博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于Thrift的java和PHP互相调用范例
阅读量:5891 次
发布时间:2019-06-19

本文共 6978 字,大约阅读时间需要 23 分钟。

hot3.png

首先我们看看 Thrift是什么?

thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和引擎,以构建在 C++, Java, Go,Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。

是不是感觉很酷??那我们看看怎么玩的,网上关于 thrift 的范例不少,但是很多都千篇一律,很多都有点残缺, 下面我们就展示一下用java来做服务端, 然后客户端用java和php同时来写的例子。

运行环境:

win7  x64

JDK  1.8.X

PHP 5.6

其中java部分是在在 Itellj idea里面基于MAVEN构建的项目。

废话不多说,上码

1,首先在idea简历maven项目, pom.xml 添加如下类库

junit
junit
3.8.1
test
org.apache.thrift
libthrift
0.9.1
org.slf4j
slf4j-log4j12
org.slf4j
slf4j-api
log4j
log4j
org.slf4j
slf4j-log4j12
1.7.2

 

2, 建立 demoHello.thrift 文件内容为

namespace java com.kedacom.demo.thriftDemoservice  HelloWorldService {    string sayHello(1:string username)}

 这种文件是 thrift专用的 IDL文件(), 然后再用 thrift 来生成 java的通用服务代码,命令如下:

     thrift-0.9.3.exe -r -gen java demoHello.thrift

 thrift的WIN7可执行文件下载  http://archive.apache.org/dist/thrift/0.9.3/thrift-0.9.3.exe, 下载完设置下 系统path就可以了, 执行命令会在 同目录下生成 gen-java 文件夹,  里面的 com\kedacom\demo\thriftDemo 下的HelloWorldService.java 文件就是我们要用到的,这个文件是定义了我们的IDL接口引用逻辑的,是把这个RPC接口抽象出来,客户端可以连接调用

 

3, 然后在项目的  src/main/java 目录下建立新的package, 命名为  com.kedacom.demo.thriftDemo,把上面的 HelloWorldService.java 拷贝到packge的目录下面,  然后在此package新建类HelloClientDemo, HelloServerDemo, HelloWorldImpl,内容分别为

 

HelloClientDemo

