有点尴尬,用了nacos一年了,然后知晓Nacos是可以用命名空间隔离测试环境和线上环境,甚至是预发环境,但是试用后,只解决了SpringCloud的服务隔离,并没有解决Dubbo隔离问题,每次就是Public空间中一大堆的dubbo接口,然后因为dubbo的问题,部署了三个nacos~~-_-
————————————————————分割线,这个问题就此解决
- 在之前的版本是可以通过dubbo.registry.namespace进行配置
- 2.7.x可以通过
- 3.1.8 版本可以通过两种方法进行配置其中一个是使用自定义配置parameters,如下
dubbo:
registry:
address: nacos://${spring.cloud.nacos.discovery.server-addr}
group: dubbo
#注册模式为实例级别
register-mode: instance
#这里配置的是自定义的配置(文档中并没有指明有哪些配置),其中namespace就在这里配置
parameters:
namespace: ${spring.cloud.nacos.config.namespace}
consumer:
check: false
#指定服务提供者的namespace (配置文档中有说明)
provider-namespace: ${spring.cloud.nacos.config.namespace}
protocol:
name: dubbo
application:
name: ${spring.application.name}
config-center:
#指定配置中心的namespace(配置文档中有说明)
namespace: ${spring.cloud.nacos.config.namespace}
还有更简单的方案
dubbo:
registry:
#这里的配置和上面的配置是一样的但是不太直观不建议采用
address: nacos://${spring.cloud.nacos.discovery.server-addr}?namespace=namespaceValue
————————————————————分割线,记录一下Dubbo调用的一个小问题
实现IM即时通信时,Dubbo的优点不需要重复三次的再说了,但是改造框架的过程中遇到了一个问题,先慢慢说一下这个场景,假设A登陆S1服务器,B登陆的也是S1服务器,那么单聊的时候,A给B发送消息,可以直接查找到当前这个B的用户的长链接(这里如果没有使用MQ作为消息中间件的话,推荐用MQ消息中间件)但是B如果登陆的不是S1,而是Sn,那么S1服务器是找不到B的链接fd的,所以,想用dubbo指定IP的方法来调用Sn,但是dubbo的provider为了防止服务端口占用,指定了端口为-1,然后杯具就出来了。。。
端口随机,IP可以知道,端口不清楚,无法发起DUBBO定向调用
解决方案如下
private Instance getInstances(String ip) {
try {
Properties properties = new Properties();
properties.setProperty(PropertyKeyConst.SERVER_ADDR, this.properties.getServerAddr());
properties.setProperty(PropertyKeyConst.NAMESPACE, this.properties.getNamespace());
NamingService service = NamingFactory.createNamingService(properties);
List<Instance> instances = service.getAllInstances("providers:com.wang.common.client.api.RouterApi:1.0.0:");
for (Instance instance : instances) {
String application = instance.getMetadata().get("application");
if (serverName.equals(application) && ip.equals(instance.getIp())) {
return instance;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
感谢一下阿里云文档,完全没有找到~!最后再Nacos的示例代码发现了~!