真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

spring中CloudNetflixHystrix彈性客戶端的示例分析

這篇文章主要介紹spring中CloudNetflix Hystrix彈性客戶端的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

創(chuàng)新互聯(lián)公司是一個技術(shù)型專業(yè)網(wǎng)站制作公司,致力于為廣大企業(yè)、創(chuàng)業(yè)者打造切實有效的PC站、WAP站、APP站點等企業(yè)網(wǎng)站。無論是企業(yè)宣傳的全網(wǎng)整合營銷推廣、致力于營銷的電商網(wǎng)站、內(nèi)容資訊分享的各行業(yè)網(wǎng)站或其他類型網(wǎng)站,我們都從網(wǎng)站前期定位分析策劃、技術(shù)架構(gòu),到網(wǎng)站界面設(shè)計、創(chuàng)意表現(xiàn)、站點架構(gòu)搭建以及后續(xù)訪問監(jiān)控、維護、網(wǎng)站托管運營反饋建議等提供整套服務(wù)。

一、為什么要有客戶端彈性模式

所有的系統(tǒng)都會遇到故障,分布式系統(tǒng)單點故障概率更高。如何構(gòu)建應(yīng)用程序來應(yīng)對故障,是每個軟件開發(fā)人員工作的關(guān)鍵部分。但是通常在構(gòu)建系統(tǒng)時,大多數(shù)工程師只考慮到基礎(chǔ)設(shè)施或關(guān)鍵服務(wù)徹底發(fā)生故障,使用諸如集群關(guān)鍵服務(wù)器、服務(wù)間的負載均衡以及異地部署等技術(shù)。盡管這些方法考慮到組件系統(tǒng)的徹底故障,但他們之解決了構(gòu)建彈性系統(tǒng)的一小部分問題。當服務(wù)崩潰時,很容易檢測到該服務(wù)以及失效,因此應(yīng)用程序可以饒過它。然而,當服務(wù)運行緩慢時,檢測到這個服務(wù)性能越發(fā)低下并繞過它是非常困難的,因為以下幾個原因:

  • 服務(wù)的降級可以是以間歇性的故障開始,并形成不可逆轉(zhuǎn)的勢頭————可能開始只是一小部分服務(wù)調(diào)用變慢,直到突然間應(yīng)用程序容器耗盡了線程(所有線程都在等待調(diào)用完成)并徹底崩潰。

  • 應(yīng)用程序通常的設(shè)計是處理遠程資源的徹底故障,而不是部分降級————通常,只要服務(wù)沒有完全死掉,應(yīng)用程序?qū)⒗^續(xù)調(diào)用這個服務(wù),直到資源耗盡崩潰。

性能較差的遠程服務(wù)會導(dǎo)致很大的潛在問題,它們不僅難以檢測,還會觸發(fā)連鎖反應(yīng),從而影響整個應(yīng)用程序生態(tài)系統(tǒng)。如果沒有適當?shù)谋Wo措施,一個性能不佳的服務(wù)可以迅速拖垮整個應(yīng)用程序?;谠?、基于微服務(wù)的應(yīng)用程序特別容易受到這些類型的終端影響,因為這些應(yīng)用由大量細粒度的分布式服務(wù)組成,這些服務(wù)在完成用戶的事務(wù)時涉及不同的基礎(chǔ)設(shè)施。

二、什么是客戶端彈性模式

客戶端彈性模式是在遠程服務(wù)發(fā)生錯誤或表現(xiàn)不佳時保護遠程資源(另一個微服務(wù)調(diào)用或者數(shù)據(jù)庫查詢)免于崩潰。這些模式的目標是為了能讓客戶端“快速失敗”,不消耗諸如數(shù)據(jù)庫連接、線程池之類的資源,還可以避免遠程服務(wù)的問題向客戶端的消費者進行傳播,引發(fā)“雪崩”效應(yīng)。spring cloud 主要使用的有四種客戶端彈性模式:

客戶端負載均衡(client load balance)模式

斷路器(circuit breaker)模式

本模式模仿的是電路中的斷路器。有了軟件斷路器,當遠程服務(wù)被調(diào)用時,斷路器將監(jiān)視這個調(diào)用,如果調(diào)用時間太長,斷路器將介入并中斷調(diào)用。此外,如果對某個遠程資源的調(diào)用失敗次數(shù)達到某個閾值,將會采取快速失敗策略,阻止將來調(diào)用失敗的遠程資源。

后備(fallback)模式

當遠程調(diào)用失敗時,將執(zhí)行替代代碼路徑,并嘗試通過其他方式來處理操作,而不是產(chǎn)生一個異常。也就是為遠程操作提供一個應(yīng)急措施,而不是簡單的拋出異常。

艙壁(bulkhead)模式

艙壁模式是建立在造船的基礎(chǔ)概念上。我們都知道一艘船會被劃分為多個水密艙(艙壁),因而即使少數(shù)幾個部位被擊穿漏水,整艘船并不會被淹沒。將這個概念帶入到遠程調(diào)用中,如果所有調(diào)用都使用的是同一個線程池來處理,那么很有可能一個緩慢的遠程調(diào)用會拖垮整個應(yīng)用程序。在艙壁模式中可以隔離每個遠程資源,并分配各自的線程池,使之互不影響。

下圖展示了這些模式是如何運用到微服務(wù)中的:

spring中CloudNetflix Hystrix彈性客戶端的示例分析

三、spring cloud 中使用

使用 Netflix 的 Hystrix 庫來實現(xiàn)上述彈性模式。繼續(xù)使用上一節(jié)的項目,給 licensingservice 服務(wù)實現(xiàn)彈性模式。

1、代碼修改

依賴引入

首先修改 POM 文件,添加下面兩個依賴:


org.springframework.cloud
spring-cloud-starter-hystrix



com.netflix.hystrix
hystrix-javanica
1.5.9

然后在啟動類上加入@EnableCircuitBreaker啟用 Hystrix。

2、實現(xiàn)斷路器

首先修改 organizationservice 項目中的 OrganizationController,模擬延遲,每隔兩次讓線程 sleep 2 秒

@RestController
public class OrganizationController {
private static int count=1;
@GetMapping(value = "/organization/{orgId}")
public Object getOrganizationInfo(@PathVariable("orgId") String orgId) throws Exception{
if(count%2==0){
TimeUnit.SECONDS.sleep(2);
}
count++;
Map data = new HashMap<>(2);
data.put("id", orgId);
data.put("name", orgId + "公司");
return data;
}
}

只需在方法上添加@HystrixCommand,即可實現(xiàn)超時短路。如果 Spring 掃描到該注解注釋的類,它將動態(tài)生成一個代理,來包裝這個方法,并通過專門用于處理遠程調(diào)用的線程池來管理對該方法的所有調(diào)用。

修改 licensingservice 服務(wù)中的 OrganizationByRibbonService,OrganizationFeignClient,給其中的方法加上@HystrixCommand的注解。

然后再訪問接口localhost:10011/licensingByRibbon/11313,localhost:10011/licensingByFeign/11313。多次訪問可發(fā)現(xiàn)拋出錯誤com.netflix.hystrix.exception.HystrixRuntimeException,斷路器生效,默認情況下操時時間為 1s。

{
"timestamp": 1543823192424,
"status": 500,
"error": "Internal Server Error",
"exception": "com.netflix.hystrix.exception.HystrixRuntimeException",
"message": "OrganizationFeignClient#getOrganization(String) timed-out and no fallback available.",
"path": "/licensingByFeign/11313/"
}

可通過設(shè)置注解參數(shù)來修改操時時間。設(shè)置超時時間大于 2s 后便不會報操時錯誤。(不知道為什么在 Feign 中設(shè)置失敗,ribbon 中正常。)。一般都是將配置寫在配置文件中。

@HystrixCommand(commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "20000")
})

3、后備處理

由于遠程資源的消費者和資源本身之間存在存在一個"中間人",因此開發(fā)人員能夠攔截服務(wù)故障,并選擇替代方案。在 Hystrix 中進行后備處理,非常容易實現(xiàn)。

1.在ribbon 中的實現(xiàn)

只需在@HystrixCommand注解中加入屬性 fallbackMethod="methodName",那么在執(zhí)行失敗時,便會執(zhí)行后備方法。注意防備方法必須和被保護方法在同一個類中,并且方法簽名必須相同。修改 licensingservice 中 service 包下的 OrganizationByRibbonService 類,改為如下:

