认识
跨语言的rpc框架,用于各个服务之间通过网络通信进行服务调用。
跨语言实现,IDL语言接口定义,生成各种类客户端和服务端的模版代码。
IDL语言支持的基本数据类型,另外还可以使用容器(list、set、map)、枚举等。
|
常用的:
(1)定义类型
struct定义结构体、const定义常量、typeof定义别名、enum枚举,异常定义
required 必须参数 optional可选参数
(2)服务类型
service关键字定义,需要指明返回值和参数类型,可以使用extends继承
(3)namespace命名空间
namespace 语言类型 包名
编译命令:thrift -gen java xx.thrift
thrift -gen py xx.thrift
快速开始
服务端开发
(1)添加依赖
<
dependencyManagement
>
<
dependencies
>
<
dependency
>
<
groupId
>com.sankuai</
groupId
>
<
artifactId
>inf-bom</
artifactId
>
<
version
>*.*.*</
version
>
<
type
>pom</
type
>
<
scope
>import</
scope
>
</
dependency
>
</
dependencies
>
</
dependencyManagement
>
<
dependencies
>
<
dependency
>
<
groupId
>com.meituan.service.mobile</
groupId
>
<
artifactId
>mtthrift</
artifactId
>
</
dependency
>
</
dependencies
>
(2)编写thrift文件
//声明接口类的包路径(以java资源包为根目录)
namespace java com.maoyan.attractions.ticket.bff.service.entertainment.TAdminEntertainmentTradeService.thrift
struct TQueryEntOrderResponse { 1: bool success, 2: TError error, 3: TEntOrderInfo data }
service TAdminEntertainmentTradeService { TQueryEntOrderResponse queryOrderByOrderId(1: TQueryEntOrderRequest arg0) }
(3)通过在线编译器http://genthrift.sankuai.com/进行编译,生成接口文件。
注意的四大接口:Iface服务端向客户端提供具体的同步业务能力。Asynclface服务端向客户端提供异步业务能力。
Client客户端以同步方式访问服务端提供的服务。AsyncClient异步的方式访问1服务端提供的服务。
(4)生成appkey标记服务,将appkey、接口类、接口实现类、监听端口配置到server.xml中
(5)实现接口类中的抽象方法
import
org.apache.thrift.TException;
public
class
HelloServiceImpl
implements
HelloService.Iface {
public
String sayHello(String username)
throws
TException {
return
"hello, "
+ username;
}
public
String sayBye(String username)
throws
TException {
return
"bye, "
+ username;
}
}
客户端开发
(1)在客户端的配置client.xml中添加本服务的app key、目标服务的app key、接口类。
(2)读取配置文件通过bean工厂生成客户端代理,代理获取bean对象。
import
org.apache.thrift.TException;
import
org.springframework.beans.factory.BeanFactory;
import
org.springframework.context.support.ClassPathXmlApplicationContext;
public
class
Client {
private
static
HelloService.Iface client;
public
static
void
main(String[] args)
throws
InterruptedException {
BeanFactory beanFactory =
new
ClassPathXmlApplicationContext(
"client.xml"
);
client = (HelloService.Iface) beanFactory.getBean(
"clientProxy"
);
Thread.sleep(
3000
);
try
{
String result = client.sayHello(
"meituan"
);
System.out.println(
"\n"
+ result +
"\n"
);
}
catch
(TException e) {
e.printStackTrace();
}
System.exit(
0
);
}
}