本次準備分享手寫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
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
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:**>標籤
自定義一個註解
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);
}
把服務和地址綁定起來,而後發佈服務
業務處理
server端服務啓動類
server服務啓動成功。
client端這裏就不細說了,若是想了解請下載代碼,代碼裏有註釋的
地址:
https://github.com/sunmutian/springmvc4tian/tree/master/
關注並回復福利 有驚喜喲
點個贊
本文分享 CSDN - 田維常。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。