1.为什么要用thrift js C#?

目录

    1.1 首先,js 通过 thrift
访问C#,实际上是一种c/s模式。thrift是通信工具,js是客户端,C#是服务端。

前言    1

    1.2 使用js直接与thrift server通信。让web开发变得更简单。如果使用Web
Service,你需要自己去实现C/S两端的序列化与反序列化操作,还需要自行处理异常,降低了开发效率。而thrift则会自动生成两端的操作类,你只需要处理方法内部的逻辑即可。

准备工作    1

    1.3 js直接与thrift
server通信,可以提高性能,并且用C#开发server,开发效率也非常高。(那些web
service弱爆了)

一个简单的小程序    3

    1.4
当然,我们不能只看到优点。用这种方法也有比较明显的缺点:如果使用web
service,则网页与web
service可以封装在一个工程里,部署到IIS上后,可以存在于一个网站内。而使用了thrift后,你还需要手动管理thrift程序。包括:

1、准备工作    3

        1.4.1
你需要拥有服务端的绝对控制权,比如,你可以直接登录服务器的操作系统上进行操作。因此,如果你只有一个网页空间,则不适合这种方法。当然,你也可以用web
service里绑定thrift,但这样你又需要自己手动进行序列化与反序列操作,而且两次转换让性能更低,有违初衷

2小试牛刀    5

        1.4.2 给thrift
server程序增加自动启动,与监视程序,来完成thrift的崩溃后自动重启。

深入挖掘    12

 

1.
架构图    12

2.环境

2数据类型    15

    Win7 – VS2012 – .net 4.0 C# 控制台工程(用来承载thrift)

3协议    16

    Win7 – VS2012 – .net 4.0 C# Web工程(用来调试js,超方便)

4传输层    16

 

5服务端类型    16

3.步骤(以下步骤,对于小白来说,有些困难。QQ讨论群:23152359 )

本文主要参考引用的资料    22

    3.1 去thrift官方下载thrift库,目前是0.9.0。

 

    3.2 去thrift官方下载编译好的win下的thrift编译器,是一个exe文件。

Thrift学习总结

    3.3
写一个数据结构定义文件。我在这里只是用了服务,没有定义自定义数据结构。

Apahce Thrift是FaceBook实现的一种高效的、支持多种语言的远程服务调用的框架。本文结合网络上的资源对从C#开发人员的角度简单介绍Apache Thrift的架构、开发,并且针对不同的传输协议和服务类型给出相应的C#实例,同时简单介绍Thrift异步客户端的实现。

        data.txt:

前言

复制代码 代码如下:

Thrift是一款由Fackbook开发的可伸缩、跨语言的服务开发框架,该框架已经开源并且加入的Apache项目。Thrift主要功能是:通过自定义的Interface
Definition Language(IDL),可以创建基于RPC的客户端和服务端的服务代码。数据和服务代码的生成是通过Thrift内置的代码生成器来实现的。Thrift
的跨语言性体现在,它可以生成C++,
Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript,
Node.js, Smalltalk, OCaml , Delphi等语言的代码,且它们之间可以进行透明的通信。

 service UserStorage
 {
     i32 Sum( 1: i32 arg_number1, 2: i32 arg_number2),
     string GetString()
 }

Thrift代码生成器windows版下载地址

3.4 命令行下,用thrift编译器,对它进行编译:
   run.bat:

http://www.apache.org/dyn/closer.cgi?path=/thrift/0.9.2/thrift-0.9.2.exe

复制代码 代码如下:

Thrift源码下载地址

 thrift-0.9.0.exe –gen csharp data.txt
 thrift-0.9.0.exe –gen js data.txt
 pause

http://www.apache.org/dyn/closer.cgi?path=/thrift/0.9.2/thrift-0.9.2.tar.gz

    3.5 建立一个名字为CSharpServer的C#控制台工程,.net 4.0的。

准备工作

    3.6
为这个工程,添加现有项目:thrift库目录\thrift-0.9.0\lib\csharp\src\Thrift.csproj,然后引用这个项目。

本文先举个栗子来简单说明Thrift的使用以及如何构建Thrift服务。首先需要下载Thrift的代码生成器和源码,如上连接。

    3.7
把thrift编译出来的UserStorage.cs(在gen-csharp目录里),拖动到解决方案管理器里的CSharpServer项目的根目录下,UserStorage.cs与Program.cs应该在同一级。

威尼斯人线上娱乐 1

    3.8
在CSharpServer项目里创建一个UserStorage的处理类UserStorageHandle.cs:(它应该与UserStorage.cs与Program.cs在同一级)

