【问题标题】:First program with Apache Thrift - Where should I define the interface? in client or server code第一个使用 Apache Thrift 的程序 - 我应该在哪里定义接口?在客户端或服务器代码中
【发布时间】:2023-03-24 19:25:02
【问题描述】:

我正在制作一个 php 客户端,它通过 apache thrift 从 java 服务请求一个函数。我正在关注这个tutorial 以获取 php 客户端代码。我需要了解一些东西,作为 file.thrift 生成的接口应该在客户端和服务器上还是仅在一侧?

另外,在客户端代码中,我如何调用调用服务器函数的客户端对象? 在教程中,我遵循这一行

$client = new HbaseClient($protocol);

他是如何定义这个类的?

apache thrift tutorial 中,他在 python 客户端中定义相同

# Create a client to use the protocol encoder
client = Calculator.Client(protocol)

Calculator 对象是接口中标识的服务器提供的服务吗?同样的问题,接口应该在客户端和服务器中??

请帮忙,我真的卡住了。

【问题讨论】:

    标签: java php thrift


    【解决方案1】:

    我正在学习这个教程

    这是真实的:http://thrift.apache.org/tutorial/

    作为 file.thrift 生成的接口应该在客户端和服务器上还是只在一侧?

    起点是 IDL 文件。 IDL 表示接口定义语言,它只是一个文件,描述了服务器和客户端之间的 API 契约。服务端的任务是实现合约中描述的接口,以便客户端调用。

    要使用 IDL 文件,您需要运行 Thruift 编译器来为两端生成一些代码。如果服务器和客户端使用相同的语言(比如 Java),只需生成一次代码并在两个项目中使用它就足够了:

      thrift -r -gen java MyApiContract.thrift
    

    创建一个包含文件的gen-java 文件夹。

    如果服务器和客户端是不同类型的代码(例如 Java 和 PHP),那么您需要为它们生成代码:

      thrift -r -gen java -gen php MyApiContract.thrift
    

    这将生成两个文件夹,分别为gen-javagen-php

    由于 Thrift 是一个跨平台、跨语言的框架,用不同的语言编写客户端和服务器并不是什么稀奇事。

    【讨论】:

    • 如果服务器已经拥有自己的 IDL 并且我们需要添加客户端将使用的额外功能怎么办。我在客户端创建新的 IDL 并生成 gen-php 文件,现在卡在服务器端。我更新了现有的 thrift 文件以添加新功能并生成 gen-java 代码,但现在无法生成 jar 文件!它不断给我依赖错误。你认为这个问题是因为它是不同的 IDL 还是不相关?
    • cannot find symbol [javac] org.apache.thrift.TSerializable msgerror: method hashCode in class Object cannot be applied to given types; [javac] hashCode = hashCode * 8191 + org.apache.thrift.TBaseHelper.hashCode(f1); 这样的一些错误我该怎么办?在向 thrift 文件添加新功能之前,这些错误不存在!我知道这并不容易弄清楚,但如果你只是给我提示我可以跟踪哪些可能的问题。
    • 我弄明白了,问题出在thriftlib的版本上。我更新了 jar 文件,它运行良好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 2018-06-08
    • 2011-10-08
    • 2016-04-25
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    相关资源
    最近更新 更多