本章我们将讲讲dubbo的服务发现机制,目前dubbo支持的注册中心有nacos,zookeeper,kubernetes service等多种注册中心的接入
注册中心 | 配置值 | 服务发现模型 | 是否支持鉴权 | spring-boot-starter |
---|---|---|---|---|
Nacos | nacos | 应用级、接口级 | 是 | dubbo-nacos-spring-boot-starter |
Zookeeper | zookeeper | 应用级、接口级 | 是 | - dubbo-zookeeper-spring-boot-starter - dubbo-zookeeper-curator5-spring-boot-starter |
Kubernetes Service | 参考独立使用文档 | 应用级 | 是 | 无 |
对于服务提供端可以采用延迟注册的方式进行注册
@DubboService(delay = 5000)
public class DemoServiceImpl implements DemoService {
}
可以在注解dubboService上添加属性delay表示进行延迟注册,延迟的时间是 Spring 上下文初始化完成后开始算起。
同时也可以在yml文件中添加属性达到全局延迟注册的效果
dubbo:
provider:
delay: 5000
通过配置 delay = -1
,可以禁止框架自动发布服务到注册中心,直到用户通过调用 online 等命令手动完成发布,具体配置如下:
dubbo:
provider:
delay: -1
application:
manual-register: true
优雅上线:
同延迟注册可以完成优雅上线的功能,延迟的目的是为了保证服务都初始化完毕之后再注册到注册中心,同时也可以添加注解warmuo和weight表示进行预热处理
@Service(warmup = 60000, weight = 30) // 1分钟预热,初始权重30%
public class MyServiceImpl implements MyService {
// ...
}
预热的目的就是为了防止服务刚上线就接受大量的流量从而造成请求延迟的效果
warmup表示预热时间,weight表示请求权重则是请求打到目标服务的比例占多少
优雅下线:
当服务进行关闭的时候可以先从注册中心摘除实例地址保证后面不会添加新的请求,然后关闭的服务进行通过遍历其持有的 channel 链接发送 readonly 事件,收到事件的消费方将会停止往该实例发送新的请求。此动作默认开启。当所有channel处理完毕之后进行关闭服务达到优雅下线的效果而不是突然全部断连。
拒绝新请求、处理存量请求、注销服务
多注册中心:
Dubbo 支持在同一应用内配置多个注册中心,一个或一组服务可同时注册到多个注册中心,一个或一组服务可同时订阅多个中心的地址,对于订阅方而言,还可以设置如何调用来自多个注册中心的地址(优先调用某一个注册中心或者其他策略)。
指定某个服务注册到多个注册中心:
@DubboService(registry = {"beijingRegistry"})
public class DemoServiceImpl implements DemoService {}
指定某个服务订阅来自多个注册中心的地址:
@DubboReference(registry = {"beijingRegistry"})
private DemoService demoService
权限控制:
通过令牌验证在注册中心控制权限,以决定要不要下发令牌给消费者,可以防止消费者绕过注册中心访问提供者。另外通过注册中心可灵活改变授权方式,而不需修改或升级提供者。
dubbo:
provider:
token: true #UUID
注册中心缓存:
当某个服务尝试向注册中心订阅地址时,此时注册中心应该同步返回获当前可用的地址列表,如果此时因网络故障等原因导致读取可用地址列表失败,框架会查询本地缓存的注册中心地址并返回(如不想使用使用缓存地址,可通过设置 check=true
快速失败抛出异常)。失败的订阅动作会被放入一个重试队列,定期重试直到成功,以确保故障恢复后可及时读到最新地址列表。
dubbo:
registry:
file-cache: false
只注册:
如果有两个镜像环境,两个注册中心,有一个服务只在其中一个注册中心有部署,另一个注册中心还没来得及部署,而两个注册中心的其它应用都需要依赖此服务。这个时候,可以让服务提供者方只注册服务到另一注册中心,而不从另一注册中心订阅服务。该机制通常用于提供程序相对静态且不太可能更改的场景或者提供程序和使用者互不依赖的场景。此时该节点仅作为服务提供者存在,不依赖其他服务。
dubbo:
registry:
subscribe: false
只订阅:
为方便开发测试,经常会在线下共用一个所有服务可用的注册中心,这时,如果一个正在开发中的服务提供者注册,可能会影响消费者不能正常运行。可以让服务提供者开发方,只订阅服务(开发的服务可能依赖其它服务),而不注册正在开发的服务,通过直连测试正在开发的服务。此时该节点仅作为服务消费者存在,不对外提供服务。
dubbo:
registry:
register: false