国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Spring Cloud Alibaba Sentinel對(duì)Feign的支持

wthee / 3516人閱讀

摘要:得到得到類得到類得到調(diào)用的服務(wù)名稱檢查和屬性省略部分代碼中的方法里面進(jìn)行熔斷限流的處理。在的方法中進(jìn)行的包裝。

Spring Cloud Alibaba Sentinel 除了對(duì) RestTemplate 做了支持,同樣對(duì)于 Feign 也做了支持,如果我們要從 Hystrix 切換到 Sentinel 是非常方便的,下面來(lái)介紹下如何對(duì) Feign 的支持以及實(shí)現(xiàn)原理。

集成 Feign 使用

spring-cloud-starter-alibaba-sentinel 的依賴還是要加的,如下:


    org.springframework.cloud
    spring-cloud-starter-alibaba-sentinel
    0.2.1.RELEASE

需要在配置文件中開啟 sentinel 對(duì) feign 的支持:

feign.sentinel.enabled=true

然后我們定義自己需要調(diào)用的 Feign Client:

@FeignClient(name = "user-service", fallback = UserFeignClientFallback.class)
public interface UserFeignClient {
    
    @GetMapping("/user/get")
    public String getUser(@RequestParam("id") Long id);
    
}

定義 fallback 類 UserFeignClientFallback:

@Component
public class UserFeignClientFallback implements UserFeignClient {

    @Override
    public String getUser(Long id) {
        return "fallback";
    }

}

測(cè)試代碼:

@Autowired
private UserFeignClient userFeignClient;

@GetMapping("/testFeign")
public String testFeign() {
    return userFeignClient.getUser(1L);
}

你可以將這個(gè) Client 對(duì)應(yīng)的 user-service 停掉,然后就可以看到輸出的內(nèi)容是 "fallback"

如果要對(duì) Feign 調(diào)用做限流,資源名稱的規(guī)則是精確到接口的,以我們上面定義的接口來(lái)分析,資源名稱就是GET:http://user-service/user/get,至于資源名稱怎么定義的,接下面的源碼分析你就知道了。

原理分析

首先看SentinelFeignAutoConfiguration中如何自動(dòng)配置:

@Bean
@Scope("prototype")
@ConditionalOnMissingBean
@ConditionalOnProperty(name = "feign.sentinel.enabled")
public Feign.Builder feignSentinelBuilder() {
    return SentinelFeign.builder();
}

@ConditionalOnProperty 中 feign.sentinel.enabled 起了決定性作用,這也就是為什么我們需要在配置文件中指定 feign.sentinel.enabled=true

接下來(lái)看 SentinelFeign.builder 里面的實(shí)現(xiàn):

build方法中重新實(shí)現(xiàn)了super.invocationHandlerFactory方法,也就是動(dòng)態(tài)代理工廠,構(gòu)建的是InvocationHandler對(duì)象。

build中會(huì)獲取Feign Client中的信息,比如fallback,fallbackFactory等,然后創(chuàng)建一個(gè)SentinelInvocationHandler,SentinelInvocationHandler繼承了InvocationHandler。

@Override
public Feign build() {
    super.invocationHandlerFactory(new InvocationHandlerFactory() {
        @Override
        public InvocationHandler create(Target target,
                Map dispatch) {
            // 得到Feign Client Bean
            Object feignClientFactoryBean = Builder.this.applicationContext
                    .getBean("&" + target.type().getName());
            // 得到fallback類
            Class fallback = (Class) getFieldValue(feignClientFactoryBean,
                    "fallback");
            // 得到fallbackFactory類
            Class fallbackFactory = (Class) getFieldValue(feignClientFactoryBean,
                    "fallbackFactory");
            // 得到調(diào)用的服務(wù)名稱
            String name = (String) getFieldValue(feignClientFactoryBean, "name");

            Object fallbackInstance;
            FallbackFactory fallbackFactoryInstance;
            // 檢查 fallback 和 fallbackFactory 屬性
            if (void.class != fallback) {
                fallbackInstance = getFromContext(name, "fallback", fallback,
                                target.type());
                return new SentinelInvocationHandler(target, dispatch,
                                new FallbackFactory.Default(fallbackInstance));
            }
            if (void.class != fallbackFactory) {
                fallbackFactoryInstance = (FallbackFactory) getFromContext(name,
                        "fallbackFactory", fallbackFactory,
                                FallbackFactory.class);
                return new SentinelInvocationHandler(target, dispatch,
                                fallbackFactoryInstance);
            }
            return new SentinelInvocationHandler(target, dispatch);
        }
  
        // 省略部分代碼                
    });
        
    super.contract(new SentinelContractHolder(contract));
    return super.build();
}

