文档章节

zk实战--rpc框架集群化

xpbob
 xpbob
发布于 07/17 13:26
字数 979
阅读 596
收藏 8
ZK

在看此篇内容时需要浏览下面内容 netty实战--手写rpc框架

前文功能简介以及功能扩充

利用netty来实现一个点对点的rpc调用。客户端和服务端都是靠手写地址进行socket同学的,无法1对多,也无法把服务拆分到不同的机器上进行压力分摊,做不到调用的时候水平扩展。现实的场景是机器单台作战能力比较差劲,但是机器多,可以把不同的运算交给不同的机器来做,这样达到机器的利用。所以有了如下的改造。

  1. 支持服务水平扩展。
  2. 支持不同的服务分布在不同的机器上。

这时候就需要引入zookeeper来做管理。

主体思路

  1. 上线的数据都写入到临时节点里
  2. 通过临时节点来确保,服务器停止之后,节点消失
  3. 自动发现服务的功能,依靠zk的Watcher来发现服务的上线和下线功能。

数据组织形式

zk数据

   /xp
    |------ip:port---services
    |    
    |------ip:port---services
    |       
    |------ip:port---services

zk的数据按照如上情况进行组织,xp为一个永久节点,下面的ip:port组成一个临时节点。分别代表服务的ip和port,当服务停止或者意外被杀以后,对应的ip:host就会消失。

xp是一个永久节点,我们对他进行watch,只要有新的服务启动或者停止都会收到事件。

client维护的结构

|-service---client
|
|-service---client

client维护的结构是service和client连接的对应,一般情况下都是一个server里有多个服务,水平扩展的时候启动多个server即可。所以组织的时候是按照service组织方便查找。

代码实现要点

客户端对永久节点进行watch,这里加入了一个callback,当发生了节点变化的时候重新更新消息。

	public List<String> getInofAndWatcher(final String path, final InfoCallBack callBack) throws Exception {
		List<String> nodeList = zk.getChildren(path, new Watcher() {
			@Override
			public void process(WatchedEvent event) {
				if (event.getType() == Event.EventType.NodeChildrenChanged) {
					try {
						List<String> nodeList = zk.getChildren(path, false);
						callBack.getLastList(nodeList);
					} catch (Exception e) {
						e.printStackTrace();
					}

				}
			}
		});
		return nodeList;
	}

发布到zk的信息,就是ip,port,service。

public class ServiceInfo {
	private String ip;
	private int port;
	private List<String> interfaces;
}

会把这些数据通过json格式写入到zk,这里需要写明文,方便查看zk下有哪些服务

	public void addService(ServiceInfo info) {
		zkUtil.create(CommonContext.PATH + "/" + info.toString(), JSONObject.toJSONString(info).getBytes());

	}

客户端在启动或者事件发生的时候进行service更替。

	public void getLastList(List<String> lists) {
		Map<String, Set<Client>> serviceTmp = new HashMap<>();
		if (lists != null && !lists.isEmpty()) {
			for (String node : lists) {
				String info;
				try {
					info = new String(zkUtil.getData(CommonContext.PATH + "/" + node));
					ServiceInfo parse = JSONObject.parseObject(info, ServiceInfo.class);
					String address = parse.toString();
					List<String> interfaces = parse.getInterfaces();
					if (interfaces != null && !interfaces.isEmpty()) {
						for (String service : interfaces) {
							Set<Client> set = serviceTmp.get(service);
							if (set == null) {
								set = new HashSet<Client>();
							}
							if (!set.contains(address)) {
								Client client = new Client();
								client.connect(parse.getIp(), parse.getPort());
								set.add(client);
							}
							serviceTmp.put(service, set);

						}
					}
				} catch (Exception e) {
					e.printStackTrace();
				}

			}

		}

		services = serviceTmp;

	}

数据发送的时候选择随机找服务,这样不至于压力都在一个服务上。

	public static void send(RpcRequest request, String className) {
		Set<Client> set = services.get(className);
		if (set != null && !set.isEmpty()) {
			Client[] array = set.toArray(new Client[0]);
			//random 
			Client client = array[new Random().nextInt(array.length)];
			client.write(request);
		}
	}

测试使用

