文档章节

Thrift 服务端实现 - TSimpleServer

lostsquirrel
 lostsquirrel
发布于 2017/05/05 16:49
字数 540
阅读 36
收藏 0

TSimpleServer

测试 TSimpleServer 功能

项目结构

server-impls --maven pom 工程
    server-impls-core -- thrift 生成的代码
    server-impls-server -- thrift 服务端代码
    server-impls-client -- thrift 客户端代码

工程源代码

关键代码

server-impls.thrift 接口定义

namespace java demo.thrift.server.impls.core

/**
Sleepy 服务接口,用于测试,Thrift 服务端实现方式的区别
*/
service ISleepyService {
    /**
                接收客户端阻塞时间
    */
    void sleep(
        /**
		客户端序号
        */
        1:i32 clientNo,
        /**
        * 阻塞时长,单位毫秒
        */
        2:i32 timeout
       )
}

SleepyServiceImpl.java 接口实现

@Override
public void sleep(int clientNo, int timeout) throws TException {
	try {
		log.debug("going to process sleeping [{}]{}ms...", clientNo, timeout);
		TimeUnit.MILLISECONDS.sleep(timeout);
		log.debug("process sleep [{}]{}ms done!", clientNo, timeout);
	} catch (InterruptedException e) {
		log.error("process sleep failed [{}]{}", clientNo, e);
		e.printStackTrace();
	}
}

SimpleServer.java 服务创建

Runnable simple = new Runnable() {
	public void run() {
		TServerTransport serverTransport;
		try {
			serverTransport = new TServerSocket(9090);
			TServer server = new TSimpleServer(new Args(serverTransport).processor(processor));
			log.info("Starting the simple server...");
			server.serve();
		} catch (TTransportException e) {
			log.error("starting the simple server failed, {}", e);
			e.printStackTrace();
		}
	}
};

new Thread(simple).start();

SimpleServerClient.java 客户端调用代码

long s = System.currentTimeMillis();
sleepyService.sleep(clientNo, timeout);
long e = System.currentTimeMillis() - s;
log.debug("client[{}] took {}ms for timeout:{}ms", this.clientNo, e ,timeout);

打印调用花费时间

TestSimpleServer.java 用户端启动代码

String host = args.length > 0 ? args[0] : "localhost";
int port = args.length > 1 ? Integer.parseInt(args[1]) : 9090;
int amount = args.length > 2 ? Integer.parseInt(args[2]) : 10;
int timeout = args.length > 3 ? Integer.parseInt(args[3]) : 100;


ExecutorService fixedThreadPool = Executors.newFixedThreadPool(amount);

for (int i = 0; i < amount; i++) {
	fixedThreadPool.execute(new SimpleServerClient(i, timeout, host, port));
}

try {
	TimeUnit.MILLISECONDS.sleep(timeout * amount + 3 * 1000);
	fixedThreadPool.shutdown();
} catch (InterruptedException e) {
	e.printStackTrace();
}

运行及日志

  1. 启动服务
java -cp /app/server-impls-server-$(VERSION)-jar-with-dependencies.jar \
	demo.thrift.server.impls.server.simple.SimpleServer
  1. 简单测试 连通性
java -cp /app/server-impls-client-$(VERSION)-jar-with-dependencies.jar \
	demo.thrift.server.impls.client.test.simple.TestSimpleServer \
	192.168.1.139 9090 10 100

参数: host 192.168.1.139 port 9090 请求线程数 10 每个请求 阻塞时长 100

server.log client.log

  1. 测试较大连接数
java -cp /app/server-impls-client-$(VERSION)-jar-with-dependencies.jar \
demo.thrift.server.impls.client.test.simple.TestSimpleServer \
 192.168.1.139 9090 500 100

参数: host 192.168.1.139 port 9090 请求线程数 500 每个请求 阻塞时长 100

server.log client.log

  1. 测试较长阻塞时间
java -cp /app/server-impls-client-$(VERSION)-jar-with-dependencies.jar \
	demo.thrift.server.impls.client.test.simple.TestSimpleServer \
	 192.168.1.139 9090 10 3000l

参数: host 192.168.1.139 port 9090 请求线程数 10 每个请求 阻塞时长 3000

server.log client.log

总结

  1. 服务端会从连接中取得(无序)一个请求并处理
  2. 客户端会请求连接客户端, 如果被占用则等待直至被重置
  3. 当连接数较大时,会有客户端连接被重置
  4. 较长时间没有引起连接超时,暂不清楚连接超时时间
  5. 不要用于生产环境

© 著作权归作者所有

lostsquirrel
粉丝 1
博文 25
码字总数 14766
作品 0
成都
后端工程师
私信 提问
Thrift 简易入门与实战

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

永顺
2017/03/07
0
0
(转)Java版的各种Thrift server实现的比较

本文是我对这篇文章的翻译:Thrift Java Servers Compared,为了便于阅读,我将原文附于此处,翻译穿插在其中。此外,为了防止原链接在未来某一天失效后,文中的图片再也看不到的问题,我将原...

Mr_Tea
2016/07/11
23
0
基于Thrift的java和PHP互相调用范例

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

r00txx
2016/09/09
239
0
Thrift源码分析1-server

前言 Thrift是由FB开发的rpc框架,后贡献到apache成为开源项目,thrift可以支持多种语言,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等,本系列文章主...

Small-Liu
2016/02/02
745
0
thrift详解

背景 thrift最早由facebook开发,后来贡献给了apache。thrift主要解决跨语言调用的问题。 thrift和protobuf有啥区别? thrift和protobuf,都解决了一个问题就是夸语言数据结构的定义,json也...

卢禹
2016/09/27
126
0

没有更多内容

加载失败,请刷新页面

加载更多

Jenkins系列_插件安装及报错处理

进入Jenkins之后我们可以进行插件的安装,插件管理位于以下模块: 发现上面报了一堆错误,是因为插件的依赖没有安装好,那么这一节,就先把这些错误解决掉吧。解决完成后,也就基本会使用插件...

shzwork
今天
2
0
mysql mysql的所有查询语句和聚合函数(整理一下,忘记了可以随时看看)

查询所有字段 select * from 表名; 查询自定字段 select 字段名 from 表名; 查询指定数据 select * from 表名 where 条件; 带关键字IN的查询 select * from 表名 where 条件 [not] in(元素...

edison_kwok
昨天
9
0
解决多线程并行加载缓存问题(利用guava实现)

依赖 com.google.guava:guava:20.0 import com.google.common.cache.Cache;import com.google.common.cache.CacheBuilder;import java.util.concurrent.ExecutionException;import j......

暗中观察
昨天
3
0
利用VisualVM 内存查看

准备工作,建几个测试类。等下就是要查看这几个类里面的属性 package visualvm;public class MultiObject { private String str; private int i; MultiObject(String str...

冷基
昨天
2
0
组装一台工作游戏两用机

一、配置清单如下: 分类 项目 价格(元) 主板 华硕(ASUS)TUF Z370-PLUS GAMING II 电竞特工 Z370二代 支持9代CPU 1049 CPU 英特尔(Intel) i7 8700K 酷睿六核 盒装CPU处理器 2640 风扇 九...

mbzhong
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部