rpc简介与thrift框架

koushr koushr     2022-08-31     151

关键词:

RPC,全称是remote process call,远程过程调用,简单来讲就是调用部署在另一台服务器上的服务或者被部署在另一台服务器上的服务调用。由于各服务部署在不同机器,服务间的调用免不了网络通信过程,服务消费方每调用一个服务都要写一坨网络通信相关的代码,不仅复杂而且极易出错。如果有一种方式能让我们像调用本地服务一样调用远程服务,而不用关心网络通信这些细节,那么将大大提高生产力。这就需要一些RPC框架了,如阿里巴巴的hsf、dubbo(开源)、Facebook的thrift(开源)、Google grpc(开源)、Twitter的finagle(开源)等。以下是一个RPC调用的通信流程图:


技术分享


1)服务消费方(client)以本地调用方式调用服务;

2)client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;

3)client stub找到服务地址,并将消息发送到服务端;

4)server stub收到消息后进行解码;

5)server stub根据解码结果调用本地的服务;

6)本地服务执行并将结果返回给server stub;

7)server stub将返回结果打包成消息并发送至消费方;

8)client stub接收到消息,并进行解码;

9)服务消费方得到最终结果。

RPC框架就是把2~8步封装起来。

Thrift框架简单使用示例:

我们想在一个服务器上部署一个服务,很简单,就是传入用户名的时候,返回欢迎信息。

我们首先需要写一个thrift文件,其实就是个service定义文件,内容如下:

 

namespace java com.kou.test
service Hello{
	string sayHello(1:string username)
}

namespace指定包名,service是接口的关键字,Hello是service名,sayHello是方法名。文件名无所谓,但为了方便管理,最好和接口同名。

 

之后,再下载thrift的代码生成工具thrift-xxx.exe,放到和thrift文件同一目录下,然后在该目录中在命令行窗口执行

thrift --gen <language> <Thrift filename>

language是要生成的代码语言,thrift支持多种语言。

 

具体就是thrift --gen java Hello.thrift,执行之后就会在当前目录中产生一个名叫gen-java的文件夹,把文件夹中的代码文件拷贝到服务端web应用对应的包中。简单看一下这个文件,会发现原来的service名现在变成了类名,原来的sayHello方法跑到了Hello类的内部接口Iface中。

服务端发布RPC服务:

需要在服务端实现这个接口,所以新建一个类,实现Iface接口,重写其sayHello方法,代码如下:

 

import org.apache.thrift.TException;

import com.kou.test.Hello.Iface;

public class HelloImpl implements Iface {
	@Override
	public String sayHello(String username) throws TException {
		return "hello," + username;
	}
}

如何启动服务呢,新建一个类,创建启动方法即可。

 

启动服务代码如下(不用记,套路基本固定):

 

