ribbon介绍
我们熟悉的nginx它是服务端的负载均衡,而ribbon则是客户端负载均衡。
再来看看之前的CloudConfig.java,RestTemplate +@LoadBalanced等价于ribbon。
package com.ft.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
@Configuration
public class CloudConfig {
public CloudConfig() {
}
/**
* 会基于OKHttp3的配置来配置RestTemplate
* @return
*/
@Bean
@LoadBalanced // 默认的负载均衡算法:轮询
public RestTemplate restTemplate() {
return new RestTemplate(new OkHttp3ClientHttpRequestFactory());
}
}
ribbon自定义负载均衡策略
方式一,启动类加上@RibbonClient
还是以用户服务调用订单服务为例。
- 由于之前@LoadBalanced默认是轮询的负载均衡,这里可以自定义负载均衡规则,并指定为随机负载。在用户服务创建MyRule.java,包路径尽量别让spring扫描到。
@Configuration
public class MyRule {
@Bean
public IRule iRule() {// 随机负载均衡
return new RandomRule();
}
}
- 用户服务启动类配置ApplicationUser.java
@SpringBootApplication
@EnableEurekaClient // 开启eureka client 注册到server中
// ribbon自定义负载均衡
@RibbonClient(name = "ORDER", configuration = MyRule.class)
public class ApplicationUser {
public static void main(String[] args) {
SpringApplication.run(ApplicationUser.class, args);
}
}
- 开启3个订单服务,并注册到eureka集群中。
4.使用postman测试,发现是随机的负载均衡策略。
方式二,用户服务application.yml配置中指定
只需要加上末尾“配置指定自定义的ribbon规则”,测试ok。
############################################################
#
# 用户微服务
# web访问端口号 约定:8001
#
############################################################
server:
# 动态设置端口号,方便部署集群
port: ${port:8001}
tomcat:
uri-encoding: UTF-8
############################################################
#
# 配置项目信息
#
############################################################
spring:
application:
name: user
############################################################
#
# eureka配置信息
#
############################################################
eureka:
server:
hostname: localhost
port: 7000
client:
# 所有的微服务都必须注册到eureka中
register-with-eureka: true
# 从注册中心获得检索服务实例,用户服务需要配置为true
# 用户服务要去获得其他服务的实例,然后去调用
fetch-registry: true
# 注册中心的服务地址
service-url:
# defaultZone: http://${eureka.server.hostname}:${eureka.server.port}/eureka/
# 用户服务注册到eureka集群中
defaultZone: http://eureka-cluster-7001:7001/eureka/,http://eureka-cluster-7002:7002/eureka/,http://eureka-cluster-7003:7003/eureka/
instance:
lease-renewal-interval-in-seconds: 3 # 调整微服务(eureka-client)和注册中心(eureka-server)之间的心跳时间
lease-expiration-duration-in-seconds: 5 # eureka距离最近的一次心跳等待剔除的时间(假设是3s发送一次心跳,但是某次3s后eureka没有收到心跳,则距离上次心跳5s后,eureka会剔除该节点)默认90s,当前设置为5s
# 配置指定自定义的ribbon规则
ORDER:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
ribbon重试机制
- 引入maven相关依赖
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
- 用户服务application.yml配置
############################################################
#
# 用户微服务
# web访问端口号 约定:8001
#
############################################################
server:
# 动态设置端口号,方便部署集群
port: ${port:8001}
tomcat:
uri-encoding: UTF-8
############################################################
#
# 配置项目信息
#
############################################################
spring:
application:
name: user
############################################################
#
# eureka配置信息
#
############################################################
eureka:
server:
hostname: localhost
port: 7000
client:
# 所有的微服务都必须注册到eureka中
register-with-eureka: true
# 从注册中心获得检索服务实例,用户服务需要配置为true
# 用户服务要去获得其他服务的实例,然后去调用
fetch-registry: true
# 注册中心的服务地址
service-url:
# defaultZone: http://${eureka.server.hostname}:${eureka.server.port}/eureka/
# 用户服务注册到eureka集群中
defaultZone: http://eureka-cluster-7001:7001/eureka/,http://eureka-cluster-7002:7002/eureka/,http://eureka-cluster-7003:7003/eureka/
instance:
lease-renewal-interval-in-seconds: 3 # 调整微服务(eureka-client)和注册中心(eureka-server)之间的心跳时间
lease-expiration-duration-in-seconds: 5 # eureka距离最近的一次心跳等待剔除的时间(假设是3s发送一次心跳,但是某次3s后eureka没有收到心跳,则距离上次心跳5s后,eureka会剔除该节点)默认90s,当前设置为5s
# 配置指定自定义的ribbon规则
ORDER:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
ribbon:
ConnectTimeout: 5000 # 客户端请求到负载均衡集群中某个节点的时候,第一次会创建一个连接,这里代表创建连接的超时时间,单位:ms
ReadTimeout: 5000 # 在连接创建好以后,调用接口的超时时间,单位:ms
MaxAutoRetries: 1 # 最大重试次数
MaxAutoRetriesNextServer: 2 # 切换到下个微服务实例的重试次数
# 当请求到某个微服务5s,超时后会进行重试,先重试连接自己当前的这个实例
# 如果当前重试失败1次,则会切换到访问集群中的下一个微服务实例,切换最大为2次
OkToRetryOnAllOperations: true # 是否对所有操作都进行重试
logging:
level:
root: debug
- 用户服务(1个节点)和订单服务(2个节点)注册到eureka集群。
- post发起调用,可以正常访问到订单服务的2个节点。此时,需要将某个订单服务stop,然后继续发起调用,观察idea用户服务控制台日志。