用户工具

站点工具


分享:技术:gxxrpc:写gxxrpc框架的过程

写gxxrpc框架的过程

1.选择netty作为nio底层通讯框架
1.1.阅读《Netty权威指南 第2版 带书签目录 完整版.pdf》
1.2.了解io,nio,netty的关系
1.3.了解TCP粘包/拆包问题现象和解决方法
TCP是个”流”协议,所谓流,就是没有界限的一串数据。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题
1.4.了解netty自带编解码器
1.4.1.LineBaseFrameDecoder 换行符作为码流结束标识,解决TCP粘包/拆包问题
1.4.2.DelimiterBasedFrameDecoder 以特殊分隔符作为码流结束标识,比如$_,解决TCP粘包/拆包问题
1.4.3.FixedLengthFrameDecoder 固定长度解码器,解决TCP粘包/拆包问题
1.4.4.LengthFieldBasedFrameDecoder 自定义长度解码器(消息头固定位置增加一个表示长度的字段),解决TCP粘包/拆包问题
1.4.4.StringEncoder和StringDecoder 字节和字符串互转
1.4.5.ObjectEncoder和ObjectDecoder 字节和对象互转,父类是LengthFieldBasedFrameDecoder
1.5.业界主流编解码框架
java序列化缺点:不能跨语言,码流大,性能低
1.5.1.Google的Protobuf
1.5.2.Facebook的Thrift
1.5.3.JBoss的Marshalling
1.5.4.msgpack
1.5.5.kryo
1.6.server端和client端编写
1.7.server端监听端口,接受client端发送消息处理并返回消息,client端接收到返回消息并打印
2.client端写动态代理类,将调用服务接口类,方法名称,参数类型,参数,传送给server端
Proxy.newProxyInstance(服务接口)
3.server端反向序列化,调用接口实现类方法,返回服务是否调用成功,结果和异常信息给client端
serviceImpl = Class.forName(服务接口实现类).newInstance();
4.参考dubbo思考准备实现的功能
4.1.xml配置:基于Spring可扩展Schema提供自定义配置支持
4.2.分布式通讯:底层使用netty作为网络通讯框架
4.3.注册中心:服务注册与订阅,都通过zookeeper
4.4.定向服务:可以指向指定服务提供方ip和端口,不指向注册中心
4.5.负载均衡策略:支持多台服务提供方集群,实现负载均衡算法:轮询,随机,加权轮询,加权随机,源地址哈希
4.6.集群容错策略:服务调用失败的策略:快速失败,失败重试,失败安全,广播失败,广播安全
4.7.服务版本控制:服务匹配相同版本号才可调用
4.8.设置超时时间:超时时间设置,默认超时时间5秒
4.9.结果缓存:设置缓存时间,缓存超上限,FIFO先进先出算法
4.10.泛化调用:不依赖api发起rpc调用
4.11.上下文信息:应用名称,ip,本次线程内调用方信息,服务方信息
4.12.隐式参数:非服务入参,客户端设置隐藏参数,服务端获取隐藏参数
4.13.异步调用:实时返回null,异步从上下文信息中获取
4.14.本地调用:不扫描注册中心,从本应用中寻找服务
4.15.拦截器:pre/post/exception
4.16.服务降级:服务请求方判断服务被降级,直接返回null,降级服务管理
4.17.优雅停机:从注册中心下掉服务和引用
4.18.telnet治理:查看应用名称,ip,管理缓存,管理降级服务
4.19.监控:向治理中心发送监控调用服务情况
5.使用spring扩展schema,设计一套标签和xsd约束文件
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:gxxrpc="http://www.recorddrip.com/schema/gxxrpc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.recorddrip.com/schema/gxxrpc http://www.recorddrip.com/schema/gxxrpc/gxxrpc.xsd">
</beans>
5.1.gxxrpc.xsd放到META-INF目录下,约束xml标签
5.2.spring.schemas放到META-INF目录下,用于指向本地xsd文件:
http\://www.recorddrip.com/schema/gxxrpc/gxxrpc.xsd=META-INF/gxxrpc.xsd
5.3.spring.handlers放到META-INF目录下,配置命名空间解析类:
http\://www.recorddrip.com/schema/gxxrpc=com.gxx.rpc.spring.SchemaNamespaceHandler
需要继承NamespaceHandlerSupport,init方法里,每个标签对应一个bean解析器
6.application标签,配置应用相关信息[id,系统名称],对用pojo实现接口:
6.1.ApplicationContextAware接口,设置spring上下文对象
6.2.InitializingBean接口,在spring实例化所有bean之后,执行该方法afterPropertiesSet()
6.2.1.rpc上下文设置本地应用名称和本地ip
6.2.2.优雅停机,下掉注册到注册中心上的所有服务和引用
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {...});
7.server标签,配置服务端相关信息[id,监听端口],对用pojo实现接口:
7.1.InitializingBean接口,在spring实例化所有bean之后,执行该方法afterPropertiesSet()
7.1.1.启动rpc服务端口监听
8.client标签,配置客户端相关信息[id,负载均衡策略],对用pojo实现接口:
8.1.InitializingBean接口,在spring实例化所有bean之后,执行该方法afterPropertiesSet()
8.1.1.同步最新降级服务,zookeeper上目录/gxxrpc/degrade_service
8.1.2.订阅降级服务变化
9.register标签,配置注册中心相关信息[id,类型,ip,端口,用户名,密码],对用pojo不实现任何接口
10.service标签,配置服务相关信息[id,服务接口名称,服务实现类,服务实现相关类,版本,权重],对用pojo实现接口:
10.1.ApplicationContextAware接口,获取spring上下文对象
10.2.InitializingBean接口,在spring实例化所有bean之后,执行该方法afterPropertiesSet()
10.2.1.发布服务到注册中心
11.refrence标签,配置引用相关信息[id,服务接口名称,版本,超时毫秒数,指向服务ip,指向服务端口,集群容错策略,使用缓存,缓存时间(秒),异步,本地调用,是否拦截,拦截器],对用pojo实现接口:
11.1.ApplicationContextAware接口,获取spring上下文对象
11.2.InitializingBean接口,在spring实例化所有bean之后,执行该方法afterPropertiesSet()
11.2.1.发布引用到注册中心
11.2.2.同步最新引用服务
11.2.3.订阅服务变化
11.3.FactoryBean接口,返回服务接口动态代理类,调用服务,则组装rpc请求调用服务端
12.monitor标签,配置监控相关信息[id,监控ip,监听端口],对用pojo不实现任何接口
13.telnet_manage标签,配置telnet服务治理相关信息[id,监听端口],对用pojo实现接口:
13.1.InitializingBean接口,在spring实例化所有bean之后,执行该方法afterPropertiesSet()
13.1.1.启动telnet治理服务端口监听
分享/技术/gxxrpc/写gxxrpc框架的过程.txt · 最后更改: 2018/03/30 10:46 由 gxx