Thrift搭建分布式微服务(四)
第一篇 《连接配置》
第二篇 《连接池》
第三篇 《标准通信》
第四篇 快速暴露接口
之前的文章,我们介绍了如何使用连接池管理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搭建分布式微服务(四)的更多相关文章
- Thrift搭建分布式微服务1
Thrift搭建分布式微服务 一.Thrift是什么? 关于Thrift的基本介绍,参看张善友的文章Thrift简介. 二.为什么使用微服务? 在公司的高速发展过程中,随着业务的增长,子系统越来越多. ...
- Thrift搭建分布式微服务(二)
第二篇 连接池 连接池配置,请前往Thrift搭建分布式微服务(一) 下面要介绍的其实不是单一的连接池,应该说是连接池集合.因为它要管理多个Tcp Socket连接节点,每个服务节点都有设置了自己 ...
- Thrift搭建分布式微服务(一)
一.Thrift是什么? 关于Thrift的基本介绍,参看张善友的文章Thrift简介. 二.为什么使用微服务? 在公司的高速发展过程中,随着业务的增长,子系统越来越多.各系统间又不同程度的在某些逻辑 ...
- Thrift搭建分布式微服务(三)
第一篇 <连接配置> 第二篇 <连接池> 第三篇 标准通信 一.TCP的连接是无状态的,怎样知道我的请求被服务端接受并且正确执行了呢? 我的解决方案是使用自己定义的标准输入输出 ...
- Kite: 一个分布式微服务框架(翻译)
原文链接:https://blog.gopheracademy.com/birthday-bash-2014/kite-microservice-library/ 此为中文翻译 用GO语言来编写web ...
- 基于docker 如何部署surging分布式微服务引擎
1.前言 转眼间surging 开源已经有1年了,经过1年的打磨,surging已从最初在window 部署的分布式微服务框架,到现在的可以在docker部署利用rancher 进行服务编排的分布式微 ...
- Dapeng框架-开源高性能分布式微服务框架
我们公司性质是新零售,公司也有专门的框架组.这群大牛自己开发了一整套分布式微服务框架.我们也在使用这套框架,有很多心得体会. 该框架既Dapeng也!开源github地址:https://github ...
- docker部署PiggyMetrics分布式微服务
在上一篇文章里http://www.cnblogs.com/lyhero11/p/8686058.html, 讲解了如何在windows10下安装docker社区版. 那如何利用docker落地一个分 ...
- .Net Core 分布式微服务框架 - Jimu 添加 Swagger 支持
系列文章 .Net Core 分布式微服务框架介绍 - Jimu .Net Core 分布式微服务框架 - Jimu 添加 Swagger 支持 一.前言 最近有空就优化 Jimu (一个基于.Net ...
随机推荐
- thumbnailator图片处理
一.简介 thumbnailator是一个用来对图片对象进行操作的Java类库.通过它我们可以很方面的使用代码的方式,对图片进行一些操作.如缩放,裁减,旋转,水印等.thumbnailator项目主页 ...
- 最近学习linux常用命令。
一.文件系统的管理tips:输入命令的时候要常用tab键来补全 ls 查看目录信息 ( ls / ) ls -l 等价于 llpwd 查看当前所处的路径 cd 切换目录 (cd /) ,如果不带参数则 ...
- 虚拟机Linux----Ubuntu1204----退格键方向键无法使用
修改 /etc/vim/vimrc.tiny,如下: set compatible #修改为 set nocompatible #控制方向键set backspace=2 #控制退格键
- D_S 线性结构
线性结构的定义:若结构是非空有限集,则有且仅有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前驱和一个直接后继. 线性结构的特点: 只有一个首结点和尾结点 除首尾结点外,其他结点只有一个直 ...
- 点击页面div弹窗以外隐藏的两种思路
在本文为大家介绍两种思路实现点击页面其它地方隐藏该div,第一种是对document的click事件绑定事件处理程序.. 第一种思路分两步 第一步:对document的click事件绑定事件处理程序, ...
- Linux下Mysql安装
1.下载安装包 首先查看Linux版本: [root@localhost ~]# lsb_release -a LSB Version: :core-4.0-amd64:core-4.0-noarch ...
- oracle 11g dataguard创建的简单方法
oracle 10g可以通过基于备份的rman DUPLICATE实现dataguard,通过步骤需要对数据库进行备份,并在standby侧进行数据库的恢复.而到了11g,oracle推出了Dupli ...
- TEZ安装试用
下载地址:http://pan.baidu.com/s/1ZNpyI 第一次使用maven编译 tez的时候到tez ui部分报错,google后发现有人遇到类似问题是因为maven版本的问题, 当时 ...
- shell script 学习笔记-----if,for,while,case语句
1.if内的判断条件为逻辑运算: 2.if内的判断条件为目录是否存在,文件是否存在,下图先检验目录/home/monster是否存在,然后再检测/home/monster中的file.txt文件是否存 ...
- 我是如何来做网站优化(Seo)的?(二)
在上一篇文章<我是如何来做网站优化(Seo)的?(一)>讲述了网站优化几个注意项目. 在我们日常网站维护中,难免会使用到各种工具,文章的第二节我们就来讲讲这些工具. 网站提交通道 百度站长 ...