public class HelloThriftServer {

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public void startServer() {
		try {
			TServer.Args tArgs = new TServer.Args(new TServerSocket(8090));
			TProcessor tprocessor = new Hello.Processor(new HelloImpl());
			tArgs.processor(tprocessor);
			tArgs.protocolFactory(new TBinaryProtocol.Factory());
			TServer server = new TSimpleServer(tArgs);
			server.serve();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

至此,服务端代码已完成,可以部署了。我们在此应用中配置一个监听器,当应用一启动的时候就调用HelloThriftServer实例的startServer()方法开启服务,待客户端调用。

监听器代码如下:

 

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import com.kou.test.HelloThriftServer;

/**
 * Application Lifecycle Listener implementation class ThriftListener
 *
 */
public class ThriftListener implements ServletContextListener {

	/**
	 * Default constructor.
	 */
	public ThriftListener() {
		// TODO Auto-generated constructor stub
	}

	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		new HelloThriftServer().startServer();
	}
}

把应用部署到Tomcat中之后即可以接受客户端的调用了。至此,RPC服务发布完成了。

 

客户端调用:

客户端调用服务端的服务,只需知道服务端的ip和端口就好了(我们在上面的服务端代码中指定了端口是8090)。

客户端和服务端一样,都需要上面用thrift代码生成工具生成的java文件,复制到客户端web应用对应的包中,然后新建一个类,写调用服务的方法,代码如下(不用记,套路基本固定):

 

import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;

import com.kou.test.Hello.Client;

public class HelloThriftClient {
	public void invokeHelloThrift(String userName) {
		TTransport tTransport = null;
		try {
			// 服务端的ip和端口
			tTransport = new TSocket("192.168.153.128", 8090, 30000);
			TProtocol protocol = new TBinaryProtocol(tTransport);
			Client client = new Client(protocol);
			tTransport.open();
			// 调用接口方法
			String str = client.sayHello(userName);
			System.out.println(str);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (null != tTransport) {
				tTransport.close();
			}
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new HelloThriftClient().startClient("寇胜瑞");
	}
}

此时,客户端应用就可以用invokeHelloThrift()方法来调用RPC服务了。这里我们通过简单的main方法来测试是否可以成功调用。

 

基于thrift的跨语言高可用高性能轻量级的rpc框架

...过服务管理系统可以方便查看服务状态和统计信息与原生thrift通信支持与原生thrift服务进行通信与业内方案的对比与thrift、avro、hessian相比,harpc支持了高可用 查看详情

thrift学习笔记thrift简介及第一个helloword程序

简介facebook开源的RPC框架,秉承了Facebook一贯的只管拉屎不管擦屁股的作风.Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在C++,Java,Python,PHP,Ruby,Erlang,Perl,Haskel... 查看详情

rpc服务框架thrift介绍(代码片段)

 rpc服务框架目前主要有thrift,grpc,dubbo,HSF等这里主要介绍thrift框架git地址 :https://github.com/apache/thrift/tree/0.9.11.接口定义 tutorial.thriftinclude"shared.thrift"/***Thriftfilescannamespace,package,orprefixtheiroutputinvarious*targetlanguages.*/namespaceclt... 查看详情

rpc框架-thrift服务端

-------服务端程序------下载   下载thrift源代码包   下载thrift的bin包准备描述文件(使用源代码包的示例文件)    hrift-0.10.0 utorialshared.thrift    hrift-0.10.0 utorial ut 查看详情

rpc框架之thrift架构及源码解读

RPC远程过程调用之Thrift架构1.Thrift基本概念2.Thrift为什么可以跨语言?3.Thrift架构4.参考文献(源码解读)1.Thrift基本概念Thrift就是通过接口文件,来生成各语言的代码,接口文件以”*.thrift”命名。代码生成完&#... 查看详情

rpc框架之thrift架构及源码解读

RPC远程过程调用之Thrift架构1.Thrift基本概念2.Thrift为什么可以跨语言?3.Thrift架构4.参考文献(源码解读)1.Thrift基本概念Thrift就是通过接口文件,来生成各语言的代码,接口文件以”*.thrift”命名。代码生成完&#... 查看详情

rpc框架-thrift客户端

   -------客户端程序------下载   下载thrift源代码包   下载thrift的bin包准备描述文件(使用源代码包的示例文件)    hrift-0.10.0 utorialshared.thrift    hrift-0 查看详情

消息总线扩展之集成thrift-rpc(代码片段)

...xff0c;希望此举能让消息总线同时为SOA提供基础设施。Thrift简介Thrift是一个跨语言的服务部署框架,最 查看详情

vip_osp--基于thrift的rpc框架的基本原理

...框架2.公司内部的Venux文档(内网文档,无法分享)一、Thrift简介Thrift采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,使用代码生成引擎可以在多种语言之中创建高效、无缝的服务,采用二进制格式进行数据的传... 查看详情

rpc框架:thrift和protobuf有啥区别?

...合多种语言,应用的解决方案。性能都差不多.相比较而言,thrift稍微强些.支持的数据格式也多些.支持的开发语言也比protobuf多些.目前只用过thrift.protobuf倒没有尝试...都差不多.参考技术Afastrpcprotobuf的一个全部开源的高性能rpc实现... 查看详情

springboot整合rpc框架---thrift

...1a;https://blog.csdn.net/lupengfei1009/article/details/100934794 什么是ThriftThrift是一种接口描述语言和二进制通讯协议,它被用来定义和创建跨语言的服务。它被当作一个远程过程调用(RPC)框架来使用,是由Facebook为“大规... 查看详情

thrift

Thrift公司的一些平台服务框架底层封装了thrift提供服务,最近项目不是很紧,于是研究了一下,刚刚入门,理解得不深,写这篇博文来整理一下思路.什么是thrift?  简单来说,是Facebook公布的一款开源跨语言的RPC框架.  那么问题来了.... 查看详情

rpc框架thrift例子-php调用c++后端程序

...用主动创建。前言前段时间用了一下Facebook的开源RPC框架Thrift,做PHP客户端调用C++后端程序,真心觉得Thrift不错!本文项目地址:https://github.com/zekunyan/ThriftDemo_PHP_CPP先看看本文的例子示意图:  流程PHP客户端发起请求,请... 查看详情

rpc原理与实践----thrift分层模型

   这一节我们从一下几个方面来讲一下Thrift的分层架构,按照官方的定义这是Thrift的网络栈,其中网络栈中分为一下几个部分,(由栈顶到栈底)server,processor,protocol,transport。下面我们按照这种结构来了解一下thrift。Transport... 查看详情

rpc远程协议之thrift入门

RPC远程协议之Thrift入门 在上一篇文章《RPC远程协议之原理分析》中,我介绍了RPC的工作原理及欲实现RPC框架功能应该做哪些事情,因为要做的事情太多,完全由开发人员研发实现,不是很现实,所以市面上出... 查看详情

apachethrift-使用,内部实现及构建一个可扩展的rpc框架

本文首先介绍了什么是ApacheThrift,接着介绍了Thrift的安装部署及如何利用Thrift来实现一个简单的RPC应用,并简单的探究了一下Thrift的内部实现原理,最后给出一个基于Thrift的可扩展的分布式RPC调用框架,在中小型项目中是一个常... 查看详情

flume简介与使用——thriftsource采集数据

Flume简介与使用(二)——ThriftSource采集数据  继上一篇安装Flume后,本篇将介绍如何使用ThriftSource采集数据。  Thrift是Google开发的用于跨语言RPC通信,它拥有功能强大的软件堆栈和代码生成引擎,允许定义一个简单的... 查看详情

消息总线扩展之集成thrift-rpc(代码片段)

...xff0c;希望此举能让消息总线同时为SOA提供基础设施。Thrift简介Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目。Thrift通过一个中间语言(IDL,接口定义语言)来定义RPC的接口和数据类型&... 查看详情