Giter Club home page Giter Club logo

brpc-java's Introduction

Build Status Coverage License Maven

项目名称

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 依赖

brpc-java当前稳定版:[STABLE_VESION] 是Maven

protobuf 2.x 环境

非 Spring 环境:

<dependency>
    <groupId>com.baidu</groupId>
    <artifactId>brpc-java</artifactId>
    <version>[STABLE_VERSION]</version>
</dependency>

Spring 环境:

<dependency>
    <groupId>com.baidu</groupId>
    <artifactId>brpc-spring</artifactId>
    <version>[STABLE_VERSION]</version>
</dependency>

Spring Boot 环境:

<dependency>
    <groupId>com.baidu</groupId>
    <artifactId>brpc-spring-boot-starter</artifactId>
    <version>[STABLE_VERSION]</version>
</dependency>

Spring Cloud 环境:

<dependency>
    <groupId>com.baidu</groupId>
    <artifactId>spring-cloud-brpc</artifactId>
    <version>[STABLE_VERSION]</version>
</dependency>

Zookeeper 注册中心:

<dependency>
    <groupId>com.baidu</groupId>
    <artifactId>brpc-java-naming-zookeeper</artifactId>
    <version>[STABLE_VERSION]</version>
</dependency>

Consul 注册中心:

<dependency>
    <groupId>com.baidu</groupId>
    <artifactId>brpc-java-naming-consul</artifactId>
    <version>[STABLE_VERSION]</version>
</dependency>

protobuf 3.x 环境

除了引入 protobuf 2.x 环境所需依赖外,还需要增加 protobuf 3.x 依赖:

<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java</artifactId>
    <version>3.11.0</version>
</dependency>
<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java-util</artifactId>
    <version>3.11.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 220k 100k 53k 27k

微信交流群:

添加以下管理员帮忙加群,备注bprc-java

brpc-java's People

Contributors

wenweihu86 avatar niexiaomeng avatar tullyliu avatar wjyheropk avatar hushupei avatar guohao avatar dependabot[bot] avatar wanghongfei avatar wy223170 avatar liyuanxin avatar actions-user avatar iceplus avatar joecqupt avatar loongs-zhang avatar dongdongzan avatar wangsan avatar blackstorm avatar jovany-wang avatar raptium avatar zuoerlost avatar xjun18 avatar wlingxiao avatar suxiongye avatar summaryzb avatar lipeishen avatar moriadry avatar retyn avatar dhhua avatar agosong avatar guoyuhong avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.