1. 新建一个目录,C:\test\thrift-test,里面建2个子文件夹,client-node和sever-csharp,然后把Thrift官方的thrift定义文件也拷贝进去。

2. 官方的thrift定义文件,会去引用一个shared的thrift文件,但是这个文件貌似没地方下载,导致生成接口时报错,索性我就把他从定义里面删掉,干净起见,注释也删了。

  1. namespace cpp tutorial
  2. namespace d tutorial
  3. namespace java tutorial
  4. namespace php tutorial
  5. namespace perl tutorial
  6. typedef i32 MyInteger
  7. const i32 INT32CONSTANT = 9853
  8. const map<string,string> MAPCONSTANT = {'hello':'world', 'goodnight':'moon'}
  9. enum Operation {
  10. ADD = 1,
  11. SUBTRACT = 2,
  12. MULTIPLY = 3,
  13. DIVIDE = 4
  14. }
  15. struct Work {
  16. 1: i32 num1 = 0,
  17. 2: i32 num2,
  18. 3: Operation op,
  19. 4: optional string comment,
  20. }
  21. exception InvalidOperation {
  22. 1: i32 what,
  23. 2: string why
  24. }
  25. service Calculator{
  26. void ping(),
  27. i32 add(1:i32 num1, 2:i32 num2),
  28. i32 calculate(1:i32 logid, 2:Work w) throws (1:InvalidOperation ouch),
  29. oneway void zip()
  30. }

3. 打开Visual Studio 2012,新建一个项目,名为thrift-1stApp-server,项目放在刚才建立的子目录server-csharp下。

4. 右键项目,选择Manage Nuget Packages,选择Online, 然后搜索thrift,第一个应该就是Apache官方提供的thrift C#库了,注意版本号和CreateBy属性,CreateBy一定要是The Apache Software Foundation,别下载山寨版。版本号要和接下来下载的thrift compiler对应。我这里显示的是2012年11月20日发布的0.9.0.0版本。点击安装,thrift.dll就被自动加入到项目引用里面了。

5. 现在thrift的windows版compiler(已经帮你编译好的exe),官方提供的下载链接是:http://thrift.apache.org/download/,只有最新0.91版的,找了半天也没找到0.90的,网上搜了下,总算下载到了:http://archive.apache.org/dist/thrift/0.9.0/

6. 把下载下来的thrift-0.9.0.exe,放到D:\Tools\thrift目录下。

7. 执行: C:\test\thrift-test\server-csharp\>D:\Tools\thrift\thrift-0.9.0 --gen csharp ..\tutorial-tutorial.thrift

8. 你应该能看到,多出来一个子目录gen-csharp,把该目录下的所有文件都Include到Visual Studio的工程里面去。

9. 编译一下,应该是没有编译错误的。

【开始编写Server端代码】:

1. 添加CalculatorHandler.cs:

  1. using System;
  2. namespace thrift_1stApp_server
  3. {
  4. public class CalculatorHandler : Calculator.Iface
  5. {
  6. public CalculatorHandler()
  7. {
  8. }
  9. public void ping()
  10. {
  11. Console.WriteLine("ping()");
  12. }
  13. public int add(int n1, int n2)
  14. {
  15. Console.WriteLine("add({0},{1})", n1, n2);
  16. return n1 + n2;
  17. }
  18. public int calculate(int logid, Work work)
  19. {
  20. Console.WriteLine("calculate({0}, [{1},{2},{3}])", logid, work.Op, work.Num1, work.Num2);
  21. int val = 0;
  22. switch (work.Op)
  23. {
  24. case Operation.ADD:
  25. val = work.Num1 + work.Num2;
  26. break;
  27. case Operation.SUBTRACT:
  28. val = work.Num1 - work.Num2;
  29. break;
  30. case Operation.MULTIPLY:
  31. val = work.Num1 * work.Num2;
  32. break;
  33. case Operation.DIVIDE:
  34. if (work.Num2 == 0)
  35. {
  36. InvalidOperation io = new InvalidOperation();
  37. io.What = (int)work.Op;
  38. io.Why = "Cannot divide by 0";
  39. throw io;
  40. }
  41. val = work.Num1 / work.Num2;
  42. break;
  43. default:
  44. {
  45. InvalidOperation io = new InvalidOperation();
  46. io.What = (int)work.Op;
  47. io.Why = "Unknown operation";
  48. throw io;
  49. }
  50. }
  51. return val;
  52. }
  53. public void zip()
  54. {
  55. Console.WriteLine("zip()");
  56. }
  57. }
  58. }

2. 实现Main方法:

  1. using System;
  2. using Thrift.Server;
  3. using Thrift.Transport;
  4. namespace thrift_1stApp_server
  5. {
  6. class Program
  7. {
  8. public static void Main()
  9. {
  10. try
  11. {
  12. CalculatorHandler handler = new CalculatorHandler();
  13. Calculator.Processor processor = new Calculator.Processor(handler);
  14. TServerTransport serverTransport = new TServerSocket(9090);
  15. TServer server = new TSimpleServer(processor, serverTransport);
  16. Console.WriteLine("Starting the server...");
  17. server.Serve();
  18. }
  19. catch (Exception x)
  20. {
  21. Console.WriteLine(x.StackTrace);
  22. }
  23. Console.WriteLine("done.");
  24. }
  25. }
  26. }

3. 编译运行,控制台会显示:Starting the Server...,然后就等待。

【开始编写Client端代码】:

