Lnk RPC是一款基于Netty实现RPC通讯协议,支持同步,异步和异步回调三种RPC调用方式,支持参数和返回值多态。支持多种负载均衡方式,支持调用流量控制,支持zookeeper和consul等服务注册发现方式,服务端口支持开发人员,运维人员配置以及动态分配,支持服务依赖关系梳理以及调用链路跟踪。支持spring配置。在服务端通过分组策略将来自不同组别的请求处理资源隔离,该思路借鉴与RocketMQ的实现思想。
Lnk RPC是一款基于Netty和Mina实现RPC通讯协议,支持同步,异步和异步回调三种RPC调用方式,支持参数和返回值多态。支持多种负载均衡方式,支持调用流量控制,支持zookeeper服务注册发现方式,服务端口支持开发人员,运维人员配置以及动态分配,支持服务依赖关系梳理以及调用链路跟踪。支持spring配置。在服务端通过分组策略将来自不同组别的请求处理资源隔离,该思路借鉴与RocketMQ的实现思想。
使用MQ实现的RPC特性:
基于Netty和Mina等通讯框架实现的RPC的特性:
综上所述:
Lnk RPC产品所支持的功能
<lnk:lnk id="payment-server" worker-threads="20" selector-threads="15" connect-timeout-millis="3000"
channel-maxidletime-seconds="120" socket-sndbuf-size="65535" socket-rcvbuf-size="65535"
pooled-bytebuf-allocator-enable="true" default-worker-processor-threads="10" default-executor-threads="8"
use-epoll-native-selector="false">
<lnk:application app="lnk-demo" ns-home="${nsHome}" type="jar"/>
<lnk:registry address="${registry}"/>
<lnk:load-balance type="hash"/>
<lnk:flow-control permits="10000"/>
<lnk:bind>
<lnk:service-group service-group="biz-pay-bgw-payment.srv" worker-threads="50"/>
<lnk:service-group service-group="biz-pay-bgw-payment.router.srv" worker-threads="50"/>
</lnk:bind>
</lnk:lnk>
listen-port:配置服务监听端口,可选配置,该配置项优先使用开发人员配置,如果没有配置或者端口被占用,框架会通过系统参数获取当前应用的分配端口,如果系统参数没有配置或者系统参数配置分配的端口被占用的话,框架会自动分配一个当前机器未使用的端口。
worker-threads:Netty和Mina服务端事件处理线程池大小,默认为10.
selector-threads:Netty和Mina服务NIO selector事件处理线程池大小,默认为5
connect-timeout-millis:客户端连接超时事件,单位毫秒。默认3000毫米即3秒。
channel-maxidletime-seconds:Netty和Mina服务端连接通道最大空闲时间,单位为秒,默认为120秒
socket-sndbuf-size:服务端socket发送数据大小,默认为65535
socket-rcvbuf-size:服务端socket接收数据大小,默认为65535
pooled-bytebuf-allocator-enable:是否开启Direct Buffer选项,开启之后内核缓冲区的内容直接写入了Channel,这样减少了数据拷贝。默认为true
default-worker-processor-threads:服务端默认消息处理线程池的大小,用于处理一些未分组的请求。默认为10
default-executor-threads:服务端默认线程池大小,主要用于处理异步回调事件。默认为8
use-epoll-native-selector:是否使用操作系统EPoll selector,默认false。
application子节点主要是标示应用名称和应用类型,主要用于做服务调用链路跟踪和应用以来关系梳理。app属性标示应用名称,type标示应用类型分为jar和war类型。
registry子节点主要标示服务注册中心类型和地址,用于server端注册自己的服务调用地址和端口,目前支持zookeeper注册中心,address标示注册中心地址
flow-control子节点主要标示流量控制单元,目前只支持使用semaphore信号量实现的流量控制。
bind子节点主要是用于将服务端的服务划分为不同的组别,不同的组别使用自身组别的线程池,是的各个组别对外提供服务的线程等资源相互隔离。service-group标示组别名称,worker-threads标示改组请求处理线程池大小。默认为10.
@LnkService(group = "biz-pay-bgw-payment.srv")
public interface AuthService {
@LnkMethod(type = InvokeType.SYNC, timeoutMillis = 3000L)
AuthResponse auth(AuthRequest request) throws AppBizException;
@LnkMethod(type = InvokeType.SYNC, timeoutMillis = 3000L)
AuthResponse auth_poly(AuthRequest request) throws AppBizException;
@LnkMethod(type = InvokeType.ASYNC)
void auth(AuthRequest request, AuthCallbackService callback) throws AppBizException;
@LnkMethod(type = InvokeType.MULTICAST)
void auth_multi_cast(AuthRequest request, AuthCallbackService callback) throws AppBizException;
}
// 标记服务发布的版本
@LnkVersion(version = "2.0.0")
public class V2AuthService implements AuthService {
@Override
public AuthResponse auth(AuthRequest request) throws AppBizException {
AuthResponse response = new AuthResponse();
response.setGateId("0312");
response.setGateRespCode("TXN.000");
response.setGateRespMsg("V2 : " + request);
response.setTxnId(request.getTxnId());
return response;
}
@Override
public AuthResponse auth_poly(AuthRequest request) throws AppBizException {
// 多态的使用
PolyAuthResponse response = new PolyAuthResponse();
response.setGateId("0104");
response.setGateRespCode("TXN.000");
response.setGateRespMsg("V2 : " + request);
response.setTxnId(request.getTxnId());
response.setPrincipalId("101");
response.setTxnType("00001");
response.setProductType("QP");
response.setIdType("01");
return response;
}
}
// 注入默认版本的服务代理
@Lnkwired
AuthService defaultAuthService;
// 注入2.0.0版本的服务代理
@Lnkwired(version = "2.0.0")
AuthService v2AuthService;