最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Ribbon單獨(dú)使用,配置自動(dòng)重試,實(shí)現(xiàn)負(fù)載均衡和高可用方式

 更新時(shí)間:2022年12月28日 14:33:16   作者:DayDayUp丶  
這篇文章主要介紹了Ribbon單獨(dú)使用,配置自動(dòng)重試,實(shí)現(xiàn)負(fù)載均衡和高可用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、前言

1.1 實(shí)現(xiàn)目標(biāo)

服務(wù)A調(diào)用服務(wù)B1和B2(B1和B2提供同種服務(wù)),當(dāng)服務(wù)B1/B2在停止和重新發(fā)布階段,或B1/B2有一個(gè)服務(wù)故障時(shí),

  • 需保證服務(wù)A正常調(diào)用B服務(wù),達(dá)到無感知發(fā)布的效果(服務(wù)B高可用)
  • 需保證服務(wù)A的請(qǐng)求負(fù)載均衡,避免某個(gè)B服務(wù)節(jié)點(diǎn)壓力過大(服務(wù)B負(fù)載均衡)

說明:這里是獨(dú)立使用Ribbon,不依賴于Eureka、Zookeeper等任何服務(wù)注冊(cè)發(fā)現(xiàn)組件。

1.2 環(huán)境

JDK 1.8,SpringCloud Greenwich.SR2,SpringBoot 2.1.3.RELEASE

二、實(shí)現(xiàn)

本文示例,CONSUMER-SERVICE服務(wù)調(diào)用PRODUCER-SERVICE服務(wù)。在進(jìn)行以下步驟前,請(qǐng)先啟動(dòng)兩個(gè)普通的SpringBoot服務(wù)PRODUCER-SERVICE。

2.1 pom依賴

因?yàn)檫@里獨(dú)立使用Ribbon,所以CONSUMER-SERVICE只需要spring-cloud-starter-netflix-ribbon,啟動(dòng)主類也無需更多的注解,如

@EnableEurekaClient、@EnableDiscoveryClient、@EnableCircuitBreaker等,只需保留@SpringBootApplication即可。

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    </dependency>
</dependencies>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Greenwich.SR2</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

2.2 RestTemplate配置

Ribbon是對(duì)RestTemplate的加強(qiáng),需要為RestTemplate添加注解@LoadBalanced,使之具有負(fù)載均衡能力。如下:

@Bean
@LoadBalanced
public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
? ? RestTemplate restTemplate = new RestTemplate(factory);
? ? restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
? ? return restTemplate;
}

2.3 Ribbon配置

注意:網(wǎng)上和書上很多教程都沒有提到ribbon.restclient.enabled這一配置,導(dǎo)致再怎么嘗試都無法成功自動(dòng)重試。

spring.application.name=CONSUMER-SERVICE
server.port=8801
?
ribbon.restclient.enabled=true
#開啟重試機(jī)制
spring.cloud.loadbalancer.retry.enabled=true
#請(qǐng)求連接的超時(shí)時(shí)間
PRODUCER-SERVICE.ribbon.ConnectTimeout=250
#請(qǐng)求處理的超時(shí)時(shí)間
PRODUCER-SERVICE.ribbon.ReadTimeout=1000
#對(duì)所有操作請(qǐng)求都進(jìn)行重試,默認(rèn)false,只有GET請(qǐng)求會(huì)重試;這是防止POST等對(duì)數(shù)據(jù)有影響的請(qǐng)求在重試后因?yàn)榻涌谖醋鰞绲刃詫?dǎo)致數(shù)據(jù)異常,影響較大
PRODUCER-SERVICE.ribbon.OkToRetryOnAllOperations=true
#指定請(qǐng)求重試開關(guān),經(jīng)調(diào)試源碼該屬性未被使用,疑似bug,導(dǎo)致不論怎么設(shè)置,都是只有服務(wù)提供者的Get請(qǐng)求可以被自動(dòng)重試
#PRODUCER-SERVICE.ribbon.RequestSpecificRetryOn=true
#切換實(shí)例的重試次數(shù)
PRODUCER-SERVICE.ribbon.MaxAutoRetriesNextServer=2
#對(duì)當(dāng)前實(shí)例的重試次數(shù)
PRODUCER-SERVICE.ribbon.MaxAutoRetries=1
?
#服務(wù)PRODUCER-SERVICE的地址
PRODUCER-SERVICE.ribbon.listOfServers=localhost:8080,localhost:8083

