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

SpringCloud網(wǎng)關(guān)(Zuul)如何給多個(gè)微服務(wù)之間傳遞共享參數(shù)

 更新時(shí)間:2022年03月22日 10:06:08   作者:蜀山雪松  
這篇文章主要介紹了SpringCloud網(wǎng)關(guān)(Zuul)如何給多個(gè)微服務(wù)之間傳遞共享參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1、使用場(chǎng)景

因?yàn)樽罱?xiàng)目需要國際化,但是以前國際化的語言切換是放置在未進(jìn)行微服務(wù)化之前的一個(gè)獨(dú)立的SpringBoot服務(wù)之中。

目前由于業(yè)務(wù)的需要和不同模塊能夠復(fù)用的要求目前已經(jīng)拆分為如下服務(wù):zuul網(wǎng)關(guān)服務(wù)、**dx服務(wù)(包含主要服務(wù))、**ai(一些推薦的AI服務(wù))、message(消息咨詢服務(wù))、forum(論壇版塊服務(wù))等等。

如果還是按照以前的的方式只切換 **dx服務(wù) 之中的語言;其他微服務(wù)是不知道當(dāng)前的Request請(qǐng)求是什么語言體系的。

就意味   **dx服務(wù) 是en語言,但是其他服務(wù)還是 zh(中文語言)。

因?yàn)榇藛栴},我本人在項(xiàng)目開始進(jìn)行國際化改版的時(shí)候,我就知道有此問題。 我就知道有此問題。 最開始就是有人不信;最后遇見問題了還是相信了!遇見問題了,總得使用相關(guān)的方案來解決此問題。

于是本人就是想到了有如下兩種解決方案:

解決方案1

在網(wǎng)關(guān)服務(wù)(Zuul)之中,寫一個(gè)統(tǒng)一的切換語言接口;在切換語言的使用同時(shí)調(diào)用其他服務(wù)的切換語言接口。這樣實(shí)現(xiàn)起來最為簡(jiǎn)單。

具體如下圖所示:

此方法比較原始直接,但是書寫代碼比較多;想當(dāng)與每個(gè)微服務(wù)都得提供一個(gè)修改語言體系的接口供 網(wǎng)關(guān)(Zuul)

解決方案2

在網(wǎng)關(guān)(Zuul)服務(wù)層進(jìn)行語言切換時(shí)候獲得切換語言的參數(shù);使用 LocaleContextHolder 暫存當(dāng)前已經(jīng)切換語言的信息;

然后在Zuul的過濾器之中通過獲得當(dāng)前請(qǐng)求(Request)的參數(shù)后,把以前語言切換暫存參數(shù)值從LocaleContextHolder獲得切換語言的參數(shù)值。然后把這個(gè)參數(shù)傳遞到其他微服務(wù)之中;其他微服務(wù)通過Request 即可獲得最新切換的語言參數(shù);然后做到順利獲取切換后的最新的語言信息。   

具體如下圖所示:   

          

針對(duì)方案一與方案二比較后;我選擇使用的方案二。

2、代碼實(shí)現(xiàn)

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        String reqUrl=request.getRequestURL().toString();
        HttpSession session = request.getSession();         
    	Map<String, Object> user=(Map<String, Object>) session.getAttribute("user");  
        if(!(reqUrl.contains("permissionUser/userLogin") || (reqUrl.contains("noAuth")) 
        		|| reqUrl.contains("appapi"))) {
        	String[] actProfile = env.getActiveProfiles();
    		String curProfile = actProfile[0];
    		
        	if (StringUtils.startsWith(curProfile, "dev")) { //dev環(huán)境不做過濾    			
    			return null;    			
    		} 
        	
    		//判斷用戶ID是否存在,不存在就跳轉(zhuǎn)到登錄界面
        	if (!checkUserIsLogin(ctx, user)) {
        	//	System.out.println("session丟失: " + request.getSession().getId());
        		return null;
        	}
        	
            //放行ignoreUrls中配置的url
        	if(checkIsIgnoreUrl(request)) {
        		addUserToZuulRequestHeader(user);
        		return null;
        	}
        	
        	//檢查該url是否有權(quán)訪問
        	if (!checkIsUrlHasRight(ctx)) {
        		return null;
        	}
        	//從會(huì)話之中獲得當(dāng)前登錄用戶的userId,判斷用戶是否被踢
        	if (checkUserIsKickout(ctx, user)) {
        		return null;
        	}            
        }
        //可以往后走了,把session放入request的header中
        addUserToZuulRequestHeader(user);  
        //語言包
        setLanguageLocal(request);
        return null;
    }
 
     /**
	 * 設(shè)置本地語言包
	 * */
	private void setLanguageLocal(HttpServletRequest request) {
		String lang = "zh";
		if (StringUtils.isNotEmpty(request.getParameter("lang"))) {
			lang = request.getParameter("lang");
		}else {
			lang=localeMessageSourceService.getCurrentLanguage();
		}
		switch(lang) {
			case "zh":
				LocaleContextHolder.setLocale(Locale.CHINESE);
				break;
			case "en":
				LocaleContextHolder.setLocale(Locale.ENGLISH);
				break;
			case "fr":
				LocaleContextHolder.setLocale(Locale.FRENCH); 
				break;
		}
		//此處為獲得請(qǐng)求的參數(shù) 然后在請(qǐng)求的參數(shù)里面加入暫存的語言攜帶參數(shù) lang
		RequestContext ctx = RequestContext.getCurrentContext();
		request.getParameterMap();
		Map<String,List<String>> requestQueryParams=ctx.getRequestQueryParams();
		if(requestQueryParams==null) {
			requestQueryParams=new HashMap<>();
		}
		//String langCode=request.getParameter("lang").toString();
		//講需要新增的參數(shù)添加進(jìn)去,被調(diào)用的微服務(wù)可以直接獲取,就像普通的一樣;框架會(huì)直接注入進(jìn)去
		    ArrayList<String> arrayList = new ArrayList<>();
            arrayList.add(lang);       
            requestQueryParams.put("lang", arrayList);
            ctx.setRequestQueryParams(requestQueryParams);
		FrameWorkConstant.MSG_INFO_EMPTY = localeMessageSourceService.getMessage("msg.info.empty");
		FrameWorkConstant.MSG_INFO_SUCCESS = localeMessageSourceService.getMessage("msg.success.operate");
		FrameWorkConstant.MSG_INFO_FAILED= localeMessageSourceService.getMessage("msg.error.unknown");
	}

