「java创建thrift」java创建线程的四种方式

博主:adminadmin 2022-11-25 18:56:10 46

本篇文章给大家谈谈java创建thrift,以及java创建线程的四种方式对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

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创建线程的四种方式的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-11-25,除非注明,否则均为首码项目网原创文章,转载请注明出处。