客户端

		new Observer("127.0.0.1:2181");
		ITest proxy = ProxyInterface.getProxy(ITest.class);
		String message = proxy.getMessage();
		System.out.println(message);

服务端

		ITest test= new TestImpl();	
		Invoker.put(test);
		List<String> list = new ArrayList<String>(Invoker.getServices());
		ServiceInfo info = new ServiceInfo("127.0.0.1", 6161, list);
		Publisher pub = new Publisher("127.0.0.1:2181");
		pub.addService(info);
		Server.bind(6161);

总结

利用zk的注册功能,让服务互相发现,并且做到水平扩展。重点就是一个事件机制和临时节点的机制。代码如下 https://github.com/xpbob/lightrpc

© 著作权归作者所有

共有 人打赏支持
xpbob
粉丝 97
博文 85
码字总数 67859
作品 0
高级程序员
高性能 RPC 框架 Dubbo 从入门到深入-服务注册中心搭建(详细)

一、前言 整体来说,一个公司业务系统的演进流程基本都是从单体应用到多应用。在单体应用时,不同业务模块相互调用直接在本地 JVM 进程内就可以完成,而变为多个应用时,相互之间进行通信的方...

加多
01/26
0
0
Commonrpc 1.0-stable 发布,分布式 RPC 框架

commonrpc 是 一个以netty 传输协议框架为基础。自定义 spring shcema标签的rpc框架,不侵入任何业务代码,插件模式,即插即用;一个高性能分布式rpc框架,支持tcp,http协议,扩展性强。 bu...

liubingsmile
2015/03/29
1K
27
Zookeeper实现简单的分布式RPC框架

在分布式系统中,为了提供系统的可用性和稳定性一般都会将服务部署在多台服务器上,为了实现自动注册自动发现远程服务,通过ZK,和ProtocolBuffe 以及Nettyr实现一个简单的分布式RPC框架。 首...

闪电
2015/05/10
0
0
Dubbo实战一:快速入门 [译]

本文根据https://github.com/alibaba/dubbo 的README,然后实战操作记录如下: 一、简介 Dubbo不单单只是高性能的RPC调用框架,更是SOA服务治理的一种方案。 核心: 1. 远程通信,向本地调用...

泥沙砖瓦浆木匠
2016/04/03
186
0
Motan源码阅读--工程概述

工程概述 Motan框架采用模块化设计,使用按需加载,模块有: motan-core:motan核心框架 motan-transport-netty:基于Netty协议的长链接传输协议 motan-registry-consul:consul服务发现组件...

春哥大魔王的博客
08/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

区块链100讲:盘点那些常用的加密算法原理

在开发过程中,常常用到各种加密方法和算法,本文总结了几种常用加密方法的原理。 1 对称加密 原理:加密和解密数据使用同一个密钥,适合对大量数据进行加解密 安全性:关键是密钥的保存方式...

HiBlock
12分钟前
0
0
zookeeper基本常识

一、Zookeeper基础知识 1 zookeeper是一个类似hdfs的树形文件结构,zookeeper可以用来保证数据在(zk)集群之间的数据的事务性一致。2 zookeeper有watch事件,是一次性触发的,当watch监视的数...

啃不动地大坚果
17分钟前
0
0
Forrester企业级容器平台权威排行出炉,小初创Rancher缘何成为领导者?

全球著名的调研机构Forrester Research近日发布了《The Forrester New Wave: Enterprise Container Platform Software Suites, Q4 2018》报告,对企业级容器平台(ECP)市场进行全面评估,希...

RancherLabs
20分钟前
0
0
【三 异步HTTP编程】 2. 流式HTTP响应

标准响应及Content-Length头 自HTTP1.1以来,服务器为了在一个链接中处理多个HTTP请求及响应,必须随response一起返回合适的Content-Length值。 默认情况下,对于简单请求你无需返回 Conten...

Landas
55分钟前
0
0
Java后端技术栈,到底如何深入学习?

Java,是现阶段中国互联网公司中,覆盖度最广的研发语言。有不少朋友问,如何深入学习Java后端技术栈,今天分享一个,互联网牛人整理出来的Java深入学习路线图,以及免费学习资料。 一 。性能...

别打我会飞
59分钟前
1
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部