====== 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类型,后续将支持复杂参数类型
- 目前拦截器可以拦截客户端调用服务的前后,后续将支持服务端被请求时的拦截
- 目前优雅停机从注册中心下掉服务和引用,后续将支持其他资源释放
- 目前监控是监控客户端请求,整个过程包括服务网络开销,后续将支持监控服务端请求,这里不包括网络开销
- 目前很多配置都控制服务类级别,后续将支持控制方法级别