如果您已经在使用其他注册中心,您可以通过以下两种方式从其他注册中心迁移到 Sofa 注册中心:
使用数据同步组件在两个注册中心之间进行数据的复制。这需要额外部署一个同步组件来实现,该方式的好处是对应用无感,应用直接修改注册中心依赖及配置即可完成迁移。
使用 Spring Cloud 的双注册方式,通过程序改造逐步切换。该方式适用于无法使用或不希望使用同步组件的场合。
本文主要介绍第二种方式。
双注册中心的依赖与配置
如果要在 Spring Cloud 项目中引入两个注册中心,您需要完成以下配置:
引入两个注册中心的 starter。
<dependency> <groupId>com.alipay.cloud</groupId> <artifactId>spring-cloud-starter-sofa-registry</artifactId> </dependency> <!-- 以Nacos为例 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- 其他必要依赖(如负载均衡模块等) -->
分别为两个注册中心配置好相应的参数。
spring.cloud.nacos.server-addr=127.0.0.1:8848 spring.cloud.nacos.discovery.namespace=public
在
application.properties
中添加以下配置:spring.cloud.sofa.multi-registry.enabled=true
完成以上步骤后,即可实现双注册中心的接入。接入的效果为:
服务将在两个注册中心上注册。
服务将从两个注册中心上发现服务,不过它不会将所有注册中心的服务列表都合并返回,而是进行遍历,最先从哪个注册中心找到服务列表即返回。默认会优先从 SOFA 注册中心查找服务。
切回单注册中心
要从双注册中心模式切回单注册中心,您需要完成以下配置:
删除不需要的注册中心依赖。
删除无用的注册中心配置。
删除对自动装配类的禁用配置。
注册中心迁移过程
我们假定一个比较简单的情况来推演通过双注册方式进行注册中心迁移的过程。假设 Provider A 被 Consumer A 和 Consumer B 调用,这三个应用逐步的进行双注册中心的改造。
通过编码方式从其他注册中心迁移到 SOFA 注册中心的过程为:
应用逐步改造为双注册中心模式,逐步注册到 SOFA 注册中心。
当所有应用均完成双注册中心改造后,此时 SOFA 注册中心会拥有全量服务信息,且订阅关系也都迁移到了 SOFA 注册中心(在没有修改过订阅优先级的情况下,默认为 SOFA 订阅优先)。
说明由于双注册中心模式下订阅也是在两个注册中心同时订阅,因此改造顺序没有要求,不需要提供者先改造也不影响服务发现,本例只是挑选一种情况进行描述。
应用全部完成双注册中心模式改造且运行平稳后,再逐步改造为仅使用 SOFA 注册中心的模式。
性能影响
将 SOFA 注册中心加入到项目中,并不会对服务调用有性能影响。因为 SOFA 注册中心的订阅是完全异步化的,服务列表在本地均有缓存,因此服务的查找不会带来性能损耗。尤其是配合 Spring Cloud SOFA 提供的预热订阅功能,能更进一步避免服务订阅对请求的性能影响。
使用限制
Spring Cloud SOFA Registry 同时支持 LoadBalancer 和 Ribbon 两种负载均衡框架,这两种框架对于双注册中心的支持是有所区别的:
LoadBalancer 作为目前 Spring Cloud 主推的负载均衡框架,本身就设计了多注册中心同时使用的机制,即使是两个以上的注册中心也可自由搭配(需要注册中心接入模块遵循 Spring Cloud 的扩展规范,SOFA 和主流开源注册中心均支持)。
Ribbon 原生并不支持双注册中心同时使用,Spring Cloud SOFA 针对 Ribbon 的特殊情况做了兼容设计,从而实现了与其他注册中心的搭配使用。因此如果使用 Ribbon 作为负载均衡框架,则只能使用 SOFA + 其他注册中心的组合,无法引入两个以上的注册中心。
服务订阅查找的优先级
在双注册中心模式下,SOFA 注册中心的订阅优先级会高于其他注册中心,这是出于迁移目标考虑而设计的。如果您想调整这个优先级,您可以在application.properties
中通过以下配置进行调整:
# 调整 SOFA 服务发现的优先级,数值越大优先级越低
spring.cloud.sofa.discovery.sofa-discovery-client-order=100
默认情况下,各个开源注册中心的服务发现优先级都设置为 0(Nacos、Consul、Eureka、Zookeeper 都默认为 0),因此只要设置比 0 大的值,即可让开源框架优先。如果未达到效果,则需要确认 SOFA 以外的注册中心的优先级设置。
只有使用 LoadBalancer 作为负载均衡时,才支持优先级调整。Ribbon 无法进行调整。