开放代码社区 › koalas-rpc

koalas-rpc

学习资源Java

koalas-RPC 个人作品,提供大家交流学习,有意见请私信,欢迎拍砖。客户端采用thrift协议,服务端支持netty和thrift的TThreadedSelectorServer半同步半异步线程模型,支持动态扩容,服务上下线,权重动态,可用性配置,页面流量统计等,QPS统计,TP90,TP99,TP95等丰富可视化数据,持续为个人以及中小型公司提供可靠的RPC框架技术方案。

AI/机器学习Web后端前端工具部署/运维
作者:用户6868语言:Java更新:2026-10-27
仓库地址
https://gitee.com/dromara/koalas-rpc.git

前往原仓库

README

<p align="center">
  <img src="https://web-code-img.oss-cn-shanghai.aliyuncs.com/readme/cc7c7927fe58e9bcfe0b609d.png" width="300">
  <br>
  <img src="https://web-code-img.oss-cn-shanghai.aliyuncs.com/readme/3d623621993c1beac6f26c2f.png">
 <br>
  <a href="https://www.apache.org/licenses/LICENSE-2.0" align="center">
    <img alt="code style" src="https://img.shields.io/badge/license-Apache%202-4EB1BA.svg?style=flat-square">
  </a>
  <a href="https://github.com/996icu/996.ICU/blob/master/LICENSE" align="center">
    <img alt="996icu" src="https://img.shields.io/badge/license-NPL%20(The%20996%20Prohibited%20License)-blue.svg">
  </a>
</p>

