Skip to content

Multi registration and multi discovery

Haotian Zhang edited this page Apr 13, 2023 · 16 revisions

多注册与多发现

当使用者想要使用多个服务注册中心,或者是想从其他注册中心平滑迁移到 Polaris 时,一种实现方式是在客户端侧多注册多发现。为了实现多注册多发现的能力,同时尽可能的对业务无侵入,polaris-java-sdk 封装了多注册多发现的功能,使用者可以轻松地实现该场景。

目前仅支持 Polaris 与 Consul / Nacos 的多注册和多发现。

方案设计

sct-Page-5 drawio

如上图所示,polaris-java-sdk 实现了多注册多发现的能力,业务应用只需对接 Polaris 的服务发现能力即可。Polaris 可以同时对 Consul 或者 Nacos 进行多注册和多发现。因此,需要增加其他注册中心的相关配置以建立注册发现连接。

使用方式

Polaris 与 Consul 多注册多发现

第一步:删除 Consul 的依赖

如果您的项目里依赖了 spring-cloud-starter-consul-discovery ,则需要删除依赖,否则会导致应用启动失败。启动失败日志如下:

***************************
APPLICATION FAILED TO START
***************************

Description:

Field autoServiceRegistratihaiyon in org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration required a single bean, but 2 were found:
	- polarisAutoServiceRegistration: defined by method 'polarisAutoServiceRegistration' in class path resource [com/tencent/cloud/polaris/registry/PolarisServiceRegistryAutoConfiguration.class]
	- consulAutoServiceRegistration: defined by method 'consulAutoServiceRegistration' in class path resource [org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistrationAutoConfiguration.class]


Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

第二步:增加 Polaris 的依赖

第一种方式直接依赖 spring-cloud-starter-tencent-polaris-discovery
<dependency>
    <groupId>com.tencent.cloud</groupId>
    <artifactId>spring-cloud-starter-tencent-polaris-discovery</artifactId>
    <version>${version}</version>
</dependency>

<dependency>
    <groupId>com.tencent.polaris</groupId>
    <artifactId>connector-consul</artifactId>
</dependency>
第二种方式通过 spring cloud tencent bom 引入
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.tencent.cloud</groupId>
            <artifactId>spring-cloud-tencent-dependencies</artifactId>
            <version>${version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>com.tencent.cloud</groupId>
        <artifactId>spring-cloud-starter-tencent-polaris-discovery</artifactId>
   </dependency>
</dependencies>

<dependency>
    <groupId>com.tencent.polaris</groupId>
    <artifactId>connector-consul</artifactId>
</dependency>

第三步:修改 application.yml 配置

  1. 配置完整的 spring cloud polaris discovery 配置
  2. 配置完整的 spring cloud consul discovery 配置,注意需要打开所有的开关,包括:
    • spring.cloud.consul.enabled
    • spring.cloud.consul.discovery.register
    • spring.cloud.consul.discovery.enabled

一份完整配置的样例如下所示:

spring:
  application:
    name: DiscoveryCalleeService
  cloud:
    polaris:
      address: grpc://127.0.0.1:8091 # 需修改为真实的 Polaris 服务地址
      discovery:
        ip-address: 127.0.0.1
    consul:
      port: 8500
      host: 127.0.0.1
      enabled: true # 需要打开
      discovery:
        register: true # 需要打开
        instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
        enabled: true # 需要打开
        service-name: ${spring.application.name}
        ip-address: localhost
        prefer-ip-address: true

Consul 可生效的配置说明

配置项Key 默认值 是否必填 配置项说明
spring.cloud.consul.host Consul后端地址
spring.cloud.consul.port Consul端口号
spring.cloud.consul.enabled true 是否启用Consul
spring.cloud.consul.discovery.enabled true 是否启用Consul服务发现
spring.cloud.consul.discovery.register true 是否启用Consul服务注册
spring.cloud.consul.discovery.service-name ${spring.application.name} 注册服务名
spring.cloud.consul.discovery.instance-id 服务名-IP-端口号 注册实例ID
spring.cloud.consul.discovery.prefer-ip-address false 是否使用自定义IP注册
spring.cloud.consul.discovery.ip-address 自定义注册IP

Polaris 与 Nacos 多注册多发现(SCT 版本 >= 1.9.0)

第一步:删除 Nacos 相关依赖

如果您的项目里依赖了 Nacos 相关,则需要删除依赖,否则会导致应用启动失败。

第二步:增加 Polaris 的依赖

第一种方式直接依赖 spring-cloud-starter-tencent-polaris-discovery
<dependency>
    <groupId>com.tencent.cloud</groupId>
    <artifactId>spring-cloud-starter-tencent-polaris-discovery</artifactId>
    <version>${version}</version>
</dependency>

<dependency>
    <groupId>com.tencent.polaris</groupId>
    <artifactId>connector-nacos</artifactId>
</dependency>
第二种方式通过 spring cloud tencent bom 引入
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.tencent.cloud</groupId>
            <artifactId>spring-cloud-tencent-dependencies</artifactId>
            <version>${version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>com.tencent.cloud</groupId>
        <artifactId>spring-cloud-starter-tencent-polaris-discovery</artifactId>
   </dependency>
</dependencies>

<dependency>
    <groupId>com.tencent.polaris</groupId>
    <artifactId>connector-nacos</artifactId>
</dependency>

第三步:修改 application.yml 配置

  1. 配置完整的 spring cloud polaris discovery 配置
  2. 配置完整的 spring cloud nacos discovery 配置,注意需要打开所有的开关,包括:
    • spring.cloud.nacos.enabled
    • spring.cloud.nacos.discovery.enabled
    • spring.cloud.nacos.discovery.register-enabled

一份完整配置的样例如下所示:

spring:
  application:
    name: DiscoveryCalleeService
  cloud:
    polaris:
      address: grpc://127.0.0.1:8091 # 需修改为真实的 Polaris 服务地址
      discovery:
        ip-address: 127.0.0.1
    nacos:
      enabled: true
      discovery:
        server-addr: 127.0.0.1:8848
        enabled: true
        register-enabled: true
        username: nacos
        password: nacos
        group: polaris
        cluster-name: DEFAULT

Nacos 可生效的配置说明

配置项Key 默认值 是否必填 配置项说明
spring.cloud.nacos.enabled true 是否启用 Nacos
spring.cloud.nacos.discovery.server-addr Nacos 后端地址
spring.cloud.nacos.discovery.enabled true 是否启用 Nacos 服务发现
spring.cloud.nacos.discovery.register-enabled true 是否启用 Nacos 服务注册
spring.cloud.nacos.discovery.username 用户名
spring.cloud.nacos.discovery.password 密码
spring.cloud.nacos.discovery.group DEFAULT_GROUP 服务分组
spring.cloud.nacos.discovery.cluster-name DEFAULT 集群名称
Clone this wiki locally