摘要:添加訪問遠(yuǎn)端用戶微服務(wù)類客戶端回退機(jī)制類。添加訪問層添加電影微服務(wù)啟動(dòng)類電影微服務(wù)接入,添加屬性來觸發(fā)請(qǐng)求進(jìn)行容災(zāi)降級(jí)。注解表示該電影微服務(wù)已經(jīng)接入模塊。
SpringCloud(第 017 篇)電影微服務(wù)接入Feign,添加 fallbackFactory 屬性來觸發(fā)請(qǐng)求進(jìn)行容災(zāi)降級(jí)
-
一、大致介紹1、在一些場(chǎng)景中,簡(jiǎn)單的觸發(fā)在 FeignClient 加入 Fallback 屬性即可,而另外有一些場(chǎng)景需要訪問導(dǎo)致回退觸發(fā)的原因,那么這個(gè)時(shí)候可以在 FeignClient 中加入 FallbackFactory 屬性即可; 2、而在使用 Fallback 和 FallbackFactory 時(shí)候,我僅僅表述個(gè)人觀點(diǎn),發(fā)現(xiàn)二者混合一起用的話,會(huì)發(fā)生沖突情況,所以大家用的時(shí)候注重考慮一下場(chǎng)景,二者屬性用其一即可。二、實(shí)現(xiàn)步驟 2.1 添加 maven 引用包
2.2 添加應(yīng)用配置文件(springms-consumer-movie-feign-with-hystrix-factorysrcmainresourcesapplication.yml)4.0.0 springms-consumer-movie-feign-with-hystrix-factory 1.0-SNAPSHOT jar com.springms.cloud springms-spring-cloud 1.0-SNAPSHOT org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter-eureka org.springframework.cloud spring-cloud-starter-feign org.springframework.cloud spring-cloud-starter-hystrix
spring: application: name: springms-consumer-movie-feign-with-hystrix-factory server: port: 8115 eureka: client: # healthcheck: # enabled: true serviceUrl: defaultZone: http://admin:admin@localhost:8761/eureka instance: prefer-ip-address: true instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}} # 解決第一次請(qǐng)求報(bào)超時(shí)異常的方案,因?yàn)?hystrix 的默認(rèn)超時(shí)時(shí)間是 1 秒,因此請(qǐng)求超過該時(shí)間后,就會(huì)出現(xiàn)頁(yè)面超時(shí)顯示 : # # 這里就介紹大概三種方式來解決超時(shí)的問題,解決方案如下: # # 第一種方式:將 hystrix 的超時(shí)時(shí)間設(shè)置成 5000 毫秒 hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000 # # 或者: # 第二種方式:將 hystrix 的超時(shí)時(shí)間直接禁用掉,這樣就沒有超時(shí)的一說了,因?yàn)橛肋h(yuǎn)也不會(huì)超時(shí)了 # hystrix.command.default.execution.timeout.enabled: false # # 或者: # 第三種方式:索性禁用feign的hystrix支持 # feign.hystrix.enabled: false ## 索性禁用feign的hystrix支持 # 超時(shí)的issue:https://github.com/spring-cloud/spring-cloud-netflix/issues/768 # 超時(shí)的解決方案: http://stackoverflow.com/questions/27375557/hystrix-command-fails-with-timed-out-and-no-fallback-available # hystrix配置: https://github.com/Netflix/Hystrix/wiki/Configuration#execution.isolation.thread.timeoutInMilliseconds2.3 添加實(shí)體用戶類User(springms-consumer-movie-feign-with-hystrix-factorysrcmainjavacomspringmscloudentityUser.java)
package com.springms.cloud.entity; import java.math.BigDecimal; public class User { private Long id; private String username; private String name; private Short age; private BigDecimal balance; public Long getId() { return this.id; } public void setId(Long id) { this.id = id; } public String getUsername() { return this.username; } public void setUsername(String username) { this.username = username; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public Short getAge() { return this.age; } public void setAge(Short age) { this.age = age; } public BigDecimal getBalance() { return this.balance; } public void setBalance(BigDecimal balance) { this.balance = balance; } }2.4 添加訪問遠(yuǎn)端用戶微服務(wù) Feign 客戶端(springms-consumer-movie-feign-with-hystrix-factorysrcmainjavacomspringmscloudfeignUserFeignHystrixFactoryClient.java)
package com.springms.cloud.feign; import com.springms.cloud.entity.User; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.*; /** * 用戶Http請(qǐng)求的客戶端。 * * 注解FeignClient的傳參:表示的是注冊(cè)到 Eureka 服務(wù)上的模塊名稱。 * * @author hmilyylimh * * @version 0.0.1 * * @date 2017/9/24 * */ @FeignClient(name = "springms-provider-user", /*fallback = HystrixClientFallback.class,*/ fallbackFactory = HystrixClientFallbackFactory.class) public interface UserFeignHystrixFactoryClient { /** * 這里有兩個(gè)坑需要注意:
* *
package com.springms.cloud.feign; import com.springms.cloud.entity.User; import org.springframework.stereotype.Component; /** * Hystrix 客戶端回退機(jī)制類。 * * 這里加上注解 Component 的目的:就是因?yàn)闆]有這個(gè)注解,運(yùn)行時(shí)候會(huì)報(bào)錯(cuò),報(bào)錯(cuò)會(huì)說沒有該類的這個(gè)實(shí)例,所以我們就想到要實(shí)例化這個(gè)類,因此加了這個(gè)注解。 * * @author hmilyylimh * * @version 0.0.1 * * @date 2017/9/24 * */ @Component public class HystrixClientFallback implements UserFeignHystrixFactoryClient { @Override public User findById(Long id) { System.out.println("======== findById Fallback " + Thread.currentThread().getThreadGroup() + " - " + Thread.currentThread().getId() + " - " + Thread.currentThread().getName()); User tmpUser = new User(); tmpUser.setId(0L); return tmpUser; } }2.6 添加訪問遠(yuǎn)端用戶微服務(wù) FallbackFactory 類(springms-consumer-movie-feign-with-hystrix-factorysrcmainjavacomspringmscloudfeignHystrixClientFallbackFactory.java)
package com.springms.cloud.feign; import com.springms.cloud.entity.User; import feign.hystrix.FallbackFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; /** * Hystrix 客戶端回退機(jī)制類。 * * 這里加上注解 Component 的目的:就是因?yàn)闆]有這個(gè)注解,運(yùn)行時(shí)候會(huì)報(bào)錯(cuò),報(bào)錯(cuò)會(huì)說沒有該類的這個(gè)實(shí)例,所以我們就想到要實(shí)例化這個(gè)類,因此加了這個(gè)注解。 * * @author hmilyylimh * * @version 0.0.1 * * @date 2017/9/24 * */ @Component public class HystrixClientFallbackFactory implements FallbackFactory2.7 添加回退處理客戶端類(springms-consumer-movie-feign-with-hystrix-factorysrcmainjavacomspringmscloudfeignUserFeignWithFallBackFactoryClient.java){ private static final Logger Logger = LoggerFactory.getLogger(HystrixClientFallbackFactory.class); @Override public UserFeignHystrixFactoryClient create(Throwable e) { Logger.info("fallback; reason was: {}", e.getMessage()); System.out.println("======== UserFeignHystrixFactoryClient.create " + Thread.currentThread().getThreadGroup() + " - " + Thread.currentThread().getId() + " - " + Thread.currentThread().getName()); return new UserFeignWithFallBackFactoryClient(){ @Override public User findById(Long id) { System.out.println("======== findById FallBackFactory " + Thread.currentThread().getThreadGroup() + " - " + Thread.currentThread().getId() + " - " + Thread.currentThread().getName()); User tmpUser = new User(); tmpUser.setId(-1L); return tmpUser; } }; } } /**************************************************************************************** @FeignClient(name = "hello", fallbackFactory = HystrixClientFallbackFactory.class) protected interface HystrixClient { @RequestMapping(method = RequestMethod.GET, value = "/hello") Hello iFailSometimes(); } @Component static class HystrixClientFallbackFactory implements FallbackFactory { @Override public HystrixClient create(Throwable cause) { return new HystrixClientWithFallBackFactory() { @Override public Hello iFailSometimes() { return new Hello("fallback; reason was: " + cause.getMessage()); } }; } } ****************************************************************************************/
package com.springms.cloud.feign; /** * 回退處理客戶端。 * * @author hmilyylimh * * @version 0.0.1 * * @date 2017/9/24 * */ public interface UserFeignWithFallBackFactoryClient extends UserFeignHystrixFactoryClient{ }2.8 添加Web訪問層Controller(springms-consumer-movie-feign-with-hystrix-factorysrcmainjavacomspringmscloudcontrollerMovieFeignHystrixFactoryController.java)
package com.springms.cloud.controller; import com.springms.cloud.entity.User; import com.springms.cloud.feign.UserFeignHystrixFactoryClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController public class MovieFeignHystrixFactoryController { @Autowired private UserFeignHystrixFactoryClient userFeignHystrixFactoryClient; @GetMapping("/movie/{id}") public User findById(@PathVariable Long id) { System.out.println("======== findById Controller " + Thread.currentThread().getThreadGroup() + " - " + Thread.currentThread().getId() + " - " + Thread.currentThread().getName()); return userFeignHystrixFactoryClient.findById(id); } }2.9 添加電影微服務(wù)啟動(dòng)類(springms-consumer-movie-feign-custom-without-hystrixsrcmainjavacomspringmscloudMsConsumerMovieFeignCustomWithoutHystrixApplication.java)
package com.springms.cloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.feign.EnableFeignClients; /** * 電影微服務(wù)接入Feign,添加 fallbackFactory 屬性來觸發(fā)請(qǐng)求進(jìn)行容災(zāi)降級(jí)。 * * Feign: Java HTTP 客戶端開發(fā)的工具。 * * 注解 EnableFeignClients 表示該電影微服務(wù)已經(jīng)接入 Feign 模塊。 * * @author hmilyylimh * * @version 0.0.1 * * @date 2017/9/24 * */ @SpringBootApplication @EnableEurekaClient @EnableFeignClients public class MsConsumerMovieFeignHystrixFactoryApplication { public static void main(String[] args) { SpringApplication.run(MsConsumerMovieFeignHystrixFactoryApplication.class, args); System.out.println("【【【【【【 電影Feign-HystrixFactory微服務(wù) 】】】】】】已啟動(dòng)."); } }三、測(cè)試
/**************************************************************************************** 一、電影微服務(wù)接入Feign,添加 fallbackFactory 屬性來觸發(fā)請(qǐng)求進(jìn)行容災(zāi)降級(jí)(測(cè)試正常接入功能): 1、注解:EnableFeignClients; 2、編寫類 HystrixClientFallbackFactory 回退處理機(jī)制類,并給該類加上注解 Component ;加入 FeignClient 注解 // @FeignClient(name = "springms-provider-user", fallback = HystrixClientFallback.class ) 3、啟動(dòng) springms-discovery-eureka 模塊服務(wù),啟動(dòng)1個(gè)端口; 4、啟動(dòng) springms-provider-user 模塊服務(wù),啟動(dòng)1個(gè)端口; 5、啟動(dòng) springms-consumer-movie-feign-with-hystrix-factory 模塊服務(wù); 6、在瀏覽器輸入地址 http://localhost:8115/movie/1 可以看到具體的用戶信息(即用戶ID != 0 的用戶)成功的被打印出來; ****************************************************************************************/ /**************************************************************************************** 二、電影FeignHystrix-HystrixFactory微服務(wù)接入 HystrixFactory 功能模塊(測(cè)試斷路器功能): 1、注解:EnableFeignClients; 2、編寫類 HystrixClientFallbackFactory 回退處理機(jī)制類,并給該類加上注解 Component,UserFeignHystrixFactoryClient 加上 fallbackFactory 屬性; // @FeignClient(name = "springms-provider-user", fallback = HystrixClientFallback.class, fallbackFactory = HystrixClientFallbackFactory.class ) 3、啟動(dòng) springms-discovery-eureka 模塊服務(wù),啟動(dòng)1個(gè)端口; 4、啟動(dòng) springms-provider-user 模塊服務(wù),啟動(dòng)1個(gè)端口; 5、啟動(dòng) springms-consumer-movie-feign-with-hystrix-factory 模塊服務(wù); 6、在瀏覽器輸入地址 http://localhost:8115/movie/1 可以看到具體的用戶信息(即用戶ID != 0 的用戶)成功的被打印出來; 7、停止 springms-provider-user 模塊服務(wù); 8、在瀏覽器輸入地址http://localhost:8115/movie/1 可以看到用戶信息ID = 0 的用戶成功的被打印出來,但隨著問題也來了; 9、HystrixClientFallbackFactory 截獲的異常卻沒有被打印出來,本來用戶微服務(wù)停止的話,請(qǐng)求鏈接就已經(jīng)鏈接超時(shí)了,但是為啥異常沒有打印出來呢?請(qǐng)看下面第三中測(cè)試方法。 ****************************************************************************************/ /**************************************************************************************** 三、電影FeignHystrix-HystrixFactory微服務(wù)接入 HystrixFactory 功能模塊(測(cè)試斷路器功能): 1、注解:EnableFeignClients; 2、編寫類 HystrixClientFallbackFactory 回退處理機(jī)制類,并給該類加上注解 Component,UserFeignHystrixFactoryClient 去掉 fallback 屬性,然后加上 fallbackfactory 屬性; // @FeignClient(name = "springms-provider-user", fallbackFactory = HystrixClientFallbackFactory.class ) 3、啟動(dòng) springms-discovery-eureka 模塊服務(wù),啟動(dòng)1個(gè)端口; 4、啟動(dòng) springms-provider-user 模塊服務(wù),啟動(dòng)1個(gè)端口; 5、啟動(dòng) springms-consumer-movie-feign-with-hystrix-factory 模塊服務(wù); 6、在瀏覽器輸入地址 http://localhost:8115/movie/1 可以看到具體的用戶信息(即用戶ID != 0 的用戶)成功的被打印出來; 7、停止 springms-provider-user 模塊服務(wù); 8、在瀏覽器輸入地址http://localhost:8115/movie/1 可以看到用戶信息ID = -1 的用戶成功的被打印出來,而且異常信息日志也被打印出來了,這就正常了; 注意:第2步驟:UserFeignHystrixFactoryClient 去掉 fallback 屬性,然后加上 fallbackfactory 屬性; 所以這里目前暫時(shí)謹(jǐn)記,fallback 和 fallbackfactory 屬性會(huì)有沖突,所以只要其一就行了; ****************************************************************************************/四、下載地址
https://gitee.com/ylimhhmily/SpringCloudTutorial.git
SpringCloudTutorial交流QQ群: 235322432
SpringCloudTutorial交流微信群: 微信溝通群二維碼圖片鏈接
歡迎關(guān)注,您的肯定是對(duì)我最大的支持!!!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70556.html
摘要:添加電影微服務(wù)啟動(dòng)類電影微服務(wù)接入進(jìn)行客戶端負(fù)載均衡,通過調(diào)用遠(yuǎn)程微服務(wù)。注解表示該電影微服務(wù)已經(jīng)接入模塊。 SpringCloud(第 012 篇)電影微服務(wù)接入 Feign 進(jìn)行客戶端負(fù)載均衡,通過 FeignClient 調(diào)用遠(yuǎn)程 Http 微服務(wù) - 一、大致介紹 1、本章節(jié)主要介紹在 SpringCloud 生態(tài)圈中,使用一個(gè)類似于 Java HTTP 客戶端的工具 Feig...
摘要:不和在同級(jí)目錄,因?yàn)槲臋n有說明,該配置文件不需要被掃描到。添加訪問層自定義控制器。添加電影微服務(wù)啟動(dòng)類電影微服務(wù)使用定制化在客戶端進(jìn)行負(fù)載均衡調(diào)度并為配置帳號(hào)密碼登錄認(rèn)證。注解表示該電影微服務(wù)已經(jīng)接入模塊。 SpringCloud(第 013 篇)電影微服務(wù)使用定制化 Feign 在客戶端進(jìn)行負(fù)載均衡調(diào)度并為 Feign 配置帳號(hào)密碼登錄認(rèn)證 Eureka - 一、大致介紹 1、定制 ...
摘要:在該配置中,加入這個(gè)方法的話,表明使用了該配置的地方,就會(huì)禁用該模塊使用容災(zāi)降級(jí)的功能添加訪問層添加電影微服務(wù)啟動(dòng)類電影微服務(wù),定制,一個(gè)功能禁用,另一個(gè)功能啟用。 SpringCloud(第 016 篇)電影微服務(wù),定制Feign,一個(gè)Feign功能禁用Hystrix,另一個(gè)Feign功能啟用Hystrix - 一、大致介紹 1、在一些場(chǎng)景中,部分功能需要使用斷路器功能,部分功能不需...
摘要:本文重點(diǎn)介紹一下基于實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)。使用方式下面我們開始的使用添加和的依賴添加注解開啟服務(wù)發(fā)現(xiàn),注解支持客戶端。同樣子,他可以使用默認(rèn)的也可以使用或者修改配置文件服務(wù)名字服務(wù)無端口會(huì)隨機(jī)選擇一個(gè)服務(wù)集群名字注冊(cè)中心地址,完成。 springcloud-feign實(shí)現(xiàn)服務(wù)發(fā)現(xiàn) 上一篇介紹了nacos實(shí)現(xiàn)配置和注冊(cè)中心,在微服務(wù)中只有配置和注冊(cè)中心遠(yuǎn)遠(yuǎn)不夠,還需要有服務(wù)發(fā)現(xiàn)。本文重點(diǎn)介紹一...
摘要:服務(wù)雪崩效應(yīng)是一種因服務(wù)提供者的不可用導(dǎo)致服務(wù)消費(fèi)者的不可用并將不可用逐漸放大的過程。這種代理能夠記錄最近調(diào)用發(fā)生錯(cuò)誤的次數(shù),然后決定使用允許操作繼續(xù),或者立即返回錯(cuò)誤。這個(gè)自己持有的上下文默認(rèn)實(shí)現(xiàn)類也是。 ?????本篇集成Hystrix,繼續(xù)搭建demo。 雪崩效應(yīng):在微服務(wù)架構(gòu)中通常會(huì)有多個(gè)服務(wù)層調(diào)用,基礎(chǔ)服務(wù)的故障可能會(huì)導(dǎo)致級(jí)聯(lián)故障,進(jìn)而造成整個(gè)系統(tǒng)不可用的情況,這種現(xiàn)象被稱為...
閱讀 1686·2021-11-23 09:51
閱讀 2696·2021-11-22 09:34
閱讀 1330·2021-10-14 09:43
閱讀 3672·2021-09-08 09:36
閱讀 3217·2019-08-30 12:57
閱讀 2039·2019-08-30 12:44
閱讀 2528·2019-08-29 17:15
閱讀 3024·2019-08-29 16:08