# 一:项目介绍
[开发者接入](https://gitee.com/a1234567891/koalas-rpc/wikis/%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E?sort_id=1424137)

koalas-RPC 个人作品,提供大家交流学习,有意见请私信,欢迎拍砖。客户端采用thrift协议,服务端支持netty和thrift的TThreadedSelectorServer半同步半异步线程模型,支持动态扩容,服务上下线,权重动态,可用性配置,页面流量统计等,QPS统计,TP90,TP99,TP95等丰富可视化数据,持续为个人以及中小型公司提供可靠的RPC框架技术方案。

##### 1:为什么要写这个RPC
市面上常见的RPC框架很多,grpc,motan,dubbo等,但是随着越来越多的元素加入,复杂的架构设计等因素似使得这些框架和spring一样,虽然号称是轻量级,但是用起来却是让我们很蹩脚,大量的配置,繁杂的API设计,其实,我们根本用不上这些东西!!! 我也算得上是在很多个互联网企业厮杀过,见过很多很多的内部RPC框架,有些优秀的设计让我非常赞赏,有一天我突然想着,为什么不对这些设计原型进行聚合归类,自己搞一套【轻量级】RPC框架呢,碍于工作原因,一直没有时间倒腾出空,十一期间工作闲暇,说搞就搞吧,落地不易,很多细节性问题,比如tcp中怎么解决大量的wait-time,如何做到thrift和netty的兼容等等大量细节的优化,希望源码对大家对认识RPC框架起到推进的作用。东西越写越多,有各种问题欢迎随时拍砖

##### 2:为什么叫koalas
树袋熊英文翻译,希望考拉RPC给那些不太喜欢动手自己去造轮子的人提供可靠的RPC使用环境

##### 3:技术栈
- [x] thrift 0.8.0
- [x] spring-core-4.2.5,spring-context-4.2.5,spring-beans-4.2.5等spring源码
- [x] log4j,slf4j
- [x] org.apache.commons(v2.0+)
- [x] io.netty4
- [x] fastJson
- [x] zookeeper
- [x] 点评cat(V3.0.0+ 做数据大盘统计上报等使用,可不配置)
- [x] AOP,反射代理等

##### 4:关于技术选型
1. 序列化篇 考察了很多个序列化组件,其中包括jdk原生,kryo、hessian、protoStuff,thrift,json等,最终选择了Thrift,原因如下 原生JDK序列化反序列化效率堪忧,其序列化内容太过全面kryo和hessian,json相对来说比原生JDK强一些,但是对跨语言支持一般,所以舍弃了,最终想在protoBuf和Thrift协议里面选择一套框架,这俩框架很相通,支持跨语言,需要静态编译等等。但是protoBuf不带RPC服务,本着提供多套服务端模式(thrift rpc,netty)的情况下,最终选择了Thrift协议。
2. IO线程模型篇 原生socket可以模拟出简单的RPC框架,但是对于大规模并发,要求吞吐量的系统来说,也就算得上是一个demo级别的,所以BIO肯定是不考虑了,NIO的模型在序列化技术选型的时候已经说了,Thrift本身支持很多个io线程模型,同步,异步,半同步异步等(SimpleServer,TNonblockingServer,THsHaServer,TThreadedSelectorServer,TThreadPoolServer),其中吞吐量最高的肯定是半同步半异步的IO模TThreadedSelectorServer了,具体原因大家可自行google,这次不做多的阐述,选择好了模型之后,发现thrift简直就是神器一样的存在,再一想,对于服务端来说,IO模型怎么能少得了Netty啊,所以下决心也要支持Netty,但是很遗憾Netty目前没有对Thrift的序列化解析,拆包粘包的处理,但是有protoBuf,和http协议的封装,怎么办,自己在netty上写对thrift的支持呗,虽然工作量大了一些,但是一想netty不就是干这个事儿的嘛- -!
3. 服务发现 支持集群的RPC框架里面,像dubbo,或者是其他三方框架,对服务发现都进行的封装,那么自研RPC的话,服务发现就要自己来写了,那么简单小巧容易上手的zookeeper肯定是首选了。
![输入图片说明](https://web-code-img.oss-cn-shanghai.aliyuncs.com/readme/290fb9a817d5e78d1bf5bf59.png "屏幕截图.png")

##### 5:安装教程
考拉RPC确保精简,轻量的原则,只需要zk服务器进行服务发现(后续版本服务治理可能需要Datasource),对于zookeeper的各个环境安装教程请自行google,不在本安装教程内特意说明 如果需要cat的数据大盘功能,想更方便的查看服务的调用情况,需要安装cat服务,至于cat的安装就更简单了,就是war包扔在tomcat里面运行,然后配置一些参数即可,当然你也可以不接入cat,单独的作为RPC框架来使用。 CAT接入参考:https://github.com/dianping/cat


# 二:使用说明
##### 1:前期准以及依赖
maven依赖

```
 <dependency>
        <groupId>koalas.rpc</groupId>
        <artifactId>com.Koalas.rpc</artifactId>
        <version>Koalas-1.0-SNAPSHOT</version>
    </dependency>
```

首先需要编写自己的thrift idl文件了,这里多说一句,在群里的小伙伴曾经说过idl文件编写不熟悉,有可能出错 这里顺带说一嘴,thrift的ldl文件和写java的请求体和service几乎没有任何区别,熟能生巧,上手之后非常简单,推荐大家去google一些相关的入门文章即可 下面截图为测试的thrift文件

```
namespace java thrift.service

include 'TestCreateAccountRequest.thrift'
include 'TestCreateAccountRespone.thrift'

service TestCreateAccountService {
      TestCreateAccountRespone.TestCreateAccountRespone getRPC(1:TestCreateAccountRequest.TestCreateAccountRequest TestCreateAccountRequest);
      TestCreateAccountRespone.TestCreateAccountRespone koaloasTest1(1:TestCreateAccountRequest.TestCreateAccountRequest TestCreateAccountRequest);
      TestCreateAccountRespone.TestCreateAccountRespone koaloasTest2(1:TestCreateAccountRequest.TestCreateAccountRequest TestCreateAccountRequest);
      TestCreateAccountRespone.TestCreateAccountRespone koaloasTest3(1:TestCreateAccountRequest.TestCreateAccountRequest TestCreateAccountRequest);
      TestCreateAccountRespone.TestCreateAccountRespone koaloasTest4(1:TestCreateAccountRequest.TestCreateAccountRequest TestCreateAccountRequest);
      TestCreateAccountRespone.TestCreateAccountRespone koaloasTest5(1:TestCreateAccountRequest.TestCreateAccountRequest TestCreateAccountRequest);
      TestCreateAccountRespone.TestCreateAccountRespone koaloasTest6(1:TestCreateAccountRequest.TestCreateAccountRequest TestCreateAccountRequest);
      TestCreateAccountRespone.TestCreateAccountRespone koaloasTest7(1:TestCreateAccountRequest.TestCreateAccountRequest TestCreateAccountRequest);
      TestCreateAccountRespone.TestCreateAccountRespone koaloasTest8(1:TestCreateAccountRequest.TestCreateAccountRequest TestCreateAccountRequest);
      TestCreateAccountRespone.TestCreateAccountRespone koaloasTest9(1:TestCreateAccountRequest.TestCreateAccountRequest TestCreateAccountRequest);
      TestCreateAccountRespone.TestCreateAccountRespone koaloasTest10(1:TestCreateAccountRequest.TestCreateAccountRequest TestCreateAccountRequest);
      TestCreateAccountRespone.TestCreateAccountRespone koaloasTest11(1:TestCreateAccountRequest.TestCreateAccountRequest TestCreateAccountRequest);
      TestCreateAccountRespone.TestCreateAccountRespone koaloasTest12(1:TestCreateAccountRequest.TestCreateAccountRequest TestCreateAccountRequest);
}
```


```
namespace java thrift.domain
/**
* 测试类
**/
struct TestCreateAccountRequest {

    1:i32 source,

    2:i32 accountType,

    3:i64 partnerId,

    4:i32 partnerType,

    5:string partnerName,

    6:i32 poiFlag,
}
```

```
namespace java thrift.domain
/**
* 测试类
**/
struct TestCreateAccountRespone {
    1:i32 code,
    2:string message,
}
```

编译器需要大家去下载对应的版本 windows和linux下不同的编译器,下载地址http://archive.apache.org/dist/thrift/0.8.0/ 下载0.8.0版本即可,0.8.0版本是很老的版本了,但是相对稳定,后续会把thirft版本升级。
编译上面三个文件 thrift -gen java TestCreateAccountService.thrift, thrift -gen java TestCreateAccountRequest.thrift, thrift -gen java TestCreateAccountResp