Spring Cloud Ribbon 是一套基于 Netflix Ribbon 实现的客户端负载均衡和服务调用工具。
Ribbon 会从服务注册中心(如 Eureka Server)中获取服务端列表,然后通过某种负载均衡策略(如简单轮询、随机连接等)将请求分摊给多个服务提供者,从而达到负载均衡的目的。
依赖:由于
spring-cloud-starter-netflix-eureka-client
已经包含spring-cloud-starter-netfilx-ribbon
,故而无需额外添加依赖。
负载均衡(Load Balance) ,简单点说就是将用户的请求平摊分配到多个服务器上运行,以达到扩展服务器带宽、增强数据处理能力、增加吞吐量、提高网络的可用性和灵活性的目的。常见的负载均衡方式有两种:
服务端负载均衡是在客户端和服务端之间建立一个独立的负载均衡服务器,该服务器既可以是硬件设备(例如 F5),也可以是软件(例如 Nginx)。这个负载均衡服务器维护了一份可用服务端清单,然后通过心跳机制来删除故障的服务端节点,以保证清单中的所有服务节点都是可以正常访问的。
当客户端发送请求时,该请求不会直接发送到服务端进行处理,而是全部交给负载均衡服务器,由负载均衡服务器按照某种算法(例如轮询、随机等),从其维护的可用服务清单中选择一个服务端,然后进行转发。
服务端负载均衡具有以下特点:
客户端负载均衡是将负载均衡逻辑以代码的形式封装到客户端上,即负载均衡器位于客户端。客户端通过服务注册中心(例如 Eureka Server)获取到一份服务端提供的可用服务清单。有了服务清单后,负载均衡器会在客户端发送请求前通过负载均衡算法选择一个服务端实例再进行访问,以达到负载均衡的目的。
客户端负载均衡具有以下特点:
Ribbon 就是一个基于 HTTP 和 TCP 的客户端负载均衡器,当我们将 Ribbon 和 Eureka 一起使用时,Ribbon 会从 Eureka Server(服务注册中心)中获取服务端列表,然后通过负载均衡策略将请求分摊给多个服务提供者,从而达到负载均衡的目的。
Ribbon 可以与 RestTemplate 配合使用,以实现微服务之间的调用。RestTemplate 是 Spring 家族中的一个用于消费第三方 REST 服务的请求框架。RestTemplate 实现了对 HTTP 请求的封装,提供了一套模板化的服务调用方法。通过它,Spring 应用可以很方便地对各种类型的 HTTP 请求进行访问。
负载均衡规则是 Ribbon 的核心,下面来看一下 Ribbon 内置的负载均衡规则。
Feign 对 Eureka、Ribbon 及 Hystrix 进行了集成,利用 Ribbon 维护了一份可用服务清单,并通过 Ribbon 实现了客户端的负载均衡,借助 Hystrix 完成服务降级、熔断、超时控制等。
Feign 是一种声明式服务调用组件,它在 RestTemplate 的基础上做了进一步的封装。通过 Feign,我们只需要声明一个接口并通过注解进行简单的配置(类似于 Dao 接口上面的 Mapper 注解一样)即可实现对 HTTP 接口的绑定。
OpenFeign 是 Spring Cloud 对 Feign 的二次封装,它具有 Feign 的所有功能,并在 Feign 的基础上增加了对 Spring MVC 注解的支持,例如 @RequestMapping、@GetMapping 和 @PostMapping 等。
新增依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
application.yml(无需添加新的配置信息)
server:
port: 80
spring:
application:
name: consumer-order
eureka:
client:
register-with-eureka: true
fetchRegistry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
主启动类激活 @EnableFeignClients
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class OrderFeignApplication {
业务逻辑接口上使用 @FeignClient
配置调用 provider 服务,接口路径与 provider 服务的 Controller 接口路径一致。
@Component
@FeignClient(value = "PROVIDER-PAYMENT")
public interface PaymentFeignService {
@GetMapping("/payment/getPaymentById/{id}")
CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
}
Controller 接口,无需再手动通过 RestTemplate 进行 HTTP 调用,而是通过 service 接口调用,符合习惯。
@RestController
@RequestMapping("/order")
public class OrderFeignController {
@Resource
private PaymentFeignService paymentFeignService;
@GetMapping("/getPaymentById/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) {
return paymentFeignService.getPaymentById(id);
}
}
Feign 自带负载均衡配置项,集成了 Ribbon。
application.yml
#设置feign客户端超时时间(OpenFeign默认支持ribbon)(单位:毫秒)
ribbon:
#指的是建立连接后从服务器读取到可用资源所用的时间
ReadTimeout: 5000
#指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
ConnectTimeout: 5000
Feign提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解Feign 中 Http请求的细节。
说白了就是对Feign接口的调用情况进行监控和输出。
日志级别
新增配置类
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
修改 yml 配置文件
logging:
level:
# feign日志以什么级别监控哪个接口
cn.tojintao.service.PaymentFeignService: debug