Thrift框架-具体使用
1.前言
使用thrift心得:
(1)thrift是一个RPC的框架 ,RPC是远程过程调用协议;用于进行可扩展且跨语言的服务的开发,以构建在C++、Java、Python、PHP、Ruby、Erlang、
Perl、Haskell、C#、Cocoa、JavaScript、Node.js、Smalltalk、and OCaml这些编程语言的服务,thrift实际上是实现了C/S模式,通过代码生成工具将接口定
义文件生成服务器端和客户端代码(可以为不同语言),从而实现服务端和客户端跨语言的支持。用户在thrift描述文件中声明自己的服务,这些服务经过编译后会
生成相应语言的代码文件,然后用户实现服务(客户端调用服务,服务器端提供服务)便可以了。其中protocol(协议层,定义数据传输格式,可以为二进制或者XML等)
和transport(传输层,定义数据传输方式,可以为TCP/IP传输,内存共享或者文件共享等)被用作运行时库
(2)thrift类似于一个脚本编译软件用来编译thrift脚本转成相应的Java文件,用于共同约束客户端和服务端关于 参数、接口、异常等数据的使用,像一个中间件一样;
(3)服务端需要设置端口号,需要实例脚本的service 【类似于接口】后映射相对应的具体实现类,具体实现类需要继承写该service并重写该service接口的方法;
(4)客户端需要输入服务端IP地址和端口号连接,连接成功后需要实例service,并设置参数,这些都需要thrift脚本转成相应的Java文件的约束,具体使用则直接调用即可,
语法的使用需要配合thrift依赖的方法使用;
(5)客户端使用结束后,记得关闭连接。
2.
需要提前编译thrift脚本,window系统可在文件夹新建一个后缀是 .thrift 的文件 ,我这里命名为 login.thrift
内容:
namespace java cn.cen.thrift struct MyRequest{
1: string username;
2: string psw;
} exception MyRequestException{
1: required i32 code;
2: optional string reason;
} //服务名
service MyLoginService{
string doLogin(1: MyRequest myRequest) throws (1:MyRequestException mrqe);//可能抛出异常
}
解释:
(1)namespace java cn.cen.thrift 的意思是说 【命名空间】【编译语言】【文件夹路径】
(2)struct 是块的意思 ,相当于poji类的使用
(3)exception 是异常类型 , required 是指必须有的参数 ,optional 是可选参数,可有可无
(4)service 是服务类型 ,类似于接口 的使用 ,里面是方法 ,string doLogin 意思是方法doLogin 返回string 类型数据 ,括号的是参数
(5)所有的参数 都需要写序号
3.
cmd打开指令框,进入有login.thrift这个文件的文件夹,后执行thrift编译指令
注意,thrift-0.9.3 是exe文件的名字,是可变的,很具实际输入 -gen java 意思是编译成java语言 ,后面的是文件名
编译后会在同文件夹生成一个gen-java文件夹 ,根据命名空间的参数一层层建立文件夹,里面会生成多个java文件
4.
新建一个maven项目,
pom.xml引入依赖包
<!-- thrift依赖包 ,这个不可缺-->
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.9.3</version>
</dependency> <!-- 下面两个日志依赖包,可有可无,虽然不影响thrift,
但是最好有,不然会有警告提示-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency> <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.21</version>
</dependency>
5.
项目结构
6.
建立 具体实现类
package doThrift; import org.apache.thrift.TException;
import thrift.MyLoginService;
import thrift.MyRequest;
import thrift.MyRequestException; import java.util.ArrayList; /**
* 具体实现类
*/
public class LoginServiceImpl implements MyLoginService.Iface {
@Override
public String doLogin(MyRequest myRequest) throws MyRequestException, TException {
System.out.println("设施具体方法位置");
System.out.println(myRequest.getUsername());
System.out.println(myRequest.getPsw());
return myRequest.getUsername() + myRequest.getPsw();
}
}
7.
建立 服务端
package server; import doThrift.LoginServiceImpl;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;
import thrift.MyLoginService; import java.io.IOException;
import java.net.ServerSocket; public class MyServer {
public static void main(String[] args) throws IOException, TTransportException {
//transport ,建立服务端socket的接收,设置端口号
ServerSocket serverSocket = new ServerSocket(8888);
TServerSocket tServerSocket = new TServerSocket(serverSocket);
//processor处理器 , 实例thrift脚本的service类型数据,生成处理器,映射相应的具体实现类【即具体业务】
MyLoginService.Processor processor = new MyLoginService.Processor(new LoginServiceImpl());
TServer.Args tServerArgs = new TServer.Args(tServerSocket);
//在总线添加子处理器
tServerArgs.processor(processor);
//server
TServer server = new TSimpleServer(tServerArgs);
System.out.println("服务端启动");
//启动服务
server.serve();
} }
可以直接运行,效果类似于tomcat的启动
8.
建立 客户端,并调用服务端 MyLoginService 接口 ,的 doLogin()方法
package client; 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 thrift.MyLoginService;
import thrift.MyRequest; public class MyClient {
public static void main(String[] args){
TTransport tTransport = null;
try {
//创建transport,,其实就是设置IP地址和端口号
tTransport = new TSocket("localhost",8888);
// 创建TProtocol 协议要与服务端一致
TProtocol tProtocol = new TBinaryProtocol(tTransport);
//创建client,,其实就是将thrift脚本的service类型数据实例化,相当于new一个对象
MyLoginService.Client client = new MyLoginService.Client(tProtocol);
//建立连接
tTransport.open();
//设置传入参数,相当于设置pojo类
MyRequest myRequest = new MyRequest().setUsername("爱你哟").setPsw("123456");
//client 调用 server端的方法 ,其实就是调用thrift脚本的service类型里的方法
String res = client.doLogin(myRequest);
System.out.println("客户端返回结果是:"+res);
}catch (Exception e){
e.printStackTrace();
}finally {
//关闭连接
tTransport.close();
}
}
}
9.
运行客户端 ,控制台打印信息
服务端打印的信息:
--------------------
参考博客原址: https://www.jianshu.com/p/166efddfcb20
Thrift框架-具体使用的更多相关文章
- thrift框架总结,可伸缩的跨语言服务开发框架
thrift框架总结,可伸缩的跨语言服务开发框架 前言: 目前流行的服务调用方式有很多种,例如基于 SOAP 消息格式的 Web Service,基于 JSON 消息格式的 RESTful 服务等.其 ...
- Thrift笔记(三)--Thrift框架通信源码分析
Thrift 客户端调用RPC的Demo public static void main(String[] args) throws Exception { TTransport transport ...
- Thrift框架-安装
1.前言 今天接触了使用 PRC[远程过程调用协议]的Thrift 框架 ,留下随笔心得,这是安装篇 2.下载 去apache官网下载Thrift脚本编译程序,window则下载一个exe文件,然后 ...
- Thrift框架介绍
1.前言 Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目.Thrift通过一个中间语言(IDL, 接口定义语言)来定义RPC的接口和 ...
- Thrift框架使用C++的一个demo
Thrift编译器会根据选择的目标语言为server产生服务接口代码,为client产生stubs,参数可以是基本类型和结构体. 代码框架用的Thrift,为了了解结构,学习写了一个thrift的De ...
- Thrift框架简介
功能:实现各个服务模块之间的跨语言.跨平台的通信,是RPC框架的一种,与dubbo类似. Thrift的应用原理: Thrift的部分功能相当于代码生成引擎,使用Thrift定义的语言编写*.Thri ...
- RPC简介与Thrift框架
RPC,全称是remote process call,远程过程调用,简单来讲就是调用部署在另一台服务器上的服务或者被部署在另一台服务器上的服务调用.由于各服务部署在不同机器,服务间的调用免不了网络通信 ...
- thrift框架
thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl ...
- Thrift框架学习
参考文章:1.http://www.kankanews.com/ICkengine/archives/54084.shtml 2.http://www.cnblogs.com/liping135991 ...
随机推荐
- Python——连接数据库操作
一.数据库基础用法 要先配置环境变量,然后cmd安装:pip install pymysql 1.连接MySQL,并创建wzg库 #引入decimal模块 import pymysql #连接数据库 ...
- drone使用git tag作为镜像tag
官方自动tag plugin/docker 已支持自动标签,使用方法如下 steps: - name: docker image: plugins/docker settings: repo: foo ...
- 沉淀vue相关知识(主要还是个人积累用)
路由懒加载的配置: const Home= () =>import('../components/Home') //使用ES6中的路由懒加载的方式 const About= () =>im ...
- HashMap的putAll方法介绍说明
jdk1.8 使用putAll时,新map中的值仅为旧map值所对应对象的引用,并不会产生新对象. 如下,使用for循环赋值! public void putAll(Map<? extends ...
- JetBrains又出神器啦!Fleet,体验飞一般的感觉
目录 简介 从eclipse到Fleet Fleet的特性 JetBrains Space 总结 简介 java开发的同学可能对于JetBrains这家公司并不陌生,因为JetBrains号称拥有世界 ...
- 韩顺平Java(持续更新中)
原创上课笔记,转载请注明出处 第一章 面向对象编程(中级部分) PDF为主 1.1 IDEA 删除当前行,ctrl+y 复制当前行,ctrl+d 补全代码,alt+/ 添加或者取消注释,ctrl+/ ...
- There is a cycle in the hierarchy! role对象此时是什么错误
There is a cycle in the hierarchy! role对象此时是什么错误
- vue 判断页面是否滚动到底部
需求 要求用户阅读完本页所有内容后,下一步按钮才可以点击. 实现思路 通过判断当前页面是否到达底部来设置按钮的点击事件. 要判断当前页面是否到达底部需要用到三个距离--距离顶部的距离scrollTop ...
- Linux(centos)使用docker安装pdf2htmlEX
pdf2htmlEX是一款可以将pdf文档转换成html文件的插件,但是Linux系统安装起来很麻烦,所以我们使用docker进行安装 首先要安装docker 因为国外镜像很慢,所以我们这边修改使用国 ...
- 【LeetCode】293. Flip Game 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历 日期 题目地址:https://leetcode ...