19 重新来过从一个服务消费者的Demo说起

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

    接下来给大家贴一下示例源码,这个源码来源于Dubbo源码目录的 dubbo-demo/dubbo-demo-api 目录下面的dubbo-demo-api-consumer子项目,这里我做了删减,方便看核心代码:
    首先我们定义一个服务接口如下所示:

    1. package link.elastic.dubbo.consumer;
    2. import link.elastic.dubbo.entity.DemoService;
    3. import org.apache.dubbo.common.constants.CommonConstants;
    4. import org.apache.dubbo.config.ApplicationConfig;
    5. import org.apache.dubbo.config.MetadataReportConfig;
    6. import org.apache.dubbo.config.ProtocolConfig;
    7. import org.apache.dubbo.config.ReferenceConfig;
    8. import org.apache.dubbo.config.RegistryConfig;
    9. import org.apache.dubbo.config.bootstrap.DubboBootstrap;
    10. import org.apache.dubbo.rpc.service.GenericService;
    11. public class ConsumerApplication {
    12. runWithBootstrap();
    13. }
    14. private static void runWithBootstrap() {
    15. ReferenceConfig<DemoService> reference = new ReferenceConfig<>();
    16. reference.setInterface(DemoService.class);
    17. reference.setGeneric("true");
    18. reference.setProtocol("");
    19. DubboBootstrap bootstrap = DubboBootstrap.getInstance();
    20. ApplicationConfig applicationConfig = new ApplicationConfig("dubbo-demo-api-consumer");
    21. applicationConfig.setQosEnable(false);
    22. applicationConfig.setQosPort(-1);
    23. bootstrap.application(applicationConfig)
    24. .protocol(new ProtocolConfig(CommonConstants.DUBBO, -1))
    25. .reference(reference)
    26. .start();
    27. String message = demoService.sayHello("dubbo");
    28. System.out.println(message);
    29. // generic invoke
    30. GenericService genericService = (GenericService) demoService;
    31. Object genericInvokeResult = genericService.$invoke("sayHello", new String[]{String.class.getName()},
    32. new Object[]{"dubbo generic invoke"});
    33. System.out.println(genericInvokeResult);
    34. }

    启动服务,这个时候我们打开Zookeeper图形化客户端来看看这个服务在Zookeeper上面写入来哪些数据,如下图:
    在这里插入图片描述
    在这里插入图片描述

    写入Zookeper上的节点用于服务在分布式场景下的协调,这些节点是比较重要的。

    • 服务提供者配置信息URL形式
    • 服务消费者的配置信息URL形式
    • 服务路由信息
    • 配置信息

    上面这个图就是Dubbo3的注册信息了,后面我们也会围绕细节来说明下,这里可以看下新增了:

    • /dubbo/metadata 元数据信息
    • /dubbo/mapping 服务和应用的映射信息
    • /dubbo/config 注册中心配置
    • /services目录应用信息

    在这里可以大致了解下,在后面会有更详细的源码解析这个示例代码.通过透析代码来看透Dubbo3服务注册原理,服务提供原理。