当前位置: 首页 > news >正文

thrift端口未被占用连接不上_跨语言RPC框架:Thrift的使用例子解析(包含完整项目源码)...

概述

  • Thrift是由FaceBook于2007年开发的一款高性能,跨语言的RPC框架,支持多种不同语言之间的RPC调用,如Java,C++等,以下基于一个HelloWorld项目来展示Thrift框架的基本使用方法,项目的完整代码请参见:
  • Thrift项目:

https://github.com/yzxie/java-framework-demo/tree/master/thrift-IDL

  • HelloWorld demo项目:

https://github.com/yzxie/java-framework-demo/tree/master/thrift-demo

一、创建Thrift项目,并在thrift文件定义数据结构与服务方法

  • 在基于IDEA来开发Thrift项目,首先需要在IDEA中集成对应的thrift插件,然后可以直接创建包含thrift文件的Thrift项目并支持编译成Java类文件,如下为对应的Thrift项目:
651a151a8d9f281c741408e232fbba58.png

1.首先需要在thrift文件定义业务数据结构和服务方法,如下在RpcHelloServiceThrift.thrift文件中定义RPC服务方法:如下定义了RpcHelloService服务或者称为RpcHelloService接口,声明了一个getHello方法。关于thrift的语法的更多知识可以参考thrift的官方文档。

03f22e86b941e8d28359f874c08e7dcc.png

2.然后可以将该thrift文件编译为对应的Java文件,其中对应如上的thrift文件定义,编译得到的Java类文件为RpcHelloService.java,最后将该文件拷贝到一个Java项目中,该项目可以专门用于管理thrift对应的Java文件,从而实现thrift的客户端thrift-client项目与服务端thrift-server项目只需要引入该项目的jar包依赖即可,如下在thrift-rpc项目定义:

8708b21f4c6439cc3da6eff28dee0e4a.png

二、实现RPC服务与Thrift服务端

1.RPC服务的实现主要是实现thrift文件编译得到的Java类文件的Iface接口,然后实现对应的业务方法即可,如下在RpcHelloServiceImpl文件中实现RpcHelloService的Iface接口并实现getHello方法。

3285d9c5f6200d8ad50f62299d7d9274.png

2.接着需要开发Thrift服务端来监听Thrift客户端对该服务方法的RPC调用请求,核心逻辑如下:关于以下类的更多知识可以参考thrift的官方文档。

00f380125a6482d9b30cd97efb69589b.png

3.其中需要指定RPC服务对应thrift的RPC请求处理器,如RpcHelloService.Processor ,并且需要指定RPC服务的对象,如rpcHelloService。之后thrift服务端启动后会在指定的端口监听thrift客户端的连接请求和后续的RPC方法调用请求。

3. 实现Thrift客户端

1.thrift客户端的实现主要包括创建连接thrift的服务端的socket套接字和RPC服务对应的客户端代理对象,其中是通过创建编译thrift文件得到的Java类的内部类Client的对象来实现,如RpcHelloService对应的RpcHelloService.Client。具体定义如下:

3af609b7711cdf772525d476e4db82d3.png

2.接着在Java的标准Service类,如HelloService中调用以上的ThriftClientWrapper类对象来发起RPC方法调用请求,核心实现如下:

185e84d456a1ca307b81e4ff5037da98.png

首先需要建立socket连接,然后通过客户端RPC服务调用代理来发起RPC方法调用请求,最后需要关闭socket连接。

相关文章:

  • 学习python有什么就业前景_学习Python的就业前景如何呢?
  • 变更控制管理流程图_药品批发企业的变更控制管理(六)管理流程详解3
  • python twisted安装_图文详解python之twisted模块安装
  • mongodb数据备份原理_MongoDB 数据备份和恢复 --- MongoDB基础用法(七)
  • mysql存在则更新 并发_SQL Server与MySQL在“存在则更新,不存在则插入”并发处理上的一些差异。...
  • MySQL时间加20天_mysql日期加一个天数获得新的日期
  • mysql创建子用户代码_mysql 创办用户
  • mysql 条件查询view_C#mysql数据库查询根据条件显示dataGridView
  • 引用类型如何避免数据结构的无穷嵌套问题_「Rust巅峰之作」- 从来没有谁能把数据类型讲的如此透彻...
  • 写个函数计算所有传入参数相乘的结果(参数数量不定)_Python 函数的封装
  • vue调用百度地图api_Vue Baidu Map 可能是 Vue 接入百度地图 API 的最佳组件了
  • mysql5.7执行计划 导出_Oracle执行计划和数据导出、MySQL入门
  • centos 7 yum卸载redis_不小心把Centos的yum给卸载了怎么办
  • mysql数据库uid是什么意思_mysql数据库权限及编码
  • mac os php mysql_教你如何在Mac OS系统搭建PHP环境及MySQL,原来这么简单
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • React-flux杂记
  • Sass 快速入门教程
  • ViewService——一种保证客户端与服务端同步的方法
  • 从零搭建Koa2 Server
  • 关于Flux,Vuex,Redux的思考
  • 机器学习 vs. 深度学习
  • 那些被忽略的 JavaScript 数组方法细节
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 在Unity中实现一个简单的消息管理器
  • 阿里云服务器购买完整流程
  • ​低代码平台的核心价值与优势
  • #define用法
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (C++)八皇后问题
  • (一)u-boot-nand.bin的下载
  • (转)C#调用WebService 基础
  • (转)h264中avc和flv数据的解析
  • (转)http协议
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 解决重复提交问题
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .net程序集学习心得
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • @javax.ws.rs Webservice注解
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • []FET-430SIM508 研究日志 11.3.31
  • [1181]linux两台服务器之间传输文件和文件夹
  • [Android]使用Retrofit进行网络请求
  • [Android]竖直滑动选择器WheelView的实现
  • [AX]AX2012开发新特性-禁止表或者表字段
  • [BZOJ] 1001: [BeiJing2006]狼抓兔子
  • [codevs 1288] 埃及分数 [IDdfs 迭代加深搜索 ]
  • [JS]Math.random()随机数的二三事
  • [LeetCode] 596:超过5名学生的课
  • [leetcode] Longest Palindromic Substring
  • [LeetCode]-225. 用队列实现栈
  • [NOIP2015] 运输计划