项目名称
brpc-java 是 baidu rpc 的 java 版本实现,支持 baidu rpc、nshead、sofa、hulu、http、stargate、dubbo 等协议。
核心功能点
支持 baidu rpc 标准协议、sofa 协议、hulu 协议、nshead+protobuf 协议、http+protobuf/json 协议、public pbrpc、stargate、dubbo协议。
支持 Spring Boot Starter,也支持 Spring Cloud 的服务注册发现、用 brpc-java 替换 Feign HTTP 调用,提升性能。
支持 Server Push 机制,并支持扩展 Server Push 协议。
支持多种 naming 服务,比如 Zookeeper、Consul、List、File、DNS 等,可以灵活扩展支持 etcd、eureka、nacos 等。
支持多种负载均衡策略,比如 fair、random、round robin、weight 等。
支持 interceptor 功能,支持计数器、令牌桶等 server 端限流算法。
RPC 功能可独立使用,不是必须依赖 Spring 和注册中心功能。
基于 SPI 机制可灵活扩展 Protocol、NamingService 和 LoadBalance。
快速开始
开发环境
java 6+ && protobuf 2.5.0+
引入 maven 依赖
protobuf 2.x 环境
非 Spring 环境:
com.baidu
brpc-java
3.0.2
Spring 环境:
com.baidu
brpc-spring
3.0.2
Spring Boot 环境:
com.baidu
brpc-spring-boot-starter
3.0.2
Spring Cloud 环境:
com.baidu
spring-cloud-brpc
3.0.2
Zookeeper 注册中心:
com.baidu
brpc-java-naming-zookeeper
3.0.2
Consul 注册中心:
com.baidu
brpc-java-naming-consul
3.0.2
protobuf 3.x 环境
除了引入 protobuf 2.x 环境所需依赖外,还需要增加 protobuf 3.x 依赖:
com.google.protobuf
protobuf-java
3.11.0
com.google.protobuf
protobuf-java-util
3.11.0
Server 端使用
Client 端使用
与 Spring 集成
扩展
一些设计
网络模型
采用 Netty 的 Reactor 网络模型,但跟常规用法有些不同:
没有使用 Netty 的 ByteToMessageDecoder 去解析协议,因为 ByteToMessageDecoder 内部会对 buffer 进行拷贝。
为了提高并发,尽量少在 IO 线程中执行业务逻辑,所以在 IO 线程中只会去解析协议的 Header 部分,并把 body 的 buffer retain 出来,然后丢给工作线程去处理;工作线程会 decode body,并执行具体业务逻辑。
由于粘包/拆包问题,可能一次 socket 读操作会包含多个包,所以支持了批量往工作线程中 submit 任务。
零拷贝 Buffer
线程池 ThreadPool
调研过 JDK 的 ThreadPoolExecutor、ConcurrentLinkedQueue 以及 Disruptor,最后使用更高性能的 ThreadPool 。
ThreadPool 内部把生产者队列、消费者队列分开,用两个锁去控制同步,当 consumer queue 为空时,且 producer queue 不为空条件满足时,会交换两个队列。
比ConcurrentHashMap 更快的 FastFutureStore
压力测试数据
部署环境:
Client/Server 机器配置:CPU 12核,内存 132G,千兆网卡。
压力测试结果:
数据量
5 byte
1k byte
2k byte
4k byte
QPS
220k
100k
53k
27k
微信交流群: