摘要:上一節(jié)我們使用了基于進行微服務(wù)的調(diào)用,的調(diào)用比較簡單,通過組件對請求的服務(wù)進行攔截,通過獲取到服務(wù)實例的然后再去調(diào)用。為了代碼的重用性,我們來創(chuàng)建一個新的作為的服務(wù)調(diào)用工具。
上一節(jié)我們使用了Ribbon(基于Http/Tcp)進行微服務(wù)的調(diào)用,Ribbon的調(diào)用比較簡單,通過Ribbon組件對請求的服務(wù)進行攔截,通過Eureka Server 獲取到服務(wù)實例的IP:Port,然后再去調(diào)用API。本節(jié)課我們使用更簡單的方式來實現(xiàn),使用聲明式的Web服務(wù)客戶端Feign,我們只需要使用Feign來聲明接口,利用注解來進行配置就可以使用了,是不是很簡單?實際工作中,我們也只會用到Feign來進行服務(wù)之間的調(diào)用(大多數(shù))。接下來,我們來實例操作一把。
為了代碼的重用性,我們來創(chuàng)建一個新的project mscx-ad-feign-sdk作為Feign的服務(wù)調(diào)用工具。
創(chuàng)建項目mscx-ad-feign-sdk
三部曲之Step 1(加依賴)
mscx-ad com.sxzhongf 1.0-SNAPSHOT 4.0.0 jar mscx-ad-feign-sdk 只定義微服務(wù)Feign調(diào)用用到的請求對象和響應(yīng)對象,而不涉及具體的實現(xiàn)類。 com.sxzhongf mscx-ad-feign-sdk 1.0-SNAPSHOT org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter-openfeign com.sxzhongf mscx-ad-common 1.0-SNAPSHOT org.springframework.cloud spring-cloud-starter-hystrix 1.2.7.RELEASE org.springframework.boot spring-boot-maven-plugin
三部曲之Step 2(加注解@EnableFeignClients,添加在具體的微服務(wù)中,使用我們自定義的FeignClient)
/** * ISponsorFeignClient for service using * * @author Isaac.Zhang | 若初 */ @FeignClient(value = "mscx-ad-sponsor", fallback = SponsorClientHystrix.class) public interface ISponsorFeignClient { @RequestMapping(value = "/ad-sponsor/plan/get", method = RequestMethod.POST) CommonResponse> getAdPlansUseFeign(@RequestBody AdPlanGetRequestVO requestVO); @RequestMapping(value = "/ad-sponsor/user/get", method = RequestMethod.GET) /** * Feign 埋坑之 如果是Get請求,必須在所有參數(shù)前添加{@link RequestParam},不能使用{@link Param} * 會被自動轉(zhuǎn)發(fā)為POST請求。 */ CommonResponse getUsers(@RequestParam(value = "username") String username); } --- @RestController @Slf4j @RequestMapping(path = "/search-feign") public class SearchFeignController { /** * 注入我們自定義的FeignClient */ private final ISponsorFeignClient sponsorFeignClient; @Autowired public SearchFeignController(ISponsorFeignClient sponsorFeignClient) { this.sponsorFeignClient = sponsorFeignClient; } @GetMapping(path = "/user/get") public CommonResponse getUsers(@Param(value = "username") String username) { log.info("ad-search::getUsersFeign -> {}", JSON.toJSONString(username)); CommonResponse commonResponse = sponsorFeignClient.getUsers(username); return commonResponse; } }
三部曲之Step 3(加配置,工具類庫不需要,添加在具體的微服務(wù)中)
我們上面的實例中有一個問題,如果說我們的廣告提供服務(wù)出現(xiàn)了問題,那么我們通過使用FeignClient 調(diào)用的APIsponsorFeignClient.getUsers(username);就會報錯,如果長時間報錯,會引起大規(guī)模的服務(wù)錯誤問題,也就有是我們常說的服務(wù)雪崩效應(yīng),我們要怎樣避免一個服務(wù)出錯而拖垮整個系統(tǒng)的問題呢?這里我們需要引入一個組件Hystrix來處理服務(wù)錯誤。
三部曲之Step1(加依賴)
從上圖我們可以看到,我們引入Feign依賴的時候,它本身已經(jīng)依賴了Hystrix,根據(jù)Maven依賴的傳遞性,我們可以知道我們自己的服務(wù)已經(jīng)包含了Hystrix的依賴支持,我們可以直接使用了~
三部曲之Step2(加注解) @EnableHystrix // 開啟hystrix 斷路器
三部曲之Step3(改配置)
feign: hystrix: enabled: true
使用Hystrix來配置Feign實現(xiàn)調(diào)用容錯
@Component public class SponsorClientHystrix implements ISponsorFeignClient { @Override public CommonResponse> getAdPlansUseFeign(AdPlanGetRequestVO requestVO) { return new CommonResponse<>(-1, "mscx-ad-sponsor feign & hystrix get plan error."); } @Override public CommonResponse getUsers(String username) { return new CommonResponse<>(-1, "mscx-ad-sponsor feign & hystrix get user error."); } }
在ISponsorFeignClient類中,添加出錯處理類(fallback)
@FeignClient(value = "mscx-ad-sponsor", fallback = SponsorClientHystrix.class) public interface ISponsorFeignClient { ...
在SponsorClientHystrix中,我們要特別注意2點
該類必須添加@Component注解,以便可以加入Spring 容器中
該類需要實現(xiàn)ISponsorFeignClientFeign的客戶端接口
通過上面的實現(xiàn),我們的服務(wù)在調(diào)用過程中,如果發(fā)生錯誤,就會進行服務(wù)降級,調(diào)用到出錯應(yīng)該調(diào)用的默認處理類中的方法,也就實現(xiàn)了我們想要做的短路處理來保護我們的當前服務(wù)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/75804.html
摘要:在前面的過程中,我們創(chuàng)建了個服務(wù)發(fā)現(xiàn)我們使用作為服務(wù)發(fā)現(xiàn)組件,學(xué)習了的使用。加依賴加注解改配置使用項目三部曲,我們可以快速添加一個新組件,并正常使用這個我沒有在項目中實現(xiàn),但是大家可以和一樣,三部曲搞定。 在前面的過程中,我們創(chuàng)建了4個project: 服務(wù)發(fā)現(xiàn) 我們使用Eureka 作為服務(wù)發(fā)現(xiàn)組件,學(xué)習了Eureka Server,Eureka Client的使用。 Eureka...
摘要:搜索系統(tǒng)啟動主類廣告搜索服務(wù)啟動類若初啟動客戶端,為了訪問其他微服務(wù)開啟服務(wù)發(fā)現(xiàn)組件,在這里等同于開啟斷路器斷路器開啟監(jiān)控配置文件請求的根路徑請求前綴,在的之前,需要執(zhí)行時是否打印語句,方便調(diào)試控制是否在懶加載時,有可能會 搜索系統(tǒng)啟動主類 /** * AdSearchApplication for 廣告搜索服務(wù)啟動類 * * @author Isaac.Zhang | 若初 ...
摘要:工作流程項目依賴監(jiān)控面板引入服務(wù)調(diào)用的組件依賴引入服務(wù)消費者的依賴數(shù)據(jù)庫鏈接依賴工具類集合類操作日志監(jiān)聽解析開源工具類庫中的配置相關(guān)依賴圖片壓縮 工作流程 showImg(https://i.loli.net/2019/07/29/5d3ee1829df4d57461.png); 項目依賴 org.springframewo...
摘要:在使用調(diào)用廣告投放系統(tǒng)之前,我們需要先創(chuàng)建個對象,數(shù)據(jù)請求對象請求響應(yīng)結(jié)果反序列化對象在啟動類中,添加客戶端。注冊讓在調(diào)用服務(wù)的時候,可以實現(xiàn)負載均衡創(chuàng)建一個,來測試調(diào)用廣告提供系統(tǒng)的若初注入 在使用Ribbon調(diào)用廣告投放系統(tǒng)API之前,我們需要先創(chuàng)建2個VO對象,AdPlanVO,AdPlanGetRequestVO. //數(shù)據(jù)請求對象 @Data @NoArgsConstruct...
摘要:是一個相對比較新的微服務(wù)框架,年才推出的版本雖然時間最短但是相比等框架提供的全套的分布式系統(tǒng)解決方案。提供線程池不同的服務(wù)走不同的線程池,實現(xiàn)了不同服務(wù)調(diào)用的隔離,避免了服務(wù)器雪崩的問題。通過互相注冊的方式來進行消息同步和保證高可用。 Spring Cloud 是一個相對比較新的微服務(wù)框架,...
閱讀 1653·2019-08-30 15:44
閱讀 2576·2019-08-30 11:19
閱讀 407·2019-08-30 11:06
閱讀 1570·2019-08-29 15:27
閱讀 3088·2019-08-29 13:44
閱讀 1631·2019-08-28 18:28
閱讀 2361·2019-08-28 18:17
閱讀 1991·2019-08-26 10:41