通过Spring Cloud Ribbon的封装,在微服务架构中使用客户端负载均衡调用非常简单,只需要如下两步:
具体布步骤如下:
1.在服务消费者微服务的POM文件中添加ribbon的依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-ribbonartifactId>
<version>2.2.8.RELEASEversion>
dependency>
在spring cloud Eureka依赖中已经包含了spring cloud ribbon,因此无需再次引入。如过已经添加了的spring cloud Eureka依赖,不要添加该依赖,否则会遇到空指针错误。
2.在服务消费者微服务中给RestTemplate添加@LoadBalanced注解
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
@RestController
public class RibbonController {
@Resource
RestTemplate restTemplate;
@RequestMapping("/hi")
public String hi() {
String str = null;
//hardCode硬编码方式不可取
// str = restTemplate.getForObject("http://localhost:8081/port", String.class);
修改成通过微服务的虚拟主机名来访问
str = restTemplate.getForObject("http://provider/port", String.class);
return str;
}
}
4.改造服务提供者的API接口,服务消费者访问该接口时打印出端口号
5.现在分别启动1个服务注册中心和3个服务提供者、1个服务消费者:
如何一个项目启动多个实例(服务提供者)
排坑博客: Ribbon负载均衡搭建遇到的问题解决方案
在IDEA上点击Application右边的下三角 ,弹出选项后,点击 Edit Configuration 。
在弹出窗口右上角勾选上 allow parallel run(旧版本将默认的Single instance only的钩去掉),点击 Apply 应用。
完成后点击运行,启动一个实例出来。
然后修改 application.yml 文件的 server.port 的端口,再次启动。(多个实例,需要多个端口,分别启动,否则会造成端口冲突无法启动第二个实例。例如第一次启动时端口为8081, 修改yml文件server.port的端口为8082再次启动 就会产生 两个不同端口的实例。)
注意:如果项目开启了热部署的话,以上方法将会失效
问题原因:
Springboot开启了热部署,修改 application.yml文件的 server.port 的端口后,启动第二个实例会触发第一个实例的热部署,使得第一个实例重新启动,占用新的端口号。所以无论将端口号改成什么,都无法启动出第二个实例。
解决方案: 去掉热部署 或 换另外一种开启多实例的方案!
前面我们使用Ribbon实现负载均衡
时,基本用法是注入一个RestTemplate
,并使用@LoadBalanced注解标注RestTemplate
,从而使RestTemplate具备负载均衡的能力
。
当Spring容器启动时,使用@LoadBalanced
注解修饰的RestTemplate会被添加拦截器,拦截器中使用了LoadBalancerClient
处理请求,从而达到负载均衡的目的。
前提:先搭建Eureka Server、创建服务提供者 (在笔记1中已经搭建过)
0.改造服务提供者:创建HelloController类,该类定义了一个sayHello ()方法,用于处理路径为/hello的请求。
创建Feign客户端
1.创建项目,引入依赖
如:Eureka Client、Feign、Web、Test依赖。
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
2.在application.yml进行相关配置
server:
port: 8764#服务注册中心端口号
spring:
application:
name: eureka-feign-client #服务名称id
eureka:
client:
service-url:
defaultZone: http://localhost:8080/eureka/ #注册中心地址
3.添加@EnableFeignClients注解
4.创建FeignService接口并添加@FeignClient注解
5.创建FeignController类,调用sayHello()方法
6.测试运行
依次启动eureka-server、eureka-provider和eureka-feign-client。启动成功后,观察服务注册管理中心
使用浏览器访问http://localhost:8764/hello,效果如下图所示:
到这里我们完成了第一个Feign程序!!
上面完成的是Feign的声明式服务调用, 后面还有Feigin 参数绑定、继承特性。
1.Ribbon的相关配置
Feign默认整合了Ribbon能够实现负载均衡,我们可以通过配置Ribbon,自定义各个服务的调用方式。可以从全局配置
和指定服务配置
两个方面在Spring Cloud Feign中进行Ribbon的相关配置。
2.日志配置
3.其他配置
Feign服务调用的工作原理可以分为以下几个步骤:
①首先通过@EnableFeignClients
注解开启FeignClient功能。程序启动时,会通过该注解开启对@FeignClient注解的包扫描
。
②根据Feign规则实现接口,并在接口上面添加@FeignClient注解
。
③程序启动后,会进行包扫描,扫描所有的@FeignClient注解类,并将这些信息注入IoC容器。
④当接口方法被调用时,通过JDK的代理生成具体的RequestTemplate模板对象。根据RequestTemplate再生成HTTP请求的Request对象,Request对象交给Client处理。
核心: 开启Spring Cloud Feign功能是通过@EnableFeignClients注解实现的。程序启动时,首先会检测是否有@EnableFeignClients注解,如果有,则会开启扫描功能,并扫描被@FeignClient注解修饰的接口。