一、MSA简介

1.1、MSA是什么

微服务架构MSA是Microservice Architecture的简称,它是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相通讯、互相配合,为用户提供最终价值。它与SOA之间的区别如下:

SOA实现 微服务架构实现  
企业级,自顶向下开展实施 团队级,自底向上开展实施  
粒度大:服务由多个子系统组成 粒度细:一个系统被拆分成多个服务,且服务的定义更加清晰  
重ESB:企业服务总线,集中式的服务架构 轻网关:无集中式总线,松散的服务架构  
开发过程复杂 易开发:减少了企业ESB开发的复杂性,与敏捷开发的思想高度结合在一起  
单块架构系统,相互依赖,部署复杂 服务能被独立部署  
     

1.2、我们的MSA框架

我们的微服务框架MsaFx.dll是个基于ServiceStack 4.0.60包装实现的.NET Web Services框架,而ServiceStack本身支持通用的轻量级协议和Metadata。MsaFx与普通Web Services框架如WCF相比,主要优势如下:
1、  高性能:性能好、速度快。
2、  支持跨平台运行:基于MsaFx开发出的Web Services既能够运行在Windows环境中,又能够运行在支持Mono的Linux环境中。
3、  支持多协议:如JSON格式的也支持XSD。
4、  更加Web化:RESTful。
5、  服务端实现与客户端实现的完全解耦:MSA基于消息的设计,使得服务端的API改变并不会破坏现有的客户端,达到服务端实现与客户端实现完全解耦的目的。
6、  MSA API可视化说明文档便于你调试。
7、  易学:使用MSA进行开发和维护服务所需的技术和时间投入要小很多。
8、  易用:简化了REST以及WCF SOAP风格的Web Services的开发过程。

1.3、MSA框架实现架构

MSA服务端的架构请见下图的第一张图,MSA的HTTP客户端架构请见下图的第二张图。MSA的内部是建立在原生的ASP.NET IHttpHandler之上实现的,支持JSON、XML、JSV、HTML、Message Pack、ProtoBuf、CSV等消息格式。
MSA服务端的架构
 
MSA HTTP Client的架构

二、MSA框架的使用

1、服务托管

服务端的服务对外提供服务前,必须先要把服务端给托管起来。MSA提供了通过IIS、Self-Host等多种形式把服务端给托管起来,宿主环境可以是控制台应用或Windows Service或ASP.NET Web应用或ASP.NET MVC应用。提供的MSA Demo的宿主环境用的是ASP.NET Web应用。

2、 路由

A、MSA自身提供的默认路由是:/[xml|json|html|jsv|csv]/[reply|oneway]/[Request DTO名] [(?query参数1={值}&query参数2={值}&......&query参数n={值})]。
B、创建自定义路由,其创建方法是:使用RouteAttribute或在宿主环境中配置。提供的MSA Demo采用的是在宿主环境中配置路由这种方式来创建自定义路由。

3、如何验证请求参数的合法性

如果你需要在提交请求参数前,验证请求参数是否必填或是否合法,那么验证逻辑必须写在继承自MSA的AbstractValidator<TRequest>的类里(参考例子请见MSA Demo的OrderValidator.cs),然后在宿主环境中进行开启验证的配置:
1 Plugins.Add(new ValidationFeature());
2 container.RegisterValidator(typeof(OrderValidator));

4、服务

创建MSA服务时,必须继承来自MSA的Service类。

5、MSA内置的客户端

5.1、MSA内置了一些便捷访问的客户端,这些对象都实现了IServiceClient接口,其中支持REST的客户端还都实现了IRestClient接口。这些客户端对象包括:JsonServiceClient、JsvServiceClient、XmlServiceClient、MsgPackServiceClient、ProtoBufServiceClient、Soap11ServiceClient、Soap12ServiceClient等。从名称可以看出,这几种不同之处在于支持的序列化和反序列化格式不同。因为它们实现的是相同的接口,所以它们的用法相同,也可以相互替换。
MSA Demo中用到了JsonServiceClient和ProtoBufServiceClient这两种客户端,其中当用到ProtoBufServiceClient客户端时,你还需要完成如下工作:
a、  除了需要引用MSA.dll外,还需要引用protobuf-net.dll。
b、  需要在宿主环境中进行如下配置:
1 Plugins.Add(new ProtoBufFormat());

c、必须分别给Request DTO对象和Response DTO对象的各属性标上[DataMember(Order = {0})]特性,具体写法请见MSA Demo的ProductRequestDTO.cs和ProductResponseDTO.cs。

 
5.2、MSA内置的客户端提供Get、Send、Post、Put、Delete等方法。查询数据一般用Get方法,新增操作一般用Post方法,更新操作一般用Put方法,删除操作一般用Delete方法。
这些方法都有重载。
以下是Get方法的其中一个签名: 
1 TResponse Get<TResponse>(IReturn<TResponse> requestDto);

