手寫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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索