本次准备分享手写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源创计划”,欢迎正在阅读的你也加入,一块儿分享。