2.4 Ribbon調(diào)用服務(wù)

在Controller中,注入RestTemplate,使用服務(wù)名(即spring.application.name)的方式,調(diào)用PRODUCER-SERVICE服務(wù)的GET接口,如下:

@Controller
@RequestMapping("consumer/api")
public class ConsumerController {
? ? @Autowired
? ? private RestTemplate restTemplate;
?
? ? @GetMapping("/test")
? ? @ResponseBody
? ? public String test() {
? ? ? ? ResponseEntity<String> entity = restTemplate
? ? ? ? ? ? ? ? .getForEntity("http://PRODUCER-SERVICE/outer/data?res=3&msgKey=token123", String.class);
? ? ? ? return entity.getBody();
? ? }
}

三、測(cè)試運(yùn)行

3.1 負(fù)載均衡測(cè)試

啟動(dòng)一個(gè)消費(fèi)者服務(wù)CONSUMER-SERVICE,多次訪問/consumer/api/test,可以通過給PRODECER-SERVICE服務(wù)的/outer/data接口添加調(diào)試日志的打印,來確認(rèn)默認(rèn)使用了輪詢的負(fù)載均衡策略。

3.2 高可用測(cè)試

停止其中一個(gè)PRODECER-SERVICE服務(wù)實(shí)例,確認(rèn)輪詢到已停止的服務(wù)時(shí),可以成功地在未停止的服務(wù)上自動(dòng)重試請(qǐng)求。

四、無法成功自動(dòng)重試的幾種情況

本人在單獨(dú)使用Ribbon的過程中,碰到以下幾種無法自動(dòng)重試其他服務(wù)節(jié)點(diǎn)的情況:

4.1 ribbon.restclient.enabled

遇到Ribbon的問題,網(wǎng)上一搜,千篇一律,也不知道作者們是否親自實(shí)踐證明可用,就隨意發(fā)篇文章。言歸正傳,若不設(shè)置ribbon.restclient.enabled=true,在本人的實(shí)驗(yàn)環(huán)境中是無法自動(dòng)重試的。

4.2 Maven打包有警告

在SpringCloud生態(tài)的開發(fā)中,各組件往往自動(dòng)依賴了很多其他的jar包,如果向Maven本地倉庫下載的過程中,網(wǎng)絡(luò)不好,就會(huì)下載到一份不完整的jar包或pom文件,最終可能會(huì)導(dǎo)致打包出錯(cuò)。下面是在使用Maven打包項(xiàng)目時(shí),比較常見下面的警告:

[WARNING] The POM for com.sun.jersey:jersey-core:jar:1.19.1 is invalid, transitive dependencies (if any) will not be available
[WARNING] The POM for com.sun.jersey:jersey-client:jar:1.19.1 is invalid, transitive dependencies (if any) will not be available
...

可以看出來,提示我們傳遞依賴將失效,所以有可能整個(gè)打包過程是SUCCESS的,但是最后啟動(dòng)jar包時(shí),卻可能報(bào)NoClassDef等缺少jar包的錯(cuò)誤。因此,我們需要在打包時(shí)加上參數(shù) -X 以查看具體原因:

