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

为了更方便了解原理,我们先来编写一个Demo,从例子中来看源码实现:,前面说了提供者现在已经有服务注册上去了,那接下来我们编写一个消费者的例子来进行服务发现与服务RPC调用。

19.1 启动Zookeeper

为了Demo可以正常启动,需要我们先在本地启动一个Zookeeper如下图所示:
在这里插入图片描述

19.2 服务消费者

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

  1. import java.util.concurrent.CompletableFuture;
  2. public interface DemoService {
  3. /**
  4. * 同步处理的服务方法
  5. * @param name
  6. * @return
  7. */
  8. String sayHello(String name);
  9. /**
  10. * 用于异步处理的服务方法
  11. * @param name
  12. * @return
  13. */
  14. default CompletableFuture<String> sayHelloAsync(String name) {
  15. return CompletableFuture.completedFuture(sayHello(name));
  16. }
  17. }
  18. 服务实现类如下:
  19. import org.apache.dubbo.rpc.RpcContext;
  20. import org.slf4j.Logger;
  21. import org.slf4j.LoggerFactory;
  22. import java.util.concurrent.CompletableFuture;
  23. public class DemoServiceImpl implements DemoService {
  24. private static final Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class);
  25. @Override
  26. public String sayHello(String name) {
  27. logger.info("Hello " + name + ", request from consumer: " + RpcContext.getServiceContext().getRemoteAddress());
  28. return "Hello " + name + ", response from provider: " + RpcContext.getServiceContext().getLocalAddress();
  29. }
  30. @Override
  31. public CompletableFuture<String> sayHelloAsync(String name) {
  32. return null;
  33. }
  34. }

19.3 启用服务消费者

有了服务接口之后我们来启用服务,启用服务的源码如下:
这里如果要启动消费者,主要要修改QOS端口这里我已经配置可以直接复用

  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. public static void main(String[] args) {
  13. runWithBootstrap();
  14. }
  15. private static void runWithBootstrap() {
  16. ReferenceConfig<DemoService> reference = new ReferenceConfig<>();
  17. reference.setInterface(DemoService.class);
  18. reference.setGeneric("true");
  19. reference.setProtocol("");
  20. DubboBootstrap bootstrap = DubboBootstrap.getInstance();
  21. ApplicationConfig applicationConfig = new ApplicationConfig("dubbo-demo-api-consumer");
  22. applicationConfig.setQosEnable(false);
  23. applicationConfig.setQosPort(-1);
  24. bootstrap.application(applicationConfig)
  25. .registry(new RegistryConfig("zookeeper://8.131.79.126:2181"))
  26. .protocol(new ProtocolConfig(CommonConstants.DUBBO, -1))
  27. .reference(reference)
  28. .start();
  29. DemoService demoService = bootstrap.getCache().get(reference);
  30. String message = demoService.sayHello("dubbo");
  31. System.out.println(message);
  32. // generic invoke
  33. GenericService genericService = (GenericService) demoService;
  34. Object genericInvokeResult = genericService.$invoke("sayHello", new String[]{String.class.getName()},
  35. new Object[]{"dubbo generic invoke"});
  36. System.out.println(genericInvokeResult);
  37. }
  38. }

1.4 启用服务后写入Zookeeper的节点数据

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

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

如果了解过Dubbo的同学,应该会知道Dubbo在低版本的时候会向注册中心中写入服务接口,具体路径在上面的 dubbo目录下 ,然后在 /dubbo/服务接口/ 路径下写入如下信息:

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

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

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

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

技术咨询支持,可以扫描微信公众号进行回复咨询
在这里插入图片描述