微服务之——负载均衡和服务接口调用(Ribbon、openfeign)

时间:2022-10-18 21:52:42

前言
????作者简介:我是笑霸final,一名热爱技术的在校学生。
????个人主页:个人主页1 || 笑霸final的主页2
????系列专栏:《后端专栏》
????如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步????
????如果感觉博主的文章还不错的话,????点赞???? + ????关注???? + ????收藏????

微服务之——负载均衡和服务接口调用(Ribbon、openfeign)

一、Ribbon简介

  • 是什么
    Spring Cloud Ribbon是基于Netflix Ribbon实现的一套 客户端 负载均衡 工具简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这次额机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。

  • Ribbon工作步骤
    第一步先选择 EurekaServer,它优先选择同一个区域内负载较少的server
    第二步再根据用户指定的策略,再从server取到的服务注册列表中选择一个地址

  • Ribbon核心组件IRule
    微服务之——负载均衡和服务接口调用(Ribbon、openfeign)

二、Ribbon入门案列

2.1引入依赖

  • 使用的Eureka集成了ribbon
 		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

微服务之——负载均衡和服务接口调用(Ribbon、openfeign)

  • 也可以单独使用ribbon
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-ribbon</artifactId>
   </dependency>

2.2 使用ribbon

我们用的RestTemplate+ribbon来实现负载均衡

主程序(加@EnableEurekaClient注解)

@SpringBootApplication
@EnableEurekaClient
public class OrderMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderMain80.class,args);
    }
}

controller

@RestController
public class DeptController_Consumer
{
	private static final String REST_URL_PREFIX = "http://CLOUD-PAYMENT-SERVICE"; //微服务的虚拟id
 
	@Autowired
	private RestTemplate restTemplate;
 
	@RequestMapping(value = "/consumer/dept/add")
	public boolean add(Dept dept)
	{
		return restTemplate.postForObject(REST_URL_PREFIX + "/dept/add", dept, Boolean.class);
	}
}

这样就能在CLOUD-PAYMENT-SERVICE开启负载均匀了

2.2修改负载均匀的方式

  • 默认按照RoundRobinRule(轮询)的策略获取服务,如果获取的服务失败侧在指定的时间会进行重试,进行获取可用的服务

  • 根据官方文档的意思,推荐在 springboot 主程序扫描的包范围之外进行自定义配置类

  • 创建配置类
    微服务之——负载均衡和服务接口调用(Ribbon、openfeign)
    代码如下
    微服务之——负载均衡和服务接口调用(Ribbon、openfeign)

  • 然后在启动类加上@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MySelfRule.class)注解
    微服务之——负载均衡和服务接口调用(Ribbon、openfeign)

三 、openfeign简介

  • 是什么
    OpenFeign为微服务架构下服务之间的调用提供了解决方案,OpenFeign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求。

  • openfeign的用途
    服务发现,负载均衡,服务调用

  • 原理
    基于@EnableFeignClients 将所有被@FeignClient注解的类 注册到容器中。当这些被@FeignClient注解的类被调用时会创建一个动态代理的对象为我们创建被调用类的实例,然后都会被统一转发给 Feign 框架所定义的一个 InvocationHandler , 由该 Handler 完成后续的 HTTP 转换, 发送, 接收, 翻译HTTP响应的工作。
    微服务之——负载均衡和服务接口调用(Ribbon、openfeign)

四、openfeign的使用

4.1导入maven依赖

  <!--openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

微服务之——负载均衡和服务接口调用(Ribbon、openfeign)

  • 也是集成了ribbon

4.2服务调用

  • 上面我们用的是ribbon+restTemplate
  • 现在直接openfeign

一、接口+注解(微服务调用接口=@FeignClient
写服务接口
微服务之——负载均衡和服务接口调用(Ribbon、openfeign)
代码如下

@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService {

    @GetMapping("/payment/get/{id}")
    CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
}

二、yml文件

server:
  port: 8000

eureka:
  client:
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/

三、主启动类开启功能(加@EnableFeignClients注解)

@SpringBootApplication
@EnableFeignClients
public class OrderFeignMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderFeignMain80.class,args);
    }
}

四、业务类

@RestController
@Slf4j
public class OederFeignController {

    @Resource
    private PaymentFeignService paymentFeignService;

    @GetMapping(value = "/consumer/payment/get/{id}")
    public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id)
    {
        return paymentFeignService.getPaymentById(id);
    }
}

4.3 openfeign超时控制

只需要在yaml文件加上如下代码

#设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
#指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
  ReadTimeout: 5000
#指的是建立连接后从服务器读取到可用资源所用的时间
  ConnectTimeout: 5000

完整的yml文件

server:
  port: 8000

eureka:
  client:
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/
#设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
#指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
  ReadTimeout: 5000
#指的是建立连接后从服务器读取到可用资源所用的时间
  ConnectTimeout: 5000

4.4 openfeign日志打印功能

先在yml加上

logging:
  level:
    # feign日志以什么级别监控哪个接口
    具体的接口路径: debug

比如我的yml文件

server:
  port: 8000

eureka:
  client:
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/
#设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
#指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
  ReadTimeout: 5000
#指的是建立连接后从服务器读取到可用资源所用的时间
  ConnectTimeout: 5000

logging:
  level:
    # feign日志以什么级别监控哪个接口
    com.xbfinal.springcloud.service.PaymentFeignService: debug

然后写配置类
微服务之——负载均衡和服务接口调用(Ribbon、openfeign)

@Configuration
public class FeignConfig
{
    @Bean
    Logger.Level feignLoggerLevel()
    {
        return Logger.Level.FULL;//详细日志
    }
}
  • 日志级别介绍
    NONE:默认的,不显示任何日志
    BASIC:仅记录请求方法、URL、响应状态码及执行时间
    HEADERS:除了 BASIC 中定义的信息之外,还有请求和响应的头信息
    FULL:除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据

  • 测试
    微服务之——负载均衡和服务接口调用(Ribbon、openfeign)
    微服务之——负载均衡和服务接口调用(Ribbon、openfeign)
    ????如果感觉博主的文章还不错的话,????点赞???? + ????关注???? + ????收藏????