ChangeLanauageConfigurer

import java.util.Locale; 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
 
/***
 *@purpose:國際化啟動(dòng)配置類
 *@since:2018年4月9日
 ***/
@Configuration
public class ChangeLanauageConfigurer extends WebMvcConfigurerAdapter {
 
 
	/**
	 * 描述 : 國際化配置類(會(huì)話區(qū)域解析器)
	 *
	 */
	@Bean
    public SessionLocaleResolver localeResolver() {
        SessionLocaleResolver slr = new SessionLocaleResolver();
//        System.out.println("aaaaaaaaaaaaaaaaaaaaaa");
//        // 設(shè)置默認(rèn)語言
        slr.setDefaultLocale(Locale.CHINESE);       
        return slr;
    }
 
    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() {
        LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
        // 設(shè)置參數(shù)名
        lci.setParamName("lang");
        return lci;
    }
 
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeChangeInterceptor());
    }
}

LocaleMessageSourceService

/***
 *@purpose:本地化語言信息工具類
 *@since:2018年3月30日
 ***/
@Service
public class LocaleMessageSourceService {
	
	@Autowired
	private MessageSource messageSource;
 
    /**
    *
    *@param code:對(duì)應(yīng)messages配置的key.
    *@return
    */
 
   public String getMessage(String code){
 
      //這里使用比較方便的方法,不依賴request.
      Locale locale = LocaleContextHolder.getLocale();
      String lang = locale.getLanguage();
      if(LanguageConstant.LANGUAGE_FR.equals(lang)) {
    	  locale = new Locale(lang,"FR");
      }
      if(LanguageConstant.LANGUAGE_ZH.equals(lang)) {
    	  locale = new Locale(lang,"CN");
      }
      if(LanguageConstant.LANGUAGE_EN.equals(lang)) {
    	  locale = new Locale(lang,"US");
      }
      
      String message = messageSource.getMessage(code,null,locale);
      return message;
   }
   
   /**
             * 獲得當(dāng)前語言
    * @param code
    * @return
    */
   public String getCurrentLanguage(){
 
       Locale locale = LocaleContextHolder.getLocale();
       String lang = locale.getLanguage();
       if(StringUtils.isEmpty(lang)) {
       	lang = LanguageConstant.LANGUAGE_EN;
       }
       return lang;
    }  
}

3、成果展現(xiàn)

在網(wǎng)關(guān)服務(wù)之中切換語言(en)后獲得信息

ai服務(wù)的語言體系

**dx服務(wù)的語言體系

網(wǎng)關(guān)切換為中文(zh)后其他服務(wù)語言返回

ai服務(wù)語言切換結(jié)果

**dx服務(wù)語言切換結(jié)果

4、總結(jié)

如果使用簡(jiǎn)單粗暴的方法,直接通過網(wǎng)關(guān)調(diào)用其他微服務(wù);雖然能夠?qū)崿F(xiàn)功能;但是此方法比較笨重;同時(shí)書寫的代碼比較多。為后期維護(hù)帶來很大的不便利。

