网络编程
网络编程
Python Thrift 简单示例
网络编程 2020-01-14 15:47

澳门在线平台 1本人的桌面

Thrift是二个软件框架,用来进展可扩充且跨语言的劳务的支付。它结合了功效强大的软件仓库和代码生成引擎,以创设在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 等等编制程序语言间无缝结合的、高效的劳动。

本文基于Thrift-0.10,使用Python完结劳务器端,使用Java达成客商端,演示了Thrift RPC调用示例。Java客商端提供七个字符串参数,Python服务器端计算那五个字符串的相仿度,并重返相符度结果(double类型,范围[0, 1],0意味不日常,1表示完全相近)

RPC(Remote Procedure Call)即 Python Thrift 简单示例。长途进程调用,说的那样抽象,其实简化理解就是贰个节点如何哀告另风姿罗曼蒂克节点所提供的劳务。在文章微服务调用链追踪中央搭建 一文中效仿出来的调用链:ServiceA ---> ServiceB ---> ServiceC 就是一个远道调用的例证,只可是那篇小说里是经过RestTemplate这种 协助进行调用格局,利用的是HTTP左券在应用层实现的,这种艺术即便见到成效,但有实功用并不高。而RPC能够不借助于应用层合同,能够平素基于TCP实行长间距调用,在传输层中就能够达成通讯,由此更适于有个别对成效须要更加高的光景。由于RPC调用方式信任于客商端与服务端之间建设布局Socket连接来兑现二进制数据通讯,底层会相比较复杂,所以有的RPC框架应运而生来封装这种复杂,让开辟者将精力聚焦于业务之上。不足为道的RPC框架包含:Thrift、gRPC、Finagle、Dubbo等等,从本文开首小编将选一些实践一下,本文重要记录小编对于Thrift框架的奉行进度。

Thrift最先由facebook开采,07年7月开放源码,08年111月跻身apache孵化机。thrift允许你定义多少个简易的概念文件中的数据类型和服务接口。以作为输入文件,编写翻译器生成代码用来方便地生成RPC客商端和服务器通信的无缝跨编制程序语言。

意气风发,境遇设置

Thrift是Apache的等级次序,它整合了效用强盛的软件酒店和代码生成引擎,能够在广大语言之间提供无缝协理。

率先景况介绍一下:

支付碰到:Windows10,PyCharm二〇一六,Anaconda3,Python3.6

心动不及走路吗!

1.IntelliJ IDEA 2017.1

第生机勃勃安装python 的thrift包:windows张开Anaconda prompt,输入:conda install -c anaconda thrift   安装thrift包。

注: 本文原载于 My Personal Blog:CodeSheep · 程序羊

2.thrift-0.9.3

输入:conda list 可查阅系统中曾经安装了怎么样包,及包的本子,如下图所示:大家设置的是:thrift-0.10.0

  • Mac OS X 10.13.2
  • SpringBoot 2.0.1
  • Thrift 0.11.0
  • IDE:IntelliJ IDEA 2018.01

信任大家在看自身那篇文章的时候曾经对thrift通讯框架已具备科学商讨,这里就不再赘言了,直接进去正题:

澳门在线平台 2

为了有助于读者知道,笔者先将下文内容计算一下,富含7点:

<1>创建HelloWorld.thrift

在写代码从前,须求先定义多个.thrift文件,然后利用Thrift Compiler生成相应的Thrift服务要求依靠的“文件”

  • Thrift情形搭建
  • IDEA中Thrift插件配置
  • 制造 Thrift 项目并编写翻译(目标:定义RPC接口)
  • 开发Thrift API接口
  • 开发RPC服务端
  • 开发RPC客户端
  • RPC通讯实际试验

namespace java com.thrift.demo

①定义.thrift文件

  • 方法一:原生安装格局,通过合法提供的手续一步一步来安装
service HelloWorldService{
string sayHello(1:string username)
}
namespace py similarityservice
namespace java similarityservice

service ChatSimilarityService{
    double similarity(1:string chat1, 2:string chat2),
}

参照这里:Mac上Thrift官方安装教程

 <2>利用thrift生成HelloWorld.java文件,cmd指令下步入thrift当前目录下输入指令