SentinelInvocationHandler中的invoke方法里面進(jìn)行熔斷限流的處理。

// 得到資源名稱(GET:http://user-service/user/get)
String resourceName = methodMetadata.template().method().toUpperCase() + ":"
                    + hardCodedTarget.url() + methodMetadata.template().url();
Entry entry = null;
try {
    ContextUtil.enter(resourceName);
    entry = SphU.entry(resourceName, EntryType.OUT, 1, args);
    result = methodHandler.invoke(args);
}
catch (Throwable ex) {
    // fallback handle
    if (!BlockException.isBlockException(ex)) {
        Tracer.trace(ex);
    }
    if (fallbackFactory != null) {
        try {
            // 回退處理
            Object fallbackResult = fallbackMethodMap.get(method)
                    .invoke(fallbackFactory.create(ex), args);
            return fallbackResult;
        }
        catch (IllegalAccessException e) {
            // shouldn"t happen as method is public due to being an interface
            throw new AssertionError(e);
        }
        catch (InvocationTargetException e) {
            throw new AssertionError(e.getCause());
        }
    }
    // 省略.....
}
總結(jié)

總的來(lái)說,這些框架的整合都有相似之處,前面講RestTemplate的整合其實(shí)和Ribbon中的@LoadBalanced原理差不多,這次的Feign的整合其實(shí)我們從其他框架的整合也是可以參考出來(lái)的,最典型的就是Hystrix了。

我們想下Hystrix要對(duì)Feign的調(diào)用進(jìn)行熔斷處理,那么肯定是將Feign的請(qǐng)求包裝了HystrixCommand。同樣的道理,我們只要找到Hystrix是如何包裝的,無(wú)非就是將Hystrix的代碼換成Sentinel的代碼而已。

InvocationHandlerFactory是用于創(chuàng)建動(dòng)態(tài)代理的工廠,有默認(rèn)的實(shí)現(xiàn),也有Hystrix的實(shí)現(xiàn)feign.hystrix.HystrixFeign。

Feign build(final FallbackFactory nullableFallbackFactory) {
      super.invocationHandlerFactory(new InvocationHandlerFactory() {
        @Override public InvocationHandler create(Target target,
            Map dispatch) {
          return new HystrixInvocationHandler(target, dispatch, setterFactory, nullableFallbackFactory);
        }
      });
      super.contract(new HystrixDelegatingContract(contract));
      return super.build();
}

上面這段代碼是不是跟Sentinel包裝的類似,不同的是Sentinel構(gòu)造的是SentinelInvocationHandler ,Hystrix構(gòu)造的是HystrixInvocationHandle。在HystrixInvocationHandler的invoke方法中進(jìn)行HystrixCommand的包裝。

