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://github.com/fengcharly/springCloud-ribbon-turbine.git