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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微服务之——负载均衡和服务接口调用(Ribbonopenfeign)相关的知识,希望对你有一定的参考价值。


目录

一、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)_微服务_02

  • 也可以单独使用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)_云原生_03

  • 代码如下
  • 微服务之——负载均衡和服务接口调用(Ribbon、openfeign)_微服务_04

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

三 、openfeign简介

  • 是什么
    OpenFeign为微服务架构下服务之间的调用提供了解决方案,OpenFeign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求。
  • openfeign的用途
    服务发现,负载均衡,服务调用
  • 原理
    基于@EnableFeignClients 将所有被@FeignClient注解的类 注册到容器中。当这些被@FeignClient注解的类被调用时会创建一个动态代理的对象为我们创建被调用类的实例,然后都会被统一转发给 Feign 框架所定义的一个 InvocationHandler , 由该 Handler 完成后续的 HTTP 转换, 发送, 接收, 翻译HTTP响应的工作。
  • 微服务之——负载均衡和服务接口调用(Ribbon、openfeign)_微服务_06

四、openfeign的使用

4.1导入maven依赖

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

微服务之——负载均衡和服务接口调用(Ribbon、openfeign)_原力计划_07

  • 也是集成了ribbon

4.2服务调用

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

一、接口+注解(微服务调用接口=​​@FeignClient​​)
写服务接口

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


代码如下

@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日志以什么级别监控哪个接口
具体的接口路径:

比如我的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:

然后写配置类

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

@Configuration
public class FeignConfig

@Bean
Logger.Level feignLoggerLevel()

return Logger.Level.FULL;//详细日志

  • ​日志级别介绍​​​:
    NONE:默认的,不显示任何日志
    BASIC:仅记录请求方法、URL、响应状态码及执行时间
    HEADERS:除了 BASIC 中定义的信息之外,还有请求和响应的头信息
    FULL:除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据
  • 测试
  • 微服务之——负载均衡和服务接口调用(Ribbon、openfeign)_spring


以上是关于微服务之——负载均衡和服务接口调用(Ribbonopenfeign)的主要内容,如果未能解决你的问题,请参考以下文章

微服务系列之Ribbon负载均衡

Spring Cloud Alibaba之负载均衡组件 - Ribbon

一起玩转微服务——通信协议如何统一

微服务调用时的超时异常,使用feign的时候负载均衡策略的调整

体系化认识微服务之四:服务注册发现机制

Spring Cloud Eureka 分布式开发之服务注册中心负载均衡声明式服务调用实现