Nepxion discovery的一些使用

   最近在接入全链路灰度的测试,调研了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+并发的时候,就会触发我们的熔断了。

原文地址:https://www.cnblogs.com/spillage/p/11996710.html