namespace提供了生龙活虎种集体代码的措施。其实正是,生成的文件放在:similarityservice这一个文件夹下。

  • 方法二:使用 brew 工具(推荐
thrift.exe -gen java HelloWorld.thrift

由于前面包车型客车Python安装的thrift-0.10,由此在官网上下载:thrift-0.10.exe,将它坐落于与 .thrift相似的目录下,cmd切换到该目录下,实施命令:

brew install thrift

java为要转移文书的档案的次序,HelloWorld.thrift为日前的文本。

.thrift-0.10.0.exe --gen py chat_similarity.thrift

澳门在线平台 3brew install thrift

<3>创制IDEA 下的maven项目,个中的利润就不生机勃勃一表明了,最入眼的一条便是足以在pom.xml文件中增加dependency,能够在品种中活动下载库文件,方便合作开辟中冒出的开采包不对应的状态。

更动的文书如下,将它们放在合适的python包下,就能够供python 服务端程序 import 了。

办法意气风发:直接在IDEA分界面中结构

<dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
    </dependency>
    <dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
    <dependency>
      <groupId>org.apache.thrift</groupId>
      <artifactId>libthrift</artifactId>
      <version>0.9.3</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.5</version>
    </dependency>

澳门在线平台 4

开辟IDEA的插件中央,寻找 Thrift 就可以安装

上述pom引进相应的依赖项就足以让它自动下载。

 

澳门在线平台 5运用插件中央设置Thrift

<4>项指标布局图当前如下所示:

二,Python服务端达成

主意二:手动下载Thrift插件安装

澳门在线平台 6

pycharm thrift插件协理

就像是小说 SpringBoot高贵编码之:Lombok加持 一文中在IDEA中安装Lombok插件相通,有时出于网络原因,方法一不奏效时插件装不上,那时得以手动下载插件并安装。

File--Project Structure--Modules,在main文件夹下新建java文件夹并设为Soueces类型(因为在Sources文件下能够新建java class文件)

可以去pycharm插件官方网址下载二个thrift插件,安装好未来,编写 .thrift 文件能够活动补全提示。

能够去如下地址下载Thrift插件:

澳门在线平台 7

服务端的兑现 首要有以下五地点:(个人知道,或然有错)

澳门在线平台 8手动下载Thrift插件

还要将thrift生成的HelloWorld.java文件复制到该目录下

①Handler

然后去IDEA中 Install plugin from disk... 接收下载的zip包安装,然后重启IDE就能够

<5>完结接口Iface

澳门在线平台,服务端业务管理逻辑。这里正是事情代码,比方总括七个字符串 雷同度

澳门在线平台 9Install plugin from disk

java代码:HelloWorldImpl.java

②Processor

安装达成的打响评释是 Compiler 中现身了 Thrift编译器!如下图所示:

package com.jmust.thrift.demo;
import org.apache.thrift.TException;
/**
 * Created by Administrator on 2017/3/31.
 */
public class HelloWorldImpl implements HelloWorldService.Iface {
  public HelloWorldImpl() {
  }
  @Override
  public String sayHello(String username) throws TException {
    return "Hi,"+username+"Welcome to my blog http://www.cnblogs.com/zfygiser";
  }
}

从Thrift框架 转移到 业务管理逻辑。因而是RPC调用,客户端要把 参数发送给服务端,而那风度翩翩体由Thrift封装起来了,由Processor将选择的“数据”转交给业务逻辑去管理

澳门在线平台 10成功安装Thrift插件

<6>服务端TSimpleServer

③Protocol

  • 第一步:创制Thrift项目并计划

java代码:HelloServer.java

多少的连串化与反种类化。顾客端提供的是“字符串”,而数据传输是三个个的字节,因而会用到连串化与反类别化。

IDE 很智能地在 New Project 时提供 Thrift项目创立选项:

/**
 * Created by Administrator on 2017/3/31.
 */
package com.jmust.thrift.demo;
import org.apache.thrift.TProcessor;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;
public class HelloServer {
  public final static int SERVER_PORT = 7099;
  private static String SERVER_IP = "localhost";
  public void startServer() {
    try {
      System.out.println("HelloWorld Server start...");
      TServerSocket serverTransport = new TServerSocket(SERVER_PORT);
      TServer.Args args = new TServer.Args(serverTransport);
      TProcessor process = new HelloWorldService.Processor(new HelloWorldImpl());
      TBinaryProtocol.Factory portFactory = new TBinaryProtocol.Factory(true, true);
      args.processor(process);
      args.protocolFactory(portFactory);
      TServer server = new TSimpleServer(args);
      server.serve();
    } catch (Exception e) {
      System.out.println("Server start error");
      e.printStackTrace();
    }
  }
  public static void main(String[] args) {
    HelloServer server = new HelloServer();
    server.startServer();
  }
}

④Transport

澳门在线平台 11Thrift项目创造选项

<7>编写顾客端代码

传输层的数量传输。

花色成立完成以往,在 Project Settings 中设置好 Facets 的 Thrift配置,如下图所示,这里我们加多一个 Java的Generator

java代码:Client.java

⑤TServer

澳门在线平台 12拉长五个Java的Generator

package com.jmust.thrift.demo;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
/**
 * Created by Administrator on 2017/4/1.
 */
public class Client {
  public static final int SERVER_PORT = 7099;
  public static final String SERVER_IP = "localhost";
  public void startClient(String username) {
    TTransport tTransport = null;
    try {
      tTransport = new TSocket(SERVER_IP, SERVER_PORT);
      //协议要和服务端一致
      TProtocol protocol = new TBinaryProtocol(tTransport);
      HelloWorldService.Client client = new HelloWorldService.Client(protocol);
      tTransport.open();
      String result = client.sayHello(username);
      System.out.println("Thrift client result=" + result);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  public static void main(String[] args) {
    Client client = new Client();
    client.startClient("zfy");
  }
}

服务端的品类。服务器以何种方法来拍卖顾客端诉求,比方,一回Client诉求成立一个新线程呢?照旧使用线程池?……可参看:卡住通讯之Socket编制程序

在弹出的对话框中配置好 Output folder 路线,该路径用于寄存由 thrift文件 转化而成的 java源文件

客商端测量试验成功,截图如下:

TSimpleServer —— 单线程服务器端使用规范的窒碍式 I/O

澳门在线平台 13配置好Output folder

澳门在线平台 14

TThreadPoolServer —— 七十多线程服务器端使用正式的堵塞式 I/O