作者 | 日期 | 版本 | 说明 |
---|---|---|---|
关向辉(Gxx) | 2017-11-20 | 1.0 | 梳理文档 |
gxxrpc是一个基于java的简易版高性能(?)RPC框架,实现功能参考dubbo。
服务端暴露服务接口,客户端引用服务,将调用服务名称,方法,参数送到服务端,服务端接收并反射执行,返回结果。依赖gxxrpc可以方便的实现整个过程的rpc调用。
github.com: https://github.com/GuanXianghui/gxxrpc
jdk1.7或者更高
maven3.0或者更高
客户端和服务端,都需要依赖gxxrpc的maven包
<dependency> <groupId>com.gxx</groupId> <artifactId>rpc</artifactId> <version>1.0.0-SNAPSHOT</version> </dependency>
服务端定义服务接口并暴露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); } }
<?xml version="1.0" encoding="UTF-8"?> <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"> <!-- 应用 --> <gxxrpc:application name="rpc_server" /> <!-- 服务端 --> <gxxrpc:server port="9527" /> <!-- 注册中心 --> <gxxrpc:register type="zookeeper" ip="121.43.104.34" port="2181" /> <!-- 提供服务 --> <gxxrpc:service id="userService" name="com.gxx.rpc.service.UserService" ref="userServiceImpl" /> <bean id="userServiceImpl" class="com.gxx.rpc.service.UserServiceImpl" /> </beans>
/** * 测试服务端-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(); }
<?xml version="1.0" encoding="UTF-8"?> <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"> <!-- 应用 --> <gxxrpc:application name="rpc_client" /> <!-- 客户端 --> <gxxrpc:client load_balance="poll" /> <!-- 注册中心 --> <gxxrpc:register type="zookeeper" ip="121.43.104.34" port="2181" /> <!-- 引用 --> <gxxrpc:refrence id="userService" name="com.gxx.rpc.service.UserService" /> </beans>
/** * 测试客户端-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(); }
基于Spring可扩展Schema提供自定义配置支持
底层使用netty作为网络通讯框架
服务注册与订阅,都通过zookeeper
可以指向指定服务提供方ip和端口,不指向注册中心
支持多台服务提供方集群,实现负载均衡算法:轮询,随机,加权轮询,加权随机,源地址哈希
服务调用失败的策略:快速失败,失败重试,失败安全,广播失败,广播安全
服务匹配相同版本号才可调用
超时时间设置,默认超时时间5秒
设置缓存时间,缓存超上限,FIFO先进先出算法
不依赖api发起rpc调用
应用名称,ip,本次线程内调用方信息,服务方信息
非服务入参,客户端设置隐藏参数,服务端获取隐藏参数
实时返回null,异步从上下文信息中获取
不扫描注册中心,从本应用中寻找服务
pre/post/exception
服务请求方判断服务被降级,直接返回null,降级服务管理
从注册中心下掉服务和引用
查看应用名称,ip,管理缓存,管理降级服务
向治理中心发送监控调用服务情况
http请求判断泛化转rpc调用返回json结果
curl 请求:
http://localhost:8080/gxxrpc-gateway/user/getUserInfo.htm?name=gxx&age=999
curl 返回:
"hello [gxx:999] from server!"
标签功能:配置应用相关信息
属性 | 类型 | 是否必填 | 默认/固定值 | 描述 |
---|---|---|---|---|
id | string | 否 | 固定值:application | 唯一id |
name | string | 是 | 系统名称 |
标签功能:配置服务端相关信息
属性 | 类型 | 是否必填 | 默认/固定值 | 描述 |
---|---|---|---|---|
id | string | 否 | 固定值:server | 唯一id |
port | string | 是 | 监听端口 |
标签功能:配置客户端相关信息
属性 | 类型 | 是否必填 | 默认/固定值 | 描述 |
---|---|---|---|---|
id | string | 否 | 固定值:client | 唯一id |
load_balance | string | 否 | 默认值:poll | 负载均衡 |
标签功能:配置telnet服务治理相关信息
属性 | 类型 | 是否必填 | 默认/固定值 | 描述 |
---|---|---|---|---|
id | string | 否 | 固定值:telnet_manage | 唯一id |
port | string | 是 | 监听端口 |
标签功能:配置监控相关信息
属性 | 类型 | 是否必填 | 默认/固定值 | 描述 |
---|---|---|---|---|
id | string | 否 | 固定值:monitor | 唯一id |
ip | string | 是 | 监控ip | |
port | integer | 是 | 监听端口 |
标签功能:配置注册中心相关信息
属性 | 类型 | 是否必填 | 默认/固定值 | 描述 |
---|---|---|---|---|
id | string | 否 | 固定值:register | 唯一id |
type | string | 是 | 类型 | |
ip | string | 否 | ip | |
port | string | 否 | 端口 | |
username | string | 否 | 用户名 | |
password | string | 否 | 密码 |
标签功能:配置服务相关信息
属性 | 类型 | 是否必填 | 默认/固定值 | 描述 |
---|---|---|---|---|
id | string | 是 | 唯一id | |
name | string | 是 | 服务接口名称 | |
impl | string | 否 | 服务实现类 | |
ref | string | 否 | 服务实现相关类 | |
version | string | 否 | 版本 | |
weight | integer | 否 | 默认值:5,范围:0~10 | 权重 |
标签功能:配置引用相关信息
属性 | 类型 | 是否必填 | 默认/固定值 | 描述 |
---|---|---|---|---|
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 | 否 | 拦截器 |