?我的博客:蘭陵笑笑生,歡迎瀏覽博客垄琐!
?上一章 SpringCloud基礎(chǔ)教程(五)-配置中心熱生效和高可用當中,我們對配置中心進行進行了深入的了解横媚,本章將繼續(xù)微服務(wù)架構(gòu)的深入學(xué)習(xí)自脯,了解在微服務(wù)中是如何做到負載均衡的。
前言
?簡單來講敞葛,Ribbon是Netflix發(fā)布的開源項目前鹅,主要的功能是提供客戶端的軟件負載均衡算法。它可以在客戶端配置服務(wù)端類別碌识,然后輪詢請求以實現(xiàn)負載均衡碾篡。
?當項目引入Eureka依賴后,會自動的引入ribbon的依賴丸冕,當然我們可以顯示的引入ribbon依賴耽梅。在集成Eureka時,DiscoveryEnabledNIWSServerList重寫了Ribbon的服務(wù)列表胖烛,在com.netflix.ribbon:ribbon-eureka:2.3.0模塊我們可以看到眼姐,同時使用 NIWSDiscoveryPing取代IPing:
一、Ribbo快速使用
?當前的實例我們會涉及到Eureka注冊中心佩番,兩個服務(wù)提供者(server-provider),一個服務(wù)消費者(server-consumer),首先众旗,我們啟動兩個服務(wù)提供者,并注冊到Eureka趟畏,服務(wù)提供接口如下:
@RestController
public class RibbonController {
@RequestMapping("/sayHello")
public String sayHello(String name) {
return "hello!,"+name;
}
}
?接下來贡歧,對之前文章的Eureka客戶端,即服務(wù)消費者進行相關(guān)改造赋秀,首先引入ribbon依賴(其實在引入eureka-client時就已經(jīng)默認引入了Ribbon):
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
?并對服務(wù)消費者代碼進行改造利朵,將DiscoveryClient改為LoadBalancerClient,顧名思義猎莲,改成支持負載均衡的客戶端绍弟,同時在消費者的主類上添加@EnableDiscoveryClient注解,開啟發(fā)現(xiàn)服務(wù)功能:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class RibbonController {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Autowired
private LoadBalancerClient client;
@Autowired
RestTemplate restTemplate;
@GetMapping("/sayHello")
public String sayHello(String name) {
ServiceInstance instance = client.choose("server-provider");
String res = restTemplate.
getForObject(instance.getUri().toString()
+ "sayHello?name=" + name, String.class);
return res + " from :" + instance.getPort();
}
}
?先后啟動Eureka注冊中心著洼,啟動兩個服務(wù)提供者和一個服務(wù)消費者樟遣,在Eureka的監(jiān)控頁面我們可以看到如下的內(nèi)容:
接下來用瀏覽器請求服務(wù)調(diào)用者的接口得到的結(jié)果是:
hello!,test from :9001
hello!,test from :9002
?響應(yīng)為9001和9002交替的出現(xiàn)而叼,這表明Ribbon客戶端正在用輪詢的方式實現(xiàn)了負載均衡。
?當然我們還可以使用一種更為簡單的方法豹悬,修改客戶端的調(diào)用代碼葵陵,給RestTemplate添加 @LoadBalanced注解,通過restTemplate直接使用URL :http://server-provider/sayHello?name=test的方式調(diào)用瞻佛,這里的server-provider是服務(wù)提供者的注冊在Eureka的服務(wù)名稱脱篙, @LoadBalanced的默認算法是輪詢:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class RibbonController {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Autowired
RestTemplate restTemplate;
@GetMapping("/sayHello")
public String sayHello(String name) {
String res = restTemplate
.getForObject("http://server-provider/sayHello?name=" + name, String.class);
return res;
}
?通過這樣簡潔的方式同樣可以實現(xiàn)負載均衡的調(diào)用。
二 伤柄、Ribbon進階配置
?上文簡單的展示了Ribbon的基本功能涡尘,但是Ribbon還可以有更多自定義的配置,比如我們想修改默認的負載均衡算法响迂、自定義HTTP線程池等,我們該如何實現(xiàn)呢细疚?
2.1 Ribbon的核心組件
?在ribbon-loadbalancer項目中蔗彤,定義和很多的接口,其中就有
IRule:輪詢的策略的接口疯兼。
ServerList:定義用于獲取服務(wù)器列表的額方法的接口然遏。
IPing:定義了以什么方式去檢查服務(wù)之間是否通訊良好的接口。
2.2 實現(xiàn)自定義算法
?Spring Cloud提供了為Ribbon的默認實現(xiàn)吧彪,當然我們也可以自定義的去修改輪詢策略等配置待侵,首選我們在客戶端你的啟動類上添加@RibbonClient注解,
import com.microservice.RibbonConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@RibbonClient(name = "server-provider",configuration = RibbonConfig.class)
public class ServerConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ServerConsumerApplication.class, args);
}
}
?@RibbonClient(name = "server-provider",= RibbonConfig.class) 中
- name:是服務(wù)提供者注冊在Eureka的名稱姨裸;
- configuration :是我們即將自定義的配置類秧倾;
接下來,我們新建RibbonConfig配置類傀缩,
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 配置Ribbon
*/
@Configuration
public class RibbonConfig {
/**
* 使用隨機的輪詢方法
*
* @return
*/
@Bean
public IRule iRule() {
return new RandomRule();
}
}
?注意:確保RibbonConfig所在的包不能被@ComponentScan掃描到那先,如果主類使用@SpringBootApplication,也需要避免會被自動掃描赡艰,具體的配置如下:
?服務(wù)調(diào)用的代碼不變化:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class RibbonController {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Autowired
RestTemplate restTemplate;
@GetMapping("/sayHello")
public String sayHello(String name) {
String res = restTemplate.getForObject("http://server-provider/sayHello?name=" + name, String.class);
return res;
}
?我們使用瀏覽器調(diào)用接口 http://192.168.1.103:5168/sayHello?name=test售淡,返回的結(jié)果是以隨機的方式返回的;
2.3 @RibbonClient注解
?我們通過指定@RibbonClient中configuration的配置可以修改默認的實現(xiàn)慷垮,針對IRule的實現(xiàn)揖闸,SpringCloud有以下的實現(xiàn):
RoundRobinRule:輪詢,默認的每一次的請求都是輪流分配給服務(wù)提供者料身;
AvailabilityFilteringRule:更具可用性進行過濾的策略汤纸。默認情況下,如果RestClient最后三次連接失敗惯驼,則實例會電路跳閘蹲嚣,一旦實例跳閘递瑰,它將保持這個狀態(tài)30s,之后會被再次啟用隙畜;如果在連續(xù)連接失敗抖部,則再會變成電路跳閘,等待的時間會指數(shù)級增長议惰;
WeightedResponseTimeRule:每個服務(wù)器根據(jù)響應(yīng)的時間給予權(quán)重慎颗,響應(yīng)時間越長,權(quán)重越少言询;
RandomRule:隨機策略
?當然還有其他的權(quán)重策略俯萎,有興趣的同學(xué)可以自行的研究源代碼。
?Spring Cloud提供了@RibbonClients這樣的一個注解运杭,我們的客戶端不可能只會調(diào)用一個提供者夫啊,這樣的注解我們可以配置多個提供者。
三辆憔、總結(jié)
?本章介紹了Ribbon組件作為一個客戶端的負載均衡器對微服務(wù)架構(gòu)方面起到了非常大的作用撇眯,我們對Ribbon有了一個深入的理解,同時我們也可以自定義一些配置虱咧,我相信微服務(wù)的學(xué)習(xí)并不是一件很難的事熊榛。
.以就是本期的分享,你還可以關(guān)注公眾號: 程序員笑笑生腕巡,關(guān)注更多精彩內(nèi)容玄坦!
SpringCloud基礎(chǔ)教程(一)-微服務(wù)與SpringCloud
SpringCloud基礎(chǔ)教程(二)-服務(wù)發(fā)現(xiàn) Eureka
SpringCloud基礎(chǔ)教程(三)-Eureka進階
SpringCloud 基礎(chǔ)教程(四)-配置中心入門
SpringCloud基礎(chǔ)教程(五)-配置中心熱生效和高可用
SpringCloud 基礎(chǔ)教程(六)-負載均衡Ribbon
更多精彩內(nèi)容,請期待...
本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布绘沉!