第一篇 《连接配置》

    第二篇 《连接池》

    第三篇 《标准通信》

    

第四篇 快速暴露接口

    之前的文章,我们介绍了如何使用连接池管理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. CSS元素类型

    前面有一篇文章讲到在css世界中,html元素的表现都是一个个盒子,而css中盒子的显示方式有三种方式,分别是块元素.行内元素和行内块元素.本文总结这三种显示方式的特征和区别. 1 写在前面 最近在整 ...

  2. 读书笔记——Windows核心编程(8)Interlocked系列函数

    先让我们来复习下小学知识 A+B=C//式中A为被加数,B为加数. A-B=C//式中A为被减数,B为减数. 再让我们来明确一个知识点:返回值为void的Windows函数意味着一定会执行成功. -- ...

  3. Javascript中replace()的一些用法总结

    关于定义 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串. 关于语法 stringObject.replace(regexp/substr,repla ...

  4. p2p投资理财入门篇(新手必备)

    在互联网金融浪潮下,如果你只知道余额宝.理财通,如果你认为宝宝们就可以代表整个互联网金融,那可真是大错特错.这些年来,P2P这股强大势力一直在互联网金融领域兴风作浪,随着被高层正名.监管升级,P2P的 ...

  5. LESSON THREE

    安装redis,并使用ruby进行简单测试.             使用redis客户端ruby测试 安装gem yum install rubygems  安装ruby所需的redis-rb程序库 ...

  6. Bellman-Ford算法解决单源最短路问题

    #include<stdio.h> #include<stdlib.h> #include<stdbool.h> #define max 100 #define I ...

  7. CentOS7.2安装总结

    第一次自己写文章,想想还有点小激动呢.折腾了大半天,终于在一个没用的台式机上面装了个mini版的CentOS7.2.写这篇文章也是做个记载,要是以后再装要注意了. 一.安装过程 采用U盘安装.最初是准 ...

  8. 第17章 内存映射文件(3)_稀疏文件(Sparse File)

    17.8 稀疏调拨的内存映射文件 17.8.1 稀疏文件简介 (1)稀疏文件(Sparse File):指的是文件中出现大量的0数据,这些数据对我们用处不大,但是却一样的占用空间.NTFS文件系统对此 ...

  9. Unity 物理引擎动力学关节

    Unity物理引擎中的各个动力学关节 Hinge Joint (铰链关节) Fixed Joint (固定关节) Spring Joint (弹簧关节) Character Joint(角色关节) C ...

  10. IDEA 滚动条跳动问题

    关掉有道词典的 “屏幕取词” 和 “划词翻译”