brpc-java是baidu rpc的java版本实现,支持baidu rpc、nshead、sofa、hulu、http、stargate等协议。
- 支持baidu rpc标准协议、sofa协议、hulu协议、nshead+protobuf协议、http+protobuf/json协议、public pbrpc、stargate协议。
- 支持SpringBoot starter,也支持SpringCloud的服务注册发现、用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+ && netty 4 && protobuf 2.5.0
非Spring环境:
<dependency>
<groupId>com.baidu</groupId>
<artifactId>brpc-java</artifactId>
<version>2.5.8</version>
</dependency>
Spring环境:
<dependency>
<groupId>com.baidu</groupId>
<artifactId>brpc-spring</artifactId>
<version>2.5.8</version>
</dependency>
SpringBoot环境:
<dependency>
<groupId>com.baidu</groupId>
<artifactId>brpc-spring-boot-stater</artifactId>
<version>2.5.8</version>
</dependency>
SpringCloud环境:
<dependency>
<groupId>com.baidu</groupId>
<artifactId>spring-cloud-brpc</artifactId>
<version>2.5.8</version>
</dependency>
Zookeeper注册中心:
<dependency>
<groupId>com.baidu</groupId>
<artifactId>brpc-java-naming-zookeeper</artifactId>
<version>2.5.8</version>
</dependency>
Consul注册中心:
<dependency>
<groupId>com.baidu</groupId>
<artifactId>brpc-java-naming-consul</artifactId>
<version>2.5.8</version>
</dependency>
采用netty的reactor网络模型,但跟常规用法有些不同:
- 没有使用netty的ByteToMessageDecoder去解析协议,因为ByteToMessageDecoder内部会对buffer进行拷贝。
- 为了提高并发,尽量少在IO线程中执行业务逻辑,所以在io线程中只会去解析协议的header部分,并把body的buffer retain出来,然后丢给工作线程去处理;工作线程会decode body,并执行具体业务逻辑。
- 由于粘包/拆包问题,可能一次socket读操作会包含多个包,所以支持了批量往工作线程中submit任务。
- 调研过JDK的ThreadPoolExecutor、ConcurrentLinkedQueue以及Disruptor,最后使用更高性能的ThreadPool。
- ThreadPool内部把生产者队列、消费者队列分开,用两个锁去控制同步,当consumer queue为空时,且producer queue不为空条件满足时,会交换两个队列。
- Client/Server机器配置:cpu 12核,内存132G,千兆网卡。
- 压测代码
数据量 | 5 byte | 1k byte | 2k byte | 4k byte |
---|---|---|---|---|
qps | 22w | 10w | 5.3w | 2.7w |