6、MSA API可视化说明文档自动生成的实现

在宿主环境中加如下配置:
1 Plugins.Add(new SwaggerFeature());

如果需要在MSA API可视化说明文档中能够看到各请求参数、响应的含义说明,那么需要为Request DTO、Response DTO对象的各属性标上ApiMember,代码参考如下:

 1 public class OrderRequest : IReturn<OrderResponse>
2 {
3 [ApiMember(Name = "Id", Description = "订单ID号", IsRequired = false)]
4 public int Id { get; set; }
5 [ApiMember(Name = "CustomerName", Description = "客户名", IsRequired = false)]
6 public string CustomerName { get; set; }
7 //......
8 [ApiMember(Name = "OrderItemList", Description = "订购的产品列表", IsRequired = false)]
9 public List<OrderItem> OrderItemList { get; set; }
10 }
 
运行结果如下图所示:
在MSA API可视化说明文档中显示各请求参数、响应的含义说明

7、运行结果

先运行托管应用(如MSA Demo中ServiceHost项目),出现下图所示的Metadata页。然后再运行客户端来调用微服务;也可通过浏览器查看数据,网址输入格式如: http://localhost:34833/orders/1.html?CustomerName=客户_1&IsTakeAway=true&StatusCode=1&CreatedDate=2017-08-21 10:58:48.230,或:  http://localhost:34833/html/reply/GetOrderRequest?Id=1&CustomerName=客户_1&IsTakeAway=true&StatusCode=1&CreatedDate=2017-08-21 10:58:48.230,其中,第1个网址格式规则就是MSA Demo中在宿主环境中所配的自定义路由规则,第2个网址格式规则就是由MSA提供的默认路由规则。
       单击下图所示Metadata页中的【MSA API UI】后,进入下图所示的MSA API可视化说明文档界面,开发人员可以通过这份由MSA自动生成的说明文档进行调试,十分方便。
Metadata页
 
 MSA API可视化说明文档界面

三、微服务治理

在我们自主开发的框架管理系统中,进行接口注册,请见下图。其中,规定内部服务访问名的命名规范是:/{***Service}/方法名,如/OrderService/CreateOrder;规定外部服务访问名OpenApiName的命名规范是:{各产品线的缩写英文名}方法名,如FltCreateOrder,其中Flt表示国内机票业务的缩写英文名。
MSA接口注册页

四、微服务网关API Gateway

4.1、API Gateway的简介

API Gateway风格的核心理念是使用一个轻量级的消息网关作为所有客户端的主入口,并且在 API Gateway层面上实现通用的非功能性需求。如下图所示:所有的服务通过API 网关来暴露,这是所有客户端访问的唯一入口;如果一个服务要访问另一个服务,也要通过这个网关。 
所有服务通过一个API网关来暴露
一旦API网关允许客户端消费一个受管理的API,那么我们就可以以受管理的API形式使用它来暴露这个微服务所实现的业务逻辑。API网关以NIO、IOCP来连接内部受管理的API,以实现API网关的高并发。

4.2、API Gateway的优点

  • 网络隔离:微服务部署在了内网,通过API Gateway开放给PartnerAPI、WebAPI或MobileAPI。
  • 在网关层面的轻量级消息路由和转换。
  • 在网关层面对存在的微服务提供必要的抽象。例如,网关可以选择对不同的用户暴露不同的API。
  • 一个中心的地方提供非功能性的能力,这些能力可复用, 比如超时、限流、熔断、监控、日志记录等。
  • 通过适用API网关模式,微服务可以变得更加轻量,因为非功能性需求都在网关上实现了。
  • 统一安全管控。

4.3、API Gateway的架构

4.4、API Gateway的功能

API Gateway主要实现以下功能:
1、路由映射:外部服务访问名映射到对应的内部服务访问名。
2、权限验证:包括针对客户角色的访问授权验证、针对客户的访问授权验证、IP黑名单验证。
3、超时处理:当API网关调用的内部服务响应时间超过了在自主开发的API网关后台管理子系统中所设置的允许最长的超时时间时,API网关会立即停止调用,并返回相关消息给你。
4、限流控制:当你通过API网关调用内部服务的频率达到在某个阈值时,API网关会立即做断开链路处理。过了时间后,链路会自动闭合回去。
5、熔断处理:熔断处理对避免无谓的资源消耗特别有用,当通过API网关调用的内部服务出现异常的频率达到某个阈值时,那么API网关会做临时熔断处理即临时断开链路,暂时停止你对那个内部服务的调用。临时熔断后,过了一段时间后,链路会自动闭合回去。
6、日志信息记录:会记录客户IP、客户请求参数、返回结果、异常信息等信息。

4.5、API Gateway的使用

在使用API Gateway之前,需要先配置网关参数。网关参数的配置是在自主开发的API网关后台管理子系统中进行:
在自主开发的API网关后台管理子系统中配置网关参数

