摘要:網(wǎng)關(guān)以及業(yè)務(wù)組件將對(duì)象存儲(chǔ)到或從獲取對(duì)象。二存在問(wèn)題基于如上微服務(wù)的分布式架構(gòu)如果按照傳統(tǒng)方式,將對(duì)象存儲(chǔ)在內(nèi)存中。微服務(wù)架構(gòu)下共享對(duì)象實(shí)現(xiàn)說(shuō)明客戶(hù)端請(qǐng)求到,基于管理將對(duì)象存儲(chǔ)到,并將生成的返回給客戶(hù)端。
一.簡(jiǎn)單做一個(gè)背景說(shuō)明
1.為說(shuō)明問(wèn)題,本文簡(jiǎn)單微服務(wù)架構(gòu)示例如下
2.組件說(shuō)明
分布式架構(gòu),每個(gè)組件都是集群或者主備。具體說(shuō)明如下:
zuul service:網(wǎng)關(guān),API調(diào)用都走zuul service。
micro service1 & micro service2:業(yè)務(wù)功能實(shí)現(xiàn),數(shù)據(jù)庫(kù)增刪改查。
eureka:組件注冊(cè),zuul service,micro service等組件都注冊(cè)到eureka,管理組件調(diào)用地址。
db-master & db-slave:數(shù)據(jù)庫(kù)集群,一主兩從。
redis master & redis slave:redis集群,緩存。這里主要存儲(chǔ)session對(duì)象。
3.組件之間API調(diào)用
①:網(wǎng)關(guān)zuul接收到的API請(qǐng)求,路由至業(yè)務(wù)實(shí)現(xiàn)組件。
②:網(wǎng)關(guān)zuul以及業(yè)務(wù)組件將session對(duì)象存儲(chǔ)到redis、或從redis獲取session對(duì)象。
③:業(yè)務(wù)組件實(shí)現(xiàn)數(shù)據(jù)增刪改查。
④:業(yè)務(wù)組件之間通過(guò)springCloud feign組件進(jìn)行調(diào)用。
⑤:網(wǎng)關(guān)zuul以及micro service組件注冊(cè)到eureka組件,或從eureka獲取組件調(diào)用地址。
二.存在問(wèn)題
基于如上微服務(wù)的分布式架構(gòu)如果按照傳統(tǒng)方式,將session對(duì)象存儲(chǔ)在內(nèi)存中。在zuul網(wǎng)關(guān)將路由請(qǐng)求至不同的micro service1或者micro service2時(shí),內(nèi)存中的session對(duì)象將不能被共享,無(wú)法判斷用戶(hù)的登陸狀態(tài),也無(wú)法獲取session對(duì)象存儲(chǔ)的全局?jǐn)?shù)據(jù)。
三.解決方案
1.Spring管理session對(duì)象
通過(guò)EnableRedisHttpSession注解支持基于Redis存儲(chǔ)session,全局共享session對(duì)象。
2.微服務(wù)架構(gòu)下共享session對(duì)象實(shí)現(xiàn)說(shuō)明
1)客戶(hù)端API請(qǐng)求到zuul,zuul基于spring管理session將session對(duì)象存儲(chǔ)到redis,并將生成的sessionId返回給客戶(hù)端。
2)zuul將請(qǐng)求路由到micro service,將sessionId通過(guò)cookie頭帶給micro service。
3)micro service通過(guò)sessionId從redis獲取到已經(jīng)生成的session對(duì)象。
4)micro servcie1調(diào)用micro service2時(shí),將sessionId也通過(guò)cookie頭帶給micro service2,micro service2通過(guò)sessionId從redis中獲取session對(duì)象。
5)客戶(hù)端再次調(diào)用時(shí)將a)步返回的sessionId增加到cookie頭,在redis中存儲(chǔ)的session失效之前zuul和micro service一直共享這個(gè)session。
5.具體實(shí)現(xiàn)
1)通過(guò)springframework的EnableRedisHttpSession注解管理session,zuul和micro service組件實(shí)現(xiàn)這個(gè)類(lèi)以存儲(chǔ)、獲取redis中存儲(chǔ)的session對(duì)象。
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; @Configuration @EnableRedisHttpSession(maxInactiveIntervalInSeconds = GlobalConstants.SESSION_TIMOUT, redisFlushMode = RedisFlushMode.IMMEDIATE) public class SessionConfig { }
EnableRedisHttpSession注解參數(shù)說(shuō)明:
maxInactiveIntervalInSeconds:session過(guò)期時(shí)間配置。
redisFlushMode:redis session刷新模式。配置為RedisFlushMode.IMMEDIATE,可以確保zuul存儲(chǔ)到redis的session對(duì)象在請(qǐng)求到micro service中能立即被獲取。在實(shí)際開(kāi)發(fā)過(guò)程中出現(xiàn)由于沒(méi)有這個(gè)配置值,有時(shí)候zuul將session對(duì)象存儲(chǔ)到了redis,但是micro service無(wú)法立即獲取。
2)在zuul過(guò)濾器方法中調(diào)用addZuulRequestHeader增加請(qǐng)求頭,將sessionId通過(guò)cookie頭路由到micro service。
public class AccessFilter extends ZuulFilter { @Autowired HttpServletRequest httpServletRequest; @Autowired HttpServletResponse httpServletResponse; @Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); String sessionId = httpServletRequest.getSession().getId(); ctx.addZuulRequestHeader("Cookie", "SESSION=" + sessionId); ctx.setSendZuulResponse(true);// 對(duì)該請(qǐng)求進(jìn)行路由 ctx.setResponseStatusCode(200); // 返回200正確響應(yīng)
3)micro service1通過(guò)feign調(diào)用micro service2時(shí),實(shí)現(xiàn)RequestInterceptor接口。通過(guò)增加cookie頭,將sessionId帶到micro service2。
@Configuration public class MyRequestInterceptor implements RequestInterceptor { @Autowired HttpServletRequest request; @Override public void apply(RequestTemplate requestTemplate) { logger.info("MyRequestInterceptor apply begin."); try { String sessionId = RequestContextHolder.currentRequestAttributes().getSessionId(); if (null != sessionId) { requestTemplate.header("Cookie", "SESSION=" + sessionId); } } catch (Exception e) { logger.error("MyRequestInterceptor exception: ", e); } } }
6.驗(yàn)證
1)通過(guò)postman請(qǐng)求zuul服務(wù)地址,調(diào)用登陸接口。
2)查看各組件sessionId
zuul sessionId:
micro service1 sessionId:
micro service1調(diào)用micro service2 sessionId:
結(jié)論:可以看到zuul和micro service中sessionId都是相同的,都是586b*c9a4,通過(guò)這種方式實(shí)現(xiàn)了API調(diào)用過(guò)程中的session對(duì)象共享。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/68946.html
摘要:接下來(lái)繼續(xù)介紹三種架構(gòu)模式,分別是查詢(xún)分離模式微服務(wù)模式多級(jí)緩存模式。分布式應(yīng)用程序可以基于實(shí)現(xiàn)諸如數(shù)據(jù)發(fā)布訂閱負(fù)載均衡命名服務(wù)分布式協(xié)調(diào)通知集群管理選舉分布式鎖和分布式隊(duì)列等功能。 SpringCloud 分布式配置 SpringCloud 分布式配置 史上最簡(jiǎn)單的 SpringCloud 教程 | 第九篇: 服務(wù)鏈路追蹤 (Spring Cloud Sleuth) 史上最簡(jiǎn)單的 S...
摘要:于是,市面上出現(xiàn)了分布式的配置中心。為什么呢因?yàn)橐Y(jié)合分布式配置中心微服務(wù),才能真正實(shí)現(xiàn)我們所理解的。所謂灰度發(fā)布,是說(shuō)一個(gè)微服務(wù)集群里面,比如有個(gè)訂單系統(tǒng),做了一些配置上的更新。數(shù)人云分布式統(tǒng)一配置中心數(shù)人云分布式統(tǒng)一配置中心,取名。 本文來(lái)自1月18日數(shù)人云資深工程師在IT大咖說(shuō)平臺(tái)的線(xiàn)上直播分享。 今天主要探討這幾方面: 一、配置中心的定位二、云化的微服務(wù)對(duì)于配置中心的要求三、微...
閱讀 675·2021-10-09 09:41
閱讀 658·2019-08-30 15:53
閱讀 1083·2019-08-30 15:53
閱讀 1217·2019-08-30 11:01
閱讀 1575·2019-08-29 17:31
閱讀 995·2019-08-29 14:05
閱讀 1724·2019-08-29 12:49
閱讀 419·2019-08-28 18:17