高性能RPC框架选型

架构师进行高性能RPC框架选型时,主要考虑以下因素:

1、I/O调度模型

同步阻塞I/O(BIO)还是非阻塞I/O(NIO)。这个比较好理解。

2、序列化框架

文本协议、二进制协议或压缩二进制协议。这句话是网上经常看到的,但其实表述很不完整。之前初学时有人问,JSON文本传输时不也是二进制么,当时就懵了。文本协议如JSON将整个消息作为文本传输,而像ProtoBuf会针对每个属性区分,如int类型属性传输时只需分配4个字节,byte类型只需分配1个字节,而JSON都作为文本考虑兼容中文就是两个字符16个字节,所以降低了传输packet大小。同时ProtoBuf采用了类似网络协议TLV的机制,非常方便反序列化,而JSON就得去解析文本格式,哪里是冒号逗号啥的。

3、线程调度模型

高性能RPC肯定是多线程,这点其实主要指的是传统多线程还是如AKKA无锁的Actor模型机制。

4、承载的通道协议

通道协议主要考虑两方面,一个是性能,如HTTP2比HTTP做了很多优化,如头部压缩,通路复用等;还有一个是安全,如SSH或HTTPS或TCP + TLS。

 

除了上面4点外,还可以考虑IDL(接口定义语言),这点一般所有RPC框架都会提供很灵活的接口定义能力;还有就是框架是否提供多语言版本如Java、C等,这对多语言子系统间RPC很有用。

 

目前业内常见的RPC框架有REST调用、GRPC/Thrift(国外)、Dubbo/BRpc(国内)、RMI/Webservice(淘汰)等,推荐使用谷歌的GRPC,很稳定(ProtoBuf已经用了很多年了),性能好,生态好,社区也很活跃。

 

转载于:https://www.cnblogs.com/yuzhengzhong/p/10090509.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HRPC HRPC是一款基于Netty和Zookeeper设计的轻量级高性能RPC框架。特性采用Protostuff序列化;高性能,负载均衡;支持服务的注册和订阅;支持同步及异步2种调用方式;长连接,自动重连;采用cglib动态代理;代码简答,易上手;支持Spring;HRPC结构图服务注册中心服务端1. 通过Spring配置<?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:context="http://www.springframework.org/schema/context"        xsi:schemaLocation="http://www.springframework.org/schema/context        http://www.springframework.org/schema/context/spring-context.xsd">     <!--扫描需求发布的服务所在的包-->     <context:component-scan base-package="com.yingjun.rpc.service.impl"/>     <context:property-placeholder location="classpath:system.properties"/>     <!--服务端配置-->     <bean id="rpcServer" class="com.yingjun.rpc.server.RPCServer">         <constructor-arg name="zookeeper" value="${zookeeper.address}"/>         <constructor-arg name="serverAddress" value="${server.address}"/>     </bean> </beans>2. 服务接口public interface UserService {     public User getUser(String phone);     public User updateUser(User user); }3. 注册服务实现@HRPCService(UserService.class) public class UserServiceImpl implements UserService {     @Override     public User getUser(String phone) {         User user =new User(111,"yingjun",phone);         return user;     }     @Override     public User updateUser(User user) {         user.setName("yingjun@update");         return user;     } }客户端1. Spring配置<?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:context="http://www.springframework.org/schema/context"        xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://www.springframework.org/schema/context        http://www.springframework.org/schema/context/spring-context.xsd">     <context:annotation-config/>     <context:property-placeholder location="classpath:system.properties"/>     <!--客户端配置-->     <bean id="rpcClient" class="com.yingjun.rpc.client.RPCClient">         <constructor-arg name="zookeeper" value="${zookeeper.address}"/>         <!--订阅需要用到的接口-->         <constructor-arg name="interfaces">             <list>                 <value>com.yingjun.rpc.service.OrderService</value>                 <value>com.yingjun.rpc.service.UserService</value>                 <value>com.yingjun.rpc.service.GoodsService</value>             </list>         </constructor-arg>     </bean> </beans>2. 同步调用UserService userService = rpcClient.createProxy(UserService.class); User user1 = userService.getUser("188888888"); logger.info("result:"   user1.toString());3. 异步调用AsyncRPCProxy asyncProxy = rpcClient.createAsyncProxy(UserService.class); asyncProxy.call("getUser", new AsyncRPCCallback() {      @Override      public void success(Object result) {          logger.info("result:"   result.toString());      }      @Override      public void fail(Exception e) {          logger.error("result:"   e.getMessage());      }  }, "188888888"); 标签:rpc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值