Thrift搭建分布式微服务(一)

一、Thrift是什么?

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

二、为什么使用微服务?

在公司的高速发展过程中,随着业务的增长,子系统越来越多。各系统间又不同程度的在某些逻辑上出现重合的场景。为了高效率的开发,必然出现到重用这些逻辑的实现代码的情况,通常的做法是直接引用相关的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

时间: 2024-10-14 06:30:04

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

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

第一篇 <连接配置> 第二篇 <连接池> 第三篇 标准通信 一.TCP的连接是无状态的,怎样知道我的请求被服务端接受并且正确执行了呢? 我的解决方案是使用自己定义的标准输入输出,Push操作和Delete操作都要返回Json的字符串,也就是说,每一个Thrift接口方法的输入参数和返回参数都是Json字符串.标准返回,Code表示状态码,Desc表示对执行结果的描述,如果Code表示服务端出错,Desc为错误信息. 1 public class StandResponse<T

Spring Cloud分布式微服务云架构构建

大型企业分布式微服务云架构服务组件 实现模块化.微服务化.原子化.灰度发布.持续集成 commonservice eurekaNetflix 云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移. commonservice configSpring 配置管理工具包,让你可以把配置放到远程服务器,集中化管理集群配置,目前支持本地存储.Git以及Subversion. Spring Cloud BusSpring 事件.消息总线,用于在集群(例如,配置变化事件

Spring cloud--Hong hu Cloud分布式微服务云系统—Config

介绍 Spring Cloud Config 为分布式系统中的外部配置提供服务器和客户端支持.使用 Config Server,您可以在所有环境中管理应用程序的外部属性.客户端和服务器上的概念映射与Spring Environment和PropertySource抽象相同, 因此它们与 Spring 应用程序非常契合,但可以与任何以任何语言运行的应用程序一起使用.随着应用程序通过从开发人员到测试和生产的部署流程,您可以管理这些环境之间的配置,并确定应用程序具有迁移时需要运行的一切.服务器存储后端

docker部署PiggyMetrics分布式微服务

在上一篇文章里http://www.cnblogs.com/lyhero11/p/8686058.html, 讲解了如何在windows10下安装docker社区版. 那如何利用docker落地一个分布式微服务架构的系统呢? github上有一个不错的开源项目PiggyMetrics,通过这个可以学习用docker和spring cloud做分布式微服务架构. 原项目地址:https://github.com/sqshq/PiggyMetrics 国内有个网友把里边应用的mongodb数据库示例

Spring cloud--鸿鹄Cloud分布式微服务云系统—Config

介绍 Spring Cloud Config 为分布式系统中的外部配置提供服务器和客户端支持.使用 Config Server,您可以在所有环境中管理应用程序的外部属性.客户端和服务器上的概念映射与Spring Environment和PropertySource抽象相同, 因此它们与 Spring 应用程序非常契合,但可以与任何以任何语言运行的应用程序一起使用.随着应用程序通过从开发人员到测试和生产的部署流程,您可以管理这些环境之间的配置,并确定应用程序具有迁移时需要运行的一切.服务器存储后端

整合spring cloud云服务架构 - 企业分布式微服务云架构构建

今天正式给大家介绍了Spring Cloud - 企业分布式微服务云架构构建,我这边结合了当前大部分企业的通用需求,包括技术的选型比较严格.苛刻,不仅要用业界最流行的技术,还要和国际接轨,在未来的5~10年内不能out.作为公司的架构师,也要有一种放眼世界的眼光,不仅要给公司做好的技术选型,而且还要快速响应企业的业务需求,能够为企业快速定制化业务. 以下是我为公司规划的大型互联网分布式企业微服务云架构: 从现在开始,我这边会将近期研发的spring cloud微服务云架构的搭建过程和精髓记录下来

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

1.前言 转眼间surging 开源已经有1年了,经过1年的打磨,surging已从最初在window 部署的分布式微服务框架,到现在的可以在docker部署利用rancher 进行服务编排的分布式微服务引擎,再把业务进行剥离, 通过配置路径就能驱动加载业务模块,这样的细粒度设计,能更加灵活从业务中针对于对象加以细分,能更加灵活的拆分聚合服务.而这篇文章我们来谈谈基于docker 如何部署 surging源码下载 2.概述 容器,就是用来存放镜像的器皿,而镜像是构建成的一个轻量的.独立的.可执行

Spring Cloud云服务架构 - 企业分布式微服务云架构构建

今天正式给大家介绍了Spring Cloud - 企业分布式微服务云架构构建,我这边结合了当前大部分企业的通用需求,包括技术的选型比较严格.苛刻,不仅要用业界最流行的技术,还要和国际接轨,在未来的5~10年内不能out.作为公司的架构师,也要有一种放眼世界的眼光,不仅要给公司做好的技术选型,而且还要快速响应企业的业务需求,能够为企业快速定制化业务. 以下是我为公司规划的大型互联网分布式企业微服务云架构: 从现在开始,我这边会将近期研发的spring cloud微服务云架构的搭建过程和精髓记录下来

(四)整合spring cloud云服务架构 - 企业分布式微服务云架构构建

今天正式给大家介绍了Spring Cloud - 企业分布式微服务云架构构建,我这边结合了当前大部分企业的通用需求,包括技术的选型比较严格.苛刻,不仅要用业界最流行的技术,还要和国际接轨,在未来的5~10年内不能out.作为公司的架构师,也要有一种放眼世界的眼光,不仅要给公司做好的技术选型,而且还要快速响应企业的业务需求,能够为企业快速定制化业务.感兴趣的可以朋友企鹅 ?壹玖零叁八叁贰伍柒玖? 以下是我为公司规划的大型互联网分布式企业微服务云架构: ?从现在开始,我这边会将近期研发的spring