[apache/dubbo]同一个服务既提供spring web服务又提供dubbo服务,如何正确关闭服务

2023-12-18 938 views
1

目前我们的同一个服务既提供spring web服务又提供dubbo服务。 dubbo的配置如下:

dubbo:
  application:
    name: ${spring.application.name}
    id: ${spring.application.name}
    register-mode: instance
    logger: slf4j
    shutwait: 5000
  protocol:
    id: dubbo
    name: dubbo
    port: -1
    serialization: hessian2
  registry:
    address: nacos://@nacos.server@
  config-center:
    address: nacos://@nacos.server@
  metadata-report:
    address: nacos://@nacos.server@
  scan:
    base-packages: com.xxx
  consumer:
    check: false
  provider:
    threads: 500
    delay: 10000

使用docker stop关闭服务的时候 dubbo服务会先关闭,不接收请求,然后spring也会关闭服务。但是问题是dubbo关闭后spring还有请求过来,导致spring 请求中有调用其他dubbo服务的就会报如下错误:

java.util.concurrent.ExecutionException: org.apache.dubbo.rpc.RpcException: Directory of type RegistryDirectory already destroyed for service com.xxx.user.rpc.UserRpc from registry nacos://192.168.100.240:8848/org.apache.dubbo.registry.RegistryService?application=xxx-service&dubbo=2.0.2&environment=product&executor-management-mode=isolation&file-cache=true&logger=slf4j&organization=xx&owner=xxx&pid=1&qos.enable=true&qos.port=28029®ister-mode=instance&release=3.2.0&serialize.check.status=WARN&shutwait=5000×tamp=1689590386952

请问怎么手动关闭dubbo服务,我想的是在spring boot的shutdownHook中手动关闭dubbo服务来解决。但是官方文档好像没有这一块的内容。

回答

0

安全一点,关闭服务之前先触发下线流量操作,如果想要dubbo后关闭可以尝试增加销毁延迟的配置

9

请问有相关文档吗,官方没看到延迟销毁的配置或者文档

2

image 是指的这个参数吗? 好像这个参数对我说的情况不生效。

6

试试这个https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/qos/service-management/

0

多谢 我研究研究

3

上面的文章链接里面有这么一句

如果使用了 SpringBoot,Dubbo 的 ShutdownHook 会在 SpringBoot 的 ShutdownHook 之前执行

这就是我遇到的问题 dubbo关闭了 但是spring boot还有请求过来,这个请求里面会调用过其他的dubbo服务就会报错

6

可以下线时候把你http层的流量也下掉比如操作nginx 这一块可以作为一个完整的功能模块

1

实在没有其他办法只能这么搞了。 目前已经在这么做了