走向ASP.NET架构设计-第六章-服务层设计(中篇)

简介:
走向ASP.NET 架构设计- 第六章- 服务层设计( 中篇)
  前言:上一篇文章介绍了一些服务层的基本知识,而且也简要的介绍了SOA 的有关知识,本篇主要是介绍在服务层可以采用的一些模式。 
本篇议题如下:
Façade  模式
Document Message Request-Reponse 模式
Reservation  模式
Idempotent 模式
   
  Façade 设计模式
  在SOA 客户端的设计中,最常用的模式就是Façade 模式了。Façade 模式简化了复杂子系统的调用接口,也就说,Façade 隐藏了子系统之间的复杂关系,给客户端一个简单的调用接口。 
   Façade 模式的好处如下:
1.  它可以使得第三方的类库经过包装之后,通过一个简单的接口就可以调用,如下图所示。
2.  它可以通过抽象等方式来解耦其他系统之间的依赖。
3.  它可以使得各个子系统之间的调用复杂度隐藏,通过一个简单的接口就可以调用,如下图所示
 
  在上面的图中:
1.  客户端调用Façade 的一个简单的API 来执行一个任务。客户端不知道Façade 内部是如何实现的,可能只一个任务的执行涉及到很多内部子系统的交互和合作。
2. SubSystemA SubSystemB 才是真正的任务执行者。
 
  下面我们就来看看客户端和服务层之间进行通信的一些模式。
  注:把这些模式讲完之后就讲一个如何使用这些模式的例子。 
 
  Document Message Request-Reponse 模式( 文档消息模式 请求- 响应模式)
在体会文档消息模式的好处之前,我们先来看看一种通信方式:RPC Remote Procedure Call  远程过程调用):RPC 方式通过暴露很多不同参数的API 来实现提供不同服务,如下:
 
Customer[] RetrieveCustomers( string  country);
Customer[] RetrieveCustomers (
string  country,  string  postalCode);
Customer[] RetrieveCustomers (
string  country,  string  postalCode,  string  street);
 
 
上面的服务接口允许客户端通过三种方式来获取用户的信息:通过提供不同的参数来实现。这种方式的维护很难的,而且往往把客户端搞糊涂,而且服务器端可能最后向客户端暴露很多名字一样的方法,尽管可以在WCF 中改变方法最后显示到客户端的名字,但是方法依然泛滥。
 
文档消息模式可以让客户端以统一和灵活的方式和服务进行通信。文档消息模式把客户端把所有的请求的信息包装成为一个信息体,发送给服务端,而且服务端的接口的定义也非常的简单,如下:
  
Customer[] FindBy(CustomerSearchRequest request);
 
这个消息体的定义如下:
 
public   class  CustomerSearchRequest
{
    
public   string  Country {  get set ; }
    
public   string  PostalCode {  get set ; }
    
public   string  Street {  get set ; }
}
 
 
有的时候消息体还携带其他额外的信息到服务端,如服务的版本号,验证授权标识等。当然了,这些额外的,相同的信息,我们可以定义一个请求消息的基本,然后让所有的请求消息都集成基类。
 
通过使用文档消息模式,我们就解决了之前RPC 的一些问题,当然服务端对消息要做一些处理的。
文档消息模式一般和请求- 响应模式一起使用。如之前的例子,我们是直接返回了Customer 的数组,其实有些时候可能不想把业务类的定义暴露出来,而且可能我们还要给客户端返回添加额外的信息,那么我们的服务端的接口定义如下:
 
CustomerSearchResponse RetrieveCustomers(CustomerSearchRequest request);
 
 
其实在之前的一些章节中的代码的例子,很多都演示了这样的模式的使用。
大家可以看看一般文档消息模式请求- 响应模式的图示:
 
 
 
  Reservation  模式( 预约保留模式)
一般情况下,SOA 中服务器那边都是无状态的,但是可能有些时候,我们需要服务器端来保存一个长时间运行的服务的一些状态,在这段时间内,客户端可能向服务器端发送很多的请求都被当成一个事务或者一个工作单元来处理。
 
Reservation 模式就是来解决这样的问题的:
1.  我们可以发送一个请求给服务器,从服务端响应中获取一个预约的唯一编号
2.  客户端余下的请求中都带上这个编号,以便服务器那边可以把这些请求当做一个事务处理来完成。
  通常情况下,这个预约的编号是有一定的期限的,也就说,一段时间之后,这个编号在服务端那边就过期了,主要是为了避免资源的耗费以及一些安全问题。 
  我们还是看看下面的一个在线订票系统中使用“Reservation  模式”的图示:
 
 
 
  在上图中:
