# brpc-java
**Repository Path**: yipen9/brpc-java
## Basic Information
- **Project Name**: brpc-java
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-01-24
- **Last Updated**: 2021-01-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README




# 项目名称
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 环境:
```xml
com.baidu
brpc-java
3.0.2
```
Spring 环境:
```xml
com.baidu
brpc-spring
3.0.2
```
Spring Boot 环境:
```xml
com.baidu
brpc-spring-boot-starter
3.0.2
```
Spring Cloud 环境:
```xml
com.baidu
spring-cloud-brpc
3.0.2
```
Zookeeper 注册中心:
```xml
com.baidu
brpc-java-naming-zookeeper
3.0.2
```
Consul 注册中心:
```xml
com.baidu
brpc-java-naming-consul
3.0.2
```
#### protobuf 3.x 环境
除了引入 protobuf 2.x 环境所需依赖外,还需要增加 protobuf 3.x 依赖:
```xml
com.google.protobuf
protobuf-java
3.11.0
```
```xml
com.google.protobuf
protobuf-java-util
3.11.0
```
### Server 端使用
* [Server 端基本用法](https://github.com/baidu/brpc-java/blob/master/docs/cn/server.md)
* [搭建标准协议/sofa 协议/hulu 协议 server](https://github.com/baidu/brpc-java/blob/master/docs/cn/brpc_server.md)
* [搭建 nshead server](https://github.com/baidu/brpc-java/blob/master/docs/cn/nshead_server.md)
* [搭建 HTTP server](https://github.com/baidu/brpc-java/blob/master/docs/cn/http_server.md)
* [Server Push 推送用法](https://github.com/baidu/brpc-java/blob/master/docs/cn/server_push.md)
### Client 端使用
* [Client 端基本用法](https://github.com/baidu/brpc-java/blob/master/docs/cn/client.md)
### 与 Spring 集成
* [Spring 集成使用](https://github.com/baidu/brpc-java/blob/master/docs/cn/spring.md)
### 扩展
* [扩展 Protocol、NamingService、LoadBalance](https://github.com/baidu/brpc-java/blob/master/docs/cn/extension.md)
### 一些设计
#### 网络模型
采用 Netty 的 Reactor 网络模型,但跟常规用法有些不同:
* 没有使用 Netty 的 ByteToMessageDecoder 去解析协议,因为 ByteToMessageDecoder 内部会对 buffer 进行拷贝。
* 为了提高并发,尽量少在 IO 线程中执行业务逻辑,所以在 IO 线程中只会去解析协议的 Header 部分,并把 body 的 buffer retain 出来,然后丢给工作线程去处理;工作线程会 decode body,并执行具体业务逻辑。
* 由于粘包/拆包问题,可能一次 socket 读操作会包含多个包,所以支持了批量往工作线程中 submit 任务。
#### 零拷贝 Buffer
* [DynamicCompositeByteBuf](https://github.com/baidu/brpc-java/blob/master/docs/cn/composite_buffer.md)
#### 线程池 ThreadPool
* 调研过 JDK 的 ThreadPoolExecutor、ConcurrentLinkedQueue 以及 Disruptor,最后使用更高性能的 [ThreadPool](https://github.com/baidu/brpc-java/blob/master/brpc-java-communication/src/main/java/com/baidu/brpc/utils/ThreadPool.java) 。
* ThreadPool 内部把生产者队列、消费者队列分开,用两个锁去控制同步,当 consumer queue 为空时,且 producer queue 不为空条件满足时,会交换两个队列。
#### 比ConcurrentHashMap 更快的 FastFutureStore
* [FastFutureStore](https://github.com/baidu/brpc-java/blob/master/docs/cn/fastfuturestore.md)
## 压力测试数据
### 部署环境:
* Client/Server 机器配置:CPU 12核,内存 132G,千兆网卡。
* [压测代码](https://github.com/baidu/brpc-java/blob/master/brpc-java-examples/src/main/java/com/baidu/brpc/example/standard/BenchmarkTest.java)
### 压力测试结果:
| 数据量 | 5 byte | 1k byte | 2k byte | 4k byte |
|:-----:| :-----: | :-------: | :-------: | :-------: |
| QPS | 220k | 100k | 53k | 27k |
# 微信交流群:
