手写mini版dubbo

本次准备分享手写mini版dubbo,能让你体验一把本身写的dubbo是什么样子,因为时间问题,因此只能算是一个mini版。java

  • 环境:JDK1.8,git

  • 开发工具:ideagithub

  • 第三方框架:zookeeperweb

若是你对dubbo陌生或者不熟悉,能够先去看看这篇文章spring

若是你对<dubbo:application name="hello" >这类标签不熟悉,你能够先去了解一下这篇文章apache

注:因为dubbo默认使用netty做为网络通讯,本文章也是使用netty,可是这里不会深刻讨论netty,后面再分享。api


建三个module网络

dubbo-apimvc

640?wx_fmt=png

package com.tian.service;
/**
* @auther: lawt
* @date: 2018/12/15 22
* @Description: 接口
*/
public interface IHelloService {
String sayHello(String msg);
}
/**
* @auther: lawt
* @date: 2018/12/15 23
* @Description: 请求参数
*/
public class Request implements Serializable {
/**
    * 类名称
    */
   private String className;
   /**
    * 方法名
    */
   private String methodName;
   /**
    * 参数类型
    */
   private Class<?>[] types;
   /**
    * 参数
    */
   private Object[] params;
   //....get and set method
}
package com.tian.bean;
import java.io.Serializable;
/**
* @auther: lawt
* @date: 2018/12/16 20
* @Description: 地址信息
*/
public class Address implements Serializable {
/**
    * ip
    */
   private String host;
   /**
    * 端口
    */
   private int port;
   public Address(String host, int port) {
this.host = host;
       this.port = port;
   }
// ... get and set method
}

而后把dubbo-api打成jar。给server和client方引用app

<dependency>
   <groupId>com.tian</groupId>
   <artifactId>dubbo-api</artifactId>
   <version>1.0-SNAPSHOT</version>
</dependency>

dubbo-server

640?wx_fmt=png

pom.xml

<dependencies>
   <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <version>4.11</version>
       <scope>test</scope>
   </dependency>
   <dependency>
       <groupId>com.tian</groupId>
       <artifactId>dubbo-api</artifactId>
       <version>1.0-SNAPSHOT</version>
   </dependency>
   <!-- 连接zk的curator jar包 -->
   <dependency>
       <groupId>org.apache.curator</groupId>
       <artifactId>curator-framework</artifactId>
       <version>2.5.0</version>
   </dependency>
   <dependency>
       <groupId>org.apache.curator</groupId>
       <artifactId>curator-recipes</artifactId>
       <version>2.5.0</version>
   </dependency>
   <!-- netty jar包 -->
   <dependency>
       <groupId>io.netty</groupId>
       <artifactId>netty-all</artifactId>
       <version>4.1.6.Final</version>
   </dependency>
   <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-context</artifactId>
       <version>3.2.4.RELEASE</version>
   </dependency>
   <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-aop</artifactId>
       <version>3.2.4.RELEASE</version>
   </dependency>
   <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-core</artifactId>
       <version>3.2.4.RELEASE</version>
   </dependency>
   <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-context-support</artifactId>
       <version>3.2.4.RELEASE</version>
   </dependency>
   <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-tx</artifactId>
       <version>3.2.4.RELEASE</version>
   </dependency>
   <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-web</artifactId>
       <version>3.2.4.RELEASE</version>
   </dependency>
   <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-beans</artifactId>
       <version>3.2.4.RELEASE</version>
   </dependency>
   <dependency>
       <groupId>org.junit.jupiter</groupId>
       <artifactId>junit-jupiter-api</artifactId>
       <version>5.2.0</version>
   </dependency>
</dependencies>

用于解析<dubbo:**>标签

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

自定义一个注解

import java.lang.annotation.*;
/**
* @auther: lawt
* @date: 2018/12/15 21
* @Description: 自定义注解
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Service {
Class<?> value();
}

注解使用

package com.tian.service;
import com.tian.annotation.Service;
/**
* @auther: lawt
* @date: 2018/12/15 21
* @Description: 业务实现类
*/
@Service(IHelloService.class)
public class HelloServiceImpl implements IHelloService {
@Override
   public String sayHello(String msg) {
return msg + "hello world";
   }
}

服务端地址

/**
* 服务地址和端口
*
* @author lawt
*/
public class ServerAddresses {
private String host;
   private int port;
   @Override
   public String toString() {
return "ServerAddresses{" +
"host='" + host + '\'' +
", port=" + port +
'}';
   }
//.... get and set method
}

服务注册到注册中心

/**
* @auther: lawt
* @date: 2018/12/15 21
* @Description: zookeeper地址
*/
public class ZookeeperConfig {
public static final String ZK_REGISTER_PATH = "/registrys";
   public static final String CONNECTION_STR = "127.0.0.1:2181";
   //集群zk的配置方式,也能够配置到咱们的配置文件中
//    public static final String CONNECTION_STR = "127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183";
}
/**
* @auther: lawt
* @date: 2018/12/15 21
* @Description: 注册接口
*/
public interface IRegistryCenter {
/**
    * serviceName:com.tian.api.IHelloService
    * serviceAddress:127.0.0.1:8080
    * 将serviceName与serviceAddress绑定在一块儿并主持到zookeeper上去
    *
    * @param serviceName    service 名称
    * @param serviceAddress 服务地址
    */
   void register(String serviceName, String serviceAddress);
}

640?wx_fmt=png

把服务和地址绑定起来,而后发布服务

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

业务处理

640?wx_fmt=png

server端服务启动类

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

server服务启动成功。

client端这里就不细说了,若是想了解请下载代码,代码里有注释的

地址:

https://github.com/sunmutian/springmvc4tian/tree/master/


关注并回复福利  有惊喜哟


                    smiley_44.png点个赞smiley_79.png



本文分享 CSDN - 田维常。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。