package com.kedacom.demo.thriftDemo;import org.apache.thrift.TException;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 org.apache.thrift.transport.TTransportException;public class HelloClientDemo {    public static final String SERVER_IP = "localhost";    public static final int SERVER_PORT = 8090;    public static final int TIMEOUT = 30000;    public void startClient(String userName) {        TTransport transport = null;        try {            transport = new TSocket(SERVER_IP, SERVER_PORT, TIMEOUT);            // 协议要和服务端一致            TProtocol protocol = new TBinaryProtocol(transport);            // TProtocol protocol = new TCompactProtocol(transport);            // TProtocol protocol = new TJSONProtocol(transport);            HelloWorldService.Client client = new HelloWorldService.Client(protocol);            transport.open();            String result = client.sayHello(userName);            System.out.println("Thrify client result =: " + result);        } catch (TTransportException e) {            e.printStackTrace();        } catch (TException e) {            e.printStackTrace();        } finally {            if (null != transport) {                transport.close();            }        }    }    public static void main(String[] args) {        HelloClientDemo client = new HelloClientDemo();        client.startClient("Jimmy");    }}

 

 

 

HelloServerDemo

package com.kedacom.demo.thriftDemo;import org.apache.thrift.TProcessor;import org.apache.thrift.protocol.TBinaryProtocol;import org.apache.thrift.protocol.TCompactProtocol;import org.apache.thrift.protocol.TJSONProtocol;import org.apache.thrift.server.TServer;import org.apache.thrift.server.TSimpleServer;import org.apache.thrift.transport.TServerSocket;public class HelloServerDemo {    public static final int SERVER_PORT = 8090;    public void startServer() {        try {            System.out.println("HelloWorld TSimpleServer start ....");            TProcessor tprocessor = new HelloWorldService.Processor
(new HelloWorldImpl()); TServerSocket serverTransport = new TServerSocket(SERVER_PORT); TServer.Args tArgs = new TServer.Args(serverTransport); tArgs.processor(tprocessor); tArgs.protocolFactory(new TBinaryProtocol.Factory()); // tArgs.protocolFactory(new TCompactProtocol.Factory()); // tArgs.protocolFactory(new TJSONProtocol.Factory()); TServer server = new TSimpleServer(tArgs); server.serve(); } catch (Exception e) { System.out.println("Server start error!!!"); e.printStackTrace(); } } public static void main(String[] args) { HelloServerDemo server = new HelloServerDemo(); server.startServer(); }}

 

HelloWorldImpl

package com.kedacom.demo.thriftDemo;import org.apache.thrift.TException;public class HelloWorldImpl implements HelloWorldService.Iface {    public HelloWorldImpl() {    }    public String sayHello(String username) throws TException {        // TODO Auto-generated method stub        return "Hi," + username + " welcome,. this is Thrift demo!";    }}

 

至此我们的java版的thrift的服务端和客户端就完成了

执行  HelloServerDemo 显示 HelloWorld TSimpleServer start ....

执行  HelloClientDemo 显示  Thrify client result =: Hi,Jimmy welcome,. this is Thrift demo!

 

其中核心逻辑其实是在 执行类  HelloWorldImpl 里面, server和client的类只是按照 thrift的标准来写好逻辑即可, 服务端和客户端的类的标准可参考官方文档,下面我们贴下 PHP 的客户端实现代码

首先我们把第二步的 文件改成

namespace php helloworldservice  HelloWorldService {    string sayHello(1:string username)}

执行thrift命令之后,会生成 gen-php 目录

 

PHP客户端代码如下

#!/usr/bin/env php
registerNamespace('Thrift', '/opt/thrift_php/lib'); //这个是thrift源码下载之后,这个目录thrift-0.9.3/lib/抽离出来的//$loader->registerNamespace('Thrift', __DIR__ . '/../../lib/php/lib');//$loader->registerDefinition('shared', $GEN_DIR);$loader->registerDefinition('helloworld', $GEN_DIR);$loader->register();use Thrift\Protocol\TBinaryProtocol;use Thrift\Transport\TSocket;use Thrift\Transport\THttpClient;use Thrift\Transport\TBufferedTransport;use Thrift\Exception\TException;//**///$socket = new TSocket('localhost', 8090); $socket = new TSocket('192.168.17.1', 8090); $transport = new TBufferedTransport($socket, 1024, 1024);$protocol = new TBinaryProtocol($transport);$client = new \helloworld\HelloWorldServiceClient($protocol);//print_r($client);$transport->open();$str = $client->sayHello("jimmyxx");echo $str;$transport->close();

其中 $socket = new TSocket('192.168.17.1', 8090);  这句是服务端的IP地址和运行端口, 直接在linux下 PHP 执行此文件,显示   Hi,jimmyxx welcome,. this is Thrift demo! 成功调用了java的服务端代码, 是不是能感觉到一点点跨编程语言的远程RPC调用的魅力所在呢? 呵呵~~~ 范例简单明了,应用到我们实际项目里面还是要根据项目的具体情况进行一下架构设计, 比如我们就把PHP的客户端,服务端都集成在我们的MVC框架里面去了。

源码地址请访问github: ,  有用的话,记得star或者fork一下哦

转载于:https://my.oschina.net/u/615967/blog/744806

你可能感兴趣的文章
ActiveX控件的安全初始化和脚本操作 和 数字签名SIGN
查看>>
Eclipse console文本换行
查看>>
微信支付开发(11) Native支付
查看>>
HDFS dfsclient写文件过程 源码分析
查看>>
【设计模式】—— 代理模式Proxy
查看>>
ejabberd
查看>>
博客园博客自动生成三级目录(generate three levels content using JS in cnblogs)
查看>>
关于多线程的那些事
查看>>
js 将json字符串转换为json对象的方法解析
查看>>
1. Two Sum
查看>>
让浏览器不再显示 https 页面中的 http 请求警报
查看>>
hdu4893Wow! Such Sequence! (线段树)
查看>>
Android 最简单的SD卡文件遍历程序
查看>>
JavaScript获取DOM元素位置和尺寸大小
查看>>
1065: 贝贝的加密工作
查看>>
lintcode 单词接龙II
查看>>
WEB版一次选择多个文件进行批量上传(WebUploader)的解决方案
查看>>
Redis之 命令行 操作
查看>>
Jvm(46),指令集----对象创建与访问指令
查看>>
EL 表达式小结
查看>>