feignClient中修改ribbon的配置
1.使用@FeignClient注解發現服務
服務提供者的controller:
@RestController
public class StudentController {
@Autowired
private StudentService studentService;
@GetMapping("/getAll/{id}")
public Student getAll(@PathVariable("id")Integer id){
System.out.println("stu-provide:localhost:5865==>消費者查詢學生時間:"+new Date().toLocaleString());
Student stu = studentService.getAllStu(id);
return stu;
}
}
消費者端:
//使用FeignClient 告知釋出方的應用名稱 預設使用ribbon進行負載均衡
@FeignClient(name="stu-provide")
public interface TestFeign {
@RequestMapping(value = "/getAll/{id}",method = RequestMethod.GET)
public Student getAll(@PathVariable("id") Integer id);
}
在使用@FeignClient注解的時候 是預設使用了ribbon進行用戶端的負載均衡的,預設的是随機的政策,那麼如果我們想要更改政策的話,需要修改消費者yml中的配置,如下:
server:
port: 9301
eureka:
client:
healthcheck:
enable: true
serviceUrl:
defaultZone: http://user:password123@localhost:8761/eureka
# defaultZone: http://eureka1:8761/eureka,http://eureka2:8762/eureka,http://eureka3:8763/eureka
instance:
hostname: localhost
ipAddress: localhost
prefer-ip-address: true
instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}
spring:
application:
name: stu-consumer
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8;useSSL=true
username: ****
password: ****
type: com.alibaba.druid.pool.DruidDataSource
initialSize: 5
minIdle: 5
maxActive: 30
maxWait: 10000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMills: 300000
validationQuery: SELECT 1 FROM DUAL
session:
store-type: none
# 配置ribbon
stu-provide:
ribbon:
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #配置規則 随機
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #配置規則 輪詢
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule #配置規則 重試
# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule #配置規則 響應時間權重
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule #配置規則 最空閑連接配接政策
ConnectTimeout: 500 #請求連接配接逾時時間
ReadTimeout: 1000 #請求處理的逾時時間
OkToRetryOnAllOperations: true #對所有請求都進行重試
MaxAutoRetriesNextServer: 2 #切換執行個體的重試次數
MaxAutoRetries: 1 #對目前執行個體的重試次數
這裡我們可以看到ribbon的政策主要有以下幾種:
- com.netflix.loadbalancer.RandomRule #配置規則 随機
- com.netflix.loadbalancer.RoundRobinRule #配置規則 輪詢
- com.netflix.loadbalancer.RetryRule #配置規則 重試
- com.netflix.loadbalancer.WeightedResponseTimeRule #配置規則 響應時間權重
- com.netflix.loadbalancer.BestAvailableRule #配置規則 最空閑連接配接政策
随機:幾個提供者間随機通路
輪詢:輪流通路
重試:在一段時間内通過RoundRobinRule選擇服務執行個體,一段時間内沒有選擇出服務則線程終止
響應時間權重:根據平均響應時間來計算權重
舉個簡單的列子,就是4個執行個體,A,B,C,D平均響應時間為10,40,80,100,是以總響應時間是10+40+80+100=230,每個執行個體權重為總響應時間與實際自身的平均響應時間的差的累積所得,是以A,B,C,D的權重分别如下:
執行個體A: 230-10=220
執行個體B:220+(230-40)=410
執行個體C:410+(230-80)=560
執行個體D:560+(230-100)=690
是以執行個體A:[0.220]
執行個體B:(220,410]
執行個體C:(410,560]
執行個體D:(560,690)
最空閑連接配接政策:目前空閑的提供者将優先被選取給消費者使用
下面以輪詢政策示範為例,配置後的使用結果如下:
通路10次:
http://localhost:9301/getAll/2:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuQjZmljZxY2NkVmY1AjMxUzMiZmY1QjNhFjN1YjM0EjNfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
image.png