我们这里用一个简单的小功能来演示一下如何使用springboot集成thrift

这个功能是,判断hdfs路径存在。

1、先解决依赖

 <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>1.2.1</version>
<scope>provided</scope>
</dependency>
</dependencies>

2、编译thrift文件

先安装thrift编译器。

jazz.thrift文件如下。namespace相当于java里的package。thrift文件的写法这里就不赘述了。

namespace java com.xiaoju.dqa.jazz.iface

service JazzService{
bool exists(1:string path)
}

编译thrift文件

thrift -gen java jazz.thrift

这将生成的JazzService.java文件,拷贝到项目中,放到namespace指定的package下。

3、实现server端

编写controller实现功能。

可以看到Controller实现了JazzService.Iface接口,这个接口就是刚才生成的JazzService.java文件中。

这个接口中我们重写了exists方法,这个方法就是定义在thfift文件中的方法。

package com.xiaoju.dqa.jazz.service.controller;

import com.xiaoju.dqa.jazz.hadoop.client.HadoopClient;
import com.xiaoju.dqa.jazz.hive.client.HiveClient;
import com.xiaoju.dqa.jazz.iface.JazzService;
import org.apache.thrift.TException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller; @Controller
public class JazzRpcController implements JazzService.Iface {
protected final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired
private HadoopClient hadoopClient;
@Autowired
private HiveClient hiveClient; @Override
public boolean exists(String path) throws TException {
boolean isExists = false;
try {
isExists = hadoopClient.exists(path);
logger.info("[存在]判断路径是否存在成功, 路径={}, 结果={}", path, isExists);
} catch (Exception e) {
logger.error("[存在]判断路径是否存在失败, 路径={}", path, e);
}
return isExists;
}
}

为了启动thriftserver我们建立一个类ThriftServer

package com.xiaoju.dqa.jazz.service.server;

import com.xiaoju.dqa.jazz.iface.JazzService;
import com.xiaoju.dqa.jazz.service.controller.JazzRpcController;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TServerTransport;
import org.apache.thrift.transport.TTransportFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; @Component
public class ThriftServer {
protected final Logger logger = LoggerFactory.getLogger(this.getClass()); @Value("${thrift.port}")
private int port;
@Value("${thrift.minWorkerThreads}")
private int minThreads;
@Value("${thrift.maxWorkerThreads}")
private int maxThreads; private TBinaryProtocol.Factory protocolFactory;
private TTransportFactory transportFactory; @Autowired
private JazzRpcController jazzRpcController; public void init() {
protocolFactory = new TBinaryProtocol.Factory();
transportFactory = new TTransportFactory();
} public void start() {
//TMultiplexedProcessor processor = new TMultiplexedProcessor();
//processor.registerProcessor(JazzService.class.getSimpleName(), new JazzService.Processor<JazzService.Iface>(hadoopService));
JazzService.Processor processor = new JazzService.Processor<JazzService.Iface>(jazzRpcController);
init();
try {
TServerTransport transport = new TServerSocket(port);
TThreadPoolServer.Args tArgs = new TThreadPoolServer.Args(transport);
tArgs.processor(processor);
tArgs.protocolFactory(protocolFactory);
tArgs.transportFactory(transportFactory);
tArgs.minWorkerThreads(minThreads);
tArgs.maxWorkerThreads(maxThreads);
TServer server = new TThreadPoolServer(tArgs);
//TServer server = new TSimpleServer(tArgs);
logger.info("thrift服务启动成功, 端口={}", port);
server.serve();
} catch (Exception e) {
logger.error("thrift服务启动失败", e);
} }
}

server端启动方式

这里我们使用了bean注入的方式启动thriftserver。

package com.xiaoju.dqa.jazz;

import com.xiaoju.dqa.jazz.service.server.ThriftServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext; @SpringBootApplication
public class JazzApplication {
private static ThriftServer thriftServer; public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(JazzApplication.class, args);
try {
thriftServer = context.getBean(ThriftServer.class);
thriftServer.start();
} catch (Exception e) {
e.printStackTrace();
}
} }

4、实现client端

定义JazzClient

package com.xiaoju.dqa.jazz.client;

import com.xiaoju.dqa.jazz.iface.JazzService;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransportException; public class JazzClient {
private JazzService.Client jazzService;
private TBinaryProtocol protocol;
private TSocket transport;
private String host;
private int port;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
} public void init() {
transport = new TSocket(host, port);
protocol = new TBinaryProtocol(transport);
jazzService = new JazzService.Client(protocol);
} public JazzService.Client getJazzService() {
return jazzService;
} public void open() throws TTransportException {
transport.open();
} public void close()
{
transport.close();
} }

config生成bean

package com.xiaoju.dqa.jazz.configuration;

import com.xiaoju.dqa.jazz.client.JazzClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class JazzClientConfig {
@Value("${thrift.host}")
private String host;
@Value("${thrift.port}")
private int port; @Bean(initMethod = "init")
public JazzClient jazzClient() {
JazzClient jazzClient = new JazzClient();
jazzClient.setHost(host);
jazzClient.setPort(port);
return jazzClient;
}
}

写一个controller作为调用入口

package com.xiaoju.dqa.jazz.controller;

