柚子快報(bào)邀請碼778899分享:java 02-Ribbon
什么是Ribbon?
Ribbon 是 Netflix 開源的一個(gè)基于 HTTP 和 TCP 的客戶端負(fù)載均衡器,被廣泛用于微服務(wù)架構(gòu)中的服務(wù)調(diào)用。它通過在客戶端內(nèi)部實(shí)現(xiàn)負(fù)載均衡算法,將請求按照一定的策略分發(fā)給多個(gè)服務(wù)提供者,以實(shí)現(xiàn)請求的高可用和均衡分配。
Ribbon 的主要特點(diǎn)和功能包括:
負(fù)載均衡:Ribbon 可以根據(jù)一定的負(fù)載均衡策略,將請求分發(fā)給多個(gè)服務(wù)提供者。它支持的負(fù)載均衡算法包括隨機(jī)、輪詢、權(quán)重等,可以根據(jù)應(yīng)用場景和需求進(jìn)行配置。 服務(wù)發(fā)現(xiàn):Ribbon 可以與注冊中心(如 Eureka、Consul 等)集成,從注冊中心獲取可用的服務(wù)實(shí)例列表,以便進(jìn)行負(fù)載均衡。 容錯(cuò)處理:Ribbon 具備容錯(cuò)處理的能力,當(dāng)某個(gè)服務(wù)提供者不可用時(shí),它會自動(dòng)切換到其他可用的服務(wù)提供者。同時(shí),Ribbon 還支持超時(shí)設(shè)置與重試,以提升系統(tǒng)的可靠性和容錯(cuò)能力。 自定義配置:Ribbon 提供了豐富的配置項(xiàng),可以進(jìn)行負(fù)載均衡和容錯(cuò)策略的配置,包括超時(shí)設(shè)置、重試次數(shù)、連接池大小等。
一、負(fù)載均衡策略
1.輪詢策略
輪詢策略:RoundRobinRule,按照一定的順序依次調(diào)用服務(wù)實(shí)例。比如一共有 3 個(gè)服務(wù),第一次調(diào)用服務(wù) 1,第二次調(diào)用服務(wù) 2,第三次調(diào)用服務(wù)3,依次類推。此策略的配置設(shè)置如下:
2.權(quán)重策略
權(quán)重策略:WeightedResponseTimeRule,根據(jù)每個(gè)服務(wù)提供者的響應(yīng)時(shí)間分配一個(gè)權(quán)重,響應(yīng)時(shí)間越長,權(quán)重越小,被選中的可能性也就越低。它的實(shí)現(xiàn)原理是,剛開始使用輪詢策略并開啟一個(gè)計(jì)時(shí)器,每一段時(shí)間收集一次所有服務(wù)提供者的平均響應(yīng)時(shí)間,然后再給每個(gè)服務(wù)提供者附上一個(gè)權(quán)重,權(quán)重越高被選中的概率也越大。此策略的配置設(shè)置如下:
3.隨機(jī)策略
隨機(jī)策略:RandomRule,從服務(wù)提供者的列表中隨機(jī)選擇一個(gè)服務(wù)實(shí)例。此策略的配置設(shè)置如下:
4.最小連接數(shù)策略
最小連接數(shù)策略:BestAvailableRule,也叫最小并發(fā)數(shù)策略,它是遍歷服務(wù)提供者列表,選取連接數(shù)最小的?個(gè)服務(wù)實(shí)例。如果有相同的最小連接數(shù),那么會調(diào)用輪詢策略進(jìn)行選取。此策略的配置設(shè)置如下:
5.重試策略
重試策略:RetryRule,按照輪詢策略來獲取服務(wù),如果獲取的服務(wù)實(shí)例為 null 或已經(jīng)失效,則在指定的時(shí)間之內(nèi)不斷地進(jìn)行重試來獲取服務(wù),如果超過指定時(shí)間依然沒獲取到服務(wù)實(shí)例則返回 null。此策略的配置設(shè)置如下:
6.可用性敏感策略
可用敏感性策略:AvailabilityFilteringRule,先過濾掉非健康的服務(wù)實(shí)例,然后再選擇連接數(shù)較小的服務(wù)實(shí)例。此策略的配置設(shè)置如下:
7.區(qū)域敏感策略
區(qū)域敏感策略:ZoneAvoidanceRule,根據(jù)服務(wù)所在區(qū)域(zone)的性能和服務(wù)的可用性來選擇服務(wù)實(shí)例,在沒有區(qū)域的環(huán)境下,該策略和輪詢策略類似。此策略的配置設(shè)置如下:
二、配置方式
Bean配置 @Configuration
public class Ribbonconfig {
@Bean
public IRule iRule (){
//對應(yīng)上面的負(fù)載均衡策略
return new RandomRule();
}
}
@SpringBootApplication
@RibbonClients(defaultConfiguration = Ribbonconfig.class)
public class ApplicationLoader {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(ApplicationLoader.class);
application.run(args);
}
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
} 配置文件配置 server:
port: 9002
spring:
application:
name: stock-nacos
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:9100
config:
import:
- nacos:nacos-config-example.properties?refresh=true
order-nacos: //被調(diào)用服務(wù)
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule //負(fù)載均衡類
三、自定義Ribbon
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
public class CustomRule extends AbstractLoadBalancerRule {
@Override
public void initWithNiwsConfig(IClientConfig iClientConfig) {
}
@Override
public Server choose(Object o) {
//獲取當(dāng)前的負(fù)載均衡器
ILoadBalancer loadBalancer = this.getLoadBalancer();
//獲取所有可達(dá)的服務(wù)器列表
List
//隨機(jī)生成一個(gè)在可達(dá)服務(wù)器列表大小范圍內(nèi)的整數(shù)
int i = ThreadLocalRandom.current().nextInt(reachableServers.size());
//根據(jù)隨機(jī)生成的整數(shù),從可達(dá)服務(wù)器列表中選擇一個(gè)服務(wù)器。
Server server = reachableServers.get(i);
//返回選中的服務(wù)器
return server;
}
}
四、配置懶加載
ribbon:
eager-load:
enabled: true //開啟懶加載
clients: order-nacos //被調(diào)用服務(wù)
懶加載解決了什么問題?
Ribbon 懶加載是一種優(yōu)化技術(shù),用于解決在應(yīng)用程序啟動(dòng)時(shí),同時(shí)初始化所有 Ribbon 客戶端可能導(dǎo)致的性能問題。
當(dāng)應(yīng)用程序中配置了多個(gè) Ribbon 客戶端時(shí),每個(gè)客戶端在初始化時(shí)都會創(chuàng)建一組實(shí)例,這些實(shí)例會預(yù)先連接到服務(wù)提供者。如果所有的客戶端都同時(shí)初始化,可能會導(dǎo)致大量的線程和連接同時(shí)被創(chuàng)建,從而導(dǎo)致資源浪費(fèi)和性能下降。
使用 Ribbon 的懶加載機(jī)制后,Ribbon 客戶端在首次請求時(shí)才會被初始化。這樣可以避免在應(yīng)用程序啟動(dòng)時(shí)一次性創(chuàng)建所有的實(shí)例,而是根據(jù)請求的實(shí)際情況動(dòng)態(tài)地初始化和連接服務(wù)提供者。這樣能夠更好地利用資源,提高應(yīng)用程序的性能和可伸縮性。
另外,懶加載還可以解決服務(wù)注冊中心不可用或服務(wù)提供者不可用時(shí),無法初始化 Ribbon 客戶端的問題。因?yàn)楫?dāng)服務(wù)注冊中心或者服務(wù)提供者不可用時(shí),Ribbon 會等待它們可用后再進(jìn)行初始化,從而避免了在啟動(dòng)時(shí)因?yàn)橐蕾嚥豢捎枚鴮?dǎo)致應(yīng)用程序啟動(dòng)失敗的情況。
柚子快報(bào)邀請碼778899分享:java 02-Ribbon
相關(guān)文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。