Spring Cloud Ribbon
- 客戶端負(fù)載均衡組件Ribbon 負(fù)載均衡就是當(dāng)client端發(fā)送請(qǐng)求得時(shí)候會(huì)均衡得分發(fā)到每個(gè)server端
創(chuàng)建spring-cloud-02-ribbon-eureka 就是個(gè)服務(wù)端 參考前面得copy過來的
創(chuàng)建spring-cloud-02-ribbon-client1 項(xiàng)目
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
@RestController
public class UserController {
@RequestMapping(value = "/getUser", method = {RequestMethod.GET})
public User getUser(@RequestParam("id") String id) {
System.err.println("client1 GET-------------" + id);
return new User(id, "20", "張三");
}
}
spring.application.name=client-service
server.port=1003
server.context-path=/
eureka.client.service-url.defaultZone=http://eureka1:8003/eureka/
spring.output.ansi.enabled=always
創(chuàng)建 spring-cloud-02-ribbon-request
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
spring.application.name=request-service
server.context-path=/
server.port=1005
eureka.client.service-url.defaultZone=http://eureka1:8003/eureka/
spring.output.ansi.enabled=always
- 啟動(dòng)所有 request訪問http://localhost:1005/get 當(dāng)請(qǐng)求得次數(shù)一樣時(shí)燥爷,會(huì)發(fā)現(xiàn)分別在client1和client2端會(huì)打印出響應(yīng)得次數(shù)秒梳,每個(gè)都打印出一半
- 這就是負(fù)載均衡 Ribbon
在這里在介紹下retry重試機(jī)制
spring-cloud-02-ribbon-retry
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
spring.application.name=retry-service
server.context-path=/
server.port=1006
eureka.client.service-url.defaultZone=http://eureka1:8003/eureka/
#啟動(dòng)重試機(jī)制
spring.cloud.loadbalancer.retry.enabled=true
##斷路器
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=14000
##連接超時(shí)時(shí)間
#client-service.ribbon.ConnectTimeout=1000
##處理超時(shí)時(shí)間
#client-service.ribbon.ReadTimeout=1000
req.fact.connect-timeout=1000
req.fact.connection-request-timeout=1000
req.fact.read-timeout=3000
#是否對(duì)所有請(qǐng)求都進(jìn)行重試
client-service.ribbon.OKToRetryOnAllOperations=true
#重試切換實(shí)例得次數(shù)
client-service.ribbon.MaxAutoRetriesNextServer=1
#重試切次數(shù)
client-service.ribbon.MaxAutoRetries=5
client-service.ribbon.ConnectTimeout=1000
client-service.ribbon.ReadTimeout=1000
這樣配置沒起作用 建議使用RestTemplate原始配置
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds:斷路器得超時(shí)時(shí)間需要大于ribbon得超時(shí)時(shí)間,不然不會(huì)發(fā)生重試。
@EnableCircuitBreaker //開啟斷路器
@EnableRetry //啟動(dòng)Retry框架重試機(jī)制
@EnableDiscoveryClient //我是服務(wù) 注冊(cè)到服務(wù)中心上
@SpringBootApplication
public class RetryApplication {
@Bean
@ConfigurationProperties(prefix = "req.fact")
public HttpComponentsClientHttpRequestFactory httpComponentsClientHttpRequestFactory(){
return new HttpComponentsClientHttpRequestFactory();
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate(httpComponentsClientHttpRequestFactory());
}
public static void main(String[] args) {
SpringApplication.run(RetryApplication.class, args);
}
}
@RestController
public class IndexController {
@Autowired
RestTemplate restTemplate;
@RequestMapping(value = "/retry", method = {RequestMethod.GET})
@HystrixCommand(fallbackMethod = "retryFailback")
public String retry(){
ResponseEntity<String> response = restTemplate.getForEntity("http://client-service/retry", String.class);
System.err.println("body:" + response.getBody());
return "----- retry ok -----";
}
public String retryFailback(){
System.err.println("-----啟動(dòng)降級(jí)策略----");
return "-----啟動(dòng)降級(jí)策略----";
}
}
- 在spring-cloud-02-ribbon-client1項(xiàng)目得Controller中添加
@RequestMapping(value = "/retry", method = {RequestMethod.GET})
public String retry() {
System.err.println("client1 1 call-------------");
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "client 1";
}
- 在spring-cloud-02-ribbon-client2項(xiàng)目得Controller中添加
@RequestMapping(value = "/retry", method = {RequestMethod.GET})
public String retry() {
System.err.println("client1 2 call-------------");
return "client 2";
}
- 在啟動(dòng)http://localhost:1006/retry時(shí)枷踏,通過Ribbon負(fù)載均衡會(huì)訪問client1或者client2項(xiàng)目得retry方法,當(dāng)訪問到client1得retry方法時(shí),配置得讀取超時(shí)時(shí)間為3ms斥赋,重試次數(shù)為5次,retry方法睡眠為4ms绢慢,就是每次訪問retry方法時(shí)重試灿渴,當(dāng)重試次數(shù)6次后,會(huì)采用降級(jí)策略胰舆,因?yàn)槿蹟嗥髋渲玫脼?4ms骚露,超過熔斷器得時(shí)間就會(huì)采用降級(jí)策略。
- GitHub地址
- hystrix 先入個(gè)門