Thrift搭建分布式微服务1
一、Thrift是什么?
关于Thrift的基本介绍,参看张善友的文章Thrift简介。
二、为什么使用微服务?
在公司的高速发展过程中,随着业务的增长,子系统越来越多。各系统间又不同程度的在某些逻辑上出现重合的场景。为了高效率的开发,必然出现到重用这些逻辑的实现代码的情况,通常的做法是直接引用相关的DLL。各子系统分别是不同的团队完成开发,直接引用DLL可能导致潜在的命名空间重复问题,以及因为方法的使用场景不明确给方法调用造成混乱等问题。另一种解决方案,就是部署统一的接口,对底层数据库的访问以及一些共同的逻辑进行统一封装。这种解决方案的实现要么考虑SOA,要么微服务。考虑到成本,微服务要更方便实施一些。
三、设计思路
Thrift采用Socket进行通信,使用Thrift搭建微服务,那它应该能够与多个IP或者端口建立TCP连接。怎样对这些连接进行统一的管理,并且能够方便的使用这些连接?使用XML配置连接,使用连接池管理TCP Socket连接。
Thrift天然支持的数据结构对于.net可能太够用,对于复杂的数据结构,怎样使用它们通信?考虑所有的通信传输数据都使用Json字符串。
服务端发生异常如何通知客户端?
身份验证问题。
如何监控连接池运行状态?
第一篇 连接配置
Thrift要建立TCP Socket的连接,首先要有IP地址和端口。因为用使用连接池来管理连接,就必须设置它的最大激活连接数、最大空闲连接数、最小空闲连接数。当激活的连接数达到了最大连接数,会使获取Socket连接的请求处于等待状态,这时需要设置一个最大等待时间,当等待超时,应有相应的动作,是去记日志还是通知连接池管理者修改连接池配置,这由开发者自己去实现。

1 [Serializable]
2 public class ServiceConfig
3 {
4 [XmlAttribute]
5 public string Name { get; set; }
6
7 [XmlAttribute]
8 public string IP { get; set; }
9
10 [XmlAttribute]
11 public int Port { get; set; }
12
13 [XmlAttribute]
14 public int MaxActive { get; set; }
15
16 [XmlAttribute]
17 public int MaxIdle { get; set; }
18
19 [XmlAttribute]
20 public int MinIdle { get; set; }
21
22 /// <summary>
23 /// 连接池等待连接时间
24 /// 单位毫秒
25 /// 超时记日志还是通知谁更改连接池配置
26 /// </summary>
27 [XmlElement, DefaultValue(1000)]
28 public int WaitingTimeout { get; set; }
29 }

很显然,一个节点的服务不能叫做微服务,所以要对这些连接节点进行管理还需要一个配置:

1 [Serializable]
2 public class ThriftConfig
3 {
4 /// <summary>
5 /// 监视器类型
6 /// 用于监视连接池运行状态
7 /// 继承自ITriftFactoryMonitor类
8 /// </summary>
9 [XmlElement]
10 public string MonitorType { get; set; }
11
12 [XmlArrayItem("Service")]
13 public List<ServiceConfig> ServiceArray { get; set; }
14 }

如何读取这些配置,使这些配置为连接池所用?

1 public static List<ServiceConfig> GetServiceConfigs()
2 {
3 List<ServiceConfig> services = new List<ServiceConfig>(ThriftConfig.ServiceArray.Count);
4 foreach(var sc in ThriftConfig.ServiceArray)
5 {
6 if (!services.Exists(service => service.Name.ToUpper() == sc.Name.ToUpper()))
7 {
8 //IP验证
9 if (IsIPV4Address(sc.IP))
10 {
11 services.Add(sc);
12 }
13 else
14 {
15 throw new ThriftException(string.Format("The Service Config Named \"{0}\",Which's IP({1}) Is Not Valid!", sc.Name, sc.IP));
16 }
17 }
18 else
19 {
20 throw new ThriftException(string.Format("There Is A Service Config Named \"{0}\",Please Check Service Config File!", sc.Name));
21 }
22 }
23 if (services.Count==0)
24 {
25 throw new ThriftException("There Is No Specific Service!");
26 }
27 return services;
28 }
29
30 private static ThriftConfig LoadThriftConfig()
31 {
32 string path = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, ThriftConfigFilePath);
33 if (File.Exists(path))
34 {
35 return SerializeHelper.LoadFromXml<ThriftConfig>(path);
36 }
37 throw new ThriftException(string.Format("Not Found Thrift Config File \"{0}\"", path));
38 }