1.  客户端首先调用ReserveTickets 服务方法,并且提供一些基本的信息给服务器:订阅2 张票等。
2.  服务端的响应就返回了一个预约的Id 和一个过期的时间。
3.  客户端程序执行一个逻辑。这些逻辑可能会从涉及到把获取customer 的详细信息作为订票一个处理过程,或者进行更多的复杂的客户端和服务端的交互。
4.  最后客户端把服务端需要的信息连同预约的Id 一同提交,调用PurchaseTicket 方法,然后服务端就返回订票成功的编号。
 
  可能上面的例子不是很恰当,大家明白其中的意思就行。
 
   Idempotent模式( 等幂模式
  在调用服务接口的时候,可能出现:用同样的参数来多次调用同一个服务接口,这种情况,但是可能是我们想要的,但是也可以不是我们想要的。例如,在订单系统中,由于某些原因,导致用户把同一个账单提交了多次(如,不小心点了多次提交按钮),那么系统中的数据就出问题。所以可以采用Idempotent 模式来确保相同的参数提交多次,但是服务端只是处理一次。 
  Idempotent 模式的基本思想是这样的:每一次的客户端的请求,都被赋予了一个唯一的请求标识(如,这个标识的生成规则可能是通过这个请求的一些参数做一些算法来生成)。在服务端就在一个存储区域检查这个唯一的标识时候已经被处理过了,是否有对应的响应信息,如果有,那么直接把响应信息返回;如果没有,那么处理这个请求。
  如下图所示:
 
 
  今天就写到这里,下一篇就开始利用WCF 来做一个Demo 了。 






















本文转自yanyangtian51CTO博客,原文链接:http://blog.51cto.com/yanyangtian/442638  ,如需转载请自行联系原作者


相关文章
|
2月前
|
敏捷开发 缓存 中间件
.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素
本文深入探讨了.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素,并通过企业级应用和Web应用开发的实践案例,展示了如何在实际项目中应用这些模式,旨在为开发者提供有益的参考和指导。
50 3
|
3月前
|
开发框架 .NET API
Windows Forms应用程序中集成一个ASP.NET API服务
Windows Forms应用程序中集成一个ASP.NET API服务
117 9
|
6月前
|
负载均衡 Java Linux
黑马头条01,环境搭建,今日头条的介绍,今日头条的功能架构图,技术栈的说明,服务层,nacos(奶靠丝)安装,安装在Linux服务器上环境准备,
黑马头条01,环境搭建,今日头条的介绍,今日头条的功能架构图,技术栈的说明,服务层,nacos(奶靠丝)安装,安装在Linux服务器上环境准备,
|
存储 开发框架 前端开发
云LIS检验系统源码,B/S架构Asp.NET CORE版
云LIS系统是基于B/S架构的实验室管理系统,整个系统的运行基于WEB层面,只需要在对应的工作台安装一个浏览器软件有外网即可访问。 支持合并两个标本的化验结果,兼容糖耐量合并; 支持图形结果; 支持两癌筛查功能; 支持危机值报警、危机值统计; 支持危急值统计、历史数据对比等条件查询报表设计
166 0
云LIS检验系统源码,B/S架构Asp.NET CORE版
|
开发框架 监控 前端开发
云LIS平台源码,基于B/S架构的实验室信息系统,技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis
支持Westguard,Gubbuss+T(n)等多种质控规则,自动判断是否失控,可自动计算靶值、SD,多个质控品可列于一个图表上;每个质控品每天可多达7次结果,可使用平均值、最后一次结果,最好一次结果画图等;靶值可自动计算,免疫等支持按季度或者自定义日期画图
414 0
云LIS平台源码,基于B/S架构的实验室信息系统,技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis
|
开发框架 .NET Unix
Linux CentOS7部署ASP.NET Core应用程序,并配置Nginx反向代理服务器和Supervisor守护服务 (下)
Linux CentOS7部署ASP.NET Core应用程序,并配置Nginx反向代理服务器和Supervisor守护服务
342 0
Linux CentOS7部署ASP.NET Core应用程序,并配置Nginx反向代理服务器和Supervisor守护服务 (下)
|
开发框架 缓存 安全
Linux CentOS7部署ASP.NET Core应用程序,并配置Nginx反向代理服务器和Supervisor守护服务 (上)
Linux CentOS7部署ASP.NET Core应用程序,并配置Nginx反向代理服务器和Supervisor守护服务
675 0
Linux CentOS7部署ASP.NET Core应用程序,并配置Nginx反向代理服务器和Supervisor守护服务 (上)
|
XML 开发框架 安全
【浅谈ASP.NET】——Web服务应用实例
【浅谈ASP.NET】——Web服务应用实例
171 0
【浅谈ASP.NET】——Web服务应用实例
|
消息中间件 JSON NoSQL
.net core实践系列之短信服务-架构设计
.net core实践系列之短信服务-架构设计
440 0
.net core实践系列之短信服务-架构设计
|
开发框架 .NET 应用服务中间件
ASP.NET Core : 五.服务是如何加载并运行的, Kestrel、配置与环境
"跨平台"后的ASP.Net Core是如何接收并处理请求的呢? 它的运行和处理机制和之前有什么不同? 本章从"宏观"到"微观"地看一下它的结构以及不同时期都干了些什么. ASP.NET Core 的运行机制: "宏观"的看一下Http请求的处理流程. ASP.NET Core 的配置与运行: 2倍放大后的ASP.NET Core Application, Kestrel服务器、启动与配置 ASP.NET Core 的环境变量.
290 0
ASP.NET Core : 五.服务是如何加载并运行的, Kestrel、配置与环境