SpringCloud實戰七:Spring Cloud Ribbon 實戰
前面的兩篇部落格已經講解了Feign作為服務間的呼叫,但是Feign是整合、封裝了Ribbonn這個元件而來的,讓服務間的呼叫更方便,因此大多使用Feign,本篇讓大家瞭解Ribbon的概念與呼叫
Ribbon是Netflix開發的一個負載均衡元件,它在服務體系中起著重要作用,Pivotal將其整合成為Spring Cloud Ribbon,與其他SpringCloud元件結合可以發揮出強大作用,它的負載策略有多種,預設輪詢,可配置超時重試
說到負載均衡,Ribbon與Lvs、Nginx不一樣,nginx是服務端負載均衡,Ribbon是客戶端負載均衡,具體表現為客戶端從註冊中心拿到服務的所有例項,然後以負載均衡方式去呼叫服務,預設以輪詢的方式去呼叫服務例項
程式碼實戰
實戰思路:1.啟用註冊中心,2.建立服務提供者,服務提供者至少啟動兩個節點,3.建立服務消費者,以restTemplate的方式呼叫服務提供者,檢視ribbon元件是否以負載均衡的方式呼叫服務提供者
1.啟動之前部落格中的Eureka註冊中心
2.建立一個maven專案,再建立服務提供者
- 服務提供者很簡單,只需要引入下面依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
- 在主類上啟用@EnableDiscoveryClient
- 在配置檔案中配置好註冊中心地址
server.port=9600
spring.application.name=provider-service
eureka.instance.prefer-ip-address=true
#配置eureka-server security的賬戶資訊
eureka.client.serviceUrl.defaultZone=http://zy:[email protected]:10025/eureka/
- 建立控制器,提供服務,返回埠資訊
@RestController public class IndexController { @GetMapping("/hello") public String hello(String name , HttpServletRequest request){ //返回埠資訊 return " From Port : " + request.getServerPort() + " , hello " + name; } }
服務提供者打包,定位到jar包目錄,使用如下命令,啟用兩個節點,訪問一下看看是否正常
java -jar provider-service-0.0.1-SNAPSHOT.jar --server.port=9600
java -jar provider-service-0.0.1-SNAPSHOT.jar --server.port=9601
兩個服務提供者節點都正常
3.建立ribbon服務消費者
- 服務消費者比服務提供者多引入一個依賴:spring-cloud-starter-netflix-ribbon
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
- 在主類上啟用@EnableDiscoveryClient,同時新增一個Bean
/**
* 新增LoadBalanced,使RestTemplate以負載均衡的方式呼叫服務
* @return
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
- 在配置檔案中配置好註冊中心地址,埠為9500,例項名為ribbon-service,其它配置都一樣
server.port=9500
spring.application.name=ribbon-service
eureka.instance.prefer-ip-address=true
#配置eureka-server security的賬戶資訊
eureka.client.serviceUrl.defaultZone=http://zy:[email protected]:10025/eureka/
- 新增一個控制器,注入RestTemplate,訪問服務提供者
@RestController
public class IndexController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/sayHello")
public String sayHello(String name){
String url = "http://provider-service/hello?name=" + name;
String result = restTemplate.getForObject(url , String.class);
return result;
}
}
- 啟動服務消費者,檢視註冊中心,可以看到服務提供者有2個節點9600、9601,服務消費者一個節點9500
- 訪問服務消費者,驗證服務呼叫是否以負載均衡方式
第一次訪問,呼叫了9600埠的服務提供者
第二次訪問,呼叫了9601埠的服務提供者
OK,Ribbon預設使用輪詢方式呼叫服務
下面說說怎麼使用其他方式,也就是其他負載均衡策略呼叫服務和配置超時重試
ribbon有7種策略,隨機、輪詢、最小併發、響應時間加權等策略,其它自行百度
在專案中使用也很簡單,定義一個config類,新增一個bean,指明使用什麼策略,程式碼如下:
/**
* ribbon負載均衡配置
*/
@Configuration
public class RibbonLBConfig {
//使用隨機策略
@Bean
public IRule ribbonRule(){
return new RandomRule();
}
}
超時與重試,只需在配置檔案中配置
#請求處理的超時時間
ribbon:
# 同一例項最大重試次數,不包括首次呼叫
MaxAutoRetries: 1
# 重試其他例項的最大重試次數,不包括首次所選的server
MaxAutoRetriesNextServer: 2
# 是否所有操作都重試
OkToRetryOnAllOperations: false
# 是否所有操作都進行重試
ReadTimeout: 10000
ConnectTimeout: 10000
程式碼已上傳至碼雲,原始碼,專案使用的版本資訊如下:
- SpringBoot 2.0.6.RELEASE
- SpringCloud Finchley.SR2(非常新的版本)