[Dubbo3.0.7源码解析]1-从一个服务提供者的Demo说起

Posted 宋小生-中间件

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Dubbo3.0.7源码解析]1-从一个服务提供者的Demo说起相关的知识,希望对你有一定的参考价值。

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

为了更方便了解原理,我们先来编写一个Demo,从例子中来看源码实现:

1.1 启动Zookeeper

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

1.2 服务提供者

接下来给大家贴一下示例源码,这个源码来源于Dubbo源码目录的 dubbo-demo/dubbo-demo-api 目录下面的dubbo-demo-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));
    


服务实现类如下:

import org.apache.dubbo.rpc.RpcContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.CompletableFuture;

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;
    


1.3 启用服务

有了服务接口之后我们来启用服务,启用服务的源码如下:

import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.MetadataReportConfig;
import org.apache.dubbo.config.ProtocolConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.ServiceConfig;
import org.apache.dubbo.config.bootstrap.DubboBootstrap;
import org.apache.dubbo.demo.DemoService;

public class Application 
    public static void main(String[] args) throws Exception 
            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("zookeeper://127.0.0.1:2181"))
            .protocol(new ProtocolConfig(CommonConstants.DUBBO, -1))
            .service(service)
            .start()
            .await();
    

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

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

写入Zookeper上的节点用于服务在分布式场景下的协调,这些节点是比较重要的,在这里可以大致了解下,在后面会有更详细的源码解析这个示例代码.通过透析代码来看透Dubbo3服务注册原理,服务提供原理

以上是关于[Dubbo3.0.7源码解析]1-从一个服务提供者的Demo说起的主要内容,如果未能解决你的问题,请参考以下文章

SDWebImage源码解析

深入解析spring源码IOC流程

3Nacos 配置中心源码解析之 项目结构

3Nacos 配置中心源码解析之 项目结构

Dubbo源码解析:服务暴露与发现

3Nacos 配置中心源码解析之 项目结构