spring cloud 学习笔记(2):Ribbon和Feign负载均衡

Spring Cloud Ribbon和Feign负载均衡

文章目录

    • Spring Cloud Ribbon和Feign负载均衡
    • 1、Ribbon的使用
    • 2、IDEA启动多个Spring Boot服务(2020.1.2版本)
    • 4、Ribbon负载均衡策略
    • 5、Ribbon的工作原理
    • 6、Feign的使用
    • 7、Fegin的配置
    • 8、Feigin的工作原理

1、Ribbon的使用

通过Spring Cloud Ribbon的封装,在微服务架构中使用客户端负载均衡调用非常简单,只需要如下两步:

  • 服务提供者只需要启动多个服务实例并注册到服务注册中心
  • 服务消费者直接通过调用被@LoadBalanced注解修饰过的RestTemplate来实现面向服务的接口调用

具体布步骤如下:
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();
    }

spring cloud 学习笔记(2):Ribbon和Feign负载均衡_第1张图片
3. 对服务消费者的controller代码进行修改

@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接口,服务消费者访问该接口时打印出端口号
spring cloud 学习笔记(2):Ribbon和Feign负载均衡_第2张图片
5.现在分别启动1个服务注册中心和3个服务提供者、1个服务消费者:
如何一个项目启动多个实例(服务提供者)
spring cloud 学习笔记(2):Ribbon和Feign负载均衡_第3张图片

启动多个服务提供者:
spring cloud 学习笔记(2):Ribbon和Feign负载均衡_第4张图片

排坑博客: Ribbon负载均衡搭建遇到的问题解决方案

2、IDEA启动多个Spring Boot服务(2020.1.2版本)

在IDEA上点击Application右边的下三角 ,弹出选项后,点击 Edit Configuration 。
spring cloud 学习笔记(2):Ribbon和Feign负载均衡_第5张图片
在弹出窗口右上角勾选上 allow parallel run(旧版本将默认的Single instance only的钩去掉),点击 Apply 应用。
spring cloud 学习笔记(2):Ribbon和Feign负载均衡_第6张图片
完成后点击运行,启动一个实例出来。

然后修改 application.yml 文件的 server.port 的端口,再次启动。(多个实例,需要多个端口,分别启动,否则会造成端口冲突无法启动第二个实例。例如第一次启动时端口为8081, 修改yml文件server.port的端口为8082再次启动 就会产生 两个不同端口的实例。)

注意:如果项目开启了热部署的话,以上方法将会失效
spring cloud 学习笔记(2):Ribbon和Feign负载均衡_第7张图片
问题原因:
Springboot开启了热部署,修改 application.yml文件的 server.port 的端口后,启动第二个实例会触发第一个实例的热部署,使得第一个实例重新启动,占用新的端口号。所以无论将端口号改成什么,都无法启动出第二个实例。
解决方案: 去掉热部署 或 换另外一种开启多实例的方案!

4、Ribbon负载均衡策略

  • 方法一:配置文件的方式
  • 方法二:使用Java代码自定义Ribbon配置
  • 方法三:负载均衡策略配置(适用于Spring Cloud 2020.0.0版之后的版本)
  • Ribbon自定义负载均衡策略

5、Ribbon的工作原理

前面我们使用Ribbon实现负载均衡时,基本用法是注入一个RestTemplate,并使用@LoadBalanced注解标注RestTemplate,从而使RestTemplate具备负载均衡的能力
当Spring容器启动时,使用@LoadBalanced注解修饰的RestTemplate会被添加拦截器,拦截器中使用了LoadBalancerClient处理请求,从而达到负载均衡的目的。

6、Feign的使用

前提:先搭建Eureka Server、创建服务提供者 (在笔记1中已经搭建过)

0.改造服务提供者:创建HelloController类,该类定义了一个sayHello ()方法,用于处理路径为/hello的请求。
spring cloud 学习笔记(2):Ribbon和Feign负载均衡_第8张图片

创建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注解
spring cloud 学习笔记(2):Ribbon和Feign负载均衡_第9张图片
4.创建FeignService接口并添加@FeignClient注解
spring cloud 学习笔记(2):Ribbon和Feign负载均衡_第10张图片
5.创建FeignController类,调用sayHello()方法
spring cloud 学习笔记(2):Ribbon和Feign负载均衡_第11张图片

6.测试运行
依次启动eureka-server、eureka-provider和eureka-feign-client。启动成功后,观察服务注册管理中心
spring cloud 学习笔记(2):Ribbon和Feign负载均衡_第12张图片

使用浏览器访问http://localhost:8764/hello,效果如下图所示:
spring cloud 学习笔记(2):Ribbon和Feign负载均衡_第13张图片
到这里我们完成了第一个Feign程序!!

上面完成的是Feign的声明式服务调用, 后面还有Feigin 参数绑定继承特性。

7、Fegin的配置

1.Ribbon的相关配置
Feign默认整合了Ribbon能够实现负载均衡,我们可以通过配置Ribbon,自定义各个服务的调用方式。可以从全局配置指定服务配置两个方面在Spring Cloud Feign中进行Ribbon的相关配置。
2.日志配置
3.其他配置

8、Feigin的工作原理

Feign服务调用的工作原理可以分为以下几个步骤:
①首先通过@EnableFeignClients注解开启FeignClient功能。程序启动时,会通过该注解开启对@FeignClient注解的包扫描
②根据Feign规则实现接口,并在接口上面添加@FeignClient注解
③程序启动后,会进行包扫描,扫描所有的@FeignClient注解类,并将这些信息注入IoC容器。
④当接口方法被调用时,通过JDK的代理生成具体的RequestTemplate模板对象。根据RequestTemplate再生成HTTP请求的Request对象,Request对象交给Client处理。

核心: 开启Spring Cloud Feign功能是通过@EnableFeignClients注解实现的。程序启动时,首先会检测是否有@EnableFeignClients注解,如果有,则会开启扫描功能,并扫描被@FeignClient注解修饰的接口。

你可能感兴趣的:(SpringCloud学习,spring,cloud,ribbon,负载均衡)