摘要:生產(chǎn)環(huán)境可以借助集合來(lái)實(shí)現(xiàn)灰度發(fā)布代碼請(qǐng)參考微服務(wù)權(quán)限框架的灰度發(fā)布功能,已經(jīng)全部開源關(guān)于基于開發(fā)基于前后分離的開發(fā)平臺(tái),支持賬號(hào)短信等多種登錄,提供配套視頻開發(fā)教程。
分析下目前遇到的痛點(diǎn)
你在開發(fā)工作的是否遇到這個(gè)問題,微服務(wù)模塊劃分過細(xì),基礎(chǔ)模塊依賴的比較多?
比如你要進(jìn)行微服務(wù)開發(fā)則需要啟動(dòng)以下基礎(chǔ)模塊
注冊(cè)中心(eureka)
配置中心(spring cloud config)
網(wǎng)關(guān)(zuul)
認(rèn)證中心(oauth)
...
如上圖紅色標(biāo)注的服務(wù)模塊,而你需要編碼或者需要的只有那么一個(gè)業(yè)務(wù)微服務(wù)模塊,本地啟動(dòng)這么微服務(wù)模塊對(duì)開發(fā)機(jī)器的要求性能較高,并且影響開發(fā)效率。
為了解決這種問題,團(tuán)隊(duì)一般都會(huì)把通用的基礎(chǔ)模塊部,提供統(tǒng)一的開發(fā)環(huán)境,方便大家開發(fā),如上圖 只需要考慮你的業(yè)務(wù)模塊(serviceA、serviceB) 即可,提高開發(fā)效率。
這種統(tǒng)一開發(fā)基礎(chǔ)環(huán)境問題存在小小的問題,比如當(dāng)開發(fā)A維護(hù)serviceA,開發(fā)B維護(hù)serviceB 不會(huì)出現(xiàn)沖突;如果開發(fā)A、B同時(shí)維護(hù)一個(gè)模塊時(shí)候,就會(huì)出現(xiàn)沖突如下圖所示:A的本地請(qǐng)求會(huì)被路由到B正在開發(fā)的biz-service,而不是目標(biāo)的A的biz-service,因?yàn)閦uul 是更具服務(wù)名稱進(jìn)行路由的
重寫網(wǎng)關(guān)的轉(zhuǎn)發(fā)規(guī)則,其實(shí)就是重寫ribbon的路由規(guī)則,根據(jù)客戶端不同的用戶請(qǐng)求(可以根據(jù)入?yún)⒉煌瑓^(qū)分)路由到對(duì)應(yīng)的微服務(wù)上,所以對(duì)應(yīng)的微服務(wù)上要打上標(biāo)簽。biz-service A開發(fā)版本,biz-service B開發(fā)版本
eureka: instance: metadata-map: version: v1.0 # A的開發(fā)版本
/** * @author lengleng * @date 2018/10/16 *3. 版本上下文TTL* 路由微服務(wù)斷言 *
* 1. eureka metadata 存在版本定義時(shí)候進(jìn)行判斷 * 2. 不存在 metadata 直接返回true */ @Slf4j public class MetadataCanaryRuleHandler extends ZoneAvoidanceRule { @Override public AbstractServerPredicate getPredicate() { return new AbstractServerPredicate() { @Override public boolean apply(PredicateKey predicateKey) { String targetVersion = RibbonVersionHolder.getContext(); RibbonVersionHolder.clearContext(); if (StrUtil.isBlank(targetVersion)) { log.debug("客戶端未配置目標(biāo)版本直接路由"); return true; } DiscoveryEnabledServer server = (DiscoveryEnabledServer) predicateKey.getServer(); final Map
metadata = server.getInstanceInfo().getMetadata(); if (StrUtil.isBlank(metadata.get(SecurityConstants.VERSION))) { log.debug("當(dāng)前微服務(wù){(diào)} 未配置版本直接路由"); return true; } if (metadata.get(SecurityConstants.VERSION).equals(targetVersion)) { return true; } else { log.debug("當(dāng)前微服務(wù){(diào)} 版本為{},目標(biāo)版本{} 匹配失敗", server.getInstanceInfo().getAppName() , metadata.get(SecurityConstants.VERSION), targetVersion); return false; } } }; } }
public class RibbonVersionHolder { private static final ThreadLocalcontext = new TransmittableThreadLocal<>(); public static String getContext() { return context.get(); } public static void setContext(String value) { context.set(value); } public static void clearContext() { context.remove(); } }
@Configuration @ConditionalOnClass(DiscoveryEnabledNIWSServerList.class) @AutoConfigureBefore(RibbonClientConfiguration.class) @ConditionalOnProperty(value = "zuul.ribbon.metadata.enabled") public class RibbonMetaFilterAutoConfiguration { @Bean @ConditionalOnMissingBean @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public ZoneAvoidanceRule metadataAwareRule() { return new MetadataCanaryRuleHandler(); } }
axios.interceptors.request.use(config => { NProgress.start() // start progress bar if (store.getters.access_token) { config.headers["Authorization"] = "Bearer " + token config.headers["version"] = "v1.0" // 開發(fā)人員自己的版本標(biāo)志,對(duì)應(yīng)eureka metadata 配置 } return config }總結(jié)
擴(kuò)展ribbon 的路由規(guī)則,根據(jù)客戶端來(lái)去不同版本的服務(wù),也可以理解為灰度發(fā)布。
生產(chǎn)環(huán)境可以借助Kong、Traefik 集合zuul 來(lái)實(shí)現(xiàn)灰度發(fā)布
代碼請(qǐng)參考微服務(wù)權(quán)限框架pig的灰度發(fā)布功能,已經(jīng)全部開源
關(guān)于pig:
基于Spring Cloud、oAuth2.0開發(fā)基于Vue前后分離的開發(fā)平臺(tái),支持賬號(hào)、短信、SSO等多種登錄,提供配套視頻開發(fā)教程。
https://gitee.com/log4j/pig
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/27505.html
摘要:生產(chǎn)環(huán)境可以借助集合來(lái)實(shí)現(xiàn)灰度發(fā)布代碼請(qǐng)參考微服務(wù)權(quán)限框架的灰度發(fā)布功能,已經(jīng)全部開源關(guān)于基于開發(fā)基于前后分離的開發(fā)平臺(tái),支持賬號(hào)短信等多種登錄,提供配套視頻開發(fā)教程。 showImg(https://segmentfault.com/img/remote/1460000016809362); 分析下目前遇到的痛點(diǎn) 你在開發(fā)工作的是否遇到這個(gè)問題,微服務(wù)模塊劃分過細(xì),基礎(chǔ)模塊依賴的比較...
摘要:無(wú)論如何,單元測(cè)試一直是一中非常重要卻常常被忽視的技能。在實(shí)踐中,重構(gòu)的要求是很高的它需要有足夠詳盡的單元測(cè)試,需要有持續(xù)集成的環(huán)境,需要隨時(shí)隨地在小步伐地永遠(yuǎn)讓代碼處于可工作狀態(tài)下去進(jìn)行改善。 showImg(https://segmentfault.com/img/bVbttWF?w=1000&h=528); 五月初的時(shí)候朋友和我說(shuō)《重構(gòu)》出第 2 版了,我才興沖沖地下單,花了一個(gè)...
摘要:我不聽,我就是這么命名。任何服務(wù)啟動(dòng)以后,都會(huì)把自己注冊(cè)到的注冊(cè)表中當(dāng)服務(wù)死亡的時(shí)候,也會(huì)通知。服務(wù)拿到結(jié)果后,會(huì)把結(jié)果緩存在本地的注冊(cè)表里。根據(jù)負(fù)載均衡策略,從注冊(cè)表中選擇一個(gè)真正的實(shí)例地址。 原創(chuàng):小姐姐味道(微信公眾號(hào)ID:xjjdog),歡迎分享,轉(zhuǎn)載請(qǐng)保留出處。 這幾天可真是熱啊,泡個(gè)海澡是再好不過了。玩的正起勁,突然腳底絆上一股暗流,然后我就一直在水里旋轉(zhuǎn)旋轉(zhuǎn)旋轉(zhuǎn)...終于...
摘要:洞察和監(jiān)控在邊緣跟蹤有意義的數(shù)據(jù)和統(tǒng)計(jì)數(shù)據(jù),以便為我們提供準(zhǔn)確的生產(chǎn)視圖。壓力測(cè)試逐步增加集群的流量,以評(píng)估性能。減少負(fù)載為每種類型的請(qǐng)求分配容量,并刪除超過限制的請(qǐng)求。在路由到源之前執(zhí)行,可以用于身份驗(yàn)證路由和裝飾請(qǐng)求。 showImg(https://segmentfault.com/img/remote/1460000018826272); 簡(jiǎn)介 Zuul是所有從設(shè)備和web站點(diǎn)...
閱讀 2989·2021-11-23 09:51
閱讀 3007·2021-11-02 14:46
閱讀 870·2021-11-02 14:45
閱讀 2751·2021-09-23 11:57
閱讀 2501·2021-09-23 11:22
閱讀 1932·2019-08-29 16:29
閱讀 749·2019-08-29 16:16
閱讀 947·2019-08-26 13:44