有了代码生成工具,还需要Thrift类库文件,以便我们调用。打开下载好的源码,找到thrift-0.9.2\lib\csharp\src下的解决方案,

复制代码 代码如下:

 

using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;

威尼斯人线上娱乐 2

 namespace CSharpServer
 {
     public class UserStorageHandle : UserStorage.Iface
     {

然后用VS2013打开,可以看见如下结构

         public UserStorageHandle()
         {

威尼斯人线上娱乐 3

         }

 

         public int Sum(int arg_number1, int arg_number2)
         {
             int result = arg_number1 + arg_number2;
             Console.WriteLine(DateTime.Now.ToString() + ”
收到请求:Sum,参数:arg_number1 = ” + arg_number1.ToString() +
“,arg_number2 = ” + arg_number2.ToString() + “,返回:result = ” +
result.ToString());
             return result;
         }

威尼斯人线上娱乐 4

         private static int Counter = 0;

一个简单的小程序

         public string GetString()
         {
             int currentCounter =
System.Threading.Interlocked.Increment(ref UserStorageHandle.Counter);
             Console.WriteLine(DateTime.Now.ToString() + ”
收到请求:GetString,参数:没有,返回:result = \”thrift is OK : ” +
currentCounter.ToString() + “\””);
             return “thrift is OK : ” + currentCounter.ToString();
         }

1、准备工作

     }
 }

做完了前期准备工作就可以正式开始编写一个小程序,感受thrift。创建一个简单的Hello服务,根据thrift的语法规范编写脚本文件Hello.thrift,代码如下:

    3.9 主程序Program.cs:

清单1.Hello.Thrift

复制代码 代码如下:

namespace
csharp HelloThrift.Interface

using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using Thrift.Transport;
 using Thrift.Protocol;
 using Thrift.Server;
 using System.Net;

service
HelloService{

 namespace CSharpServer
 {
     class Program
     {
         private static HttpListener httpListener = null;
         private static THttpHandler httpServer = null;

    string
HelloString(1:string para)

         static void Main(string[] args)
         {
             string serviceUrl = “http://localhost:99/“;
             try
             {
                 UserStorageHandle handle = new UserStorageHandle();
                 UserStorage.Processor processor = new
UserStorage.Processor(handle);
                 TProtocolFactory protocolFactory = new
TJSONProtocol.Factory();

    i32
HelloInt(1:i32 para)

                 Program.httpServer = new THttpHandler(processor,
protocolFactory);

    bool
HelloBoolean(1:bool para)

                 Program.httpListener = new HttpListener();
                 Program.httpListener.Prefixes.Add(serviceUrl);
                 Program.httpListener.Start();
                 IAsyncResult result =
Program.httpListener.BeginGetContext(new
AsyncCallback(WebRequestCallback), null);
                 Console.WriteLine(“Thrift 服务成功启动,网址是 ” +
serviceUrl);
             }
             catch (System.Exception ex)
             {
                 Console.WriteLine(“发生错误:” + ex.Message);
                 Console.WriteLine(“按回车键退出”);
                 Console.ReadLine();
                 return;
             }
            
Console.WriteLine(“若需结束程序,请直接关闭窗口,或按回车。”);
             Console.ReadLine();
         }

    void
HelloVoid()

         public static void WebRequestCallback(IAsyncResult result)
         {
             if (Program.httpListener == null)
             {
                
Console.WriteLine(“发生错误:HttpListener已经被关闭”);
                 Console.WriteLine(“按回车键退出”);
                 Console.ReadLine();
                 return;
             }

    string
HelloNull()

             HttpListenerContext httpListenerContext =
Program.httpListener.EndGetContext(result);

}

             Program.httpListener.BeginGetContext(new
AsyncCallback(WebRequestCallback), null);

然后打开cmd切换到thrift代码生成工具的存放目录,在命令行中输入如下命令thrift -gen csharp Hello.thrift

             Program.httpServer.ProcessRequest(httpListenerContext);
         }

威尼斯人线上娱乐 5

     }
 }

威尼斯人线上娱乐 6

    3.10 按F5,启动CSharpServer项目。

代码生成工具会自动在当前目录下把定义好的接口脚本生成C#代码,生成后的代码目录如下威尼斯人线上娱乐 7

    3.11 新开一个VS2012(内存不够的赶快去买),建立一个叫JsProject的C#
.net 4.0 Web空工程。

打开目录会看到生成的服务定义文件

    3.12 去jquery官网下载jquery-1.9.1.js(mini版也行,随便)

威尼斯人线上娱乐 8

    3.13
