NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

Web Service 同样需要系统化的设计模式

  • 2007-09-08
  • 本文字数:1150 字

    阅读完需:约 4 分钟

最近《Pattern-Oriented Software Architecture》出版了 4、5 卷,联想到现在正快速发展的 Web 服务建设,他们同样也进入到系统化设计、实施的阶段,也到了该应用模式化设计的阶段。设计模式不仅是方法论,很多时候也是实现技巧、代码重构设计思路、解决方案等。Web 服务与 GOF23 提到的面向对象设计模式本身有很大差距,因为它提供的是基于 WSDL 的一个个 API,也就是说它是“平”的,没有所谓的继承关系。

现阶段 Web 服务更多的被架构师设计为应用的“一张皮”,即便这样经过近几年数量众多的 Web 服务建设,它还是形成了很多固定的模式(为了区别于经典的模式名称,这里每个模式名称前都增加了一个“Service”):

l Service Facade:Web 服务是平台、开发语言无关的,那么为了实现无关那就需要把原有的资源包装好,这个意义上讲,Web 服务天生就有很朴素的 Facade 特性;

l Service Adapter:Web 服务间的调用越来越普遍,尤其在互操作或者与合作伙伴 Web 服务交互的过程中,如何使不同 Service Endpoint 互联本质上也是 WSDL 与 WSDL 接口间的交互,概念上适配器就是很不错的选择;

l Service DTO(Data Transfer Object):Web 服务的调用是相对很昂贵的,但客户程序很少有机会决定服务端的接口颗粒度,如果对方颗粒度很小,但自己需要的数据本身就很粗,那么如何将多次调用打包成一个,DTO 就是不错的选择;

l Service Observer:既然架构上 Web 服务被定义为 SOA 环境的普遍技术,那么设计上也更需要面向客户,无论是最终客户应用、人还是客户 Web 服务,很多情况下都需要异步根据既定内容提供消息,Observer 这时候就很有用武之地,进一步还可以扩展为 Service Subscriber / Publisher;

l Service Visitor:虽然现在绝大多数企业内 Web 服务还远没有达到形成双因素依赖的程度,但很多协作方 Web 服务间已经形成了很多基于“服务——请求”链条的双因素依赖关系,当两个服务之间“拆解”有问题的时候,恐怕就是“外来和尚好念经”了,Visitor 是个不错的思路;

l … …

概念上应用这些模式很清晰,但实现上要求架构师有几个“坎”必须跨越:

l 首先,实现上述模式的基础是解决 Web 服务依赖倒置的问题,虽然 WSDL 很好的描述了 Web 服务接口部分的抽象,但服务实体本身必须增加一个抽象逻辑层适配 WSDL 的描述,否则 WSDL 与 Web 服务实体间还是 1:1 的紧密耦合,想通过模式玩点“花样”很难;

l 其次是参数、消息内容上必须(起码是强烈建议)采用 XML 家族的技术,XSD、XSLT、XML 数据访问技术(Xpath / XQuery)等;

l 然后,标准化是时时要考虑的问题,设计模式没有提到版本问题,但 Web 服务发展的太快,为了更好的把他们服务化,供其它客户程序使用,不仅要设计上有好的规划,实现上也要处处留意标准化,因为很多时候要靠相关标准的兼容性保证自己 Web 服务的兼容性。

2007-09-08 19:49766
用户头像

发布了 61 篇内容, 共 96294 次阅读, 收获喜欢 0 次。

关注

评论

发布
暂无评论
发现更多内容

测试流程如何落地?

老张

软件测试 质量保障

实战 | Kibana面板使用

写程序的小王叔叔

Kibana ELK Stack 6月月更

莫把功能当能力!从企业架构视角看警察在火锅店站岗

涛哥 数字产品和业务架构

企业架构

[数据分析实践]-文本分析-U.S. Patent Phrase-1

浩波的笔记

数据分析

c语言选择,循环语句概述

工程师日月

6月月更

Paper Reading 预告 | Volcano-An Extensible and Parallel Query Evaluation System(众神推荐的 Paper 下载合集)

TiDB 社区干货传送门

TiDB Paper Reading

CentOS环境基于nginx搭建负载均衡

乌龟哥哥

6月月更

测试开发【Mock平台】04实战:前后端项目初始化与登录鉴权实现

MegaQi

测试平台开发教程 测试干货 6月月更

纯CSS 毛玻璃效果 💎

德育处主任

CSS 纯CSS 6月月更

助力直播平台源码脱颖而出,要完成哪些关键功能?

开源直播系统源码

软件开发 直播源码

中台的细节

卢卡多多

中台 6月月更

字符串

Jason199

js 字符串 6月月更

面试突击57:聚簇索引=主键索引吗?

王磊

Java MySQL 面试

flutter系列之:Material中的3D组件Card

程序那些事

flutter 程序那些事 6月月更

Java Core 「8」字节码增强技术

Samson

学习笔记 Java core 6月月更

JVM调优简要思想及简单案例-JVM是什么?

zarmnosaj

6月月更

C#入门系列(十六) -- 类及其成员介绍

陈言必行

C# 6月月更

读《Software Systems Architecture》(26)—— The Performance and Scalability Perspective

术子米德

架构师成长笔记

读《Software Systems Architecture》(27)—— The Availability and Resilience Perspective

术子米德

架构师成长笔记

spring4.1.8扩展实战之五:改变bean的定义(BeanFactoryPostProcessor接口)

程序员欣宸

Java spring Spring Framework 6月月更

几个非常有用的 Flutter 技巧,你可以立即使用!

坚果

6月月更

python停车时间计算,时分秒计算(split()函数)

写代码两年半

Python 6月月更

InfoQ 极客传媒 15 周年庆征文|漫谈公网网络延迟

耳东@Erdong

运维 6月月更 InfoQ极客传媒15周年庆 网络延迟

【愚公系列】2022年06月 通用职责分配原则(三)-低耦合原则

愚公搬代码

6月月更

Linux开发_Makefile规则与Shell脚本语言

DS小龙哥

6月月更

【协程】LifecycleScope源码解析

yechaoa

android 协程 6月月更 LifecycleScope

InfoQ 极客传媒 15 周年庆征文| 手把手带你入门 API 开发

宇宙之一粟

flask-restful 6月月更 InfoQ极客传媒15周年庆 API开发

读《Software Systems Architecture》(28)—— The Evolution Perspective

术子米德

架构师成长笔记

力扣每日一练之二维数组上篇Day4

京与旧铺

6月月更

远程办公-如何提高开会效率?| 社区征文

石云升

远程办公 开会 会议 6月月更 初夏征文

gogs使用webhook部署react单页应用

Nick

ci 持续集成 React 6月月更 gogs

Web Service同样需要系统化的设计模式_架构_王翔_InfoQ精选文章