基本信息
文件名称:实现一个简单Dubbo完整过程详解.docx
文件大小:19.11 KB
总页数:10 页
更新时间:2025-05-20
总字数:约6.89千字
文档摘要

实现一个简单Dubbo完整过程详解

目录Dubbo需求网络服务端代理测试

Dubbo

Dubbo最早的定位是rpc框架,即远程服务调用,解决的是跨服务之间的方法调用问题,本文还是在这个定位基础上尝试手写一个简单的Dubbo

需求

首先要搭建测试的项目结构,两个服务consumer和provider,分别代表调用方和提供方,二者功能依赖于interface,其中暴露接口

interface包中定义一个接口

//interface

publicinterfaceHelloService{

StringsayHello(Stringname);

provider实现

//provider

publicclassHelloServiceImplimplementsHelloService{

publicStringsayHello(Stringname){

returnhello+name;

consumer调用

//consumer

publicclassConsumer{

publicstaticvoidmain(String[]args){

//todo获取不到HelloService的实现

HelloServicehelloService=null;

System.out.println(helloService.sayHello(pq));

当前的需求即consumer服务调用provider服务里sayHello方法的实现,显然当前无法实现,这是一种远程发放调用,我们在新建一个Module命名为dubbo,意图通过依赖它来实现远程方法的调用

dubbo

网络

由于跨服务了,所以远程调用必然是要走网络的,dubbo使用了netty,我们也用netty来实现通讯

首先定义网络请求的数据,远程调用需要的信息:哪个类,哪个方法,什么参数,我们把这些信息封装一下

//dubbo

@Data

@AllArgsConstructor

publicclassInvocationimplementsSerializable{

privateStringclassName;

privateStringmethodName;

privateClass[]paramTypes;

privateObject[]args;

服务端

provider作为服务的提供方,需要依靠netty搭建一个服务器,当接受到请求(Invocation对象)时,可以根据className,methodName等信息找到对应的本地方法进行调用

所以provider首先要维护一个map存储className和class的对应关系,这样在收到请求时可以通过className找到对应的类,再通过反射获取对应的方法进行调用

在我们的dubbo框架中封装这么一个map结构供provider使用

//dubbo

publicclassLocalRegister{

privatestaticMapString,Objectmap=newHashMapString,Object();

publicstaticvoidregister(StringclassName,Objectimpl){

map.put(className,impl);

publicstaticObjectget(StringclassName){

returnmap.get(className);

然后再做一个处理请求netty服务供provider使用

//dubbo

publicclassNettyServer{

publicvoidstart(Integerport){

try{

finalServerBootstrapbootstrap=newServerBootstrap();

EventLoopGroupbossGroup=newNioEventLoopGroup(1,newDefaultThreadFactory(bossGroup,true));

EventLoopGroupworkerGroup=newNioEventLoopGroup(10,newDefaultThreadFactory(workerGroup,