Ribbon 簡介
SpringCloud Ribbon是一個基於HTTP和TCP的客戶端負載均衡工具,它基於Netflix Ribbon實現。通過Spring Cloud的封裝,可以讓我們輕松地將面向服務的REST模版
請求自動轉換成客戶端負載均衡的服務調用。SpringCloud Ribbon雖然只是一個工具類框架,它不像服務注冊中心、配置中心、API網關那樣需要獨立部署,但是它幾乎存在
於每一個Spring Cloud構建的微服務和基礎設施中。因為微服務間的調用,API網關的請求轉發等內容,實際上都是通過Ribbon來實現的。
客戶端負載均衡器
我們通常所說的負載均衡都指的是服務端負載均衡,還有一種客戶端負載均衡:
1) 硬件負載均衡:主要通過在服務器節點之間按照專門用於負載均衡的設備,比如F5等。
2) 軟件負載均衡:主要通過在服務器上安裝一些用於負載均衡功能或模塊等軟件來完成請求分發工作,比如Nginx等。
3) 客戶端負載均衡:主要通過將負載均衡的功能以庫的方式集成到服務的消費方來完成請求分發工作,比如Ribbon等。
硬件負載均衡的設備或是軟件負載均衡的軟件模塊都會維護一個下掛可用的服務端清單,通過心跳檢測來剔除故障的服務端節點以保證清單中都是可以正常訪問的服務端節點。
當客戶端發送請求到負載均衡設備的時候,該設備按某種算法(比如線性輪詢、按權重負載、按流量負載等)從維護的可用服務端清單中取出一台服務端端地址然后進行轉發。
而客戶端負載均衡和服務端負載均衡最大的不同點在於上面所提到服務清單所存儲的位置。在客戶端負載均衡中,所有客戶端節點都維護着自己要訪問的服務端清單,而這些
服務端端清單來自於服務注冊中心。
Ribbon入門
我們在SpringCloud中使用客戶端負載均衡調用非常簡單,只需要如下兩步:
1)服務提供者只需要啟動多個服務實例並注冊到服務注冊中心。
2)服務消費者直接通過調用被@LoadBalanced注解修飾過的RestTemplate來實現面向服務的接口調用(默認為輪詢)。
1、單節點服務消費者配置
<!--1. 配置pom文件,引入spring-cloud-starter-netflix-eureka-client包-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!- 2. 配置屬性文件->
server.port=8001
spring.application.name=ms-provider-order #注冊到eureka服務端的微服務名稱
eureka.client.service-url.defaultZone=http://localhost:9000/eureka/ #注冊到eureka服務端的地址
eureka.instance.prefer-ip-address=true #點擊具體的微服務,右下角是否顯示ip
eureka.instance.instance-id=ms-provider-order-8001 #顯示微服務的名稱
<!- 3. 在Spring的啟動入口添加@EnableDiscoveryClient注解或@EnableEurekaClient注解->
@SpringBootApplication
@EnableDiscoveryClient
public class EurekaProviderApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaProviderApplication.class, args);
}
}
<!- 4. 引入Ribbon輪詢配置->
@Configuration
public class RibbonConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
<!-- Controller層通過restTemplate發起請求 -->
@RestController
@RequestMapping("/consumer")
public class EmployeeController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/getIpAndPort")
public String getIpAndPort() {
return this.restTemplate.getForObject("http://MS-PROVIDER-ORDER/order/getRegisterInfo",String.class);
}
@GetMapping("/log-user-instance")
public String logUserInstance() {
ServiceInstance serviceInstance = loadBalancerClient.choose("MS-PROVIDER-ORDER");
return serviceInstance.getServiceId() + " /"+serviceInstance.getHost()+ " /"+serviceInstance.getPort();
}
}
2、集群服務消費者配置
8001端口
<!- 修改屬性文件,其他與單節點一致-> server.port=8001 spring.application.name=ms-provider-order eureka.client.service-url.defaultZone=http://localhost:9000/eureka/,http://localhost:9001/eureka/ eureka.instance.prefer-ip-address=true eureka.instance.instance-id=ms-provider-order-8001
8002服務端口
<!- 修改屬性文件,其他與單節點一致-> server.port=8002 spring.application.name=ms-consumer-user eureka.client.service-url.defaultZone=http://localhost:9000/eureka/,http://localhost:9001/eureka/ eureka.instance.prefer-ip-address=true eureka.instance.instance-id=ms-consumer-user-8002
3、@EnableDiscoveryClient與@EnableEurekaClient的區別
spring cloud的注冊中心有許多實現方式,@EnableDiscoveryClient基於spring-cloud-commons, @EnableEurekaClient基於spring-cloud-netflix。
如果選用的注冊中心是eureka,推薦使用@EnableEurekaClient,如果是其他的注冊中心,那么推薦使用@EnableDiscoveryClient。
