为了更方便了解源码,先编写一个 Demo,从例子中来看源码的实现。由于目前在实际公司中使用的 Dubbo 版本是 3.3.0,所以在这里是围绕该版本进行说明的。
启动 Nacos
为了 Demo 可以正常启动,需要在本地启动一个 Nacos,如下图所示:
服务提供者
以 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 控制台查看配置中心引入了那些配置信息
如图所示,服务名前缀为 providers:
的信息为服务提供者的元信息,consumers:
则代表服务消费者的元信息。点击“详情”可查看服务状态详情:
Service Name | Details |
---|---|
dubbo-demo-api-provider | dubbo.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 服务注册原理,服务提供原理。