一、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. mac下 home-brew安装及php,nginx环境安装及配置

    Homebrew官网 http://brew.sh/index_zh-cn.html Homebrew是神马 linux系统有个让人蛋疼的通病,软件包依赖,好在当前主流的两大发行版本都自带了解决方案, ...

  2. nagios 自定义插件demo

    #!/bin/bash loadavg=$( uptime | awk -F: '{print $4}' | xargs ) load1int=$( ) load5int=$( ) load15int ...

  3. 关于 SSIS 并行foreach loop的一个设计思路

    SSIS 包在控制流方面的性能优化,主要是提高并行度. 可以设置并发线程数MaxConcurrentExecuteables. SSIS中的foreach loop container 不是并行执行任 ...

  4. Ubuntu 安装libusb

    执行以下指令 sudo apt-get install libusb-dev sudo apt-get install libusb-1.0-0-dev

  5. js对Date对象的操作的问题(生成一个倒数7天的数组)

    今天在论坛上看到这样一个问题如下: 问题描述: 使用JavaScript生成一个倒数7天的数组.比如今天是10月1号,生成的数组是["9月25号","9月26号" ...

  6. UVA 12723 Dudu, the Possum --数学期望

    题意不说了,概率和期望值要分开处理. 方法1:可以先算出到达每层的概率,然后再乘以每层的期望,每层的期望是固定的. 方法二:也可以从后往前直接推期望.为什么从后往前呢?因为第i层的时候,它可以跳到的层 ...

  7. 栈和队列的面试题Java实现【重要】

    栈和队列: 面试的时候,栈和队列经常会成对出现来考察.本文包含栈和队列的如下考试内容: (1)栈的创建 (2)队列的创建 (3)两个栈实现一个队列 (4)两个队列实现一个栈 (5)设计含最小函数min ...

  8. Windows系统安装Oracle 11g客户端

    一.下载 http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html以下网址来源此官方下载页网 ...

  9. HTML5和css3的总结

    简单的罗列一个HTML5的新东西,以后的几天里详细的过一遍一个挺有用的网站:www.css88.com [H5的新标签] 用之前的标签完全可以代替的:header footer aside atric ...

  10. 【转】【WPF】TemplateBinding和Binding的区别

    定义 TemplateBinding是为了某个特定场景优化出来的数据绑定版本--需要把ControlTemplate里面的某个Property绑定到应用该ControlTemplate的控件的对应Pr ...