那么,netty是什么东西呢,跟RPC有什么关系?
Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序
RPC要做到用户无感知的调用远程服务必定要经过网络传输,而netty正好是是Java编写的快速开发高性能高可靠性的网络编程框架。
目前使用netty作为传输层的RPC框架很多,国内知名的有dubbo,motan等。
下面以新浪开源的motan为例,说明netty在RPC的位置:
下图中transport即使使用netty实现的。
总结来说,netty就是解决RPC网络传输的。
分布式RPC需要解决哪些问题呢?
- protocol:传输协议
- proxy:client代理,服务引用方调用方法通过代理发送远程消息
- codec:协议编解码压缩等
- transport:协议传输
- registry:注册中心,服务注册服务发现
- cluster:负载均衡,服务容错策略
- 其他:服务降级,服务隔离,服务治理
如何实现一个分布式的RPC框架呢?
现在互联网已经很少单点服务了,一个好的rpc框架能帮我们省掉很多工作,那么如何撸一个自己喜欢的RPC框架呢?
现在写rpc框架已经不难了,我们可以有很多参考,很多成熟的第三方开源项目可以依赖,可以说是站在巨人的肩膀上。
第一步,选择传输协议:
高性能的rpc和良好的编码协议是分不开的。好的协议不仅耗用流量小,而且序列化和反序列化更快。
现在比较流行的协议有thrift,protobuf,json,restful等。其中thrfit和protobuf性能都比较优异,而且占用空间小,最重要的是跨语言,具有语言平台无关性。但,美中不足的是他们都需要预先根据协议文件预先生成好代码。开发极不流畅。
我们也可以自定义协议,像dubbo和motan一样,定制自己的私有协议,
比如motan协议的header部分如下:
body部分采用hession或者fastjson序列化,
如果不考虑跨语言,这种算是比较完美的解决方案。
定义协议过程中的一些重要且容易忽略的问题:
- 协议版本号
- 消息id
- 协议扩展字段
第二步,协议传输层
一个高性能RPC框架最重要的四个点就是:传输协议,框架线程模型,IO模型,零拷贝。
java程序如果能做好这四点,那么性能应该不会比c++程序差多少。
而作为java开发者,netty正好解决了后三个点,所以使用netty作为RPC框架的传输层会事半功倍。
链接:https://www.zhihu.com/question/25536695/answer/134976748
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
第三部,注册中心的选择
现在有很多提供服务注册发现的服务,实现成本比较低就是zookeeper,可以很容易的实现服务注册和服务发现的功能。
解决了这三部,后面的就得脚踏实地码代码了,当然后续会有很多细节,不过都不是问题,现在有好多成熟的开源框架可以参考。
当然也可以参考我最近实现的分布式RPC框架,也欢迎提issue(后续会持续优化)。
自己撸一个RPC还是很不错的,如果有兴趣建议自己撸一遍玩玩。
下面是广告时间>>>>>>>>>
dempeZheng/forestRPC 基于netty, spring,轻量的高性能分布式RPC服务框架
Overview
基于netty, spring,轻量的高性能分布式RPC服务框架。简单,易用,高效。
Features
- 服务端支持多种序列化方式:fastjson,hession,kryo
- 服务端支持多种压缩方式:gzip,snappy
- 服务端可根据group进行线程隔离,支持基于spring对不同的group配置不同的业务线程池
- 支持注解配置,也支持spring xml配置
- 支持服务发现服务注册
- client端支持多种负载均衡策略和容灾策略
- client内置连接池
- 基于netty 4.x版本实现,高性能(win 8cpu单机8w+)
TODO
- 服务降级功能
- http服务支持
- 跨语言协议支持
- 服务治理管理后台
相关推荐
C语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC...RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPC
go-rpc代码分析
servant C++语言框架rpc的源码实现 tools C++语言框架IDL工具的源码实现 util C++语言框架基础工具库的源码实现 examples C++语言框架的示例代码,包括:快速入门示例、promise编程入门示例、压测程序示例 unittest ...
hprose-golang, Hprose是跨语言的RPC 这里项目为 Hprose 2.0,用于 Golang Hprose 2.0用于 Golang Hprose 2.0用于Golang中文文档简介安装使用Http服务器基于 net/http协议的基于 fasthttp的基于的 。基于
ONC RPC 协议实现,根据.x接口文档生成JAVA代码,实现不同语言间的RPC调用
jsonrpc-c-master 基于 json rpc 1.0 纯C开发的服务端代码和示例
该工程是Tars RPC框架C++语言的源代码 , C++语言框架rpc的源码实现,C++语言框架IDL工具的源码实现 。
RFC:远程过程调用协议说明第二版 (RPC: Remote Procedure Call Protocol Specification Version 2) 备忘录状态 该备忘录表书了Sun为...A.1 端口映射协议说明(用RPC语言) 15 A.2 端口映射操作: 17 参考资料: 17
hprose-php, Hprose是跨语言的RPC 这里项目为 Hprose 2.0,用于 PHP for PHP 简介Hprose 是一个高性能远程对象服务引擎。它是一种现代。轻量级。跨语言。跨平台。面向对象。高性能。远程动态通信中间件。 它不仅易于...
- JAVA语言开发,工程性好,保护原有技术投资。 - 预留兼容性,以protobuf为契约,符合社区技术趋势,为后续以protobuf为基础做技术升级留下兼容性。例如,引入grpc,业务契约无需改变。 - 灵活性,可采用集中治理,...
HARPC(High Availability RPC)是基于Thrift的跨语言、高可用的RPC框架。具备高性能、高可用、轻量级等特点 * 跨语言通信 * 方便的使Java、Python、C++三种程序可以相互通信 * 负载均衡和容灾处理 * 方便的实现...
son-rpc是基于json的跨语言远程调用协议,比xml-rpc、webservice等基于文本的协议传输数据格小;相对hessian、java-rpc等二进制协议便于调试、实现、扩展,是非常优秀的一种远程调用协议
JSON-RPC协议的C语言版与Python语言版,源代码及示例
各语言之间数据共享交互,RPC协议。亲测可用。
第一种,也是最常用的方式是单向RPC,即客户端发送一个请求给服务端,从服务端获取一个应答,就像一次普通的函数调用 第二种方式是服务端流式RPC,即服务端返回的不
PHPRPC 是一个轻型的、安全的、跨网际的、跨语言的、跨平台的、跨环境的、跨域的、支持复杂对象传输的、支持引用参数传递的、支持内容输出重定向的、支持分级错误处理的、支持会话的、面向服务的高性能远程过程调用...
在客户端模块中,使用GO语言、jsonrpc库完成服务端接口调用,接收服务端的通知消息,并完成通知消息的处理。
第一种,也是最常用的方式是单向 RPC,即客户端发送一个请求给服务端,从服务端获取一个 第二种方式是服务端流式 RPC,即服务端返回的不是一个结果,而是一批 第
json-rpc是一种非常轻量级的跨语言远程调用协议,实现及使用简单。仅需几十行代码,即可实现一个远程调用的客户端,方便语言扩展客户端的实现。此为最新jar包,jsonrpc4j-1.5.3.jar
c++语言框架rpc源代码实现- TarsCloud/TarsCpp-源码