你在開發工做的是否遇到這個問題,微服務模塊劃分過細,基礎模塊依賴的比較多?
好比你要進行微服務開發則須要啓動如下基礎模塊ios
重寫網關的轉發規則,其實就是重寫ribbon的路由規則,根據客戶端不一樣的用戶請求(能夠根據入參不一樣區分)路由到對應的微服務上,因此對應的微服務上要打上標籤。biz-service A開發版本,biz-service B開發版本
git
eureka:
instance:
metadata-map:
version: v1.0 # A的開發版本
複製代碼
/**
* @author lengleng
* @date 2018/10/16
* <p>
* 路由微服務斷言
* <p>
* 1. eureka metadata 存在版本定義時候進行判斷
* 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("客戶端未配置目標版本直接路由");
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 的路由規則,根據客戶端來去不一樣版本的服務,也能夠理解爲灰度發佈。spring
生產環境能夠藉助Kong、Traefik 集合zuul 來實現灰度發佈axios
代碼請參考微服務權限框架pig的灰度發佈功能,已經所有開源bash
關於pig:
基於Spring Cloud、oAuth2.0開發基於Vue先後分離的開發平臺,支持帳號、短信、SSO等多種登陸,提供配套視頻開發教程。
gitee.com/log4j/pigapp