
81

GitHub - baidu/brpc-java: Java implementation for Baidu RPC
source link: https://github.com/baidu/brpc-java
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

README.md
项目名称
brpc-java是baidu rpc的java版本实现,主要用于java系统中的rpc交互,支持baidu rpc、nshead、sofa、hulu、http等协议。
核心功能点
- 支持baidu rpc标准协议、sofa协议、hulu协议、nshead+protobuf协议、http+protobuf/json协议。
- 可以灵活自定义任意协议,只需要实现Protocol接口,客户端和服务端可以分开实现。
- 支持使用POJO替代protobuf生成的类来进行序列化(基于jprotobuf实现)。
- 支持多种naming服务,比如List、File、DNS等,可以灵活扩展支持zookeeper、etcd、eureka、nacos等。
- 支持多种负载均衡策略,比如fair、random、round robin、weight等。
- 支持interceptor功能。
- 支持server端限流:计数器、令牌桶等算法。
- 支持snappy、gzip、zlib压缩。
- 将RPC功能和Spring功能分离,既适用于一些无需spring的场景,也适用于包含Spring的场景。
快速开始
开发环境
java 6+ && netty 4 && protobuf 2.5.0
引入maven依赖
非Spring环境:
<dependency> <groupId>com.baidu</groupId> <artifactId>brpc-java</artifactId> <version>2.0.0</version> </dependency>
Spring环境:
<dependency> <groupId>com.baidu</groupId> <artifactId>brpc-java-spring</artifactId> <version>2.0.0</version> </dependency>
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不为空条件满足时,会交换两个队列。
压力测试数据
部署环境:
- Client/Server机器配置:cpu 12核,内存132G,千兆网卡。
- 压测代码
压力测试结果:
数据量 5 byte 1k byte 2k byte 4k byte qps 22w 10w 5.3w 2.7w测试
mvn clean install
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK