跨语言RPC框架Thrift详解_aronykl的博客-CSDN博客


本站和网页 https://blog.csdn.net/zw19910924/article/details/78178539 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

跨语言RPC框架Thrift详解_aronykl的博客-CSDN博客
跨语言RPC框架Thrift详解
aronykl
于 2017-10-08 23:32:36 发布
14338
收藏
16
分类专栏:
RPC
文章标签:
RPC
Thrift
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zw19910924/article/details/78178539
版权
RPC
专栏收录该内容
1 篇文章
0 订阅
订阅专栏
一、 概念
Apache的Thrift软件框架,是用来进行可伸缩的、跨语言的服务开发,它通过一个代码生成引擎来构建高效、无缝的服务,这些服务能够实现跨语言调度,目前支持的语言有: C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi 等。
二、 安装Thrift
目前官网最新的版本是v0.10.0。下面主要介绍基于mac os系统的Thrift的安装。windows系统可参考官网教程进行安装。
mac os官网提供的安装方法比较复杂,这里介绍下mac 下的home brew的安装方法。
打开终端,如果你的mac还没有安装home brew,那么先要安装home brew,使用以下命令:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
然后安装最新版本的Thrift:
brew install thrift
等待安装完成,然后输入以下命令,如果打印了Thrift的版本信息,表示安装成功:
thrift -version
三、 Thrift支持的类型
1. 基本类型
bool:布尔值(true或者false)byte:8位的有符号字节(java的byte类型)i16:16位的有符号整数(java的short类型)i32:32位的有符号整数(java的int类型)i64:64位的有符号长整型(java的long类型)double:一个64位的浮点数(java的double类型)string: 一个utf8编码的字符串文本(java的String)
2. Structs
Thrift的structs用来定义一个通用对象,但是没有继承关系。
3. 集合类型
list:一个有序的元素列表。元素可以重复。set:一个无序的元素集合,集合中元素不能重复。map:一个键值对的数据结构,相当于Java中的HashMap。
4. 异常类型Exceptions
Thrift的异常类型,除了是继承于静态异常基类以外,其他的跟struct是类似的。表示的是一个异常对象。
5. 服务类型Services
Thrift 的service类型相当于定义一个面向对象编程的一个接口。Thrift的编译器会根据这个接口定义来生成服务端和客户端的接口实现代码。
四、一个简单的Thrift调用实例
1. 编写.thrift文件,也就是IDL(接口描述语言)文件
以下是data.thrift文件:
namespace java thrift.generated
namespace py py.thrift.generated
typedef i16 short
typedef i32 int
typedef i64 long
typedef bool boolean
typedef string String
struct Person {
1: optional String username,
2: optional int age,
3: optional boolean married
exception DataException {
1: optional String message,
2: optional String callStack,
3: optional String date
service PersonService {
Person getPersonByUsername(1: required String username) throws (1: DataException dataException),
void savePerson(1: required Person person) throws (1: DataException dataException)
2. 使用thrift的编译器,生成客户端和服务端的代码
生成java的客户端服务端代码:
thrift --gen java src/thrift/data.thrift
生成Python的客户端服务端代码:
thrift --gen py src/thrift/data.thrift
其他语言的生成也是类似。
3. Thrift的调用
以java作为服务端,java作为客户端以及Python作为客户端对服务端进行请求。 java服务端代码:
public class PersonServiceImpl implements PersonService.Iface {
@Override
public Person getPersonByUsername(String username) throws DataException, TException {
System.out.println("Got client param: " + username);
Person person = new Person();
person.setUsername(username);
person.setAge(20);
person.setMarried(false);
return person;
@Override
public void savePerson(Person person) throws DataException, TException {
System.out.println("Got client param: ");
System.out.println(person.getUsername());
System.out.println(person.getAge());
System.out.println(person.isMarried());
public class ThriftServer {
public static void main(String[] args) throws Exception {
TNonblockingServerSocket serverSocket = new TNonblockingServerSocket(8899);
THsHaServer.Args arg = new THsHaServer.Args(serverSocket).minWorkerThreads(2).maxWorkerThreads(4);
PersonService.Processor<PersonServiceImpl> processor = new PersonService.Processor<>(new PersonServiceImpl());
arg.protocolFactory(new TCompactProtocol.Factory());
arg.transportFactory(new TFramedTransport.Factory());
arg.processorFactory(new TProcessorFactory(processor));
TServer server = new THsHaServer(arg);
System.out.println("Thrift Server Started!");
server.serve();
java客户端代码:
public class ThriftClient {
public static void main(String[] args) {
TTransport transport = new TFramedTransport(new TSocket("localhost", 8899), 600);
TProtocol protocol = new TCompactProtocol(transport);
PersonService.Client client = new PersonService.Client(protocol);
try {
transport.open();
Person person = client.getPersonByUsername("张三");
System.out.println(person.getUsername());
System.out.println(person.getAge());
System.out.println(person.isMarried());
System.out.println("------------");
Person person1 = new Person();
person1.setUsername("李四");
person1.setAge(30);
person1.setMarried(true);
client.savePerson(person1);
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
} finally {
transport.close();
python客户端代码:
__author__ = '作者'
from py.thrift.generated import PersonService
from py.thrift.generated import ttypes
from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TCompactProtocol
import sys
reload(sys)
sys.setdefaultencoding('utf8')
try:
tSocket = TSocket.TSocket('localhost', 8899)
tSocket.setTimeout(600)
transport = TTransport.TFramedTransport(tSocket)
protocol = TCompactProtocol.TCompactProtocol(transport)
client = PersonService.Client(protocol)
transport.open()
person = client.getPersonByUsername('张三')
print person.username
print person.age
print person.married
print '------------------'
newPerson = ttypes.Person()
newPerson.username = '李四'
newPerson.age = 30
newPerson.married = True
client.savePerson(newPerson)
except Thrift.TException, tx:
print '%s' % tx.message
先运行服务端,然后再运行客户端,观察服务端和客户端的输出来理解下thrift的一个调用流程是什么样的。
五、Thrift的架构原理
以下是thrift的客户端和服务端交互的一个原理图:
如上图,客户端在进行远程方法调用时,首先是通过Thrift的编译器生成的客户端,将调用信息(方法名,参数信息)以指定的协议进行封装,而传输层TTransport是对协议层的封装进行处理(比如封装成帧frame),并通过网络发送出去。服务端这边流程跟客户端相反,收到客户端发过来的数据后,首先经过传输层对传过来的数据进行处理,然后使用特定的协议(跟客户端是一一对应的)进行解析,然后再通过生成的Processor调用用户编写的代码,如果有返回值的话,返回值以逆向的顺序,即通过协议层封装,然后传输层处理对数据进行发送,到了客户端那边就是对服务端返回的数据进行处理,使用特定协议进行解析,然后得到一个调用个的结果。
以上就是Thrift的RPC调用的一个完整流程。
六、 Thrift的传输格式(协议层)
Thrift之所以被称为一种高效的RPC框架,其中一个重要的原因就是它提供了高效的数据传输。 以下是Thrift的传输格式种类:
TBinaryProtocol: 二进制格式。效率显然高于文本格式。TCompactProtocol:压缩格式。在二进制基础上进一步压缩。TJSONProtocol:JSON格式。TSimpleJSONProtocol:提供JSON只写协议(缺少元数据信息),生成的文件很容易用过脚本语言解析。TDebugProtocol:使用易懂的刻度文本格式,以便于调试。
以上可以看到,在线上环境,使用TCompactProtocol格式效率是最高的,同等数据传输占用网络带宽是最少的。
七、Thrift的数据传输方式(传输层)
TSocket:阻塞式socket。TFramedTransport:以frame为单位进行传输,非阻塞式服务中使用。TFileTransport:以文件形式进行传输。TMemoryTransport:将内存用于I/O,Java是现实内部实际使用了简单的ByteArrayOutputStream。TZlibTransport:使用zlib进行压缩,与其他传输方式联合使用。当前无java实现。
八、Thrift的服务模型
TSimpleServer 简单的单线程服务模型,常用于测试。只在一个单独的线程中以阻塞I/O的方式来提供服务。所以它只能服务一个客户端连接,其他所有客户端在被服务器端接受之前都只能等待。TNonblockingServer 它使用了非阻塞式I/O,使用了java.nio.channels.Selector,通过调用select(),它使得程序阻塞在多个连接上,而不是单一的一个连接上。TNonblockingServer处理这些连接的时候,要么接受它,要么从它那读数据,要么把数据写到它那里,然后再次调用select()来等待下一个准备好的可用的连接。通用这种方式,server可同时服务多个客户端,而不会出现一个客户端把其他客户端全部“饿死”的情况。缺点是所有消息是被调用select()方法的同一个线程处理的,服务端同一时间只会处理一个消息,并没有实现并行处理。THsHaServer(半同步半异步server) 针对TNonblockingServer存在的问题,THsHaServer应运而生。它使用一个单独的线程专门负责I/O,同样使用java.nio.channels.Selector,通过调用select()。然后再利用一个独立的worker线程池来处理消息。只要有空闲的worker线程,消息就会被立即处理,因此多条消息能被并行处理。效率进一步得到了提高。TThreadedSelectorServer 它与THsHaServer的主要区别在于,TThreadedSelectorServer允许你用多个线程来处理网络I/O。它维护了两个线程池,一个用来处理网络I/O,另一个用来进行请求的处理。TThreadPoolServer 它使用的是一种多线程服务模型,使用标准的阻塞式I/O。它会使用一个单独的线程来接收连接。一旦接受了一个连接,它就会被放入ThreadPoolExecutor中的一个worker线程里处理。worker线程被绑定到特定的客户端连接上,直到它关闭。一旦连接关闭,该worker线程就又回到了线程池中。 这意味着,如果有1万个并发的客户端连接,你就需要运行1万个线程。所以它对系统资源的消耗不像其他类型的server一样那么“友好”。此外,如果客户端数量超过了线程池中的最大线程数,在有一个worker线程可用之前,请求将被一直阻塞在那里。 如果提前知道了将要连接到服务器上的客户端数量,并且不介意运行大量线程的话,TThreadPoolServer可能是个很好的选择。
九、 其他
Facebook开源了一个简化thrift java开发的一个库——swift。swift是一个易于使用的、基于注解的java库,主要用来创建thrift可序列化类型和服务。
github地址:https://github.com/facebook/swift
十、 总结
Thrift是一个跨语言的RPC框架,如果有跨语言交互的业务场景,Thrift可能是一个很好的选择。如果使用恰当,thrift将是一个非常高效的一个RPC框架。开发时应根据具体场景选择合适的协议,传输方式以及服务模型。缺点就是Thrift并没有像dubbo那样提供分布式服务的支持,如果要支持分布式,需要开发者自己去开发集成。
aronykl
关注
关注
点赞
16
收藏
打赏
评论
跨语言RPC框架Thrift详解
一、 概念Apache的Thrift软件框架,是用来进行可伸缩的、跨语言的服务开发,它通过一个代码生成引擎来构建高效、无缝的服务,这些服务能够实现跨语言调度,目前支持的语言有: C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi
复制链接
扫一扫
专栏目录
基于thrift的RPC调用实例
05-27
RPC(Remote Procedure Call Protocol)远程过程调用协议实例,学习和使用thrift无痛入门代码。具体使用方法,可以看博客详解。
6种微服务RPC框架,你知道几个?
02-24
跟语言平台绑定的开源RPC框架主要有下面几种。Dubbo:国内最早开源的RPC框架,由阿里巴巴公司开发并于2011年末对外开源,仅支持Java语言。Motan:微博内部使用的RPC框架,于2016年对外开源,仅支持Java语言。Tars:腾讯内部使用的RPC框架,于2017年对外开源,仅支持C++语言。SpringCloud:国外Pivotal公司2014年对外开源的RPC框架,仅支持Java语言而跨语言平台的开源RPC框架主要有以下几种。gRPC:Google于2015年对外开源的跨语言RPC框架,支持多种语言。Thrift:最初是由Facebook开发的内部系统跨语言的RPC框架,2007
参与评论
您还未登录,请先
登录
后发表或查看评论
面试官让我手写一个RPC框架 ,so easy !
程序IT圈
09-12
16
作者:Java码农链接:https://www.jianshu.com/p/08108654b083如今,分布式系统大行其道,RPC 有着举足轻重的地位。Dubbo、Thrift、gRpc 等框架各领风骚,学习RPC是新手也是老鸟的必修课。本文带你手撸一个rpc-spring-starter,深入学习和理解rpc相关技术,包括但不限于 RPC 原理、动态代理、Javassist 字节码增强、服务注...
thrift的使用:(Java、Python之间跨语言调用)
BlackMoon
09-02
635
由于公司现在的开发业务模块中,有使用到Java作为客户端调用python服务器端业务处理,因此在底下研究了下,结合了网上的优质文章,在此做一下记录。
thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在C++,Java,Go,Python,PHP,Ruby,Erlang,Perl,C#,Cocoa,JavaScript,Node.js,Smalltalk,and OCaml这些变成语言间无缝结合的。高效的服务。
thrift最初由facebo
漫谈grpc 2:实战grpc,跨语言的rpc框架到底好不好用,试试就知道
程序员黄小斜
12-31
491
gRPC 这项技术真是太棒了,接口约束严格,性能还高,在 k8s 和很多微服务框架中都有应用。
作为一名程序员,学就对了。
之前用 Python 写过一些 gRPC 服务,现在准备用 Go 来感受一下原汁原味的 gRPC 程序开发。
本文的特点是直接用代码说话,通过开箱即用的完整代码,来介绍 gRPC 的各种使用方法。
代码已经上传到 GitHub,下面正式开始。
介绍
gRPC 是 Google 公司基于 Protobuf 开发的跨语言的开源 RPC 框架。gRPC 基于 HTTP/2 协
什么是RPC框架?
最新发布
柚子树's Blog
10-30
489
RPC(Remote Procedure Call)即远程过程调用,不同于本地调用,RPC是指调用远端机器的函数或方法,且不需要关心底层的调用细节,如网络协议和传输协议等,对于调用者来说,和调用本地方法没有什么区别。
motan:跨语言远程过程调用(RPC)框架,用于快速开发高性能分布式服务
02-17
莫坦
概述
Motan是用于快速开发高性能分布式服务的跨语言远程过程调用(RPC)框架。
Motan生态系统中的相关项目:
是golang的实现。
是PHP客户端,可以直接或通过Motan-go代理与Motan服务器进行交互。
是基于的Lua(Luajit)实现。
特征
创建分布式服务而无需编写额外的代码。
提供群集支持并与流行的服务发现服务(如或集成。
支持高级调度功能,例如加权负载均衡,跨IDC调度等。
针对高负载场景的优化,可在生产环境中提供高可用性。
支持同步和异步调用。
支持与Golang,PHP,Lua(Luajit)等进行跨语言交互。
快速开始
快速入门提供了在同一台计算机上运行客户端和服务器的非常基本的示例。 有关使用和开发Motan的详细信息,请转到 。
快速入门的最低要求是:
JDK 1.7或更高
基于Java的项目管理软件,例如或
同步通话
将依
XXL-JOB v2.2.0 发布 | 跨语言特性增强
许雪里
04-14
875
v2.2.0 Release Notes
1、RESTful API:调度中心与执行器提供语言无关的 RESTful API 服务,第三方任意语言可据此对接调度中心或者实现执行器。
2、任务复制功能:点击复制是弹出新建任务弹框,并初始化被复制任务信息;
3、任务手动执行一次的时候,支持指定本次执行的机器地址,为空则从执行器获取;
4、任务结果丢失处理:调度记录停留在 “运行中” 状态超过10mi...
Netty多语言(Java、Android 、C#、WebSocket)通信实例Demo (一)概述 【附源码】
lucherr 的学习历程
03-09
3565
转载请注明出处,原文地址:https://blog.csdn.net/lucherr/article/details/88358240
Netty多语言(Java、Android 、C#、WebSocket)通信实例Demo (一)概述 【附源码】Netty多语言(Java、Android 、C#、WebSocket)通信实例Demo (二)Java端简介【附源码】Netty多语言(Java、A...
burningbar:Swift RPC 生成器
05-31
燃烧棒 :straight_ruler: :fire:
Swift RPC 生成器。
可简单的规范编辑器和输出查看器使用。
克隆并运行:
$ git clone https://github.com/cfr/burningbar.git
$ cd burningbar
$ make example
有关一般安装和 Xcode 集成说明,请参阅 。
用法
命令
$ burningbar --spec-file spec.bb
读取并生成 (RPC funcs) 和 (structs/mappers),Interface 类由包含call 、 cast 、 listen 、 cancel funcs 和CancellationToken别名的Transport协议参数化。 Struct 的init?(json:)以[String: AnyObject]表示 JSON 对象, json返回这个对象。
有关更多选项,请参
《Netty学习打卡--从小白到放弃》----- 12 - netty 之thrift 初识thrift
那一抹回忆
07-11
379
学习要点
- 1.Thrift是什么
- 2.Thrift架构
- 3.Thrift能做什么
- 4.TProtocol
- 5.Thrift TTransPort
- 6.Thrift支持哪几种Server模型
- 7.Thrift IDL文件有哪几种基本数据类型
- 8.Thrift 支持哪几种容器
- 9.Thrift 关键字
1.Thrift是什么?
...
rpc和grpc和protobuf
喜欢打篮球的普通人
01-10
1125
文章目录1.rpc2.grpc
1.rpc
eg:计算a+b=?的函数
RPC指的是将a+b=?的功能的函数封装在另外一台server机器上,而client机器只需将参数a和b打包发送到server端,server端运行完毕后,打包发送给client端。
为什么需要RPC?
client运行的一个程序完成的A功能,但是A功能需要B功能,但是client他没有B功能,所以需要server端提供B功能的结果,通过调用B功能的集群,来获取他们的结果
http和rpc的区别?其实问的是http,swift,grp
php java thrift_使用thrift进行跨语言调用(php c# java)
weixin_42388485的博客
02-28
53
1:前言实际上本文说的是跨进程的异构语言调用,举个简单的例子就是利用PHP写的代码去调C#或是java写的服务端。其实除了本文提供的办法还有其他办法,例如http+xml(json)等等都能做到。本文的意义是介绍thrift,记录我在调试thrift时遇到的问题和相应的解决方案,避免大家走弯路。2:大概的流程thrift是通过socket+序列化协议来完成跨语言调用的。类似的方案有protocol...
Thirft框架介绍
Royce Wang专栏
07-05
1413
原文:http://dongxicheng.org/search-engine/thrift-framework-intro/1、前言Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目。Thrif
有了Thrift,跨语言通信不用再发愁
刘中兵专栏
06-17
3995
<br />地球上有几百个国家,上千种语言,如果两个国家要交往,首先要解决语言互相翻译的问题。那N种语言之间,就需要2*N*(N-1)个翻译。<br />如果我们要开发一个系统,来实现这么多语言之间的互通,就需要实现2*N*(N-1)个翻译模块。工作量之大!<br /> <br />有一个简单的方案,就是在所有的语言之外找到一种通用语言,实现N中语言和该通用语言的互通,这时仅需要实现2*N个翻译模块。工作量之小!<br /> <br />再进一步,如果能够提供者2*N个与通用语言的公共翻译模块为大家所用,那
跨语言rpc框架的一种实现方案
weixin_34088583的博客
04-26
1027
2019独角兽企业重金招聘Python工程师标准>>>
...
RPC框架:从原理到选型,一文带你搞懂RPC
qwer123451234123的博客
04-13
6754
大家好,我是华仔,RPC系列的文章是我去年写的,当时写的比较散,现在重新进行整理。对于想学习RPC框架的同学,通过这篇文章,让你知其然并知其所以然,便于以后技术选型,下面是文章内容目录:
RPC
什么是RPC
RPC(Remote Procedure Call Protocol)远程过程调用协议。一个通俗的描述是:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。
比较正式的描述是:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术
Thrift RPC详解
热门推荐
kesonyk的专栏
03-18
2万+
转自http://zheming.wang/thrift-rpcxiang-jie.html
Zheming
HomeCategoriesTagsArchivesAboutPublication
Thrift RPC详解
原创声明:本作品采用知识共享署名-非商业性使用 3.0 版本许可协议进行许
Thrift & Netty
简单之美
11-07
1万+
1 thrift协议
优点:thrift协议性能高,官方类库可扩展性好,提供了多种语言的类库,基于.thrift这种类似头文件的中间格式方便文档共享。
缺点:官方文档不够详尽,使用过程中(java版 libthrift.jar)遇到一些坑:
1 基本类型写入时要调用set方法,如果用字段赋值的方式则写不进去(默认情况下会给POJO生成public的字段,初学者很容易被坑)
第4章 分布式通信之Netty
05-13
<span>本章从BIO、NIO到AIO的演进过程开始,介绍网络IO的通信原理。然后,介绍Netty的基本设计原理,带大家用Netty手写一个Tomcat和一个RPC框架。接着,深入分析Netty的源码,掌握Netty的核心组件如BootStrap、EventLoop、Pipeline、Promise、Future等,最后,将带大家完成一个消息推送系统,模拟百万链接性能调优。</span>
Apache Thrift 学习第一篇(架构&介绍)
IPJMC的专栏
10-12
89
Thrift 是什么?
Thrift源于大名鼎鼎的facebook之手,在2007年facebook提交Apache基金会将Thrift作为一个开源项目,对于当时的
facebook来说创造thrift是为了解决facebook系统中各系统间大数据量的传
输通信以及系统之间语言环境不同需要跨平台的特性。所以thrift可以支持多种程序语言,例如: C++, C#, Coc...
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:大白
设计师:CSDN官方博客
返回首页
aronykl
CSDN认证博客专家
CSDN认证企业博客
码龄11年
暂无认证
43
原创
14万+
周排名
85万+
总排名
13万+
访问
等级
1721
积分
64
粉丝
65
获赞
26
评论
230
收藏
私信
关注
热门文章
如何使用跳板机一键登录目标机器
21986
跨语言RPC框架Thrift详解
14338
Java8的流Stream与收集器Collector详解
11450
线上服务运行时间长变慢问题的分析定位
8858
Java8流Stream中间操作、终止操作运行流程源码分析
8075
分类专栏
Java SE
12篇
struts2
1篇
hibernate
1篇
设计模式
8篇
SpringMVC
1篇
Zookeeper
1篇
分布式
2篇
Netty
5篇
工具使用
2篇
git
2篇
随想
5篇
java8
2篇
websocket
1篇
大数据
2篇
RPC
1篇
JVM
1篇
spring cloud
最新评论
如何使用跳板机一键登录目标机器
pyxLOVEdjy:
主机
Java8的流Stream与收集器Collector详解
Hey_Ray:
很好的文章,得多看几遍
Java8的流Stream与收集器Collector详解
翠竹飘飘:
简单点说,流不可以提取出变量,被重复使用
Java8的流Stream与收集器Collector详解
践行~渐远:
这比读文档舒服多了
如何使用跳板机一键登录目标机器
马呓:
这个是在哪里打开呀?
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
HDFS中的基本概念
JDK集合源码分析系列(四)——LinkedHashMap
JDK集合源码分析系列(三)——HashMap
2021年1篇
2018年9篇
2017年20篇
2016年4篇
2015年5篇
2014年6篇
2013年2篇
目录
目录
分类专栏
Java SE
12篇
struts2
1篇
hibernate
1篇
设计模式
8篇
SpringMVC
1篇
Zookeeper
1篇
分布式
2篇
Netty
5篇
工具使用
2篇
git
2篇
随想
5篇
java8
2篇
websocket
1篇
大数据
2篇
RPC
1篇
JVM
1篇
spring cloud
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
打赏作者
aronykl
你的鼓励将是我创作的最大动力
¥2
¥4
¥6
¥10
¥20
输入1-500的整数
余额支付
(余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值