menu 不会旅行的兔子不是好青蛙
search self_improvement
目录

Nacos Dubbo 命名空间 和 IP定向调用

旅行青蛙
旅行青蛙 2023年07月26日  ·  阅读 2,538

有点尴尬,用了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的示例代码发现了~!

分类: