由于项目问题,只能使用zuul做网关,所以还是使用的Netflix 这一套,但是要接入nacos做服务注册,这里就会导致一个问题
provider注册到nacos,还得让网关能从nacos拉取serverList,通过ribbon实现负载均衡的话,ribbon的serverList默认就是eureka实现的,想用nacos就得把ribbon的serverList用nacos实现一下。
这里根据这篇文章
由于nacos使用的是2.x版本,所以里面的实现需要改动,将nacosserver改成
new Server(instance.getIp(),instance.getPort());
然后加上注解@Configuration即可,顺便要在yml配置文件上关闭ribbon对eureka的支持
ribbon:
eureka:
enabled: false
例子:(这里的servicenamecontext是自定义的上下文类,获取当前请求线程的服务名)
@Slf4j
@Configuration
public class NacosWeightRandomV2Rule extends AbstractLoadBalancerRule {
@Autowired
private NacosDiscoveryProperties discoveryProperties;
@Override
public Server choose(Object key) {
DynamicServerListLoadBalancer loadBalancer = (DynamicServerListLoadBalancer) getLoadBalancer();
String name = loadBalancer.getName();
try {
if(ServiceNameContext.getServiceName()!= null){
name = ServiceNameContext.getServiceName();
}
Instance instance = discoveryProperties.namingServiceInstance()
.selectOneHealthyInstance(name);
log.info("选中的instance = {}", instance);
return new Server(instance.getIp(),instance.getPort());
} catch (NacosException e) {
log.error("发生异常", e);
return null;
}
}
@Override
public void initWithNiwsConfig(IClientConfig iClientConfig) {
}
}