Netty入门——手写Dubbo框架

手写Dubbo框架

1 简介

Dubbo框架本身就是一个RPC框架。RPC的服务提供者将自身的服务名、IP和端口存放在服务协调器ZK的某个节点下,服务消费者通过监听ZK的该节点,获取可调用的服务名,以及服务提供者的IP和端口信息。
本文使用netty实现一个简单的Dubbo框架,使用zk作为注册服务器,完成RPC的整个过程。

2 实现步骤

2.1 服务端实现步骤

Dubbo服务提供者的实现步骤如下:
1、在zk上创建持久节点/dubboregistry。
2、在zk的/dubboregistry节点下以服务名创建持久节点。
3、在zk的服务节点下,创建服务器提供者临时节点,以IP和端口信息作为临时节点名称。

2.2 消费端实现步骤

Dubbo服务消费者的实现步骤如下:
1、获取zk节点/dubboregistry 下的子节点,得到可调用的远程服务列表。
2、监听所有子节点,读取子节点的IP和端口。
3、通过负载均衡选择一个服务提供者。
4、消费者发送调用消息给服务提供者,并接受返回的结果作为调用结果。

3 创建dubbo-api工程

api工程主要定义业务接口,通用模型和常量。

3.1 业务接口

// 业务接口
public interface SomeService {
   

	String doSome(String city);
}

3.2 调用模型

@Data
public class InvokeMessage implements Serializable {
   

	// 服务名称
	private String serviceName;

	// 方法名
	private String methodName;

	// 参数列表
	private Class<?>[] paramTypes;

	// 方法参数值
	private Object[] paramValues;
}

3.3 常量定义

public class ApiConstant {
   
	public static final String ZK_CLUSTER = "localhost:12181";
	public static final String ZK_DUBBO_PATH = "/dubboregistry";
}

4 创建dubbo-server工程

4.1 添加依赖

包含api、netty、zkclient

<dependencies>
	<!--api-->
	<dependency>
		<groupId>com.hornsey</groupId>
		<artifactId>11-dubbo-api</artifactId>
		<version>1.0-SNAPSHOT</version>
	</dependency>
	<!--netty-->
	<dependency>
		<groupId>io.netty</groupId>
		<artifactId>netty-all</artifactId>
		<version>4.1.36.Final</version>
	</dependency>
	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<version>1.18.8</version>
	</dependency>
	<!--zkclient-->
	<dependency>
		<groupId>org.apache.curator</groupId>
		<artifactId>curator-framework</artifactId>
		<version>2.12.0</version>
	</dependency>
	<dependency>
		<groupId>org.apache.curator</groupId>
		<artifactId>curator-recipes</artifactId>
		<version>2.12.0</version>
	</dependency>
</dependencies>

4.2 添加zk注册接口

添加接口
public interface RegistryCenter {
   

	/**
	 * 将服务注册到zk
	 * @param serviceName
	 * @param serviceAddress
	 */
	void register(String serviceName, String serviceAddress);
}
添加实现类
  • 添加zk客户端
// zkclient
private CuratorFramework curator;

public ZKRegistryCenter() {
   
	// 创建客户端
	curator = CuratorFrameworkFactory.builder()
			.connectString(ApiConstant.ZK_CLUSTER)
			.sessionTimeoutMs(3000)
			.retryPolicy(new RetryNTimes(3, 2000))
			.build();
	// 启动客户端
	curator.start();
}
  • 实现注册函数
@Override
public void register(String serviceName, String serviceAddress) {
   
	String servicePath = ApiConstant.ZK_DUBBO_PATH + "/" + serviceName;

	try {
   
		if (curator
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值