把thrift编译的js文件data_types.js与UserStorage.js,thrift库的js库文件(thrift库目录\thrift-0.9.0\lib\js\thrift.js),以及刚下载的jq文件jquery-1.9.1.js,全部拖动到解决方案资源管理器的JsProject项目的根目录下:

其中定义了服务HelloService的五个方法,每个方法包含一个方法名,参数列表和返回类型。每个参数包括参数序号,参数类型以及参数名。Thrift
是对
IDL(Interface Definition Language)描述性语言的一种具体实现。因此,以上的服务描述文件使用
IDL语法编写.使用Thrift
工具编译
Hello.thrift,就会生成相应的
HelloService.cs文件。该文件包含了在
Hello.thrift 文件中描述的服务
HelloService 的接口定义,即HelloService.Iface
接口,以及服务调用的底层通信细节,包括客户端的调用逻辑HelloService.Client
以及服务器端的处理逻辑HelloService.Processor,用于构建客户端和服务器端的功能。

        data_types.js \ jquery-1.9.1.js \ thrift.js \ UserStorage.js
应该与Web.config在同一级。

2小试牛刀

    3.14 在根目录下创建一个Test.html文件,Test.html
应该与Web.config在同一级:

做好准备工作以后就可以开始感受thrift的魅力。打开VS新建一个空白解决方案命名为HelloThrift。在解决方案根目录下创建一个lib文件夹,将准备工作中生成的Thrift.dll文件放入lib文件夹中。在解决方案分中建立两个控制台程序和一个类库,控制台程序分别命名为HelloThrift.Client和HelloThrift.Server,类库命名为Thrift.Interface。Client、Server和Interface分别引用lib文件夹中的Thrift.dll文件,将准备工作中生成的HelloService文件导入到Interface类库中。Client和Server分别引用Interface。具体结果如下图所示。

            Test.html:

 

复制代码 代码如下:

威尼斯人线上娱乐 9

<!DOCTYPE html>
 <html xmlns=”http://www.w3.org/1999/xhtml"&gt;
 <head>
 <meta http-equiv=”Content-Type” content=”text/html;
charset=utf-8″/>
     <title></title>
     <script type=”text/javascript”
src=”jquery-1.9.1.js”></script>
     <script type=”text/javascript”
src=”data_types.js”></script>
     <script type=”text/javascript”
src=”thrift.js”></script>
     <script type=”text/javascript”
src=”UserStorage.js”></script>

威尼斯人线上娱乐 10

     <script>
         $(document).ready(function ()
         {
             var debugPosation = 0;
             try
             {
                 var transport = new
Thrift.Transport(“//www.jb51.net/”);
                 var protocol = new Thrift.Protocol(transport);
                 var client = new UserStorageClient(protocol);

威尼斯人线上娱乐 11

                 var result_GetString = client.GetString();
                 var result_Sum = client.Sum(255, 322);
             }
             catch (e)
             {
                 alert(“出错鸟:” + e.message);
             }
         });
     </script>
 </head>
 <body>
 </body>
 </html>

完成引用导入工作以后,在服务端创建一个类命名为MyHelloService,实现HelloService.Iface接口,代码如下:

    3.15 给Test.html的 “ var debugPosation = 0; ”
这一行,下断点,然后F5,就可以看到效果了。

清单2.MyHelloService

您可能感兴趣的文章:

 

using System;

using HelloThrift.Interface;

 

namespace HelloThrift.Server

{

public class MyHelloService :
HelloService.Iface

{

/// <summary>

///
只有一个参数返回值为字符串类型的方法

/// </summary>

/// <param name=”para”>string类型参数</param>

/// <returns>返回值为string类型</returns>

public string
HelloString(string para)

{

Console.WriteLine(“客户端调用了HelloString方法”);

return para;

}

 

/// <summary>

///
只有一个参数,返回值为int类型的方法

/// </summary>

/// <param
name=”para”></param>

/// <returns>返回值为int类型</returns>

public int HelloInt(int para)

{

Console.WriteLine(“客户端调用了HelloInt方法”);

return para;

}

 

/// <summary>

///
只有一个bool类型参数,返回值为bool类型的方法

/// </summary>

/// <param
name=”para”></param>

/// <returns>返回值为bool类型</returns>

public bool HelloBoolean(bool para)

{

Console.WriteLine(“客户端调用了HelloBoolean方法”);

return para;

}

 

/// <summary>

///
返回执行为空的方法

/// </summary>

public void HelloVoid()

{

Console.WriteLine(“客户端调用了HelloVoid方法”);

Console.WriteLine(“HelloWorld”);

}

网站地图xml地图