DubboV3.3 从一个服务提供者的 Demo 说起

作者: vnjohn / 发表于 2025-05-12 / 分类: DubboV3.3

Dubbo3, 源码

为了更方便了解源码,先编写一个 Demo,从例子中来看源码的实现。由于目前在实际公司中使用的 Dubbo 版本是 3.3.0,所以在这里是围绕该版本进行说明的。

启动 Nacos

为了 Demo 可以正常启动,需要在本地启动一个 Nacos,如下图所示:

image-20250513111216352

服务提供者

以 dubbo-demo/dubbo-api 目录下的 dubbo-api-provider 模块的代码为例,接下来给大家贴一下相关的源码部分

服务提供者如下:

import java.util.concurrent.CompletableFuture;
public interface DemoService {

    /**
     * 同步处理的服务方法
     *
     * @param name
     * @return
     */
    String sayHello(String name);

    /**
     * 用于异步处理的服务方法
     *
     * @param name
     * @return
     */
    default CompletableFuture<String> sayHelloAsync(String name) {
        return CompletableFuture.completedFuture(sayHello(name));
    }
}

服务实现类如下:

public class DemoServiceImpl implements DemoService {
    private static final Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class);

    @Override
    public String sayHello(String name) {
        logger.info("Hello " + name + ", request from consumer: " + RpcContext.getServiceContext().getRemoteAddress());
        return "Hello " + name + ", response from provider: " + RpcContext.getServiceContext().getLocalAddress();
    }

    @Override
    public CompletableFuture<String> sayHelloAsync(String name) {
        return null;
    }
}

启动服务

服务接口有了接下来就需要启动提供者了,应用启动的源码如下:

public class Application {
    private static final String REGISTRY_URL = "nacos://127.0.0.1:8848";

    public static void main(String[] args) {
        startWithBootstrap();
    }

    private static void startWithBootstrap() {
        ServiceConfig<DemoServiceImpl> service = new ServiceConfig<>();
        service.setInterface(DemoService.class);
        service.setRef(new DemoServiceImpl());

        DubboBootstrap bootstrap = DubboBootstrap.getInstance();
        bootstrap
                .application(new ApplicationConfig("dubbo-demo-api-provider"))
                .registry(new RegistryConfig(REGISTRY_URL))
                .protocol(new ProtocolConfig(CommonConstants.DUBBO, -1))
                .service(service)
                .start()
                .await();
    }
}

写入 Nacos 配置数据

启动服务成功以后,就可以打开 Nacos 控制台查看配置中心引入了那些配置信息

image-20250513152353181

如图所示,服务名前缀为 providers: 的信息为服务提供者的元信息,consumers: 则代表服务消费者的元信息。点击“详情”可查看服务状态详情:

Service NameDetails
dubbo-demo-api-providerdubbo.metadata-service.url-params=
{“prefer.serialization”:“hessian2,fastjson2”,“version”:“1.0.0”,“dubbo”:“2.0.2”,“release”:“3.3.0”,
“side”:“provider”,“port”:“20880”,“protocol”:“dubbo”}
dubbo.endpoints=[{“port”:20880,“protocol”:“dubbo”}]
dubbo.metadata.revision=4d53cbe6f6ae93bd6b9e49600
dubbo.metadata.storage-type=local
meta-v=1.0.0
timestamp=1747105316418
org.apache.dubbo.demo.DemoService:::
provider:dubbo-demo-api-provider
side=provider
release=3.3.0
methods=sayHello,sayHelloAsync
deprecated=false
dubbo=2.0.2
interface=org.apache.dubbo.demo.DemoService
service-name-mapping=true
generic=false
path=org.apache.dubbo.demo.DemoService
protocol=dubbo
application=dubbo-demo-api-provider
prefer.serialization=hessian2,fastjson2
dynamic=true
category=providers
timestamp=1747105316418

在这里可以大致了解下,在后面会有更详细的源码解析这个示例代码

通过透析代码来看透 Dubbo3 服务注册原理,服务提供原理。

参考文献

01 从一个服务提供者的Demo说起

Nacos 注册中心

vnjohn

作者

vnjohn

后端研发工程师。喜欢探索新技术,空闲时也折腾 AIGC 等效率工具。 可以在 GitHub 关注我了解更多,也可以加我微信(vnjohn) 与我交流。