介绍
定制化开发我们熟悉的它是服务端定制化开发的负载均衡,而ribbon定制化开发则是客户端负载均衡。
定制化开发再来看看之前的CloudConfig.java, +@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;@Configurationpublic class CloudConfig { public CloudConfig() { } /** * 会基于OKHttp3定制化开发的配置来配置RestTemplate * @return */ @Bean @LoadBalanced // 定制化开发默认的负载均衡算法:轮询 public RestTemplate restTemplate() { return new RestTemplate(new OkHttp3ClientHttpRequestFactory()); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
ribbon定制化开发自定义策略
方式一,定制化开发启动类加上@RibbonClient
定制化开发还是以用户服务调用订单服务为例。
- 由于之前@LoadBalanced默认是轮询的负载均衡,这里可以自定义负载均衡规则,并指定为随机负载。在用户服务创建MyRule.java,包路径尽量别让spring扫描到。
@Configurationpublic class MyRule { @Bean public IRule iRule() {// 随机负载均衡 return new RandomRule(); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 用户服务启动类配置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); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 开启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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
ribbon重试机制
- 引入maven相关依赖
<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency>
- 1
- 2
- 3
- 4
- 用户服务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.RandomRuleribbon: ConnectTimeout: 5000 # 客户端请求到负载均衡集群中某个节点的时候,第一次会创建一个连接,这里代表创建连接的超时时间,单位:ms ReadTimeout: 5000 # 在连接创建好以后,调用接口的超时时间,单位:ms MaxAutoRetries: 1 # 最大重试次数 MaxAutoRetriesNextServer: 2 # 切换到下个微服务实例的重试次数 # 当请求到某个微服务5s,超时后会进行重试,先重试连接自己当前的这个实例 # 如果当前重试失败1次,则会切换到访问集群中的下一个微服务实例,切换最大为2次 OkToRetryOnAllOperations: true # 是否对所有操作都进行重试logging: level: root: debug
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 用户服务(1个节点)和订单服务(2个节点)注册到eureka集群。
- post发起调用,可以正常访问到订单服务的2个节点。此时,需要将某个订单服务stop,然后继续发起调用,观察idea用户服务控制台日志。