亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring Cloud體系實現(xiàn)標(biāo)簽路由的方法示例

 更新時間:2019年05月17日 08:27:10   作者:每當(dāng)變幻時  
這篇文章主要介紹了Spring Cloud體系實現(xiàn)標(biāo)簽路由的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

如果你正在使用Spring Cloud體系,在實際使用過程中正遇到以下問題,可以閱讀本文章的內(nèi)容作為后續(xù)你解決這些問題的參考,文章內(nèi)容不保證無錯,請務(wù)必仔細(xì)思考之后再進(jìn)行實踐。

問題:

1,本地連上開發(fā)或測試環(huán)境的集群連調(diào),正常測試請求可能會請求到本地,被自己的debug阻塞。

2,測試環(huán)境維護(hù)時,多項目并發(fā)提測,維護(hù)多個相同的集群進(jìn)行測試是否必要,是否有更好的方案。

一般,我們在使用Spring Cloud全家桶的時候,會選擇zuul作為網(wǎng)關(guān),Ribbon作為負(fù)載均衡器,F(xiàn)eign作為遠(yuǎn)程服務(wù)調(diào)用模版。使用過Spring Cloud的同學(xué)對這些組件的作用必然非常熟悉。這里就拿這些組件組合成的微服務(wù)集群來實現(xiàn)標(biāo)簽路由的功能。

實現(xiàn)的效果如圖所示,在頭上帶上標(biāo)簽的請求會在經(jīng)過網(wǎng)關(guān)和各個應(yīng)用時進(jìn)行標(biāo)簽判斷流量應(yīng)該打到哪一個去,而每一個應(yīng)用自己本身的標(biāo)簽是通過eureka上的matedate實現(xiàn)的。

如下圖可以構(gòu)想動態(tài)修改標(biāo)簽控制應(yīng)用所能承接的請求,這里暫時不描述mq部分的功能:

 

答案:

實現(xiàn)一個ZoneAvoidanceRule的繼承類,重寫getPredicate方法:

@Override
public AbstractServerPredicate getPredicate() {
  OfflineEnvMetadataAwarePredicate offlineEnvMetadataAwarePredicate = new OfflineEnvMetadataAwarePredicate();
  offlineEnvMetadataAwarePredicate.setEnv(env);
  return offlineEnvMetadataAwarePredicate;
}

Predicate的實現(xiàn)屏蔽了開發(fā)測試環(huán)境中非這個環(huán)境網(wǎng)段啟動的應(yīng)用,并且比對請求的標(biāo)簽和本地的標(biāo)簽,來控制路由給哪一個服務(wù)器。

@Override
public AbstractServerPredicate getPredicate() {
  OfflineEnvMetadataAwarePredicate offlineEnvMetadataAwarePredicate = new OfflineEnvMetadataAwarePredicate();
  offlineEnvMetadataAwarePredicate.setEnv(env);
  return offlineEnvMetadataAwarePredicate;
}

那么我們注意到請求頭上的標(biāo)簽要在初始時就拿到,所以需要一個ServletRequestListener,將拿到的zone放入RequestZoneLabelContext。我們知道在一個請求中如果是一個io線程執(zhí)行到底,我們只需要利用threadlocal來存儲線程變量,可是如果一個請求中會產(chǎn)生不定的子線程完成,數(shù)據(jù)在線程間的傳遞就成為問題,這里使用了InheritableThreadLocal來決解,在RequestZoneLabelContext中可以看到。

public class RequestZoneLabelContextListener implements ServletRequestListener {


  private static final String ZONE_LABEL_NAME = "zone";


  @Override
  public void requestDestroyed(ServletRequestEvent sre) {
    RequestZoneLabelContext.remove();
  }


  @Override
  public void requestInitialized(ServletRequestEvent requestEvent) {
    HttpServletRequest request = (HttpServletRequest)requestEvent.getServletRequest();
    String lbZone = request.getHeader(ZONE_LABEL_NAME);
    if(StringUtils.isNotBlank(lbZone)){
      RequestZoneLabelContext.setZone(lbZone);
    }
  }
}
/**
 * 從request header上傳遞label到feign請求
 */
public class RequestZoneLabelContext {


  private static InheritableThreadLocal<String> zoneLabelThreadLocal = new InheritableThreadLocal<>();


  public static void setZone(String zone){
    zoneLabelThreadLocal.set(zone);
  }


