feignClient中修改ribbon的配置

weixin_34292287發表於2018-07-19

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:

12057079-1af0a4eb252e642f.png
image.png

相關文章