最近在接入全鏈路灰度的測試,調研了nepxion discovery,研究了下nepxion discovery怎么接入的問題,在這里記錄下心得。
https://github.com/Nepxion/Discovery
無需介紹,只要想做spring cloud灰度發布,肯定都會調研過這個神器,目測也有很多使用心得,這里只說一些自己接入的感受。
1. 如果需要灰度,Nepxion discovery還是需要開發擼一些代碼作為灰度規則的,也需要自己手動擼一些代碼的,包括流量判斷,環境判斷,標記判斷,版本判斷等灰度發布的策略支持。
在impl里,需要手動實現攔截器,進行攔截,舉例如下:
如果我需要根據版本灰度,我需要實現以下攔截器:
public class MyDiscoveryEnabledStrategy extends DefaultDiscoveryEnabledStrategy {
private static final Logger LOG = LoggerFactory.getLogger(MyDiscoveryEnabledStrategy.class);
// 對REST調用傳來的Header參數(例如:mobile)做策略
@Override
public boolean apply(Server server) {
String mobile = strategyContextHolder.getHeader("mobile");
String serviceId = pluginAdapter.getServerServiceId(server);
String version = pluginAdapter.getServerVersion(server);
String region = pluginAdapter.getServerRegion(server);
String environment = pluginAdapter.getServerEnvironment(server);
String address = server.getHostPort();
LOG.info("負載均衡用戶定制觸發:mobile={}, serviceId={}, version={}, region={}, env={}, address={}", mobile, serviceId, version, region, environment, address);
if (StringUtils.isNotEmpty(mobile)) {
// 手機號以移動138開頭,路由到1.0版本的服務上
if (mobile.startsWith("138") && StringUtils.equals(version, "1.0")) {
return true;
// 手機號以聯通133開頭,路由到2.0版本的服務上
} else if (mobile.startsWith("133") && StringUtils.equals(version, "1.1")) {
return true;
} else {
// 其它情況,直接拒絕請求
return false;
}
}
return true;
}
}
在這里,灰度版本是1.1,常規版本是1.0,也就是說,根據header的值來進行路由,到底是選擇常規版本還是灰度版本。
這是使用discovery在我們的demo項目上增加的filter。
在壓測中出現過一個問題,nepxion集成了zuul,在引用了nepxion的jar包后,需要自定義semaphore.maxSemaphores,否則,壓測達到1k+並發的時候,就會觸發我們的熔斷了。