第一篇 《连接配置》

    第二篇 《连接池》

    第三篇 《标准通信》

    

第四篇 快速暴露接口

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

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

 1     public abstract class ThriftService2     {3         protected virtual string Excute<Q>(StandRequest<Q> request, Func<StandRequest<Q>, string> func)4         {5             if (request.IsValid())6             {7                 try8                 {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.Iface2     {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:IThriftFactoryMonitor2     {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

转载于:https://www.cnblogs.com/DKSL/p/Thrift_Utiliry4.html

Thrift搭建分布式微服务(四)相关推荐

  1. java springcloud版b2b2c社交电商spring cloud分布式微服务-docker-feign(四)

    简介 Spring Cloud大型企业分布式微服务云构建的B2B2C电子商务平台源码请加企鹅求求:一零三八七七四六二六.上一节,我们讨论了怎么通过,restTemlate调用cloud的生产者,实现起 ...

  2. java版电子商务spring cloud分布式微服务b2b2c社交电商 (十四)服务注册(consul)

    Springcloud b2b2c电子商务社交平台源码请加企鹅求求:一零三八七七四六二六.这篇文章主要介绍 spring cloud consul 组件,它是一个提供服务发现和配置的工具.consul ...

  3. java版电子商务spring cloud分布式微服务b2b2c社交电商(四)SpringBoot 整合JPA

    b2b2c电子商务社交平台源码请加企鹅求求:一零三八七七四六二六.JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对 ...

  4. 企业分布式微服务云SpringCloud SpringBoot mybatis (十一)docker部署spring cloud项目

    一.docker简介 Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机). ...

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

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

  6. springboot 插入返回id_Spring Boot实现分布式微服务开发实战系列(七)

    今天已经进入第七讲了,整个微服务架构的搭建工作也基本完成.那到目前为止究竟使用了那些技术及实现了什么功能呢?我们先回顾一下. 使用的技术:SpringBoot.Dubbo.Zookeeper.Redi ...

  7. (十)java版b2b2c社交电商spring cloud分布式微服务- SSO单点登录之OAuth2.0登录认证(1)...

    之前写了很多关于spring cloud的文章,今天我们对OAuth2.0的整合方式做一下笔记,首先我从网上找了一些关于OAuth2.0的一些基础知识点,帮助大家回顾一下知识点:Spring Clou ...

  8. spring cloud构建互联网分布式微服务云平台-消息总线

    Spring Cloud Bus除了支持RabbitMQ的自动化配置之外,还支持现在被广泛应用的Kafka.在本文中,我们将搭建一个Kafka的本地环境,并通过它来尝试使用Spring Cloud B ...

  9. 【我的新书】分布式微服务架构:原理与实战

    开心一笑 一次批小学语文卷,要求用"有--有--还有--"造句.一学生是这样写的:昨天去奶奶家,奶奶给我拿个鸡腿,我都吃完了问奶奶还有吗,奶奶答:"有,有,还有!&quo ...

最新文章

  1. 【唠叨两句】如何将一张树型结构的Excel表格中的数据导入到多张数据库表中...
  2. python求正方体体积_「高中数学」简单几何体的面积与体积相关知识点整理+例题...
  3. C++ Primer 5th笔记(chap 19 特殊工具与技术)typeid
  4. 第三章 系统指令与汇编程序设计 3.1 单片机指令系统
  5. “低代码”开发管理应用,这家大型连锁企业也说好
  6. Windows 10每天定时执行脚本
  7. 德州扑克里的专业术语你知道几个?
  8. HALCON示例程序measure_screw.hdev螺纹尺寸测量
  9. 【ZOJ - 3591】Nim(博弈问题,思维,STLmap)
  10. 01.神经网络和深度学习 W4.深层神经网络(作业:建立你的深度神经网络+图片猫预测)
  11. Word2Vec学习笔记(三)
  12. Java斗地主算法的设计与实现_斗地主算法的设计与实现–洗牌和发牌
  13. 3月15日 卡尔曼与多元传感器融合
  14. cron 在线表达式
  15. CenOS7 搭建无人值守安装服务器
  16. SpringBoot项目怎么重命名
  17. Java基础视频教程,带你系统全面入门Java
  18. 【软考数据库】第五章 计算机网络
  19. 2021年美国对中国货物出口情况:美对中的出口额达到1492亿美元,同比增长21.30% [图]
  20. linux的input命令,认识linux input子系统(一)

热门文章

  1. 数据分析数据挖掘(三)
  2. ln -s命令 linux_浅谈linux中ln命令,附带案例
  3. 判断用户 小程序_小程序对于用户的作用有哪些
  4. 360浏览器清除缓存_放飞浏览器的反应速度
  5. 的有效 海思编码_【最佳案例展示】2020年CUVA“超高清视频创新产品与解决方案”全球首款8K@120解码芯片海思Hi3796CV300...
  6. 无线网络(预处理+并查集)
  7. 区间合数的最小公倍数(质数+因数分解)
  8. Maven下载jar包失败的原因- 解决方法汇总
  9. 因果推断笔记——uplift建模、meta元学习、Class Transformation Method(八)
  10. R+大地图时代︱ leaflet/leafletCN 动态、交互式绘制地图(遍地代码图)