import com.xiaoju.dqa.jazz.client.JazzClient;
import com.xiaoju.dqa.jazz.response.Response;
import com.xiaoju.dqa.jazz.response.ResultCode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map; @RestController
@RequestMapping("/jazz")
public class JazzClientController { protected final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired
private JazzClient jazzClient; @RequestMapping(value = "/exists", method = RequestMethod.GET)
public Response exists(HttpServletRequest request, HttpServletResponse response) {
Map<String, Object> retMap = new HashMap<String, Object>();
try {
logger.info("[存在]判断路径是否存在");
String path = request.getParameter("path");
jazzClient.open();
boolean isExists = jazzClient.getJazzService().exists(path);
retMap.put("result", isExists);
logger.info("[存在]判断路径是否存在成功, 返回={}", retMap);
return new Response(ResultCode.SUCCESS, "判断存在成功" , retMap);
} catch (Exception e) {
logger.error("[存在]判断路径是否存在失败, 返回={}", retMap, e);
return new Response(ResultCode.EXCEPTION, "判断存在失败", retMap);
} finally {
jazzClient.close();
}
}
}

你可以使用如下方式测试代码

curl "http://10.93.18.34:8698/jazz/exists?path=/home/...."

springboot与thrift集成实现服务端和客户端的更多相关文章

  1. thrift生成c++服务端和客户端

    https://blog.csdn.net/jdx0909/article/details/84727523 https://blog.csdn.net/luoyexuge/article/detai ...

  2. [发布]SuperIO v2.2.5 集成OPC服务端和OPC客户端

    SuperIO 下载:本站下载 百度网盘 1.修复串口号大于等于10的时候导致IO未知状态. 2.优化RunIODevice(io)函数内部处理流程,二次开发可以重载这个接口. 3.优化IO接收数据, ...

  3. python thrift 服务端与客户端使用

    一.简介 thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, ...

  4. 使用Apache CXF开发WebServices服务端、客户端

    在前一篇的博客中,我使用Xfire1.x来开发了WebServies的服务端. 但是如果你访问Apache的官网,可以看到xfire已经被合并了. 最新的框架叫做CXF. Apache CXF = C ...

  5. Netty学习笔记(二) 实现服务端和客户端

    在Netty学习笔记(一) 实现DISCARD服务中,我们使用Netty和Python实现了简单的丢弃DISCARD服务,这篇,我们使用Netty实现服务端和客户端交互的需求. 前置工作 开发环境 J ...

  6. Java的oauth2.0 服务端与客户端的实现

    oauth原理简述 oauth本身不是技术,而是一项资源授权协议,重点是协议!Apache基金会提供了针对Java的oauth封装.我们做Java web项目想要实现oauth协议进行资源授权访问,直 ...

  7. 使用WebSocket实现服务端和客户端的通信

    开发中经常会有这样的使用场景.如某个用户在一个数据上做了xx操作, 与该数据相关的用户在线上的话,需要实时接收到一条信息. 这种可以使用WebSocket来实现. 另外,对于消息,可以定义一个类进行固 ...

  8. seata服务端和客户端配置(使用nacos进行注册发现,使用mysql进行数据持久化),以及过程中可能会出现的问题与解决方案

    seata服务端和客户端配置(使用nacos进行注册发现,使用mysql进行数据持久化),以及过程中可能会出现的问题与解决方案 说明: 之所以只用nacos进行了注册与发现,因为seata使用naco ...

  9. asp.net获取服务端和客户端信息

    asp.net获取服务端和客户端信息 获取服务器名:Page.Server.ManchineName获取用户信息:Page.User 获取客户端电脑名:Page.Request.UserHostNam ...

随机推荐

  1. [自制操作系统] JOS文件系统详解&支持工作路径&MSH

    本文分为两部分: 第一部分将详细分析JOS的文件系统及文件描述符的实现方法. 第二部分将实现工作路径,提供新的系统调用,完善用户空间工具. 本文中支持的新特性: 支持进程工作目录 提供getcwd与c ...

  2. Sublime Text 安装插件

    Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等.还可自定义键绑定,菜单和工具栏.Sublime Text 的主要功能包括:拼写检查,书签,完整的 ...

  3. 基于GUI的四则运算

    基于GUI的四则运算 李志强 201421123028 连永刚 201421123014 林方言 201421123023 coding 地址 https://git.coding.net/lizhi ...

  4. 201521123077 《Java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 泛型类 利用泛型可以写出一个更加通用的类,比如下面的例子: class simpleHolder<T&g ...

  5. 201521123096《Java程序设计》第七周学习总结

    1. 本周学习总结 2. 书面作业 ArrayList代码分析 1.1 解释ArrayList的contains源代码 contains遍历了ArrayList,如果ArrayList中存在与o相等的 ...

  6. 201521123071 《JAVA程序设计》第九周学习总结

    第九周-异常 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 此处仅部分知识点归纳 2. 书面作业 1. 常用异常,题目5-1 1.1 截图你的提交结果(出现学号) ...

  7. Java课程设计——学生成绩管理系统(201521123003 董美凤)

    Java课程设计--学生成绩管理系统(201521123003 董美凤) 1.团队课程设计博客链接 学生成绩管理系统博客链接 2.个人负责模块或任务说明 信息修改 密码修改 部分界面设计 3.自己的代 ...

  8. 三分钟深入TT猫之故障转移

    结束了一周繁忙的工作,趁着周末,小编手中的键盘早已饥渴难耐了,想知道上期省略号中发生了什么有趣的故事么?且听小编娓娓道来,结尾有彩蛋. 目录 风月前场 梦回现实 模拟老鸨 会话机制 故障转移 总结 风 ...

  9. Sql Server——基础

    前言: 在了解数据库之前,我们应该首先了解一下和数据库有关的知识,如:什么是数据,什么又是数据库等.  数据:描述事物的符号记录称为数据,它是数据库中存储的基本对象.  数据库(Datebase):数 ...

  10. python之socket编程------粘包

    一.粘包 什么是粘包 只有TCP只有粘包现象,UDP永远不会粘包 所谓粘包问题主要还是因为接收方不知道之间的界限,不知道一次性提取多少字节的数据所造成的 两种情况发生粘包: 1.发送端需要等缓冲区满才 ...