准备工作做好了,下一篇,将讲解如何使用这些配置来建立连接池。
Thrift微服务代码下载Thrift.Utility
Thrift搭建分布式微服务1的更多相关文章
- Thrift搭建分布式微服务(二)
第二篇 连接池 连接池配置,请前往Thrift搭建分布式微服务(一) 下面要介绍的其实不是单一的连接池,应该说是连接池集合.因为它要管理多个Tcp Socket连接节点,每个服务节点都有设置了自己 ...
- Thrift搭建分布式微服务(四)
第一篇 <连接配置> 第二篇 <连接池> 第三篇 <标准通信> 第四篇 快速暴露接口 之前的文章,我们介绍了如何使用连接池管理Thrift节点,以及使用Thri ...
- Thrift搭建分布式微服务(一)
一.Thrift是什么? 关于Thrift的基本介绍,参看张善友的文章Thrift简介. 二.为什么使用微服务? 在公司的高速发展过程中,随着业务的增长,子系统越来越多.各系统间又不同程度的在某些逻辑 ...
- Thrift搭建分布式微服务(三)
第一篇 <连接配置> 第二篇 <连接池> 第三篇 标准通信 一.TCP的连接是无状态的,怎样知道我的请求被服务端接受并且正确执行了呢? 我的解决方案是使用自己定义的标准输入输出 ...
- Kite: 一个分布式微服务框架(翻译)
原文链接:https://blog.gopheracademy.com/birthday-bash-2014/kite-microservice-library/ 此为中文翻译 用GO语言来编写web ...
- Dapeng框架-开源高性能分布式微服务框架
我们公司性质是新零售,公司也有专门的框架组.这群大牛自己开发了一整套分布式微服务框架.我们也在使用这套框架,有很多心得体会. 该框架既Dapeng也!开源github地址:https://github ...
- 基于docker 如何部署surging分布式微服务引擎
1.前言 转眼间surging 开源已经有1年了,经过1年的打磨,surging已从最初在window 部署的分布式微服务框架,到现在的可以在docker部署利用rancher 进行服务编排的分布式微 ...
- docker部署PiggyMetrics分布式微服务
在上一篇文章里http://www.cnblogs.com/lyhero11/p/8686058.html, 讲解了如何在windows10下安装docker社区版. 那如何利用docker落地一个分 ...
- Train-Alypay-Cloud:分布式微服务中间件sofa 开发培训(第二次)
ylbtech-Train-Alypay-Cloud:分布式微服务中间件sofa 开发培训(第二次) 1.返回顶部 1. 这是本次培训的内容,望各位提前配好环境.工具.2.6-2.7 我们在环球金融8 ...
随机推荐
- LoadRunner监控数据库服务器
使用LoadRunner的数据库服务器资源监控器,可以在场景或会话步骤运行期间监控DB2.Oracle.SQL Server或Sybase数据库的资源使用率.在场景或会话步骤运行期间,使用这些监控器可 ...
- JS Call()与Apply()
JS Call()与Apply() ECMAScript规范给所有函数都定义了Call()与apply()两个方法,call与apply的第一个参数都是需要调用的函数对象,在函数体内这个参数就是thi ...
- linux 下启动jar小程序
下面是我的三个可运行jar程序 1.启动 采集话单文件应用程序 nohup java -jar gather.jar > logs/gather/console.out & 2.启动 ...
- 解决ORA-28000: the account is locked
原文地址:http://yanwushu.sinaapp.com/ora-28000-the-account-is-locked/ 在oracle中.连续十次尝试登陆不成功.那么此账户将会被锁定(lo ...
- Swift - 做一个简单的无线U盘(手机端Http服务器搭建)
由于iOS系统的封闭性,在数据传输方面十分不方便.不像安卓设备,直接连接电脑就能当U盘使用.所以一般我们如果用iPhone临时存取个东西,要么使用数据线连接iTunes,要么手机电脑都登上QQ,使用Q ...
- Sencha Touch 2 在MAC下详细的开发流程
在不久的将来我相信Web App会流行的非常广, 能看到未来才能主宰未来.对于我们开发人员来说我觉得想成就一件伟大的事情,需要过硬的技术和好的想法,再加上决不放弃的精神,一定可以成功的. 以下在Mac ...
- ANT编译Android Eclipse工程
将Android SDK的tools/和platform-tools/目录包含在可执行文件的搜索路径中.Windows下,将其添加到PATH环境变量中 切换到Android Eclipse项目目录下, ...
- 2015 Multi-University Training Contest 1
最近真是太废柴了,题没做几道,也没学什么新知识,多校做了三场也没总结~诶!好好学吧! 多校第一场感觉被完虐...orz... Hdu 5288 OO’s Sequence 题目链接:http://ac ...
- JavaScript快速入门(三)——JavaScript语句
JavaScript基本语句 基本概述 JavaScript是脚本语言,从上到下解释执行,最小单位为语句或语句块,每个语句以分号结尾,每个语句块以右大括号结尾. JavaScript可以将多条语句或语 ...
- 使用 Nginx 创建服务器的负载均衡
译序 Nginx 的负载均衡配置看上去很简单.以下是 Nginx 官方给的一个简单的负载均衡的例子: http { upstream myproject { server ...