摘要:上一節我們使用了基于進行微服務的調用,的調用比較簡單,通過組件對請求的服務進行攔截,通過獲取到服務實例的然后再去調用。為了代碼的重用性,我們來創建一個新的作為的服務調用工具。
上一節我們使用了Ribbon(基于Http/Tcp)進行微服務的調用,Ribbon的調用比較簡單,通過Ribbon組件對請求的服務進行攔截,通過Eureka Server 獲取到服務實例的IP:Port,然后再去調用API。本節課我們使用更簡單的方式來實現,使用聲明式的Web服務客戶端Feign,我們只需要使用Feign來聲明接口,利用注解來進行配置就可以使用了,是不是很簡單?實際工作中,我們也只會用到Feign來進行服務之間的調用(大多數)。接下來,我們來實例操作一把。
為了代碼的重用性,我們來創建一個新的project mscx-ad-feign-sdk作為Feign的服務調用工具。
創建項目mscx-ad-feign-sdk
三部曲之Step 1(加依賴)
mscx-ad com.sxzhongf 1.0-SNAPSHOT 4.0.0 jar mscx-ad-feign-sdk 只定義微服務Feign調用用到的請求對象和響應對象,而不涉及具體的實現類。 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,添加在具體的微服務中,使用我們自定義的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請求,必須在所有參數前添加{@link RequestParam},不能使用{@link Param} * 會被自動轉發為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(加配置,工具類庫不需要,添加在具體的微服務中)
我們上面的實例中有一個問題,如果說我們的廣告提供服務出現了問題,那么我們通過使用FeignClient 調用的APIsponsorFeignClient.getUsers(username);就會報錯,如果長時間報錯,會引起大規模的服務錯誤問題,也就有是我們常說的服務雪崩效應,我們要怎樣避免一個服務出錯而拖垮整個系統的問題呢?這里我們需要引入一個組件Hystrix來處理服務錯誤。
三部曲之Step1(加依賴)
從上圖我們可以看到,我們引入Feign依賴的時候,它本身已經依賴了Hystrix,根據Maven依賴的傳遞性,我們可以知道我們自己的服務已經包含了Hystrix的依賴支持,我們可以直接使用了~
三部曲之Step2(加注解) @EnableHystrix // 開啟hystrix 斷路器
三部曲之Step3(改配置)
feign: hystrix: enabled: true
使用Hystrix來配置Feign實現調用容錯
@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 容器中
該類需要實現ISponsorFeignClientFeign的客戶端接口
通過上面的實現,我們的服務在調用過程中,如果發生錯誤,就會進行服務降級,調用到出錯應該調用的默認處理類中的方法,也就實現了我們想要做的短路處理來保護我們的當前服務。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75804.html
摘要:在前面的過程中,我們創建了個服務發現我們使用作為服務發現組件,學習了的使用。加依賴加注解改配置使用項目三部曲,我們可以快速添加一個新組件,并正常使用這個我沒有在項目中實現,但是大家可以和一樣,三部曲搞定。 在前面的過程中,我們創建了4個project: 服務發現 我們使用Eureka 作為服務發現組件,學習了Eureka Server,Eureka Client的使用。 Eureka...
摘要:搜索系統啟動主類廣告搜索服務啟動類若初啟動客戶端,為了訪問其他微服務開啟服務發現組件,在這里等同于開啟斷路器斷路器開啟監控配置文件請求的根路徑請求前綴,在的之前,需要執行時是否打印語句,方便調試控制是否在懶加載時,有可能會 搜索系統啟動主類 /** * AdSearchApplication for 廣告搜索服務啟動類 * * @author Isaac.Zhang | 若初 ...
摘要:工作流程項目依賴監控面板引入服務調用的組件依賴引入服務消費者的依賴數據庫鏈接依賴工具類集合類操作日志監聽解析開源工具類庫中的配置相關依賴圖片壓縮 工作流程 showImg(https://i.loli.net/2019/07/29/5d3ee1829df4d57461.png); 項目依賴 org.springframewo...
摘要:在使用調用廣告投放系統之前,我們需要先創建個對象,數據請求對象請求響應結果反序列化對象在啟動類中,添加客戶端。注冊讓在調用服務的時候,可以實現負載均衡創建一個,來測試調用廣告提供系統的若初注入 在使用Ribbon調用廣告投放系統API之前,我們需要先創建2個VO對象,AdPlanVO,AdPlanGetRequestVO. //數據請求對象 @Data @NoArgsConstruct...
摘要:是一個相對比較新的微服務框架,年才推出的版本雖然時間最短但是相比等框架提供的全套的分布式系統解決方案。提供線程池不同的服務走不同的線程池,實現了不同服務調用的隔離,避免了服務器雪崩的問題。通過互相注冊的方式來進行消息同步和保證高可用。 Spring Cloud 是一個相對比較新的微服務框架,...
閱讀 1642·2019-08-30 15:44
閱讀 2566·2019-08-30 11:19
閱讀 394·2019-08-30 11:06
閱讀 1557·2019-08-29 15:27
閱讀 3077·2019-08-29 13:44
閱讀 1621·2019-08-28 18:28
閱讀 2353·2019-08-28 18:17
閱讀 1980·2019-08-26 10:41