跳至内容
wiki
用户工具
登录
站点工具
工具
显示页面
修订记录
反向链接
最近更改
媒体管理器
网站地图
登录
最近更改
媒体管理器
网站地图
您的足迹:
分享:技术:gxxrpc:写gxxrpc框架的过程
本页面只读。您可以查看源文件,但不能更改它。如果您觉得这是系统错误,请联系管理员。
====== 写gxxrpc框架的过程 ====== <code> 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治理服务端口监听 </code>
分享/技术/gxxrpc/写gxxrpc框架的过程.txt
· 最后更改: 2018/03/30 10:46 由
gxx
页面工具
显示页面
修订记录
反向链接
回到顶部