一、Thrift是什么?

关于Thrift的基本介绍,参看张善友的文章Thrift简介

二、为什么使用微服务?

在公司的高速发展过程中,随着业务的增长,子系统越来越多。各系统间又不同程度的在某些逻辑上出现重合的场景。为了高效率的开发,必然出现到重用这些逻辑的实现代码的情况,通常的做法是直接引用相关的DLL。各子系统分别是不同的团队完成开发,直接引用DLL可能导致潜在的命名空间重复问题,以及因为方法的使用场景不明确给方法调用造成混乱等问题。另一种解决方案,就是部署统一的接口,对底层数据库的访问以及一些共同的逻辑进行统一封装。这种解决方案的实现要么考虑SOA,要么微服务。考虑到成本,微服务要更方便实施一些。

三、设计思路

Thrift采用Socket进行通信,使用Thrift搭建微服务,那它应该能够与多个IP或者端口建立TCP连接。怎样对这些连接进行统一的管理,并且能够方便的使用这些连接?使用XML配置连接,使用连接池管理TCP Socket连接。

Thrift天然支持的数据结构对于.net可能太够用,对于复杂的数据结构,怎样使用它们通信?考虑所有的通信传输数据都使用Json字符串。

服务端发生异常如何通知客户端?

身份验证问题。

如何监控连接池运行状态?

第一篇 连接配置

Thrift要建立TCP Socket的连接,首先要有IP地址和端口。因为用使用连接池来管理连接,就必须设置它的最大激活连接数、最大空闲连接数、最小空闲连接数。当激活的连接数达到了最大连接数,会使获取Socket连接的请求处于等待状态,这时需要设置一个最大等待时间,当等待超时,应有相应的动作,是去记日志还是通知连接池管理者修改连接池配置,这由开发者自己去实现。

     [Serializable]
public class ServiceConfig
{
[XmlAttribute]
public string Name { get; set; } [XmlAttribute]
public string IP { get; set; } [XmlAttribute]
public int Port { get; set; } [XmlAttribute]
public int MaxActive { get; set; } [XmlAttribute]
public int MaxIdle { get; set; } [XmlAttribute]
public int MinIdle { get; set; } /// <summary>
/// 连接池等待连接时间
/// 单位毫秒
/// 超时记日志还是通知谁更改连接池配置
/// </summary>
[XmlElement, DefaultValue()]
public int WaitingTimeout { get; set; }
}

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

     [Serializable]
public class ThriftConfig
{
/// <summary>
/// 监视器类型
/// 用于监视连接池运行状态
/// 继承自ITriftFactoryMonitor类
/// </summary>
[XmlElement]
public string MonitorType { get; set; } [XmlArrayItem("Service")]
public List<ServiceConfig> ServiceArray { get; set; }
}

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

         public static List<ServiceConfig> GetServiceConfigs()
{
List<ServiceConfig> services = new List<ServiceConfig>(ThriftConfig.ServiceArray.Count);
foreach(var sc in ThriftConfig.ServiceArray)
{
if (!services.Exists(service => service.Name.ToUpper() == sc.Name.ToUpper()))
{
//IP验证
if (IsIPV4Address(sc.IP))
{
services.Add(sc);
}
else
{
throw new ThriftException(string.Format("The Service Config Named \"{0}\",Which's IP({1}) Is Not Valid!", sc.Name, sc.IP));
}
}
else
{
throw new ThriftException(string.Format("There Is A Service Config Named \"{0}\",Please Check Service Config File!", sc.Name));
}
}
if (services.Count==)
{
throw new ThriftException("There Is No Specific Service!");
}
return services;
} private static ThriftConfig LoadThriftConfig()
{
string path = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, ThriftConfigFilePath);
if (File.Exists(path))
{
return SerializeHelper.LoadFromXml<ThriftConfig>(path);
}
throw new ThriftException(string.Format("Not Found Thrift Config File \"{0}\"", path));
}

准备工作做好了,下一篇,将讲解如何使用这些配置来建立连接池。

Thrift微服务代码下载Thrift.Utility

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

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

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

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

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

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

      第一篇 <连接配置> 第二篇 <连接池> 第三篇 <标准通信> 第四篇 快速暴露接口 之前的文章,我们介绍了如何使用连接池管理Thrift节点,以及使用Thri ...

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

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

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

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

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

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

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

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

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

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

  9. Train-Alypay-Cloud:分布式微服务中间件sofa 开发培训(第二次)

    ylbtech-Train-Alypay-Cloud:分布式微服务中间件sofa 开发培训(第二次) 1.返回顶部 1. 这是本次培训的内容,望各位提前配好环境.工具.2.6-2.7 我们在环球金融8 ...

随机推荐

  1. 处理 InterruptedException——Brian Goetz

    本文转自Brian Goetz大师在IBM的developerWorks中发布的文章: 中文地址:http://www.ibm.com/developerworks/cn/java/j-jtp0523 ...

  2. Android 开发之 Android 开发的起步

    前言  Android 开发的起步 我们可以先来看看百科上面怎么说? 百度百科上 Android的介绍 一.Windows环境下在线搭建Android环境. 1. 下载 Android开发工具. JD ...

  3. poj 2942 Knights of the Round Table 圆桌骑士(双连通分量模板题)

    Knights of the Round Table Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 9169   Accep ...

  4. history介绍及bash命令快速调用

    在日常工作中,能够快速并准确的使用命令是必不可少的,下面为大家介绍一下其中的小技巧. 一.查找命令历史——history 使用history能够快速的找到之前输入过的命令. # history 大家可 ...

  5. Linux root 密码重置与用户管理

    ---forget root password restart your linux system press 'e' when start. press 'e' again then choose ...

  6. web工程 所需是jar包总结

    commons-beanutils-1.8.3.jar : BeanUtils主要提供了对于JavaBean进行各种操作,需要Commons -Collections包和Commons -loggin ...

  7. Network client/server

    <Beginning Linux Programming_4th>  chapter 15 Sockets 1  A simple local client/server 1)  clie ...

  8. python中str()和repr()的区别

    >>> s = 'Hello, world.' >>> str(s) 'Hello, world.' >>> repr(s) "'Hel ...

  9. Codeforces Round 261 Div.2 D Pashmak and Parmida's problem --树状数组

    题意:给出数组A,定义f(l,r,x)为A[]的下标l到r之间,等于x的元素数.i和j符合f(1,i,a[i])>f(j,n,a[j]),求有多少对这样的(i,j). 解法:分别从左到右,由右到 ...

  10. Properties集合的练习

    1.更改文件中的数据,特定键的值: 需求:我有一个文本文件(user.txt),我知道数据是键值对形式的,但是不知道内容是什么. 请写一个程序判断是否有"lisi"这样的键存在,如 ...