====== gxxrpc介绍文档 ====== ===== 版本 ===== ^ 作者 ^ 日期 ^ 版本 ^ 说明 ^ | 关向辉(Gxx) | 2017-11-20 | 1.0 | 梳理文档 | ===== 介绍 ===== gxxrpc是一个基于java的简易版高性能(?)RPC框架,实现功能参考dubbo。 服务端暴露服务接口,客户端引用服务,将调用服务名称,方法,参数送到服务端,服务端接收并反射执行,返回结果。依赖gxxrpc可以方便的实现整个过程的rpc调用。 ===== 源码 ===== github.com: https://github.com/GuanXianghui/gxxrpc ===== 架构 ===== {{:分享:技术:gxxrpc:wechatimg14840.jpeg?400|}} - Providor服务端启动,将服务注册到Register注册中心 - Consumer客户端启动,将引用注册到Register注册中心,并订阅引用服务变化和降级服务变化 - Register注册中心有服务注册或者下线,或者降级服务的新增或者删除,都会通知Consumer客户端,客户端内部负载均衡路由调用 - Consumer客户端根据从Register注册中心获取的服务列表,根据负载均衡算法路由调用指定Providor服务端 - Consumer客户端配置监控,将服务调用详情数据推送给Manage治理中心 - Manage治理中心管理降级服务,接收监控数据,查看监控数据和图表 - Gateway泛化网关配置http请求转rpc服务调用关系,将http请求转成rpc调用,返回json结果 ===== 示例 ===== ==== 要求 ==== jdk1.7或者更高 maven3.0或者更高 ==== maven依赖 ==== 客户端和服务端,都需要依赖gxxrpc的maven包 com.gxx rpc 1.0.0-SNAPSHOT ==== 服务接口定义 ==== 服务端定义服务接口并暴露api jar包 package com.gxx.rpc.service; import java.math.BigDecimal; /** * 用户服务 * @author Gxx */ public interface UserService { /** * 加法-正常返回结果 * @param a * @param b * @return */ BigDecimal normalPlus(BigDecimal a, BigDecimal b); } ==== 服务接口实现 ==== 服务端服务接口实现,没必要暴露在api jar包中 package com.gxx.rpc.service; import java.math.BigDecimal; /** * 用户服务实现类 * @author Gxx */ public class UserServiceImpl implements UserService { /** * 加法-正常返回结果 * @param a * @param b * @return */ public BigDecimal normalPlus(BigDecimal a, BigDecimal b) { return a.add(b); } } ==== 服务端配置 ==== ==== 服务端启动 ==== /** * 测试服务端-base版本 * @throws Exception */ @SuppressWarnings("resource") @Test public void testServer_base() throws Exception { logger.info("测试服务端-base版本"); ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("gxxrpc-provider-base.xml"); context.start(); System.in.read(); } ==== 客户端配置 ==== ==== 客户端启动 ==== /** * 测试客户端-base版本 * @throws Exception */ @SuppressWarnings("resource") @Test public void testClient_base() throws Exception { logger.info("测试客户端-base版本"); ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("gxxrpc-consumer-base.xml"); context.start(); /** * 服务调用 */ UserService userService = (UserService)context.getBean("userService"); BigDecimal a = new BigDecimal("123"); BigDecimal b = new BigDecimal("321"); logger.info("a+b:" + userService.normalPlus(a, b)); System.in.read(); } ===== 能力 ===== ==== xml配置 ==== 基于Spring可扩展Schema提供自定义配置支持 ==== 分布式通讯 ==== 底层使用netty作为网络通讯框架 ==== 注册中心 ==== 服务注册与订阅,都通过zookeeper ==== 定向服务 ==== 可以指向指定服务提供方ip和端口,不指向注册中心 ==== 负载均衡策略 ==== 支持多台服务提供方集群,实现负载均衡算法:轮询,随机,加权轮询,加权随机,源地址哈希 ==== 集群容错策略 ==== 服务调用失败的策略:快速失败,失败重试,失败安全,广播失败,广播安全 ==== 服务版本控制 ==== 服务匹配相同版本号才可调用 ==== 设置超时时间 ==== 超时时间设置,默认超时时间5秒 ==== 结果缓存 ==== 设置缓存时间,缓存超上限,FIFO先进先出算法 ==== 泛化调用 ==== 不依赖api发起rpc调用 ==== 上下文信息 ==== 应用名称,ip,本次线程内调用方信息,服务方信息 ==== 隐式参数 ==== 非服务入参,客户端设置隐藏参数,服务端获取隐藏参数 ==== 异步调用 ==== 实时返回null,异步从上下文信息中获取 ==== 本地调用 ==== 不扫描注册中心,从本应用中寻找服务 ==== 拦截器 ==== pre/post/exception ==== 服务降级 ==== 服务请求方判断服务被降级,直接返回null,降级服务管理 ==== 优雅停机 ==== 从注册中心下掉服务和引用 ==== telnet治理 ==== 查看应用名称,ip,管理缓存,管理降级服务 ==== 监控 ==== 向治理中心发送监控调用服务情况 ===== 治理中心[gxxrpc-manage] ===== ==== 用户登录 ==== 用户名,密码验证 {{:分享:技术:gxxrpc:wechatimg64.jpeg?600|}} ==== 服务治理 ==== 服务降级与非降级切换,服务请求方判断是否降级 {{:分享:技术:gxxrpc:wechatimg65.jpeg?600|}} ==== 监控查询 ==== 查询监控数据明细,统计监控并发数,平均耗时,tps {{:分享:技术:gxxrpc:wechatimg66.jpeg?600|}} {{:分享:技术:gxxrpc:wechatimg67.jpeg?600|}} ==== 实时监控 ==== 曲线图展示选择时间段监控交易并发数,平均耗时,tps {{:分享:技术:gxxrpc:wechatimg68.jpeg?600|}} ===== 泛化网关[gxxrpc-gateway] ===== ==== 用户登录 ==== 用户名,密码验证 {{:分享:技术:gxxrpc:wechatimg69.jpeg?600|}} ==== 泛化配置 ==== 增删改查泛化配置 {{:分享:技术:gxxrpc:wechatimg70.jpeg?600|}} ==== http请求转发 ==== http请求判断泛化转rpc调用返回json结果 curl 请求: http://localhost:8080/gxxrpc-gateway/user/getUserInfo.htm?name=gxx&age=999 curl 返回: "hello [gxx:999] from server!" ===== schema配置手册 ===== ==== gxxrpc:application ==== 标签功能:配置应用相关信息 ^ 属性 ^ 类型 ^ 是否必填 ^ 默认/固定值 ^ 描述 ^ | id | string | 否 | 固定值:application | 唯一id | | name | string | 是 | | 系统名称 | ==== gxxrpc:server ==== 标签功能:配置服务端相关信息 ^ 属性 ^ 类型 ^ 是否必填 ^ 默认/固定值 ^ 描述 ^ | id | string | 否 | 固定值:server | 唯一id | | port | string | 是 | | 监听端口 | ==== gxxrpc:client ==== 标签功能:配置客户端相关信息 ^ 属性 ^ 类型 ^ 是否必填 ^ 默认/固定值 ^ 描述 ^ | id | string | 否 | 固定值:client | 唯一id | | load_balance | string | 否 | 默认值:poll | 负载均衡 | ==== gxxrpc:telnet_manage ==== 标签功能:配置telnet服务治理相关信息 ^ 属性 ^ 类型 ^ 是否必填 ^ 默认/固定值 ^ 描述 ^ | id | string | 否 | 固定值:telnet_manage | 唯一id | | port | string | 是 | | 监听端口 | ==== gxxrpc:monitor ==== 标签功能:配置监控相关信息 ^ 属性 ^ 类型 ^ 是否必填 ^ 默认/固定值 ^ 描述 ^ | id | string | 否 | 固定值:monitor | 唯一id | | ip | string | 是 | | 监控ip | | port | integer | 是 | | 监听端口 | ==== gxxrpc:register ==== 标签功能:配置注册中心相关信息 ^ 属性 ^ 类型 ^ 是否必填 ^ 默认/固定值 ^ 描述 ^ | id | string | 否 | 固定值:register | 唯一id | | type | string | 是 | | 类型 | | ip | string | 否 | | ip | | port | string | 否 | | 端口 | | username | string | 否 | | 用户名 | | password | string | 否 | | 密码 | ==== gxxrpc:service ==== 标签功能:配置服务相关信息 ^ 属性 ^ 类型 ^ 是否必填 ^ 默认/固定值 ^ 描述 ^ | id | string | 是 | | 唯一id | | name | string | 是 | | 服务接口名称 | | impl | string | 否 | | 服务实现类 | | ref | string | 否 | | 服务实现相关类 | | version | string | 否 | | 版本 | | weight | integer | 否 | 默认值:5,范围:0~10 | 权重 | ==== gxxrpc:refrence ==== 标签功能:配置引用相关信息 ^ 属性 ^ 类型 ^ 是否必填 ^ 默认/固定值 ^ 描述 ^ | id | string | 是 | | 唯一id | | name | string | 是 | | 服务接口名称 | | version | string | 否 | | 版本 | | timeout | integer | 否 | 默认值:5000 | 超时毫秒数 | | direct_server_ip | string | 否 | | 指向服务ip | | direct_server_port | string | 否 | | 指向服务端口 | | cluster_fault | string | 否 | | 集群容错策略 | | use_cache | string | 否 | 默认值:false,范围:true/false | 使用缓存 | | cache_time | integer | 否 | | 缓存时间(秒) | | async | string | 否 | 默认值:false,范围:true/false | 异步 | | search_local | string | 否 | 默认值:false,范围:true/false | 本地调用 | | intercept | string | 否 | 默认值:false,范围:true/false | 是否拦截 | | interceptor | string | 否 | | 拦截器 | ===== 后期版本规划 ===== - 目前支持spring延伸xml标签配置,后续将支持properties配置和api方式配置 - 目前底层采用netty作为通讯框架,后续将支持mina - 目前注册中心采用zookeeper,后续将支持redis和自开发一套注册中心,实现服务的注册和订阅 - 目前负载均衡算法有轮询,随机,加权轮询,加权随机,源地址哈希,后续将支持最小连接数算法 - 目前泛化调用仅支持基础类型和java.lang.String类型,后续将支持复杂参数类型 - 目前拦截器可以拦截客户端调用服务的前后,后续将支持服务端被请求时的拦截 - 目前优雅停机从注册中心下掉服务和引用,后续将支持其他资源释放 - 目前监控是监控客户端请求,整个过程包括服务网络开销,后续将支持监控服务端请求,这里不包括网络开销 - 目前很多配置都控制服务类级别,后续将支持控制方法级别