你在開發工做的是否遇到這個問題,微服務模塊劃分過細,基礎模塊依賴的比較多?
好比你要進行微服務開發則須要啓動如下基礎模塊java
重寫網關的轉發規則,其實就是重寫ribbon的路由規則,根據客戶端不一樣的用戶請求(能夠根據入參不一樣區分)路由到對應的微服務上,因此對應的微服務上要打上標籤。biz-service A開發版本,biz-service B開發版本
ios
eureka: instance: metadata-map: version: v1.0 # A的開發版本
@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("客戶端未配置目標版本直接路由"); return true; } DiscoveryEnabledServer server = (DiscoveryEnabledServer) predicateKey.getServer(); final Map<String, String> metadata = server.getInstanceInfo().getMetadata(); if (StrUtil.isBlank(metadata.get(SecurityConstants.VERSION))) { log.debug("當前微服務{} 未配置版本直接路由"); return true; } if (metadata.get(SecurityConstants.VERSION).equals(targetVersion)) { return true; } else { log.debug("當前微服務{} 版本爲{},目標版本{} 匹配失敗", server.getInstanceInfo().getAppName() , metadata.get(SecurityConstants.VERSION), targetVersion); return false; } } }; } }
public class RibbonVersionHolder { private static final ThreadLocal<String> context = 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' // 開發人員本身的版本標誌,對應eureka metadata 配置 } return config }
擴展ribbon 的路由規則,根據客戶端來去不一樣版本的服務,也能夠理解爲灰度發佈。git
生產環境能夠藉助Kong、Traefik 集合zuul 來實現灰度發佈spring
代碼請參考微服務權限框架pig的灰度發佈功能,已經所有開源axios
關於pig:
基於Spring Cloud、oAuth2.0開發基於Vue先後分離的開發平臺,支持帳號、短信、SSO等多種登陸,提供配套視頻開發教程。
https://gitee.com/log4j/pigapp