@Component
public class OrganizationByRibbonService {
private RestTemplate restTemplate;
@Autowired
public OrganizationByRibbonService(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@HystrixCommand(commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000")
},fallbackMethod = "getOrganizationWithRibbonBackup")
public Organization getOrganizationWithRibbon(String id) throws Exception {
ResponseEntity responseEntity = restTemplate.exchange("http://organizationservice/organization/{id}",
HttpMethod.GET, null, Organization.class, id);
return responseEntity.getBody();
}
public Organization getOrganizationWithRibbonBackup(String id)throws Exception{
Organization organization = new Organization();
organization.setId("0");
organization.setName("組織服務(wù)調(diào)用失敗");
return organization;
}
}

啟動應(yīng)用,多次訪問localhost:10011/licensingByRibbon/11313/,可以發(fā)現(xiàn)調(diào)用失敗時,會啟用后備方法。

2.在feign 中實現(xiàn)

在 feign 中實現(xiàn)后備模式,需要編寫一個 feign 接口的實現(xiàn)類,然后在 feign 接口中指定該類。以 licensingservice 為例。首先在 client 包中添加一個 OrganizationFeignClientImpl 類,代碼如下:

@Component
public class OrganizationFeignClientImpl implements OrganizationFeignClient{
@Override
public Organization getOrganization(String orgId) {
Organization organization=new Organization();
organization.setId("0");
organization.setName("后備模式返回的數(shù)據(jù)");
return organization;
}
}

然后修改 OrganizationFeignClient 接口的注解,將@FeignClient("organizationservice")改為@FeignClient(name="organizationservice",fallback = OrganizationFeignClientImpl.class。

重啟項目,多次訪問localhost:10011/licensingByFeign/11313/,可發(fā)現(xiàn)后備服務(wù)起作用了。

在確認是否要啟用后備服務(wù)時,要注意以下兩點:

  • 后備是一種在資源操時或失敗時提供行動方案的機制。如果只是用后備來捕獲操時異常然后只做日志記錄,那只需要 try..catch 即可,捕獲 HystrixRuntimeException 異常。

  • 注意后備方法所執(zhí)行的操作。如果在后備服務(wù)中調(diào)用另一個分布式服務(wù),需要注意用@HystrixCommand 方法注解包裝后備方法。

4、實現(xiàn)艙壁模式

在基于微服務(wù)的應(yīng)用程序中,通常需要調(diào)用多個微服務(wù)來完成特定的任務(wù),在不適用艙壁的模式下,這些調(diào)用默認是使用同一批線程來執(zhí)行調(diào)用的,而這些線程是為了處理整個 Java 容器的請求而預(yù)留的。因此在存在大量請求的情況下,一個服務(wù)出現(xiàn)性能問題會導(dǎo)致 Java 容器內(nèi)的所有線程被占用,同時阻塞新請求,最終容器徹底崩潰。

Hystrix 使用線程池來委派所有對遠程服務(wù)的調(diào)用,默認情況下這個線程池有 10 個工作線程。但是這樣很容易出現(xiàn)一個運行緩慢的服務(wù)占用全部的線程,所有 hystrix 提供了一種一種易于使用的機制,在不同的遠程資源調(diào)用間創(chuàng)建‘艙壁',將不同服務(wù)的調(diào)用隔離到不同的線程池中,使之互不影響。

要實現(xiàn)隔離的線程池,只需要在@HystrixCommand上加入線程池的注解,這里以 ribbon 為例(Feign 類似)。修改 licensingservice 中 service 包下的 OrganizaitonByRibbonService 類,將getOrganizationWithRibbon方法的注解改為如下:

@HystrixCommand(commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000")
}, fallbackMethod = "getOrganizationWithRibbonBackup",
threadPoolKey = "licenseByOrgThreadPool",
threadPoolProperties = {
@HystrixProperty(name = "coreSize", value = "30"),
@HystrixProperty(name = "maxQueueSize", value = "10")
})

如果將maxQueueSize屬性值設(shè)為-1,將使用SynchronousQueue保存所有的傳入請求,同步隊列會強制要求正在處理中的請求數(shù)量永遠不能超過線程池的大小。設(shè)為大于 1 的值將使用LinkedBlockingQueue。

注意:示例代碼中都是硬編碼屬性值到 Hystrix 注解中的。在實際應(yīng)用環(huán)境中,一般都是將配置項配置在 Spring Cloud Config 中的,方便統(tǒng)一管理。

以上是“spring中CloudNetflix Hystrix彈性客戶端的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


新聞名稱:spring中CloudNetflixHystrix彈性客戶端的示例分析
網(wǎng)址分享:http://weahome.cn/article/gdhehp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部