java实现rpc_brpc-java是baidu rpc的java版本实现

68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f776f726b666c6f772f7374617475732f62616964752f627270632d6a6176612f556e69742532305465737468747470733a2f2f696d672e736869656c64732e696f2f636f6465636f762f632f67682f62616964752f627270632d6a61766168747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f62616964752f627270632d6a6176612e73766768747470733a2f2f696d672e736869656c64732e696f2f6d6176656e2d63656e7472616c2f762f636f6d2e62616964752f627270632d6a6176612e737667

项目名称

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 环境:

com.baidu

brpc-java

3.0.1

Spring 环境:

com.baidu

brpc-spring

3.0.1

Spring Boot 环境:

com.baidu

brpc-spring-boot-starter

3.0.1

Spring Cloud 环境:

com.baidu

spring-cloud-brpc

3.0.1

Zookeeper 注册中心:

com.baidu

brpc-java-naming-zookeeper

3.0.1

Consul 注册中心:

com.baidu

brpc-java-naming-consul

3.0.1

protobuf 3.x 环境

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

com.google.protobuf

protobuf-java

3.11.0

com.google.protobuf

protobuf-java-util

3.11.0

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

微信交流群:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值