  public static String getRequestZone(){
    return zoneLabelThreadLocal.get();
  }


  public static void remove(){
    zoneLabelThreadLocal.remove();
  }
}

那么在應(yīng)用之間調(diào)用的feign中我們是需要繼續(xù)把這個zone通過header傳遞下去的,所以又?jǐn)U展了RequestInterceptor:

public class FeignZoneHeaderInterceptor implements RequestInterceptor {


  @Override
  public void apply(RequestTemplate template) {
    String requestZone = RequestZoneLabelContext.getRequestZone();
    if(StringUtils.isNotBlank(requestZone)){
      template.header("zone", requestZone);
    }
  }
}

至此就基本實現(xiàn)了最初的想法。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java中使用雪花算法(Snowflake)為分布式系統(tǒng)生成全局唯一ID代碼示例

    java中使用雪花算法(Snowflake)為分布式系統(tǒng)生成全局唯一ID代碼示例

    Java雪花算法是一種用于生成唯一ID的算法,它可以在分布式系統(tǒng)中生成全局唯一的ID,這篇文章主要給大家介紹了關(guān)于java中使用雪花算法(Snowflake)為分布式系統(tǒng)生成全局唯一ID的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • SpringBoot整合Xxl-job實現(xiàn)定時任務(wù)的全過程

    SpringBoot整合Xxl-job實現(xiàn)定時任務(wù)的全過程

    XXL-JOB是一個分布式任務(wù)調(diào)度平臺,其核心設(shè)計目標(biāo)是開發(fā)迅速、學(xué)習(xí)簡單、輕量級、易擴(kuò)展,下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合Xxl-job實現(xiàn)定時任務(wù)的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • Springboot?No?bean?named?'XXXXX'?available?問題解決方法

    Springboot?No?bean?named?'XXXXX'?available?問

    這篇文章主要介紹了Springboot?No?bean?named?'XXXXX'?available?問題解決方法,解決方法也很簡單,盡量規(guī)范類的命名,注解中指定bean名稱,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • 關(guān)于Spring?Data?Jpa?自定義方法實現(xiàn)問題

    關(guān)于Spring?Data?Jpa?自定義方法實現(xiàn)問題

    這篇文章主要介紹了關(guān)于Spring?Data?Jpa?自定義方法實現(xiàn)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Mybatis-Plus開發(fā)提速器mybatis-plus-generator-ui詳解

    Mybatis-Plus開發(fā)提速器mybatis-plus-generator-ui詳解

    這篇文章主要介紹了Mybatis-Plus開發(fā)提速器mybatis-plus-generator-ui,本文簡要介紹一款基于Mybatis-Plus的代碼自助生成器,文章通過實例集成的方式來詳細(xì)講解mybatis-plus-generator-ui,從相關(guān)概念到實際集成案例,以及具體的擴(kuò)展開發(fā)介紹,需要的朋友可以參考下
    2022-11-11
  • java阻塞隊列實現(xiàn)原理及實例解析

    java阻塞隊列實現(xiàn)原理及實例解析

    這篇文章主要介紹了java阻塞隊列實現(xiàn)原理及實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • Java動態(tài)修改配置即時生效的方式WatchService

    Java動態(tài)修改配置即時生效的方式WatchService

    這篇文章給大家分享了Java動態(tài)修改配置即時生效的方式WatchService的相關(guān)知識點內(nèi)容,有興趣的朋友可以參考學(xué)習(xí)下。
    2018-06-06
  • 使用Java自制一個一個Nacos

    使用Java自制一個一個Nacos

    Nacos是?Dynamic?Naming?and?Configuration?Service的首字母簡稱,一個更易于構(gòu)建云原生應(yīng)用的動態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺,本文將嘗試用Java實現(xiàn)一個Nacos,感興趣的可以了解下
    2024-01-01
  • java 多態(tài)與抽象類詳解總結(jié)

    java 多態(tài)與抽象類詳解總結(jié)

    在面向?qū)ο蟮母拍钪?,所有的對象都是通過類來描繪的,但是反過來,并不是所有的類都是用來描繪對象的,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類,而多態(tài)是同一個行為具有多個不同表現(xiàn)形式或形態(tài)的能力
    2021-11-11
  • SpringMVC項目訪問controller時候報404的解決

    SpringMVC項目訪問controller時候報404的解決

    這篇文章主要介紹了SpringMVC項目訪問controller時候報404的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論