如果使用方案二在網(wǎng)關(guān)層進(jìn)行統(tǒng)一處理,借助語言切換的能夠在網(wǎng)關(guān)(Zuul)服務(wù)進(jìn)行暫存和傳遞;同時(shí)動(dòng)態(tài)添加切換語言后的參數(shù)到Request之中;能夠便捷的把語言參數(shù)帶到其他微服務(wù)之中。此方法值得推崇。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring Boot Security配置教程

    Spring Boot Security配置教程

    在本文里我們給大家分享了關(guān)于Spring Boot Security配置的相關(guān)步驟以及注意要點(diǎn),需要的朋友們跟著操作下。
    2019-05-05
  • MyBatis中批量插入和批量更新的實(shí)現(xiàn)方法詳解

    MyBatis中批量插入和批量更新的實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了MyBatis中批量插入和批量更新的實(shí)現(xiàn)方法,在日常開發(fā)中有時(shí)候需要從A數(shù)據(jù)庫提取大量數(shù)據(jù)同步到B系統(tǒng),這種情況自然是需要批量操作才行,感興趣想要詳細(xì)了解可以參考下文
    2023-05-05
  • Java LinkedHashSet集合的底層原理和TreeSet集合

    Java LinkedHashSet集合的底層原理和TreeSet集合

    LinkedHashSet保證元素有序且唯一,底層通過雙鏈表實(shí)現(xiàn),TreeSet元素不重復(fù)且可排序,底層使用紅黑樹實(shí)現(xiàn)排序,自定義類型排序可通過實(shí)現(xiàn)Comparable接口或提供Comparator來定義排序規(guī)則,適用于需要大量元素快速檢索的場(chǎng)景
    2024-10-10
  • 使用Java實(shí)現(xiàn)價(jià)格加密與優(yōu)化功能

    使用Java實(shí)現(xiàn)價(jià)格加密與優(yōu)化功能

    在現(xiàn)代軟件開發(fā)中,數(shù)據(jù)加密是一個(gè)非常重要的環(huán)節(jié),尤其是在處理敏感信息(如價(jià)格、用戶數(shù)據(jù)等)時(shí),本文將詳細(xì)介紹如何使用?Java?實(shí)現(xiàn)價(jià)格加密,并對(duì)代碼進(jìn)行優(yōu)化,需要的朋友可以參考下
    2025-01-01
  • 實(shí)例講解Java批量插入、更新數(shù)據(jù)

    實(shí)例講解Java批量插入、更新數(shù)據(jù)

    這片文章介紹了一個(gè)Java批量添加數(shù)據(jù),多個(gè)字段同時(shí)添加多條數(shù)據(jù)具體實(shí)例,面向的是Oracle數(shù)據(jù)庫,需要的朋友可以參考下
    2015-07-07
  • Java異常分類處理拋出捕獲操作詳解

    Java異常分類處理拋出捕獲操作詳解

    異常就是不正常,比如當(dāng)我們身體出現(xiàn)了異常我們會(huì)根據(jù)身體情況選擇喝開水、吃藥、看病、等 異常處理方法。 java異常處理機(jī)制是我們java語言使用異常處理機(jī)制為程序提供了錯(cuò)誤處理的能力,程序出現(xiàn)的錯(cuò)誤,程序可以安全的退出,以保證程序正常的運(yùn)行等
    2022-09-09
  • SpringDataRedis入門和序列化方式解決內(nèi)存占用問題小結(jié)

    SpringDataRedis入門和序列化方式解決內(nèi)存占用問題小結(jié)

    spring-data-redis是spring-data模塊的一部分,專門用來支持在spring管理項(xiàng)目對(duì)redis的操作,這篇文章主要介紹了SpringDataRedis入門和序列化方式解決內(nèi)存占用問題,需要的朋友可以參考下
    2022-12-12
  • resubmit漸進(jìn)式防重復(fù)提交框架示例

    resubmit漸進(jìn)式防重復(fù)提交框架示例

    這篇文章主要為大家介紹了resubmit漸進(jìn)式防重復(fù)提交框架示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 使用@PathVariable時(shí)候無法將參數(shù)映射到變量中的解決

    使用@PathVariable時(shí)候無法將參數(shù)映射到變量中的解決

    這篇文章主要介紹了使用@PathVariable時(shí)候無法將參數(shù)映射到變量中的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringBoot整合RabbitMQ及生產(chǎn)全場(chǎng)景高級(jí)特性實(shí)戰(zhàn)

    SpringBoot整合RabbitMQ及生產(chǎn)全場(chǎng)景高級(jí)特性實(shí)戰(zhàn)

    本文主要介紹了SpringBoot整合RabbitMQ及生產(chǎn)全場(chǎng)景高級(jí)特性實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10

最新評(píng)論

永嘉县| 渭源县| 垦利县| 丰原市| 延津县| 饶阳县| 仁寿县| 琼海市| 秀山| 茶陵县| 南安市| 台湾省| 英吉沙县| 沂水县| 潍坊市| 西昌市| 昭苏县| 洛川县| 壶关县| 历史| 延津县| 永新县| 凉山| 喀喇沁旗| 西昌市| 钟山县| 松原市| 太仆寺旗| 禄劝| 商水县| 通河县| 济南市| 汉寿县| 贡嘎县| 深泽县| 河西区| 涡阳县| 新郑市| 新郑市| 阿荣旗| 郸城县|