[WARNING] The POM for com.sun.jersey:jersey-core:jar:1.19.1 is invalid, transitive dependencies (if any) will not be available: 1 problem was encountered while building the effective model for com.sun.jersey:jersey-core:[unknown-version]
[FATAL] Non-parseable POM E:\maven\repository\com\sun\jersey\jersey-project\1.19.1\jersey-project-1.19.1.pom: processing instruction can not have PITarget with reserved xml name (position: END_TAG seen ...</properties>\n\n</project>\n<?xml ... @627:7)  @ E:\maven\repository\com\sun\jersey\jersey-project\1.19.1\jersey-project-1.19.1.pom, line 627, column 7
[WARNING] The POM for com.sun.jersey:jersey-client:jar:1.19.1 is invalid, transitive dependencies (if any) will not be available: 1 problem was encountered while building the effective model for com.sun.jersey:jersey-client:[unknown-version]
[FATAL] Non-parseable POM E:\maven\repository\com\sun\jersey\jersey-project\1.19.1\jersey-project-1.19.1.pom: processing instruction can not have PITarget with reserved xml name (position: END_TAG seen ...</properties>\n\n</project>\n<?xml ... @627:7)  @ E:\maven\repository\com\sun\jersey\jersey-project\1.19.1\jersey-project-1.19.1.pom, line 627, column 7
[WARNING] The POM for com.sun.jersey.contribs:jersey-apache-client4:jar:1.19.1 is invalid, transitive dependencies (if any) will not be available: 1 problem was encountered while building the effective model for com.sun.jersey.contribs:jersey-apache-client4:[unknown-version]
[FATAL] Non-parseable POM E:\maven\repository\com\sun\jersey\jersey-project\1.19.1\jersey-project-1.19.1.pom: processing instruction can not have PITarget with reserved xml name (position: END_TAG seen ...</properties>\n\n</project>\n<?xml ... @627:7)  @ E:\maven\repository\com\sun\jersey\jersey-project\1.19.1\jersey-project-1.19.1.pom, line 627, column 7

特別注意FATAL這個(gè)最嚴(yán)重的日志級(jí)別的信息, 日志提醒我們本地倉庫的pom文件E:\maven\repository\com\sun\jersey\jersey-project\1.19.1\jersey-project-1.19.1.pom解析出錯(cuò),然后我們?nèi)ゴ四夸浵?,可以發(fā)現(xiàn)這個(gè)文件未被下載完整。

最后的解決方式是刪除此文件的父目錄,重新打包,則會(huì)自動(dòng)下載一份完整的pom文件,警告消失,打包成功。

4.3 OkToRetryOnAllOperations和RequestSpecificRetryOn失效

在上文的例子中,消費(fèi)者服務(wù)調(diào)用的生產(chǎn)者服務(wù)接口是GET類型,自動(dòng)重試沒有任何問題。

接著,本人嘗試讓消費(fèi)者調(diào)用生產(chǎn)者服務(wù)的POST接口,同時(shí)仍然設(shè)置了ribbon.OkToRetryOnAllOperations=true,結(jié)果無法成功重試,然后去調(diào)試ribbon源碼,查看自動(dòng)重試機(jī)制,經(jīng)查,OkToRetryOnAllOperations和RequestSpecificRetryOn屬性可以成功獲取到,但RequestSpecificRetryOn并未被獲取出來使用,疑似Ribbon的bug。

這里記錄一下調(diào)試的重要部分,

(1)Ribbon配置屬性類com.netflix.client.config.CommonClientConfigKey;

(2)Ribbon判斷是否重試:

所以,單獨(dú)使用Ribbon需謹(jǐn)慎!

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

平邑县| 平武县| 桐城市| 辉南县| 安徽省| 临泽县| 玉田县| 清远市| 东宁县| 铁岭县| 勐海县| 耿马| 盐津县| 溧水县| 武汉市| 遂宁市| 平定县| 江永县| 文水县| 南通市| 鱼台县| 松潘县| 峨眉山市| 无锡市| 文登市| 台江县| 婺源县| 莆田市| 阳山县| 淄博市| 嘉荫县| 清远市| 万源市| 大渡口区| 新蔡县| 晋江市| 临沭县| 抚州市| 黄浦区| 阜平县| 昭苏县|