五、Demo下载及更多资料

.NET微服务架构及API网关的更多相关文章

  1. spring cloud+dotnet core搭建微服务架构:Api网关(三)

    前言 国庆假期,一直没有时间更新. 根据群里面的同学的提问,强烈推荐大家先熟悉下spring cloud.文章下面有纯洁大神的spring cloud系列. 上一章最后说了,因为服务是不对外暴露的,所 ...

  2. spring cloud+.net core搭建微服务架构:Api网关(三)

    前言 国庆假期,一直没有时间更新. 根据群里面的同学的提问,强烈推荐大家先熟悉下spring cloud.文章下面有纯洁大神的spring cloud系列. 上一章最后说了,因为服务是不对外暴露的,所 ...

  3. 微服务架构中API网关的角色

    [上海尚学堂的话]:本文主要讲述了Mashape的首席技术执行官Palladino对API网关的详细介绍,以及API网关在微服务中所起的作用,同时介绍了Mashape的一款开源API网关Kong. A ...

  4. spring cloud+dotnet core搭建微服务架构:Api授权认证(六)

    前言 这篇文章拖太久了,因为最近实在太忙了,加上这篇文章也非常长,所以花了不少时间,给大家说句抱歉.好,进入正题.目前的项目基本都是前后端分离了,前端分Web,Ios,Android...,后端也基本 ...

  5. spring cloud+.net core搭建微服务架构:Api授权认证(六)

    前言 这篇文章拖太久了,因为最近实在太忙了,加上这篇文章也非常长,所以花了不少时间,给大家说句抱歉.好,进入正题.目前的项目基本都是前后端分离了,前端分Web,Ios,Android...,后端也基本 ...

  6. Chris Richardson微服务翻译:构建微服务之使用API网关

    Chris Richardson 微服务系列翻译全7篇链接: 微服务介绍 构建微服务之使用API网关(本文) 构建微服务之微服务架构的进程通讯 微服务架构中的服务发现 微服务之事件驱动的数据管理 微服 ...

  7. Spring Cloud 微服务三: API网关Spring cloud gateway

    前言:前面介绍了一款API网关组件zuul,不过发现spring cloud自己开发了一个新网关gateway,貌似要取代zuul,spring官网上也已经没有zuul的组件了(虽然在仓库中可以更新到 ...

  8. 谈谈微服务中的 API 网关(API Gateway)

    前言 又是很久没写博客了,最近一段时间换了新工作,比较忙,所以没有抽出来太多的时间写给关注我的粉丝写一些干货了,就有人问我怎么最近没有更新博客了,在这里给大家抱歉. 那么,在本篇文章中,我们就一起来探 ...

  9. 微服务中的 API 网关(API Gateway)

    API 网关(API Gateway)提供高性能.高可用的 API 托管服务,帮助用户对外开放其部署在 ECS.容器服务等云产品上的应用,提供完整的 API 发布.管理.维护生命周期管理.用户只需进行 ...

随机推荐

  1. nodejs要远程连接另一个主机上的monogodb数据库服务器

    我的mongodb是装在linux下的. 首先,先添加用户 1.首先在mongodb服务器主机上进行terminal命令行,输入 mongo 2.输入 use admin 进入用户管理数据库 3.db ...

  2. 乐乎共享wifi充电宝项目

  3. 查看SqlServer连接所使用的端口号

    最近一个项目里用到了一个插件,在配置时发现连接数据库使用的是JDBC,输入URL时用到了端口号.印象中在使用Sqlserver时貌似没有提到端口号,在网上查阅了一下,记录下来省的忘了 方法是通过内置的 ...

  4. Deutsch lernen (04)

    1. streng a. 严厉的,严格的 streng gegen sich selbst und gegen andere sein streng auf Ordnung halten 2. ver ...

  5. NSURLCredential 代表认证结果证书?

    NSURLCredential 代表认证结果证书?

  6. 单调队列 && 单调栈

    单调队列 && 单调栈 单调队列 维护某个滑动区间的min or max,可用于dp的优化 以维护min为例,采用STL双端队列实现 每次加入元素x前 先检查队首元素==滑动后要删除的 ...

  7. 7.5 pragma 指令

    第1个pragma禁用了我们感兴趣的特别警告,第2个恢复了它.禁用尽可能小的一段代码的警告是一个良好的做法,以便你不会错过任何真正应该修复的错误.如果你想在单独一行上禁用或恢复多个警告,那么只需用逗号 ...

  8. USACO 4.1 Fence Rails

    Fence RailsBurch, Kolstad, and Schrijvers Farmer John is trying to erect a fence around part of his ...

  9. SQL第二节课

    SQL练习题 一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的 ...

  10. 使用for或while循环来处理处理不确定页数的网页数据爬取

    本文转载自以下网站: Python For 和 While 循环爬取不确定页数的网页  https://www.makcyun.top/web_scraping_withpython16.html 需 ...