Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

keweiguo/brpc-java

Open more actions menu
 
 

Repository files navigation

Build Status license maven

项目名称

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调用,提升性能。
  • 支持多种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

引入maven依赖

非Spring环境:

<dependency>
    <groupId>com.baidu</groupId>
    <artifactId>brpc-java</artifactId>
    <version>2.5.0</version>
</dependency>

Spring环境:

<dependency>
    <groupId>com.baidu</groupId>
    <artifactId>brpc-spring</artifactId>
    <version>2.5.0</version>
</dependency>

SpringBoot环境:

<dependency>
    <groupId>com.baidu</groupId>
    <artifactId>brpc-spring-boot-stater</artifactId>
    <version>2.5.0</version>
</dependency>

SpringCloud环境:

<dependency>
    <groupId>com.baidu</groupId>
    <artifactId>spring-cloud-brpc</artifactId>
    <version>2.5.0</version>
</dependency>

Zookeeper注册中心:

<dependency>
    <groupId>com.baidu</groupId>
    <artifactId>brpc-java-naming-zookeeper</artifactId>
    <version>2.5.0</version>
</dependency>

Consul注册中心:

<dependency>
    <groupId>com.baidu</groupId>
    <artifactId>brpc-java-naming-consul</artifactId>
    <version>2.5.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不为空条件满足时,会交换两个队列。

比ConcurrentHashMap更快的FastFutureStore

压力测试数据

部署环境:

  • Client/Server机器配置:cpu 12核,内存132G,千兆网卡。
  • 压测代码

压力测试结果:

数据量 5 byte 1k byte 2k byte 4k byte
qps 22w 10w 5.3w 2.7w

微信交流群:

About

Java implementation for Baidu RPC, multi-protocol & high performance RPC.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages

  • Java 99.4%
  • Shell 0.6%
Morty Proxy This is a proxified and sanitized view of the page, visit original site.