最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

問(wèn)題:

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

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

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

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

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

 

答案:

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

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

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

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

那么我們注意到請(qǐng)求頭上的標(biāo)簽要在初始時(shí)就拿到,所以需要一個(gè)ServletRequestListener,將拿到的zone放入RequestZoneLabelContext。我們知道在一個(gè)請(qǐng)求中如果是一個(gè)io線程執(zhí)行到底,我們只需要利用threadlocal來(lái)存儲(chǔ)線程變量,可是如果一個(gè)請(qǐng)求中會(huì)產(chǎn)生不定的子線程完成,數(shù)據(jù)在線程間的傳遞就成為問(wèn)題,這里使用了InheritableThreadLocal來(lái)決解,在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請(qǐng)求
 */
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ù)把這個(gè)zone通過(guò)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);
    }
  }
}

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

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

相關(guān)文章

  • java中“==“和equals()的區(qū)別詳解

    java中“==“和equals()的區(qū)別詳解

    這篇文章主要給大家介紹了關(guān)于java中“==“和equals()區(qū)別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Springmvc conver實(shí)現(xiàn)原理及用法解析

    Springmvc conver實(shí)現(xiàn)原理及用法解析

    這篇文章主要介紹了Springmvc conver實(shí)現(xiàn)原理及用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 新版idea工具欄菜單展開與合并顯示方式

    新版idea工具欄菜單展開與合并顯示方式

    文章介紹了如何在新版IDEA中調(diào)整工具欄菜單的顯示方式,通過(guò)取消勾選設(shè)置中的某個(gè)選項(xiàng),可以使菜單展開更加方便
    2025-01-01
  • 淺談slf4j中的橋接器是如何運(yùn)作的

    淺談slf4j中的橋接器是如何運(yùn)作的

    這篇文章主要介紹了slf4j中的橋接器是如何運(yùn)作的,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 教你如何使用idea管理docker

    教你如何使用idea管理docker

    其實(shí)idea也提供了docker的管理功能,比如查看容器列表,啟動(dòng)容器,停止容器等,本文來(lái)看下如何管理本地的docker?daemon和遠(yuǎn)程的dockers?daemon,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • 詳解在IDEA中使用MyBatis Generator逆向工程生成代碼

    詳解在IDEA中使用MyBatis Generator逆向工程生成代碼

    這篇文章主要介紹了詳解在IDEA中使用MyBatis Generator逆向工程生成代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • Springboot 如何使用@Async整合線程池

    Springboot 如何使用@Async整合線程池

    這篇文章主要介紹了Springboot 使用@Async整合線程池的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java RMI機(jī)制講解

    Java RMI機(jī)制講解

    這篇文章主要介紹了Java RMI機(jī)制講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • MyEclipse配置JDK的全過(guò)程

    MyEclipse配置JDK的全過(guò)程

    這篇文章主要介紹了MyEclipse配置JDK的全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 一文搞懂Java中的日期類

    一文搞懂Java中的日期類

    在程序的開發(fā)中我們經(jīng)常會(huì)遇到日期類型的操作,Java對(duì)日期類型的操作提供了很好的支持。本文將通過(guò)示例來(lái)聊聊Java中日期類的使用,需要的可以參考一下
    2022-09-09

最新評(píng)論

洪湖市| 连州市| 桐梓县| 溆浦县| 大名县| 铜山县| 揭阳市| 韩城市| 祁连县| 胶州市| 庆阳市| 荆州市| 池州市| 龙南县| 浏阳市| 连平县| 济源市| 濮阳县| 芦溪县| 锡林浩特市| 沈阳市| 延吉市| 大城县| 河北省| 资讯 | 攀枝花市| 乌拉特后旗| 黔西| 天水市| 富平县| 延津县| 襄垣县| 桃园县| 华坪县| 合肥市| 阜平县| 尤溪县| 日喀则市| 东兴市| 东台市| 宣武区|