目录
1.创建注册中心 demo-registy (Eureka-server框架)
SpringCloud 套餐介绍
-
springcloud 有两个主流的套餐
套餐1:netfilx(这是一家公司的名称,网飞、奈飞):springcloud netfilx 这就是netfilx这家公司提供的一套微服务解决方案,这套解决方案有很多技术,技术1 注册中心 Eurake,技术2负载均衡Ribbon 等等
套餐2:阿里巴巴的 springcloud alibaba
实操
-
操作流程
1.新建一个空项目
2.在这个空项目下,新建4个模块,一个注册中心,两个服务提供者,一个服务消费者
-
这里使用的是 springcloud netfilx ,springboot 版本 2.3.7
1.创建注册中心 demo-registy (Eureka-server框架)
1.1 导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
1.2 配置注册中心 application.properties
# 应用名称
spring.application.name=demo-registry
# 应用服务 WEB 访问端口,官网默认端口8761,随意改
server.port=8761
# 是否注册到注册中心,因为此项目本身就是注册中心,所以不用注册到注册中心,所以配置为false,这里默认配置是 ture 的
eureka.client.register-with-eureka=false
# 是否允许从注册中心拉取服务,但是此项目本身就是注册中心,所以配置为false
eureka.client.fetch-registry=false
# 配置的注册中心的注册地址,本身就是注册中心,下面这段可以不写,因为源码里就有这个默认值
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
1.3 在启动类上加注解 @EnableEurekaServer
@SpringBootApplication
@EnableEurekaServer //允许当前项目以注册中心的身份启动
public class DemoRegistryApplication {
public static void main(String[] args) {
SpringApplication.run(DemoRegistryApplication.class, args);
}
}
-
这时候启动项目,访问http://localhost:8761,可以访问到,说明注册中心创建成功
2.创建第一个服务提供者 demo-provider
2.1 导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2.2 配置注册到服务中心 application.properties
# 应用名称
spring.application.name=demo-provider
# 应用服务 WEB 访问端口
server.port=8081
# 因为此项目是服务提供者,需要把服务注册到注册中心,所以配置为true,这里默认是true的
eureka.client.register-with-eureka=true
# 允许从注册中心拉去服务,此项目是服务提供者,所以配置true,这里默认是true的
eureka.client.fetch-registry=true
# 配置的注册中心的注册地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
2.3 在启动类上加注解 @EnableEurekaClient
@SpringBootApplication
@EnableEurekaClient //服务提供者身份启动
public class DemoProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DemoProviderApplication.class, args);
}
}
2.4 编写一个接口
@RestController
@RequestMapping("/provider")
public class ProviderController {
@RequestMapping("/demo")
public String demo(){
return "服务提供者1";
}
}
-
启动项目,访问 http://localhost:8761 ,可以看到 demo-provider 服务注册到注册中心,说明创建服务者成功
3.创建第二个服务提供者 demo-provider2
3.1 再建一个项目 demo-provider2,服务名还是叫 demo-provider
-
所有的配置跟 demo-provider 一样,接口名也一样,服务内容改一改,端口号改一改
3.2 配置 application.properties
3.3 编写 controller,除了内容不一样,接口名什么的都跟 demo-provider 一样
-
启动 demo-provider2 项目,访问 http://localhost:8761 ,可以看到服务名为 demo-provider 有两个服务
4.创建服务消费者 demo-consumer
4.1 导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 发现服务提供者需要的包 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- 注册到注册中心需要的包 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
4.2 配置注册到服务中心 application.properties
# 应用名称
spring.application.name=demo-consumer
# 应用服务 WEB 访问端口
server.port=8082
# 因为此项目是服务消费者,需要注册到注册中心,配置为 true,这里默认是 true
eureka.client.register-with-eureka=true
# 允许从注册中心拉去信息,此项目是服务消费者,所以配置true,这里默认是 true
eureka.client.fetch-registry=true
# 配置的注册中心的注册地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
4.3在启动类上加注解 @EnableDiscoveryClient
@SpringBootApplication
@EnableDiscoveryClient //服务消费者身份启动
public class DemoConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DemoConsumerApplication.class, args);
}
}
4.4编写一个接口,远程调用服务消费者提供的服务
5. 调用远程服务
5.1 方法一:使用 RestTemplate 工具类调用
-
RestTemplate 调用方式默认是支持复制均衡(它支持负载均衡的框架是 Ribbon,默认是加入了Ribbon,Ribbon是实现负载均衡的框架)
Ribbon与Nginx的负载均衡的区别:
-
Nginx主要是做服务器直接的负载均衡,可以做静态资源负载均衡
-
Ribbon是代码级别的负载均衡,这个职责单一
5.1.1 编写 RestTemplateConfig
@Configuration
public class RestTemplateConfig {
@Bean //将当前方法创建的 Bean 交给 spring 管理
@LoadBalanced //支持负载均衡
public RestTemplate restTemplate(){
RestTemplate template = new RestTemplate();
return template;
}
}
5.1.2 编写 controller
@RestController
@RequestMapping("/consunmer")
public class Demo {
@Autowired
private RestTemplate template;
@RequestMapping("/getData")
public String test(){
//参数1:请求地址
//参数2:响应返回值
//参数3:请求参数
// 服务提供者那边接口没有参数,所有这里也不用写
String object = template.getForObject("http://demo-provider/provider/demo", String.class);
return object;
}
}
-
访问 http://localhost:8082/consunmer/getData ,会发现,一下得到的结果是 “服务提供者1”,一下是“服务提供者2”,这里的比例趋量于1:1
-
从上可以看到,请求地址 http://demo-provider/provider/demo ,这里是通过服务名 demo-provider 来调用里面的接口。说明这里默认就是支持负载均衡的。
5.2 方式二:使用服务消费 Feign 框架
-
Fegin 框架封装了 RestTemplate 完成服务消费功能,以更加简洁的方式来消费服务提供者
5.2.1 导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
5.2.2 配置启动类 @EnableFeignClients
@SpringBootApplication
@EnableDiscoveryClient //服务消费者身份启动
@EnableFeignClients //开启 Feign 进行服务调用
public class DemoConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DemoConsumerApplication.class, args);
}
}
5.2.3 使用 Feign,需要写一个接口 PrviderServier
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient("demo-provider") //参数配置是服务提供者的服务名称
@RequestMapping("/provider")
public interface ProviderService {
@RequestMapping("/demo")
public String demo();
}
5.2.4 编写 controller
@RestController
@RequestMapping("/consumer")
public class Demo {
// 方法一:使用 RestTemplate 工具类调用
@Autowired
private RestTemplate template;
// 方法二:使用服务消费 Fegin 框架
@Autowired
private ProviderService providerService;
// 方法一
@RequestMapping("/getData")
public String test(){
//参数1:请求地址
//参数2:响应返回值
//参数3:请求参数
String object = template.getForObject("http://demo-provider/demo", String.class);
System.out.println("调用:"+ object);
return object;
}
// 方法二:使用服务消费 Fegin 框架
@RequestMapping("/getData2")
public String test2(){
String demo = providerService.demo();
System.out.println("调用:" + demo);
return demo;
}
}
-
访问 http://localhost:8082/consunmer/getData2,会发现,一下得到的结果是 “服务提供者1”,一下是“服务提供者2”,这里的比例趋量于1:1