Thrift_简介(基于C#)
//Server:
TProtocolFactory ProtocolFactory = new TBinaryProtocol.Factory(true, true);
TTransportFactory TransportFactory = new TFramedTransport.Factory();
serverTransport = new TServerSocket(this._port, 0, false);
ThriftService.Processor processor = new ThriftService.Processor(new ThriftServiceImpl(_frm));
TMultiplexedProcessor multiplex = new TMultiplexedProcessor();
multiplex.RegisterProcessor("RTDListenerService", processor);
server = new TThreadPoolServer(processor, serverTransport, TransportFactory, ProtocolFactory); //Client:
TTransport trans = new TSocket("10.232.158.49", 8083);
TProtocol Protocol = new TBinaryProtocol(trans, true, true);
TMultiplexedProtocol multiplex = new TMultiplexedProtocol(Protocol, "RTDListenerService");
ThriftService.Iface client = new ThriftService.Client(multiplex);
client.RquestThriftNoReply(null);
/* * Thrift的RPC调用的一个完整流程: * 首先是通过Thrift的编译器生成的客户端,将调用信息(方法名,参数信息)以指定的协议进行封装, * 而传输层TTransport是对协议层的封装进行处理(比如封装成帧frame),并通过网络发送出去。 * 服务端这边流程跟客户端相反,收到客户端发过来的数据后,首先经过传输层对传过来的数据进行处理, * 然后使用特定的协议(跟客户端是一一对应的)进行解析,然后再通过生成的Processor调用用户编写的代码, * 如果有返回值的话,返回值以逆向的顺序,即通过协议层封装,然后传输层处理对数据进行发送, * 到了客户端那边就是对服务端返回的数据进行处理,使用特定协议进行解析,然后得到一个调用个的结果。 * * 基本类型 * bool:布尔值(true或者false) * byte:8位的有符号字节(byte类型) * i16:16位的有符号整数(short类型) * i32:32位的有符号整数(int类型) * i64:64位的有符号长整型(long类型) * double:一个64位的浮点数(double类型) * string: 一个utf8编码的字符串文本(String) * * 集合类型 * list:一个有序的元素列表。元素可以重复。 * set:一个无序的元素集合,集合中元素不能重复。 * map:一个键值对的数据结构,相当于Java中的HashMap。 * * 异常类型Exceptions * Thrift的异常类型,除了是继承于静态异常基类以外,其他的跟struct是类似的。表示的是一个异常对象。 * * 服务类型Services Server: 4.服务层, 整合上述组件, 提供网络模型(单线程/多线程/事件驱动), 最终形成真正的服务. * Thrift 的service类型相当于定义一个面向对象编程的一个接口。Thrift的编译器会根据这个接口定义来生成服务端和客户端的接口实现代码。 * * Thrift的传输格式(协议层)1.protocol: 协议层, 定义数据传输格式,可以为二进制或者XML等 * TBinaryProtocol: 二进制格式。效率显然高于文本格式 * TCompactProtocol:压缩格式。在二进制基础上进一步压缩。 * TJSONProtocol:JSON格式。 * TSimpleJSONProtocol:提供JSON只写协议(缺少元数据信息),生成的文件很容易用过脚本语言解析。 * TDebugProtocol:使用易懂的刻度文本格式,以便于调试。 * * Thrift的数据传输方式(传输层) 2. Transport: 传输层,定义数据传输方式,可以为TCP/IP传输,内存共享或者文件共享等 * TSocket:阻塞式socket。 * TFramedTransport:以frame为单位进行传输,非阻塞式服务中使用。 * TFileTransport:以文件形式进行传输。 * TMemoryTransport:将内存用于I/O,Java是现实内部实际使用了简单的ByteArrayOutputStream。 * TZlibTransport:使用zlib进行压缩,与其他传输方式联合使用。当前无java实现。 * * Thrift的服务模型 Processor: 3. 处理层, 这部分由定义的idl来生成, 封装了协议输入输出流, 并委托给用户实现的handler进行处理. * TSimpleServer: 简单的单线程服务模型,常用于测试。只在一个单独的线程中以阻塞I/O的方式来提供服务。所以它只能服务一个客户端连接,其他所有客户端在被服务器端接受之前都只能等待。 * TNonblockingServer: 它使用了非阻塞式I/O,使用了java.nio.channels.Selector,通过调用select(),它使得程序阻塞在多个连接上,而不是单一的一个连接上。TNonblockingServer处理这些连接的时候,要么接受它,要么从它那读数据,要么把数据写到它那里,然后再次调用select()来等待下一个准备好的可用的连接。通用这种方式,server可同时服务多个客户端,而不会出现一个客户端把其他客户端全部“饿死”的情况。缺点是所有消息是被调用select()方法的同一个线程处理的,服务端同一时间只会处理一个消息,并没有实现并行处理。 * THsHaServer:(半同步半异步server) 针对TNonblockingServer存在的问题,THsHaServer应运而生。它使用一个单独的线程专门负责I/O,同样使用java.nio.channels.Selector,通过调用select()。然后再利用一个独立的worker线程池来处理消息。只要有空闲的worker线程,消息就会被立即处理,因此多条消息能被并行处理。效率进一步得到了提高。 * TThreadedSelectorServer: 它与THsHaServer的主要区别在于,TThreadedSelectorServer允许你用多个线程来处理网络I/O。它维护了两个线程池,一个用来处理网络I/O,另一个用来进行请求的处理。 * TThreadPoolServer: 它使用的是一种多线程服务模型,使用标准的阻塞式I/O。它会使用一个单独的线程来接收连接。一旦接受了一个连接,它就会被放入ThreadPoolExecutor中的一个worker线程里处理。worker线程被绑定到特定的客户端连接上,直到它关闭。一旦连接关闭,该worker线程就又回到了线程池中。 这意味着,如果有1万个并发的客户端连接,你就需要运行1万个线程。所以它对系统资源的消耗不像其他类型的server一样那么“友好”。此外,如果客户端数量超过了线程池中的最大线程数,在有一个worker线程可用之前,请求将被一直阻塞在那里。 如果提前知道了将要连接到服务器上的客户端数量,并且不介意运行大量线程的话,TThreadPoolServer可能是个很好的选择 * * cmd命令: * thrift-0.9.1.exe -help * thrift-0.9.1.exe -r -gen java data.thrift * thrift-0.9.1.exe -r -gen py data.thrift * thrift-0.9.1.exe -r -gen csharp data.thrift */ using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; using System.Threading.Tasks; using System.Collections; using Thrift.Transport; using Thrift.Server; using Thrift.Protocol; namespace TestThriftProject { public partial class FrmTest : Form { public FrmTest() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { if (textBox1.Text != null) { TTransport transport = new TSocket("127.0.0.1", , ); TProtocol protocol = new TBinaryProtocol(transport);//协议要和服务端一致 HelloWorldService.Client client = new HelloWorldService.Client(protocol); try { transport.Open(); String result = client.SayHello(textBox1.Text.Trim()); Console.WriteLine("Thrift client result =: " + result); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); } finally { if (transport != null) { transport.Close(); } } } } private void FrmTest_Load(object sender, EventArgs e) { new Task(new Action(() => { try { TServerSocket serverTransport = new TServerSocket(, , false); HelloWorldService.Processor processor = new HelloWorldService.Processor(new HelloWroldImpl()); TServer server = new TSimpleServer(processor, serverTransport); server.Serve(); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); } })).Start(); } } }
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace TestThriftProject
{
public class HelloWroldImpl : HelloWorldService.Iface
{
public string SayHello(string username)
{
return string.Format("{0:yyyy/MM/dd hh:mm:ss} hello: {1}", DateTime.Now, username);
}
}
}
Thrift_简介(基于C#)的更多相关文章
- nxlog4go 简介 - 基于log4go的下一代go语言日志系统
nxlog4go的项目网址: https://github.com/ccpaging/nxlog4go 项目历史 ccpaging's log4go forked from https://githu ...
- 分类算法简介 基于R
最近的关键字:分类算法,outlier detection, machine learning 简介: 此文将 k-means,decision tree,random forest,SVM(supp ...
- LambdaMART简介——基于Ranklib源码(二 Regression Tree训练)
上一节中介绍了 $ \lambda $ 的计算,lambdaMART就以计算的每个doc的 $\lambda$ 值作为label,训练Regression Tree,并在最后对叶子节点上的样本 $la ...
- RRDTool 存储原理简介——基于时间序列的环型数据库
转自:http://www.jianshu.com/p/b925b1584ab2 RRDTool是一套监测工具,可用于存储和展示被监测对象随时间的变化情况.比如,我们在 Windows 电脑上常见的内 ...
- LambdaMART简介——基于Ranklib源码(一 lambda计算)
学习Machine Learning,阅读文献,看各种数学公式的推导,其实是一件很枯燥的事情.有的时候即使理解了数学推导过程,也仍然会一知半解,离自己写程序实现,似乎还有一道鸿沟.所幸的是,现在很多主 ...
- 关于海康视频采集卡的简介---基于pci的插潮采集卡
vga 640x480 qvga vga的1/4,宽高分别是vga的一半 (1)采集类型 海康威视 DS-2CE16A2P-IT3P 700TVL 1/3" DIS ICR 红外防水筒型摄像 ...
- [译]基于GPU的体渲染高级技术之raycasting算法
[译]基于GPU的体渲染高级技术之raycasting算法 PS:我决定翻译一下<Advanced Illumination Techniques for GPU-Based Volume Ra ...
- JAVA IDE IntelliJ IDEA使用简介(一)—之界面元素
(注:简介基于IDEA的版本为:11.0,下载地址:http://www.jetbrains.com/idea/) 打开IDEA,(当第一次打开的时候出现的是一个欢迎页面,随便创建一个project来 ...
- SmartBusinessDevFramework架构设计-1:结构简介
SmartBusinessDevFramework 简介 基于.net 4.0 开发的企业级系统框架 功能 1 自定义ORM.如果客官喜欢NHibernate EntityFramework ,并对其 ...
随机推荐
- WCF服务端开发和客户端引用小结
1.服务端开发 1.1 WCF服务创建方式 创建一个WCF服务,总是会创建一个服务接口和一个服务接口实现.通常根据服务宿主的不同,有两种创建方式. (1)创建WCF应用程序 通过创建WCF服务应用程序 ...
- sql 删除默认索引,对象 依赖于 列,由于一个或多个对象访问此列
declare @name varchar(50)select @name =b.name from sysobjects b join syscolumns aon b.id = a.cdefau ...
- CTR预估中GBDT与LR融合方案
1. 背景 CTR预估(Click-Through Rate Prediction)是互联网计算广告中的关键环节,预估准确性直接影响公司广告收入.CTR预估中用的最多的模型是LR(Logistic R ...
- PyQt5--TextDrag
# -*- coding:utf-8 -*- ''' Created on Sep 21, 2018 @author: SaShuangYiBing Comment: ''' import sys f ...
- Python--详解Python中re.sub
给出定义: re.sub(pattern, repl, string, count=0, flags=0) Return the string obtained by replacing the le ...
- 在 PHP 中使用 `yield` 来做内存优化
你有没有想过 "在 PHP 中使用 yield 会有什么益处",我将为你节省一些谷歌搜索的时间: 我列出了一些要向你介绍的要点来全面认知 yield: 什么是 yield. yie ...
- 3990 [模板]矩阵快速幂 洛谷luogu
题目背景 矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 输入输出格式 输入格式: 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素 输出格式: 输出A^k ...
- 最小生成树(图论)--3366lg【模版】
题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N<=5000,M<= ...
- WebSocket原理与实践(一)---基本原理
WebSocket原理与实践(一)---基本原理 一:为什么要使用WebSocket?1. 了解现有的HTTP的架构模式:Http是客户端/服务器模式中请求-响应所用的协议,在这种模式中,客户端(一般 ...
- Linux kernel Programming - Allocating Memory
kmalloc #include <linux/slab.h> void *kmalloc(size_t size,int flags); void kfree(void *addr); ...