1. 执行: C:\test\thrift-test\client-node>npm init,一路回车直到终结。
2. 安装thrift库,执行: C:\test\thrift-test\client-node>npm install thrift --save。

3. 生成Nodejs接口,执行:c:\test\thrift-test\client-node>D:\Tools\thrift\thrift-0.9.0.exe --gen js:node .
.\tutorial-tutorial.thrift

4. 应该可以看到,多了一个gen-nodejs的目录

5. TBD...

Thrift实践的更多相关文章

  1. erlang+thrift配合开发

    I  think, thrift is a  tcp/ip based Client-Server architecture multi-languages supported RPC framewo ...

  2. Thrift简单实践

    0.什么是RPC RPC(Remote Procedure Call - 远程过程调用),是通过网络从远程计算机上请求服务,而不需要了解底层网路技术的细节.简单点说,就是像调用本地服务(方法)一样调用 ...

  3. RPC与实践(thrift在windows的编译/安装--c++版)

    ------------------------------------------------------------------------ RPC 功能目标 RPC 的主要功能目标是让构建分布式 ...

  4. RPC框架实践之:Apache Thrift

    一.概述 RPC(Remote Procedure Call)即 远程过程调用,说的这么抽象,其实简化理解就是一个节点如何请求另一节点所提供的服务.在文章 微服务调用链追踪中心搭建 一文中模拟出来的调 ...

  5. RPC原理与实践(二)----Thrift分层模型

    这一节我们从一下几个方面来讲一下Thrift的分层架构,按照官方的定义这是Thrift的网络栈,其中网络栈中分为一下几个部分,(由栈顶到栈底)server,processor,protocol,tra ...

  6. RPC原理与实践(一)----RPC原理与实现(Thrift版)

    什么是RPC?为什么要使用RPC? 首先什么是RPC,RPC全称Remote Process Call,远程过程调用,现在几乎所有的公司都在使用RPC这种架构,诸如YOUTUBE使用的Thrift,B ...

  7. 【转】Flume(NG)架构设计要点及配置实践

    Flume(NG)架构设计要点及配置实践   Flume NG是一个分布式.可靠.可用的系统,它能够将不同数据源的海量日志数据进行高效收集.聚合.移动,最后存储到一个中心化数据存储系统中.由原来的Fl ...

  8. Spark SQL Thrift Server 配置 Kerberos身份认证和权限管理

    转载请注明出处:http://www.cnblogs.com/xiaodf/ 之前的博客介绍了通过Kerberos + Sentry的方式实现了hive server2的身份认证和权限管理功能,本文主 ...

  9. Thrift 个人实战--Thrift 的序列化机制

    前言: Thrift作为Facebook开源的RPC框架, 通过IDL中间语言, 并借助代码生成引擎生成各种主流语言的rpc框架服务端/客户端代码. 不过Thrift的实现, 简单使用离实际生产环境还 ...

随机推荐

  1. design pattern Builder 生成器设计模式

    其实设计模式可以学习很有趣,你并不需要有这么难啃旱地FOG对我来说,当然,这些都是健康的骨骼啃啃. 在本文中,建造者模式设计一个搞笑的一幕.根据这一模型来学习功夫的方法,哈哈. 基类的第一,设计.那么 ...

  2. 基本shell编程【3】- 常用的工具awk\sed\sort\uniq\od(转)

    awk awk是个很好用的东西,大量使用在linux系统分析的结果展示处理上.并且可以使用管道, input | awk ''  | output 1.首先要知道形式 awk 'command' fi ...

  3. [DEEP LEARNING An MIT Press book in preparation]Linear algebra

    线性代数是数学的一个重要分支,它经常被施加到project问题,要了解学习和工作深入研究的深度,因此,对于线性代数的深刻理解是非常重要的.下面是我总结的距离DL book性代数中抽取出来的比較有意思的 ...

  4. celery最佳实践

    作为一个Celery使用重度用户.看到Celery Best Practices这篇文章.不由得菊花一紧. 干脆翻译出来,同一时候也会添加我们项目中celery的实战经验. 至于Celery为何物,看 ...

  5. Hadoop Hive sql 语法详细解释

    Hive 是基于Hadoop 构建的一套数据仓库分析系统.它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,能够将结构 化的数据文件映射为一张数据库表,并提供完整的SQL查 ...

  6. 测试数据库sql声明效率

    书写sql当被发现的声明.对于所期望的结果通常是更好地执行. 当面对这些实现的时候如何选择它的最好的,相对来说?这导致了这个博客的话题,如何测试sql效率 以下介绍几种sql语句測试效率的方法,大多数 ...

  7. NPOI以及在ASP.NET MVC中的使用

    NPOI以及在ASP.NET MVC中的使用 1.前言 相信大家在工作中经常要遇到一些导入导出Execl操作.学习贵在分享,分享使人快乐,园子里的前辈已经有很多好的文章,鄙人也是能力有限,在这里把这些 ...

  8. Java Web整合开发(4) -- JSP

    JSP脚本中的9个内置对象: application:    javax.servlet.ServletContext config:          javax.servlet.ServletCo ...

  9. Linux netstat订购具体解释

    简单介绍 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics).masquerade 连接.多播成员 (Multicast Memb ...

  10. Android开发模板------自己定义SimpleCursorAdapter的使用

    使用SimpleCursorAdapter所设计的table(数据表)一定要有_id字段名称,否则会出现"找不到_id"的错误 SimpleCursorAdapter直接使用的方法 ...