第一篇 《连接配置》

    第二篇 《连接池》

    第三篇 《标准通信》

    

第四篇 快速暴露接口

    之前的文章,我们介绍了如何使用连接池管理Thrift节点,以及使用Thrift搭建微服务用到的标准输入输出。这一篇,我将介绍如何快速暴露服务接口,并对服务端进行错误处理。

    从代码图上看,开发者在使用Thrift.Utility搭建微服务时,两个类围绕着标准输入输出,是最常用的两个类,ThriftClient上一篇已经讲过,用于客户端,与服务端建立连接,并访问服务端接口,返回值。ThriftService用于服务端,用来暴露服务接口,我们看一下ThriftService.cs:    

 1     public abstract class ThriftService
2 {
3 protected virtual string Excute<Q>(StandRequest<Q> request, Func<StandRequest<Q>, string> func)
4 {
5 if (request.IsValid())
6 {
7 try
8 {
9 string result = string.Empty;
10 if (func != null)
11 {
12 result = func(request);
13 }
14 StandResponse<string> response = new StandResponse<string>
15 {
16 Code = "0",
17 Desc = "SUCCESS",
18 Data = result
19 };
20 return SerializeHelper.JsonSerialize2(response);
21 }
22 catch (Exception ex)
23 {
24 CatchException(ex);
25 StandResponse<string> response = new StandResponse<string>
26 {
27 Code = "-2",
28 Desc = "服务端异常",
29 Data = string.Empty
30 };
31 return SerializeHelper.JsonSerialize2(response);
32 }
33 }
34 StandResponse<string> res = new StandResponse<string>
35 {
36 Code = "-1",
37 Desc = "请求数据异常",
38 Data = string.Empty
39 };
40 return SerializeHelper.JsonSerialize2(res);
41 }
42
43 /// <summary>
44 /// 异常处理
45 /// </summary>
46 /// <param name="ex"></param>
47 protected abstract void CatchException(Exception ex);
48 }

这个类做了两件事,第一件事就是提供了供服务端暴露接口时使用的方法Excute(StandRequest<Q> request, Func<StandRequest<Q>, string> func),只需将得到的请求参数反序列化成StandRequest<Q>,传入Excute,Excute将返回序列化好的响应。第二件事就是,在Excute里提供了错误处理机制,避免开发者进行重复的劳动,开发者只需要重写CatchException方法。

    先看一下传统的调用一个本地的方法是怎么做的:

1 List<BrandInfo> brans = ProductService.GetBrandByVendorSysNo(32);

再看看用Thrift.Utility如何调用远端的服务:

1 using (var tc = new ThriftClient<ProductService.Client>("ProductService"))
2 {
3 List<BrandInfo> brands = tc.Invoke<int, List<BrandInfo>>("GetBrandByVendorSysNo", 32);
4 }

很简洁吧,如何做到的呢?

 1     public class ProductServiceImpl :ThriftService, ProductService.Iface
2 {
3 public string GetBrandByVendorSysNo(string request)
4 {
5 var req = SerializationUtility.JsonDeserialize2<StandRequest<int>>(request);
6 return Excute(req, (arg) =>
7 {
8 //调用Service,这是没有使用Thrift之前的方法,通过string GetBrandByVendorSysNo(string request)将其暴露给客户端调用,就这4、5行代码就可以暴露一个服务接口。
9 List<BrandInfo> brans = ProductService.GetBrandByVendorSysNo(req.Data);
10 return SerializationUtility.JsonSerialize2(brans);
11 });
12 }
14
15 protected override void CatchException(Exception ex) //开发者自己实现服务端错误处理
16 {
17 if (ex is BusinessException)
18 {
19
20 }
21 else
22 {
23
24 }
25 }
26 }

使用本框架,暴露服务端接口就是这么简单。再看看客户端的配置:

1 <?xml version="1.0" encoding="utf-8" ?>
2 <ThriftConfig>
3 <MonitorType>Demo.RPCClient.ConnectionPoolMonitor,Demo.RPCClient</MonitorType>
4 <ServiceArray>
5 <Service Name="ProductService" IP="127.0.0.1" Port="7911" MaxActive="100" MaxIdle="20" MinIdle="10" WaitingTimeout="1000"/>
6 <Service Name="SOService" IP="127.0.0.1" Port="7912" MaxActive="100" MaxIdle="20" MinIdle="10" WaitingTimeout="1000"/>
7 </ServiceArray>
8 </ThriftConfig>

客户端自定义模拟器示例:

 1     public class ConnectionPoolMonitor:IThriftFactoryMonitor
2 {
3 public void Monitor(List<Tuple<string, int, int>> tuples)
4 {
5 foreach (var t in tuples)
6 {
7 Console.WriteLine(string.Format("自定义{0}连接池,空闲连接数量:{1},激活连接数量:{2}", t.Item1, t.Item2, t.Item3));
8 }
9 }
10
11 public void TimeoutNotify(string serviceName, int timeOut)
12 {
13 Console.WriteLine(string.Format("自定义{0}连接池等待连接超时{1}", serviceName, timeOut));
14 }
15 }

    Demo的代码没有提供给大家,感兴趣的可以照着示例自己写一个。

    到此整个系列就完结了,之所以写这个系列的文章,是希望和园友们进行交流讨论,如果代码中有什么缺点或没考虑到的地方,还希望园友们能提出来,加以改善,让这个框架更完美。

