「java创建thrift」java创建线程的四种方式
本篇文章给大家谈谈java创建thrift,以及java创建线程的四种方式对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、thrift java有什么特点
- 2、如何让thrift 支持java
- 3、跟我学Thrift 4:由浅入深Thrift文件
- 4、用java写一个thrift的hello world服务,要求输入姓名,输出, hello, xxx。
- 5、eclipse java怎么使用thrift插件
- 6、怎么生成thrift 代码
thrift java有什么特点
Apache Thrift 是一个跨语言的服务框架,本质上为RPC;当我们开发的service需要开放出去的时候,就会遇到跨语言调用的问题,JAVA语言开发了一个UserService用来提供获取用户信息的服务,如果服务消费端有PHP/Python/C++等,我们不可能为所有的语言都适配出相应的调用方式,有时候我们会很无奈的使用Http来作为访问协议;但是如果服务消费端不能使用HTTP,而且更加倾向于 以操作本地API的方式 来使用服务,那么我们就需要Thrift来提供支持.
本文以UserService为例,描述一下使用thrift的方式,以及其原理..
一. service.thrift
struct User{
1:i64 id,
2:string name,
3:i64 timestamp,
4:bool vip
}
service UserService{
User getById(1:i64 id)
}
二. 生成API文件
首先下载和安装thrift客户端,比如在windows平台下,下载thrift.exe,不过此处需要提醒,不同的thrift客户端版本生成的API可能不兼容.本例使用thrift-0.9.0.exe;通过"--gen"指定生成API所适配的语言.本实例为生成java客户端API.
//windows平台下,将API文件输出在service目录下(此目录需要存在)
thrift.exe --gen java -o service service.thrift
三. UserService实现类
public class UserServiceImpl implements UserService.Iface {
@Override
public User getById(long id){
System.out.println("invoke...id:" + id);
return new User();//for test
}
}
四.原理简析
1. User.java : thrift生成API的能力还是非常的有限,比如在struct中只能使用简单的数据类型(不支持Date,Collection?等),不过我们能从User中看出,它生成的类实现了"Serializable"接口和"TBase"接口.
其中Serializable接口表明这个类的实例是需要序列化之后在网络中传输的,为了不干扰JAVA本身的序列化和反序列化机制,它还重写了readObject和writeObject方法.不过这对thrift本身并没有帮助.
TBase接口是thrift序列化和反序列化时使用的,它的两个核心方法:read和write.在上述的thrift文件中,struct定义的每个属性都有一个序号,比如:1:id,那么thrift在序列化时,将会根据序号的顺序依次将属性的"名称 + 值"写入inputStream中,反序列化也是如此.(具体参见read和write的实现).
因为thrift的序列化和反序列化实例数据时,是根据"属性序号"进行,这可以保证数据在inputstream和outputstream中顺序是严格的.这一点也要求API开发者,如果更改了thrift文件中的struct定义,需要重新生成客户端API,否则服务将无法继续使用(可能报错,也可能数据错误).thrift序列化/反序列化的过程和JAVA自带的序列化机制不同,它将不会携带额外的class结构,此外thrift这种序列化机制更加适合网络传输,而且性能更加高效.
2. UserService.Client: 在生成的UserService中,有个Client静态类,这个类就是一个典型的代理类,此类已经实现了UserService的所有方法.开发者需要使用Client类中的API方法与Thrift server端交互,它将负责与Thrift server的Socket链接中,发送请求和接收响应.
如何让thrift 支持java
ava 和 python 属于不同的进程。只能通过进程间通信的方法。
如果你是新手。进程间通信的常见方法是通过网络,我只能说不同的语言之间是不能随便互相调用的,你需要学习 JNI 和 Python CTypes ,比如用 tcp 。
目前常见的跨语言 RPC 方案有 ZeroMQ protobuf 、Thrift 等。这样代码都在同一个进程里。
另一种不通过进程间通信的办法是用 Java 的 JNI 做一个 dll ,然后用 Python 的 ffi 调用 这个 dll ,你这个是进程间通信
跟我学Thrift 4:由浅入深Thrift文件
我们以顾客下单买车为例子,来深入了解下Thrift的一些细节
1.自定义标识符VS自动标识符
2.Optional VS Required VS Default
3.struct的组合(struct不支持继承)
首先是Thrift文件定义如下:
namespace java com.whp.demo.thrift.optional
struct Car {
1:required i32 carId,
2:required string carName,
3:required i64 price,
4: optional i16 age=0
}
struct Consumer{
1:required i32 consumerId,
2:optional string name
}
struct Order{
required i64 orderId,
required Car car,
required Consumer consumer,
}
service CarService{
Order createBuyCarOder(1:required Car car, 2:required Consumer consumer)
}
include "other.thrift" //包含其它的thrift文件
namespace java com.whp.demo //java下的namespace com.whp.demo
typedef i32 int; //tydef 语法
typedef i64 long;
enum Player {
JAVA = 0;
FLASH = 1;
}
#required:一定会被序列号,并且如果没有被复制,将会被提醒
#optional:如果没有被赋值,将不会被序列化。如果有默认值,则将会被序列化成默认值。具有一定的向后兼容性。
#default: 默认情况下是 req-in,opt-out即 对于write stream默认是required,对于read stream是optional
#如果一个程序分开来开发,那版本问题就是绕不过去的问题。Thrift的版本是通过“field identifiers”来实现的,每个结构由其标识,结构中的每个域有其标识,这两个标识唯一决定了一个数据域。在解码的时候,数据域的标识被检查,如果不能识别,则该数据域被抛弃.
用户自定义编号是从1开始的正整数
默认编号是从-1 开始递减。
struct Order{
required i64 orderId,
required Car car,
required Consumer consumer,
}
比如这个,编译后会成为:
ORDER_ID((short)-1,"orderId"),
CAR((short)-2,"car"),
CONSUMER((short)-3,"consumer");
struct Order{
required i64 orderId,
required Car car,
required Consumer consumer,
}
我们可以直接在Order中组合Car和Consumer
用java写一个thrift的hello world服务,要求输入姓名,输出, hello, xxx。
Scanner scann = nwe Scanner(System.in);
String name = scann.nextLine();
System.out.println("Hello,"+name);
eclipse java怎么使用thrift插件
package net.johnc.thrift;
import org.apache.thrift.TException;
public class TestImpl implements Test.Iface {
public void ping(int length) throws TException {
System.out.println("calling ping ,length=" + length);
}
}
怎么生成thrift 代码
编写,thrift文件,以笔者项目为例,auth.thrift,把auth.thrift拷贝到D盘Thrift目录下,在命令行输入:thrift -gen java D:\Thrift\auth.thrift
在目录下即可生成EntityAuth.java文件。将java文件拷贝到自己的项目里即可使用了。
关于java创建thrift和java创建线程的四种方式的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-11-25,除非注明,否则均为
原创文章,转载请注明出处。