Thrift实践
1. 新建一个目录,C:\test\thrift-test,里面建2个子文件夹,client-node和sever-csharp,然后把Thrift官方的thrift定义文件也拷贝进去。
2. 官方的thrift定义文件,会去引用一个shared的thrift文件,但是这个文件貌似没地方下载,导致生成接口时报错,索性我就把他从定义里面删掉,干净起见,注释也删了。
- namespace cpp tutorial
- namespace d tutorial
- namespace java tutorial
- namespace php tutorial
- namespace perl tutorial
- typedef i32 MyInteger
- const i32 INT32CONSTANT = 9853
- const map<string,string> MAPCONSTANT = {'hello':'world', 'goodnight':'moon'}
- enum Operation {
- ADD = 1,
- SUBTRACT = 2,
- MULTIPLY = 3,
- DIVIDE = 4
- }
- struct Work {
- 1: i32 num1 = 0,
- 2: i32 num2,
- 3: Operation op,
- 4: optional string comment,
- }
- exception InvalidOperation {
- 1: i32 what,
- 2: string why
- }
- service Calculator{
- void ping(),
- i32 add(1:i32 num1, 2:i32 num2),
- i32 calculate(1:i32 logid, 2:Work w) throws (1:InvalidOperation ouch),
- oneway void zip()
- }
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:
- using System;
- namespace thrift_1stApp_server
- {
- public class CalculatorHandler : Calculator.Iface
- {
- public CalculatorHandler()
- {
- }
- public void ping()
- {
- Console.WriteLine("ping()");
- }
- public int add(int n1, int n2)
- {
- Console.WriteLine("add({0},{1})", n1, n2);
- return n1 + n2;
- }
- public int calculate(int logid, Work work)
- {
- Console.WriteLine("calculate({0}, [{1},{2},{3}])", logid, work.Op, work.Num1, work.Num2);
- int val = 0;
- switch (work.Op)
- {
- case Operation.ADD:
- val = work.Num1 + work.Num2;
- break;
- case Operation.SUBTRACT:
- val = work.Num1 - work.Num2;
- break;
- case Operation.MULTIPLY:
- val = work.Num1 * work.Num2;
- break;
- case Operation.DIVIDE:
- if (work.Num2 == 0)
- {
- InvalidOperation io = new InvalidOperation();
- io.What = (int)work.Op;
- io.Why = "Cannot divide by 0";
- throw io;
- }
- val = work.Num1 / work.Num2;
- break;
- default:
- {
- InvalidOperation io = new InvalidOperation();
- io.What = (int)work.Op;
- io.Why = "Unknown operation";
- throw io;
- }
- }
- return val;
- }
- public void zip()
- {
- Console.WriteLine("zip()");
- }
- }
- }
2. 实现Main方法:
- using System;
- using Thrift.Server;
- using Thrift.Transport;
- namespace thrift_1stApp_server
- {
- class Program
- {
- public static void Main()
- {
- try
- {
- CalculatorHandler handler = new CalculatorHandler();
- Calculator.Processor processor = new Calculator.Processor(handler);
- TServerTransport serverTransport = new TServerSocket(9090);
- TServer server = new TSimpleServer(processor, serverTransport);
- Console.WriteLine("Starting the server...");
- server.Serve();
- }
- catch (Exception x)
- {
- Console.WriteLine(x.StackTrace);
- }
- Console.WriteLine("done.");
- }
- }
- }
3. 编译运行,控制台会显示:Starting the Server...,然后就等待。
【开始编写Client端代码】:
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实践的更多相关文章
- erlang+thrift配合开发
I think, thrift is a tcp/ip based Client-Server architecture multi-languages supported RPC framewo ...
- Thrift简单实践
0.什么是RPC RPC(Remote Procedure Call - 远程过程调用),是通过网络从远程计算机上请求服务,而不需要了解底层网路技术的细节.简单点说,就是像调用本地服务(方法)一样调用 ...
- RPC与实践(thrift在windows的编译/安装--c++版)
------------------------------------------------------------------------ RPC 功能目标 RPC 的主要功能目标是让构建分布式 ...
- RPC框架实践之:Apache Thrift
一.概述 RPC(Remote Procedure Call)即 远程过程调用,说的这么抽象,其实简化理解就是一个节点如何请求另一节点所提供的服务.在文章 微服务调用链追踪中心搭建 一文中模拟出来的调 ...
- RPC原理与实践(二)----Thrift分层模型
这一节我们从一下几个方面来讲一下Thrift的分层架构,按照官方的定义这是Thrift的网络栈,其中网络栈中分为一下几个部分,(由栈顶到栈底)server,processor,protocol,tra ...
- RPC原理与实践(一)----RPC原理与实现(Thrift版)
什么是RPC?为什么要使用RPC? 首先什么是RPC,RPC全称Remote Process Call,远程过程调用,现在几乎所有的公司都在使用RPC这种架构,诸如YOUTUBE使用的Thrift,B ...
- 【转】Flume(NG)架构设计要点及配置实践
Flume(NG)架构设计要点及配置实践 Flume NG是一个分布式.可靠.可用的系统,它能够将不同数据源的海量日志数据进行高效收集.聚合.移动,最后存储到一个中心化数据存储系统中.由原来的Fl ...
- Spark SQL Thrift Server 配置 Kerberos身份认证和权限管理
转载请注明出处:http://www.cnblogs.com/xiaodf/ 之前的博客介绍了通过Kerberos + Sentry的方式实现了hive server2的身份认证和权限管理功能,本文主 ...
- Thrift 个人实战--Thrift 的序列化机制
前言: Thrift作为Facebook开源的RPC框架, 通过IDL中间语言, 并借助代码生成引擎生成各种主流语言的rpc框架服务端/客户端代码. 不过Thrift的实现, 简单使用离实际生产环境还 ...
随机推荐
- 多快好省的做个app开发
从技术经理的角度算一算,如何可以多快好省的做个app [导读]前端时间,一篇“从产品经理的角度算一算,做个app需要多少钱”的文章在网上疯传,可见大家对互联网创业的热情!这次,从一名技术经理的角度再给 ...
- How to pause the game in Uniy3D
static float timeScale; Description The scale at which the time is passing. This can be used for slo ...
- Windows Phone 8 MD5
using System; using System.Net; using System.Windows; using System.Windows.Controls; using System.Wi ...
- Shell 文字 顶替tomcat星团war包裹
执行前server造成免费ssh登陆. 修改配置文件不是太大 您可以覆盖原有的配置 profile 简介 bak=/home/wsm/bak webapps=/home/wsm/webapps/WSM ...
- java.lang.ClassCastException: java.lang.NoClassDefFoundError cannot be cast to java.lang.RuntimeException
不是一个Exception,而是一个Error,要强制转成Exception类型,就出错了java.lang.NoClassDefFoundError java.lang.RuntimeExcepti ...
- Linux/UNIX先进I/O
先进I/O 非阻塞IO 非阻塞I/O因此,我们可以称之为open.read和write这种I/O操作,而这些操作不会永久阻止.我们假设,该操作不能完成,然后调用立即返回一个错误.则表示该操作将继续作为 ...
- javaScript在私有的属性和方法
javaScript并没有什么特别的语法来代表私人.保.或公共的属性和方法,在这一点上与 java或其他语言是不同的.JavaScript大家是共同的所有对象: var myobj={ mypop:1 ...
- mvc5 解析route源码实现自己的route系统
Asp.net mvc5 解析route源码实现自己的route系统 url route 路由系统的责任是找到匹配的路由,创建路由数据,并将请求分配给一个处理程序. 选择动作是 MVC 的处理程序 ...
- Android(Lollipop/5.0) Material Design(六) 自定义动画
官网地址:https://developer.android.com/intl/zh-tw/training/material/animations.html 动画在Material设计中,为用户与a ...
- 堆C数组实现
堆栈是一个最后出来该数据结构. 栈的基本操作包含:入栈,出栈,初始化栈,清空栈,遍历栈. C代码例如以下: #include <stdio.h> #define MaxSize 20 ty ...