Thrift微服务代码下载Thrift.Utility

Thrift搭建分布式微服务(四)的更多相关文章

  1. Thrift搭建分布式微服务1

    Thrift搭建分布式微服务 一.Thrift是什么? 关于Thrift的基本介绍,参看张善友的文章Thrift简介. 二.为什么使用微服务? 在公司的高速发展过程中,随着业务的增长,子系统越来越多. ...

  2. Thrift搭建分布式微服务(二)

    第二篇 连接池  连接池配置,请前往Thrift搭建分布式微服务(一)  下面要介绍的其实不是单一的连接池,应该说是连接池集合.因为它要管理多个Tcp Socket连接节点,每个服务节点都有设置了自己 ...

  3. Thrift搭建分布式微服务(一)

    一.Thrift是什么? 关于Thrift的基本介绍,参看张善友的文章Thrift简介. 二.为什么使用微服务? 在公司的高速发展过程中,随着业务的增长,子系统越来越多.各系统间又不同程度的在某些逻辑 ...

  4. Thrift搭建分布式微服务(三)

    第一篇 <连接配置> 第二篇 <连接池> 第三篇 标准通信 一.TCP的连接是无状态的,怎样知道我的请求被服务端接受并且正确执行了呢? 我的解决方案是使用自己定义的标准输入输出 ...

  5. Kite: 一个分布式微服务框架(翻译)

    原文链接:https://blog.gopheracademy.com/birthday-bash-2014/kite-microservice-library/ 此为中文翻译 用GO语言来编写web ...

  6. 基于docker 如何部署surging分布式微服务引擎

    1.前言 转眼间surging 开源已经有1年了,经过1年的打磨,surging已从最初在window 部署的分布式微服务框架,到现在的可以在docker部署利用rancher 进行服务编排的分布式微 ...

  7. Dapeng框架-开源高性能分布式微服务框架

    我们公司性质是新零售,公司也有专门的框架组.这群大牛自己开发了一整套分布式微服务框架.我们也在使用这套框架,有很多心得体会. 该框架既Dapeng也!开源github地址:https://github ...

  8. docker部署PiggyMetrics分布式微服务

    在上一篇文章里http://www.cnblogs.com/lyhero11/p/8686058.html, 讲解了如何在windows10下安装docker社区版. 那如何利用docker落地一个分 ...

  9. .Net Core 分布式微服务框架 - Jimu 添加 Swagger 支持

    系列文章 .Net Core 分布式微服务框架介绍 - Jimu .Net Core 分布式微服务框架 - Jimu 添加 Swagger 支持 一.前言 最近有空就优化 Jimu (一个基于.Net ...

随机推荐

  1. 本人常用的Linux bash快捷键(持续更新)

    按使用频率由高到低排列: Ctrl + a :移到命令行首Ctrl + e :移到命令行尾 Ctrl + u :从光标处删除至命令行首Ctrl + k :从光标处删除至命令行尾 Ctrl + d :删 ...

  2. Windows下MongoDB安装与设置

    最近在研究传奇已久的MongoDB,遇到很多问题,将整理好的Windows下的MongoDB整体到连接过程分享给大家,也留给自己. 第一步:下载http://www.mongodb.org/downl ...

  3. jQuery form插件的使用--处理server返回的JSON, XML,HTML数据

    详细代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> & ...

  4. Linux学习之一——开机必备知识

    linux最重要的特色是指令交互,利用一个个指令来进行各种操作.当然可以用X Window获得友好的linux窗口,但是还是有很多局限性. linux用户登录后默认进入 /root目录下. 比较重要的 ...

  5. docker基础命令详解

    Commands: attach    Attach to a running container build     Build an image from a Dockerfile commit  ...

  6. selenium如何跳转到iframe

    处理iframe,selenium提供了3中方法: 1.html的frame有id,传入id 2.html的frame有name,传入name 3.先找到iframe的元素,再传入该元素对象 跳出if ...

  7. ZOJ 3829 Known Notation --贪心+找规律

    题意:给出一个字符串,有两种操作: 1.插入一个数字  2.交换两个字符   问最少多少步可以把该字符串变为一个后缀表达式(操作符只有*). 解法:仔细观察,发现如果数字够的话根本不用插入,数字够的最 ...

  8. 2014 Super Training #6 H Edward's Cola Plan --排序+二分

    原题: ZOJ 3676  http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3676 题意:给每个朋友一瓶可乐,可乐有普通和高 ...

  9. Jenkins学习八:Jenkins语言本地化

    在Jenkins中,英语一大片,不懂英语的看着头疼.非常高兴的是,Jenkins作为一个主流流行的持续构建工具,提供了一个本地化语言的配置界面. 你可以找到它,在Jenkins每页的左下角.如下图: ...

  10. Java AtomicInteger

    AtomicInteger,一个提供原子操作的Integer的类.在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字.而AtomicIn ...