歡迎加入我的知識(shí)星球,一起交流技術(shù),免費(fèi)學(xué)習(xí)猿天地的課程(http://cxytiandi.com/course) PS:目前星球中正在星主的帶領(lǐng)下組隊(duì)學(xué)習(xí)Sentinel,等你哦!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/77682.html

相關(guān)文章

  • Spring Cloud Alibaba Sentinel 整合 Feign 設(shè)計(jì)實(shí)現(xiàn)

    摘要:作用跟一致跟屬性作用一致給設(shè)置注解絕對(duì)路徑,用于替換服務(wù)名。在服務(wù)名或與之間默認(rèn)是,表示當(dāng)前這個(gè)生成的是否是。內(nèi)部的能獲取服務(wù)名信息,的實(shí)現(xiàn)類能拿到對(duì)應(yīng)的請(qǐng)求路徑信息。很不幸,這個(gè)類也是包級(jí)別的類。整合的代碼目前已經(jīng)在倉(cāng)庫(kù)上,但是沒未發(fā)版。 作者 | Spring Cloud Alibaba 高級(jí)開發(fā)工程師洛夜來(lái)自公眾號(hào)阿里巴巴中間件投稿 前段時(shí)間 Hystrix 宣布不再維護(hù)之后(H...

    OldPanda 評(píng)論0 收藏0
  • Spring Cloud Alibaba 新版本發(fā)布:眾多期待內(nèi)容整合打包加入!

    摘要:在之后,也終于發(fā)布了最新的版本。該版本距離上一次發(fā)布,過去了整整個(gè)月下面就隨我一起看看,這個(gè)大家期待已久的版本都有哪些內(nèi)容值得我們關(guān)注。如果是用戶,同時(shí)也是阿里云這些產(chǎn)品的用戶,那么直接使用還是非常方便的。 在Nacos 1.0.0 Release之后,Spring Cloud Alibaba也終于發(fā)布了最新的版本。該版本距離上一次發(fā)布,過去了整整4個(gè)月!下面就隨我一起看看,這個(gè)大家期...

    不知名網(wǎng)友 評(píng)論0 收藏0
  • [Spring-Cloud-Alibaba] Sentinel 整合RestTemplate &am

    摘要:開發(fā)階段很有意義。源碼整合配置文件中添加來(lái)開啟編寫類,實(shí)現(xiàn)默認(rèn)用戶遠(yuǎn)程調(diào)用被限流降級(jí),默認(rèn)用戶應(yīng)用定義可以拿到異常信息無(wú)法拿到異常信息若初啟動(dòng)應(yīng)用,設(shè)置流控規(guī)則,結(jié)果展示如下默認(rèn)用戶源碼 Sentinel API Github : WIKI Sphu (指明要保護(hù)的資源名稱) Tracer (指明調(diào)用來(lái)源,異常統(tǒng)計(jì)接口) ContextUtil(標(biāo)示進(jìn)入調(diào)用鏈入口) 流控規(guī)則(針...

    libin19890520 評(píng)論0 收藏0
  • Spring Cloud Alibaba到底坑不坑?

    摘要:我沒有能力去控制那些自媒體發(fā)布這些不實(shí)的內(nèi)容,但是在我了解的范圍內(nèi),還是盡力輸出一些我的理解。 之前我發(fā)過一篇《說說我為什么看好Spring Cloud Alibaba》,然后這兩天有網(wǎng)友給我轉(zhuǎn)了這篇文章《坑爹項(xiàng)目spring-cloud-alibaba,我們也來(lái)一個(gè)》,問我的看法是怎么樣的,聊天時(shí)候簡(jiǎn)單說了一下。今天在家休息,抽空整理一下內(nèi)容,逐點(diǎn)說一下我的看法,主要還是覺得這篇文章...

    娣辯孩 評(píng)論0 收藏0
  • 公益:開放一臺(tái)Nacos服務(wù)端給各位Spring Cloud愛好者

    摘要:之前開放過一臺(tái)公益給大家,以方便大家在閱讀我博客中教程時(shí)候做實(shí)驗(yàn)。由于目前在連載,所以對(duì)應(yīng)的也部署了一臺(tái),并且也開放出來(lái),給大家學(xué)習(xí)測(cè)試之用。 之前開放過一臺(tái)公益Eureka Server給大家,以方便大家在閱讀我博客中教程時(shí)候做實(shí)驗(yàn)。由于目前在連載Spring Cloud Alibaba,所以對(duì)應(yīng)的也部署了一臺(tái)Nacos,并且也開放出來(lái),給大家學(xué)習(xí)測(cè)試之用。 Nacos控制臺(tái) ...

    jk_v1 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<