第15章 面向服务架构设计理论实践

服务是一个由服务提供者提供的,用于满足使用者请求的业务单元。服务的提供者和使用者都是软件代理为了各自的利益而产生的角色。
面向服务的体系结构(Service-Oriented Architecture,SOA)中,服务的概念有了延伸,泛指系统对外提供的功能集。例如,在一个大型企业内部,可能存在进销存、人事档案和财务等多个系统,在实施SOA后,每个系统用于提供相应的服务,财务系统作为资金运作的重要环节,也向整个企业信息化系统提供财务处理的服务,那么财务系统的开放接口可以看成是一个服务。
  

15.1 SOA的相关概念

15.1.1 SOA的定义

应用的角度定义,可以认为SOA是一种应用框架,它着眼于日常的业务应用,并将它们划分为单独的业务功能和流程,即所谓的服务。SOA使用户可以构建、部署和整合这些服务,且无需依赖应用程序及其运行平台,从而提高业务流程的灵活性。这种业务灵活性可使企业加快发展速度,降低总体拥有成本,改善对及时、准确信息的访问。SOA有助于实现更多的资产重用、更轻松的管理和更快的开发与部署。
软件的基本原理定义,可以认为SOA是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种这样的系统中的服务可以一种统一和通用的方式进行交互。
作为软件架构师,后一种从软件原理方面的定义,对日常工作更具指导性。

15.1.2 业务流程与BPEL

业务流程是指为了实现某种业务目的行为所进行的流程或一系列动作
 
在计算机领域,业务流程代表的是某一个问题在计算机系统内部得到解决的全部流程
 
由于业务流程来源于现实世界,传统上是通过复杂的语言进行描述。在计算机业务系统建模中,需要用到一种特定的、简洁的语言来专门描述计算机系统的业务流程,这便促使了BPEL的诞生。
 
BPEL(Business Process Execution Language For Web Service), 面向Web服务的业务流程执行语言,也有的文献简写成 BPEL4WS, 它是一种使用Web服务定义和执行业务流程的语言。
作用:
使用BPEL,用户可以通过组合、编排和协调Web服务自上而下地实现面向服务的体系结构。BPEL提供了一种相对简单易懂的方法,可将多个Web服务组合到一个新的复合服务(称作业务流程)中。
实践:
BPEL目前用于整合现有的Web Services,将现有的Web Services按照要求的业务流程整理成为一个新的Web Services,在这个基础上,形成一个从外界看来和单个Service一样的Service。

15.2 SOA的发展历史--看看即可

15.2.1 SOA的发展历史

1.萌芽阶段:

XML是SOA的基石。

XML规定了服务之间以及服务内部数据交换的格式和结构。XSD Schemas保障了消息数据的完整性和有效性,而XSLT使得不同的数据表达能通过Schema映射而互相通信。

2.标准化阶段

这一时期,出现了三个著名的Web服务标准和规范:
简单对象访问协议(Simple Object Access Protocal,SOAP)、
Web服务描述语言(Web Services Description Language,WSDL)
通用服务发现和集成协议(Universal Discovery Description and Integration,UDDI)。
Web服务三剑客,极大地推动了Web服务的普及和发展,有力电子商务和因特网的发展,
Web服务也是因特网Web 2.0时代的一项重要特征。

3.成熟应用阶段

在三个重量级规范上:SCA/SDO/WS-Policy。
SCA和SDO构成了SOA编程模型的基础,而WS-Policy建立了SOA组件之间安全交互的规范。这三个规范的发布,标志着SOA进入了实施阶段。

15.2.2 国内SOA的发展现状与国外对比

《SOA中国路线图》可取之处:
(1)指出了中美IT系统所面临的根本性问题不同。
(2)为国内大型集团化企业指明了如何解决系统集成和系统构建的融合性问题,基于SOA
方式下的解决方案。

15.2.3 SOA的微服务化发展

随着技术的发展,SOA向微服务演进。

SOA与微服务的区别在于 如下几个方面:
(1)微服务相比于SOA更加精细,微服务更多地以独立的进程的方式存在,互相之间并无影响;
(2)微服务提供的接口方式更加通用化,例如HTTP RESTful方式,各种终端都可以调用,无关语言、平台限制;
(3)微服务更倾向于分布式去中心化的部署方式,在互联网业务场景下更适合。
SOA架构是一个面向服务的架构将其视为组件模型,其将系统整体拆分为多个独立的功能模块,模块之间通过调用接口进行交互,有效整合了应用系统的各项业务功能,系统各个模块之间是松耦合的。SOA架构以企业服务总线链接各个子系统是集中式的技术架构,应用服务间相互依赖导致部署复杂,应用间交互使用远程通信,降低了响应速度。
   
微服务架构是SOA架构的进一步优化,去除了ESB企业服务总线,是一个真正意义上去中心化的分布式架构。其降低了微服务之间的耦合程度,不同的微服务采用不同的数据库技术,服务独立数据源唯一,应用极易扩展和维护,同时降低了系统复杂性
微服务比SOA更加强调服务个体的独立性、拆分粒度更小。

15.3 SOA的参考架构

IBM的Websphere业务集成参考架构(如图15-2所示,以下称参考架构)是典型的以服务为中心的企业集成架构。以它为例子来学习SOA架构。

以服务为中心的企业集成采用“关注点分离(Separation of Concern)”的方法规划企业集成中的各种架构元素,同时从服务视角规划每种架构元素提供的服务,以及服务如何被组合在一起完成某种类型的集成。这里架构元素提供的服务既包括狭义的服务(WSDL描述),也包括广义的服务(某种能力)。

从服务为中心的视角来看,企业集成的架构(如图15-2所示)可划 分为6大类。
  
(1)业务逻辑服务(Business Logic Service):包括用于实现业务逻辑的服务和执行业务逻辑的能力,其中包括业务应用服务(Business Application Service)、业务伙伴服务(Partner Service)以及应用和信息资产(Application and Information asset)。
-- 顾名思义,执行我们的业务逻辑的。
(2)控制服务(Control Service):包括实现人(People)、流程(Process)和信息(Information)集成的服务,以及执行这些集成逻辑的能力。
(3)连接服务(Connectivity Service):通过提供企业服务总线提供分布在各种架构元素中服务间的连接性。
(4)业务创新和优化服务(Business Innovation and Optimization Service):用于监控业务系统运行时服务的业务性能,并通过及时了解到的业务性能和变化,采取措施适应变化的市场。
(5)开发服务(Development Service):贯彻整个软件开发生命周期的开发平台,从需求分析,到建模、设计、开发、测试和维护等全面的工具支持。
(6)IT服务管理(IT Service Management):支持业务系统运行的各种基础设施管理能力或服务,如安全服务、目录服务、系统管理和资源虚拟化。

1.连接服务——企业服务总线

企业服务总线(Enterprise Service Bus,ESB)采用了“ 总线”这样一种模式管理和简化应用之间的集成 拓扑结构,以广为接受的 开放标准为基础来支持应用之间在消息、事件和服务的级别上动态地互联互通。
ESB的基本特征和能力包括:描述服务的元数据服务注册管理
1).服务请求者和服务提供者之间传递数据,ESB不是仅仅是"高速公路"的方式,ESB还会对数据进行转换(不同的服务发送的消息及内容甚至协议等等的格式、结构、种类等等不相同,转换为标准的ESB格式)。
2).ESB还具有同步和异步模式等,消息的异步发送,在ESB中暂存,延迟发送等等
3).ESB还具备发现、路由、匹配、选择的能力,并支持服务之间的动态交互,解耦了请求者和提供者。
4).更好的ESB还具备安全方面相关的支持,服务质量保证、可管理和负载平衡等。
ESB这种转换的中介过程是自动完成的(基于服务注册管理和业务规则等)。
ESB总线的意义:
ESB采用总线结构模式简化了应用之间的集成拓扑,通过源自实践的模式,提供了基于标准的通用连接服务,使得服务请求者和服务提供者之间可以以松散耦合、动态的方式交互,从而在不同层次上使得SOA解决方案是一个松散耦合、灵活的架构

举例:

一个典型的企业服务总线如图15-3所示。需要注意的是,ESB是一种架构模式,不能简单地等同于特定的技术或者产品,但实现ESB确实需要各种产品在运行时和工具方面的支持。
IBM有很好的产品支持,运行时支持包括WebSphere ESB和WebSphere Message Broker;而工具方面IBM则有WebSphere Integration Developer,支持用户以图形界面的方式来完成相关的开发任务,如发布服务,使用各种模式、转换消息和定义路由等。

2.业务逻辑服务

1).整合已有应用——应用和信息访问服务

已有应用和信息是实现业务逻辑和业务数据的重要资产。集成它们实现更多增值,所以它们是企业集成中重要的一环。
以服务为中心的企业集成通过应用和信息访问服务(Application and Information Access Service)来实现对已有应用和信息的集成
实质:各种适配器技术(比较牛逼的胶水代码啥的)把业务逻辑和业务数据包装适配到ESB支持的协议和数据格式,这样就可以集成在一起了。
已有的应用:如遗留应用、预包装的应用各种企业数据存储,在IBM的Websphere这个参考架构中可分两类:

(1)可接入服务(On-Ramp Service):

通过各种消息通信模式(单向、请求/应答和轮询)将业务逻辑和业务数据包装成企业服务总线可以访问的功能。
 
(2)事件发现服务(Event Detect Service);
提供事件通知服务将已有应用和数据中的变化通过事件框架发布到企业服务总线上。

2).整合新开发的应用——业务应用服务

新开发的应用也是集成的目标,以服务为中心的企业集成通过业务应用服务(Business Application Service)实现新应用集成。

业务应用服务(Business Application Service)作用有2方面:

Ⅰ.它提供了很多可重用的组件,可辅助开发可重用、可维护和灵活的业务逻辑组件。

Ⅱ.提供了运行时的集成对业务逻辑组件的自治管理。就是管理类的工具自动化管理等等。

IBM的Websphere这个参考架构中,有三类应用服务:

(1)组件服务(Component Service):

为可重用的组件提供应用的运行时容器管理服务,如对象持久化、组件安全管理和事务管理等。
   

(2)核心服务(Core Service):

提供运行时的服务,包括内存管理、对象实例化和对象池、性能管理和负载均衡、可用性管理等

(3)接口服务(Interface Service):
提供和其他企业系统集成的接口,如其他企业应用,数据库、消息系统和管理框架。

3).整合客户和业务伙伴(B2C/B2B)——伙伴服务

企业不是独立存在的,他需要与其他企业或者组织交互,合作伙伴的系统异构性,需要支持多种传输协议和数据格式。

IBM的Websphere这个参考架构中,有三类应用服务:
(1)社区服务(Community Service):
用于管理和企业贸易的业务伙伴,支持以交易中心(Trade Hub)为主的集中式管理以伙伴为中心的自我管理
(2)文档服务(Document Service):
用于支持和业务伙伴交换的文档格式,以及交互的流程和状态管理,支持主流的RosettaNet、EDI和AS1/AS2等。
(3)协议服务(Protocol Service):为文档的交互提供传输层的支持,包括认证和路由等

3.控制服务

1)数据整合——信息服务

企业数据的分布性和异构性是阻碍数据访问和增值服务的主要障碍。通过数据集成聚合技术来对分布式数据和异构数据的透明访问。
以服务为中心的企业集成通过信息服务提供集成数据的能力,目前主要包括如下集中信息服务。
(1)联邦服务(Federation Service):提供将各种类型的数据聚合的能力,它既支持关系型数据,也支持像XML数据、文本数据和内容数据等非关系型数据。同时,所有的数据仍然按照自己本身的方式管理。
 
(2)复制服务(Replication Service):提供远程数据的本地访问能力,它通过自动的实时复制和数据转换,在本地维护一个数据源的副本。本地数据和数据源在技术实现上可以是独立的。
 
(3)转换服务(Transformation Service);用于数据源格式到目标格式的转换,可以是批量的或者是基于记录的。
 
(4)搜索服务(Search Service):提供对企业数据的查询和检索服务,既支持数据库等结构化数据,也支持像PDF等非结构化数据。

2)流程整合——流程服务

企业内部的IT系统通过将业务流程自动化提效,但是流程有可能跨部门的,所以将关联的流程(不管跨不跨部门)组成自动化流程更高效,业务流程集成就是为此诞生的。

参考架构中,流程服务包括:

(1)编排服务(Choreography Service):通过预定义的流程逻辑制流程中业务活动的执行,并帮助业务流程从错误中恢复
(2)事务服务(Transaction Service):用于保证流程执行中的事务特性(ACID)。对于短流 ,通常采用传统的两阶段提交技术;对于长流程,一般采用补偿的方法。
(3)人工服务(StaffService):用于将人工的活动集成到流程中。一方面,它通过关联的交互服务使得人工可以参与到流程执行中;另一方面,它需要管理由于人工参与带来的管理任务,如任务分派、授权和监管等。

3)用户访问整合——交互服务

将适当的信息、在适当的时间、传递给合适的人一直是信息技术追求的目标。用户访问集成是实现这一目标的重要一环,它负责将信息系统中的信息传递给客户,不管它在哪里,以什么样的设备接入。
以服务为中心的企业集成,通过交互服务来实现用户访问集成。参考架构中的交互服务包括如下类型。
(1)交付服务(Delivery Service):提供运行时的交互框架,它通过各种技术支持同样的交互逻辑可以在多种方式(图形界面、语音和普及计算消息)和设备(桌面、PDA和无线终端等)上运行,例如通过页面聚合和标签翻译使得同一个Portlet可以在桌面浏览器和PDA浏览器上展现。
(2)体验服务(Experience Service):通过用户为中心的服务增强用户体验,其中的技术包括个性化、协作和单点登录等
(3)资源服务(Resource Service):提供运行时交互组件的管理如安全配置、界面皮肤等。

4.开发服务

企业集成,涉及范围很广,不仅要集成新开发的应用,还有集成已有的应用和数据;不仅企业内部集成还有企业外部系统集成,不仅交互集成和数据集成,还有功能和应用集成;所以企业集成复杂性较高,需要强有力的开发工具支持。

在以服务为中心的企业集成中,除了需要支持整个软件开发周期和标准的工具框架以外,开发服务需要提供和服务开发相关的技术
(1)用于支持以服务为中心的企业集成方法学和建模,如SODA和IBM的SOMA(Service Oriented Modeling and Architecture)。
(2)用于服务为中心的编程模型,如WSDL、BPEL4WS、SCA和SDO等。
按照开发者不同的职责/角色,4类服务:
  
(1)建模服务(Model Service):用于构建可视化的业务流程模型
(2)设计服务(Design Service):根据业务模型,进一步分解为服务组件,设计服务用于设计和开发这些服务组件。
(3)实现服务(Implementation Service):用于将设计和开发的服务组件部署到生产环境中。
(4)测试服务(Test Service):支持服务组件的单元测试和系统的集成测试

5.业务创新和优化

一方面通过各种集成提高信息流转速度,一方面为业务创新和优化提供了支持平台。

业务创新和优化服务以业务性能管理(Business Process Management,BPM)技术为核心提供业务事件发布、收集和关键业务指标监控能力。具体而言,业务创新和优化服务由以下服务组成。
(1)公共事件框架服务(Common Event Infrastructure Service):通过一个公共事件框架提供IT和业务事件的激发、存储和分类等。
(2)采集服务(Collection Service):通过基于策略的过滤和相关性分析检测感兴趣的服务。
(3)监控服务(Monitoring Service):通过事件与监控上下文间的映射,计算和管理业务流程的关键性能指标(Key Performance Indicators,KPI)。
在建模阶段被确定的业务流程的关键性能指标作为重要的数据被用于重构或优化业务流程。

6.IT服务管理

(1)安全和目录服务(Security and Directory Service):企业范围的用户、认证和授权管理,
如单点登录(SSO)。
(2)系统管理和虚拟化服务(System Management and Virtualization Service):用于管理服务器、
存储、网络和其他IT资源。
IT服务管理中相当一部分服务是面向软硬件管理的;而另外一部分服务,特别是安全和目录服务,以及操作系统和中间件管理,会通过企业服务总线和其他服务集成在一起,用于实现业务流程和服务的非功能性需求,如性能、可用性和安全性等。

15.4 SOA 主要协议和规范

Web服务是实现SOA的主要手段,了解一下Web Service相关的标准。

Web服务最基本的协议包括UDDI、WSDL和SOAP,通过它们,可以提供直接而又简单的Web Service支持,如图15-4所示。

15.4.1 UDDI协议

UDDI(统一描述、发现和集成协议)计划是一个广泛的、开放的行业计划,它使得商业实体能够彼此发现;UDDI同时也是Web服务集成的一个体系框架,包含了服务描述与发现的标准规范。

用于Web服务注册和服务查找,描述了服务的概念,定义了编程的接口,供其他企业来调用。

15.4.2 WSDL规范

WSDL(Web Services Description Language,Web服务描述语言),是一个用来描述Web服务和说明如何与Web服务通信的XML语言。是Web服务的接口定义语言,描述Web服务的三个基本属性。
 
(1)服务做些什么——服务所提供的操作(方法)。
(2)如何访问服务——和服务交互的数据格式以及必要协议。
(3)服务位于何处——协议相关的地址,如URL。
WSDL文档被分为两种类型:服务接口(Service Interface)和服务实现(Service Implementations)。

服务接口文档中主要元素的作用分别如下。
 
● types:定义了Web服务使用的所有数据类型集合,可被元素的各消息部件所引用。它使用某种类型系统(一般使用XML Schema中的类型系统)。
● message:通信消息数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构。
● operation:对服务中所支持操作的抽象描述。一般单个operation描述了一个访问入口的请求/响应消息对。
● portType:对于某个访问入口点类型所支持操作的抽象集合。这些操作可以由一个或多个服务访问点来支持。
● binding:包含了如何将抽象接口的元素(portType)转变为具体表示的细节,也就是指特定的数据格式和协议的结合,以及特定端口类型的具体协议和数据格式规范的绑定。
● port:定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。
● service:这是一个粗糙命名的元素,代表端口的集合,以及相关服务访问点的集合。

WSDL文档的元素实例:

<definitions name="MyService"
    targetNamespace="http://www.examples.com/MyService"
    xmlns:tns="http://www.examples.com/MyService"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns="http://schemas.xmlsoap.org/wsdl/">
 
  <types>
    <xsd:schema targetNamespace="http://www.examples.com/MyService">
      <xsd:element name="MyRequest">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="Name" type="xsd:string"/>
            <xsd:element name="Age" type="xsd:int"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
      <xsd:element name="MyResponse">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="Greeting" type="xsd:string"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:schema>
  </types>
 
  <message name="MyRequestMessage">
    <part name="parameters" element="tns:MyRequest"/>
  </message>
  <message name="MyResponseMessage">
    <part name="parameters" element="tns:MyResponse"/>
  </message>
 
  <portType name="MyServicePortType">
    <operation name="MyOperation">
      <input message="tns:MyRequestMessage"/>
      <output message="tns:MyResponseMessage"/>
    </operation>
  </portType>
 
  <binding name="MyServiceSoapBinding" type="tns:MyServicePortType">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="MyOperation">
      <soap:operation soapAction="http://www.examples.com/MyService/MyOperation"/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
  </binding>
 
  <service name="MyServiceService">
    <port name="MyServicePort" binding="tns:MyServiceSoapBinding">
      <soap:address location="http://www.examples.com/MyService"/>
    </port>
  </service>
 
</definitions>

服务接口和服务实现实例:

在Web服务描述语言(WSDL)中,服务接口服务实现是通过<portType><binding>元素定义的。

以下是一个简单的WSDL示例,其中定义了一个名为HelloWorldService的服务接口和该服务的SOAP绑定实现。

<definitions name="HelloWorldService" targetNamespace="http://example.com/HelloWorldService"
    xmlns:tns="http://example.com/HelloWorldService" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
 
    <!-- 服务接口定义 -->
    <portType name="HelloWorldPortType">
        <operation name="sayHello">
            <input message="tns:sayHelloRequest"/>
            <output message="tns:sayHelloResponse"/>
        </operation>
    </portType>
 
    <!-- 消息定义 -->
    <message name="sayHelloRequest">
        <part name="name" type="xsd:string"/>
    </message>
    <message name="sayHelloResponse">
        <part name="greeting" type="xsd:string"/>
    </message>
 
    <!-- 服务实现绑定定义 -->
    <binding type="tns:HelloWorldPortType" name="HelloWorldSoapBinding">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="sayHello">
            <soap:operation soapAction=""/>
            <input>
                <soap:body use="literal"/>
            </input>
            <output>
                <soap:body use="literal"/>
            </output>
        </operation>
    </binding>
 
</definitions>

详细简介参考:WebService——WSDL详解-CSDN博客

15.4.3 SOAP协议

SOAP为建立Web服务和服务请求之间的通信提供支持。

SOAP是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议。
 
4个部分组成:
SOAP封装(Envelop),定义了一个描述消息中的内容是什么,是谁发送的,谁应当接收并处理它以及如何处理它们的框架;
SOAP编码规则(Encoding Rules),用于表示应用程序需要使用的数据类型的实例;
SOAP RPC表示(RPC Representation)是远程过程调用和应答的协定;
SOAP绑定(Binding)是使用底层协议交换信息。
  

这4个部分都作为SOAP的一部分,作为一个整体定义的,但它们在功能上是相交的、彼此独立的。

SOAP的两个主要设计目标是简单性和可扩展性,这就意味着有一些传统消息系统或分布式对象系统中的某些性质将不是SOAP规范的一部分。例如,分布式垃圾收集(Distributed Garbage Collection)、成批传送消息、对象引用和对象激活等。

深入研究:SOAP传输协议_soap协议-CSDN博客、SOAP协议-CSDN博客

15.4.4 REST规范

REST(Representational State Tran):译是表述性状态转移,可以理解为资源表述性状态转移。

它不仅仅是一种规范,更是一种软件架构风格,不仅仅适应于互联网环境,而是一个普遍是设计理念,目的是为了让不同的软件或者应用程序在任何网络环境下都可以进行信息的互相传递。

微服务对外就是以REST API形式暴露给调用者的 。RESTful是在REST基础上增加了设计约束的一类设计的总称。

1.资源(Resource)

资源是REST架构中的核心概念,它是系统中某种具体实体或抽象概念的唯一标识。资源可以是任何事物,比如一个用户、一篇文章、一张图片等。每个资源都有自己的URI作为唯一标识符。

对资源相关数据和表述进行组合,借助URI(统一资源标识符)标识Web上的资源。但是URI和资源又不是一一映射,一个资源可以设计多个URI,但一个URI只能对应一种资源。
2.表述(Representational)

资源的表现形式称为表示,可以是一段文本、一张图片、一个JSON对象等。客户端和服务器之间通过交换表示来实现资源的传输和状态的转换。

REST中用表述描述资源在Web中某一个时间的状态。

3.状态转移(State Transfer)

REST定义中状态分为两种:应用状态和资源状态
 
应用状态是对某个时间内用户请求会话相关信息的快照,保存在客户端,由客户端自身维护,可以和缓存配合降低服务端并发请求压力。
 
资源状态在服务端保存,是对某个时间资源请求表述的快照,保证在服务端,如果一段时间内没有对资源状态进行改变,客户端对同一资源请求返回的表述一致。同时状态转移还要借助HTTP方法来实现,如GET方法、POST方法、DELETE方法等。

4.超链接
超链接是通过在页面中嵌入链接和其他资源建立联系,这里的资源可以是文本、图片、文件等。

REST是一种设计风格而不是一个架构。RESTful不可能摒弃REST而独立存在,是人们借助HTTP、JSON、URI、HTML等Web服务开发中广泛使用的标准和协议,同时使用不同的编
程语言编写客户端和服务端,通过HTTP方法操作资源状态,最后遵循REST设计原则实现的
应用程序或服务架构。

深入研究:https://zhuanlan.zhihu.com/p/99196645、REST详解_rest协议-CSDN博客、rest 设计规范_rest 规范-CSDN博客

15.5 SOA设计的标准要求

15.5.1 文档标准化

SOA服务具有平台独立的自我描述XML文档。Web服务描述语言是用于描述服务的标准语言。

15.5.2 通信协议标准

SOA服务用消息进行通信,该消息通常使用XML Schema来定义(也称作XSD,XML Schema Definition。服务间的通信也可以看作企业内部处理的关键商业文档。

15.5.3 应用程序统一登记与集成

在一个企业内部,SOA服务通过一个扮演目录列表(Directory Listing)角色的登记处(Registry)来进行维护。应用程序在登记处(Registry)寻找并调用某项服务。统一描述、定义和集成是服务登记的标准。

15.5.4 服务质量(QoS)

每项SOA服务都有一个与之相关的服务质量(Quality of Service,QoS)。QoS的一些关键元素有安全需求(例如认证和授权)、可靠通信以及谁能调用服务的策略。
在企业中,关键任务系统用来解决高级需求,例如安全性、可靠性和事务。这些需求也称作服务质量。与QoS相关的众多规范已经由一些标准化组织(Standards Bodies)提出,像W3C和OASIS(the
Organization for the Advancement of Structured Information Standards)。

1.可靠性

在典型的SOA环境中,服务消费者和服务提供者之间会有几种不同的文档在进行交换。
具有诸如“仅且仅仅传送一次(Once-and-only-once Delivery)”,
“最多传送一次(At-most-once Delivery)”,
“重复消息过滤(Duplicate Message Elimination)”,
“保证消息传送(Guaranteed Message Delivery)”等特性消息的发送和确认,
在关键任务系统(Mission-critical Systems)中变得十分重要。
WS-Reliability和WS-Reliable Messaging是两个用来解决此类问题的标准。这些标准现在都由OASIS负责。

2.安全性

Web服务安全规范用来保证消息的安全性。该规范主要包括认证交换、消息完整性和消息保密。
该规范吸引人的地方在于它借助现有的安全标准,例如,SAML(as Security Assertion Markup Language)实现Web服务消息的安全。OASIS正致力于Web服务安全规范的制定。

3.策略

服务提供者有时候会要求服务消费者与某种策略通信。例如,服务提供商可能会要求消费者提供Kerberos安全标示才能取得某项服务。这些要求被定义为策略断言(Policy Assertions),一项策略可能会包含多个断言。WS-Policy用来标准化服务消费者和服务提供者之间的策略通信。
比如安全验证策略,电信运营商手机验证码?

4.控制

在SOA中,进程是使用一组离散的服务创建的。BPEL4WS或者WSBPEL(Web Service Business Process Execution Language)是用来控制这些服务的语言。当企业着手于服务架构时,服务可以用来整合数据仓库(Silos of Data),应用程序,以及组件。整合应用意味着像异步通信,并行处理,数据转换,以及校正等进程请求必须被标准化。

5.管理

随着企业服务的增长,所使用的服务和业务进程的数量也随之增加,一个用来让系统管理员管理所有,运行在多种环境下的服务的管理系统就显得尤为重要。WSDM(Web Services for Distributed Management)的制定,使任何根据WSDM实现的服务都可以由一个WSDM适应(WSDM-compliant)的管理方案来管理。
其他的QoS特性,例如合作方之间的沟通和通信,多个服务之间的事务处理,都在WS-Coordination和WS-Transaction标准中描述,这些都是OASIS的工作。

15.6 SOA的作用

SOA普及之前,解决企业内部信息系统的问题通常是采用EAI(企业应用整合)的方式。但是

每一个应用都需要一个EAI Server来翻译(转换/适配),应用多了这就会造成几何数量的增长。
SOA凭借其松耦合的特性,使得企业可以按照模块化的方式来添加新服务或更新现有服务,以解决新的业务需要,提供选择从而可以通过不同的渠道提供服务,并可以把企业现有的或已有的应用作为服务,从而保护了现有的IT基础建设投资。
SOA对于实现企业资源共享,打破“信息孤岛”的步骤如下。
(1)把应用和资源转换成服务。
(2)把这些服务变成标准的服务,形成资源的共享。
SOA不仅仅是一个技术,而是一个软件架构。

15.7 SOA的设计原则

SOA架构中,继承了来自对象和组件设计的各种原则,如封装、自我包含等。那些保证服
务的灵活性、松散耦合和重用能力的设计原则。
结构上,服务总线是SOA的架构模式之一。关于服务,一些常见和讨论的设计原则如下。
(1)无状态。以避免服务请求者依赖于服务提供者的状态。
(2)单一实例。避免功能冗余。
(3)明确定义的接口。
(4)自包含和模块化。
(5)粗粒度。
(6)服务之间的松耦合性。
(7)重用能力。
(8)互操作性、兼容和策略声明。

15.8 SOA的设计模式

SOA的实现方式:

15.8.1 服务注册表模式

服务注册表(Service Registry)主要在SOA设计时段使用,虽然它们常常也具有运行时段的功能。注册表支持驱动SOA治理的服务合同、策略和元数据的开发、发布和管理。因此,它们提供一个主控制点,或者称为策略执行点(Policy Enforcement Point,PEP)。在这个点上,服务可以在SOA中注册和被发现
注册表可以包括有关服务和相关软件组件的配置、遵从性和约束配置文件。任何帮助注册、
发现和检索服务合同、元数据和策略的信息库、数据库、目录或其他节点都可以被认为是一个
注册表。
一个阵营是提供服务、策略和元数据注册表及信息库的纯SOA厂商,其中包括Flashline、Infravio、LogicLibrary、SOA Software和Systinet(Mercury Interactive下属分公司);
另一个阵营是SOA平台厂商,这些厂商将注册表作为集成产品套件的一个组件,厂商的集成产品套件常常包括应用服务器、门户、数据库管理系统、BI工具、集成中间件和其他功能组件。
SOA治理功能:
(1)服务注册:
服务提供者,向注册表公布他们的功能。他们公布服务合同,包括服务身份、位置、方法、绑定、配置、方案和策略等描述性属性。
实现SOA治理最有效的方法之一,是限制哪类新服务可以向主注册表发布、由谁发布以及谁批准和根据什么条件批准。此外,许多注册表包含开发向注册表发布服务可能需要的说明性服务模板。
(2)服务位置:

也就是服务应用开发者,帮助他们查询注册服务,寻找符合自身要求的服务。

注册表让服务的消费者检索服务合同。对谁可以访问注册表,以及什么服务属性通过注册表暴露的控制,是另一些有效的SOA治理手段,注册表产品一般都支持此类功能。
(3)服务绑定:
服务的消费者利用检索到的服务合同来开发代码,开发的代码将与注册的服务绑定、调用注册的服务以及与它们实现互动。开发者常常利用集成的开发环境自动将新开发的服务与不同的新协议、方案和程序间通信所需的其他接口绑在一起。工具驱动对服务绑定的控制,有效地管理服务在ESB上的互动。
注册表中的配置文件(Profle)管理:
配置文件用于说明服务目前的生命周期阶段和该阶段的相关策略。

15.8.2 企业服务总线模式

企业基于SOA实施EAI、B2B、BP吗的过程中,点对点的集成方式存在着复杂度高,可管理性差,复用度差和系统脆弱等问题。业服务总线(Enterprise Service Bus, ESB)技术在这种背景下产生,其思想是提供一种标准的软件底层架构,各种程序组件能够以服务单元的方式“插入”到该平台上运行,并且组件之间能够以标准的消息通信方式来进行交互。

定义通常如下:企业服务总线是由中间件技术实现的支持面向服务架构的基础软件平台,支持异构环境中的服务以基于消息和事件驱动模式的交互,并且具有适当的服务质量和可管理性。
ESB本质上是以中间件形式支持服务单元之间进行交互的软件平台各种程序组件以标准的方式连接在该“总线”上,并且组件之间能够以格式统一的消息通信的方式来进行交互。

交互过程:

一个典型的在ESB环境中组件之间的交互过程是:首先由服务请求者触发一次交互过程,产生一个服务请求消息,并将该消息按照ESB的要求标准化,然后标准化的消息被发送给服务总线。ESB根据请求消息中的服务名或者接口名进行目的组件查找,将消息转发至目的组件,并最终将处理结果逆向返回给服务请求者。

ESB的核心功能如下:
(1)提供位置透明性的消息路由和寻址服务。
(2)提供服务注册和命名的管理功能。
(3)支持多种消息传递范型(如请求/响应、发布/订阅等)。
(4)支持多种可以广泛使用的传输协议。
(5)支持多种数据格式及其相互转换。
(6)提供日志和监控功能。

意义:

  • ESB最大限度上解耦了组件之间的依赖关系,降低了软件系统互连的复杂性。连接在总线上的组件无需了解其他组件和应用系统的位置及交互协议,只需要向服务总线发出请求,消息即可获得所需服务。服务总线事实上实现了组件和应用系统的位置透明和协议透明。技术人员可以通过开发符合ESB标准的组件(适配器)将外部应用连接至服务总线,实现与其他系统的互操作。同时,ESB以中间件的方式,提供服务容错、负载均衡、QoS保障和可管理功能。
  • 由于采用了基于标准的互连技术,ESB使得企业内部以及外部系统之间可以很容易地进行异步或同步交互。它采用的面向服务的架构为系统提供了易扩展性和灵活性,在提高集成应用的开发效率的同时降低了成本。
  • ESB技术克服了传统应用集成技术的缺陷,能够对各种技术和应用系统提供支持,具有很强的灵活性和可扩展性,可以说是目前理想的EAI、B2B应用系统集成支撑平台。

15.8.3 案例研究--看看即可

15.8.4 微服务模式

1.微服务架构概述

1).复杂应用解耦

微服务架构将单一模块应用分解为多个微服务,同时保持总体功能不变。应用按照业务逻辑被分解为多个可管理的分支或服务,避免了复杂度的不断积累。每个服务专注于单一功能,通过良好的接口清晰表述服务边界。由于功能单一、复杂度低,小规模开发团队完全能够掌握,易于保持较高的开发效率,且易于维护。

2).独立

微服务在系统软件生命周期中是独立开发、测试及部署的。微服务具备独立的运行进程,每个微服务可进行独立开发与部署,因此在大型企业互联网系统中,当某个微服务发生变更时无需编译、部署整个系统应用。从测试角度来看,每个微服务具备独立的测试机制,测试过程中不需要建立大范围的回归测试,不用担心测试破坏系统其他功能。因此,微服务组成的系统应用具备一系列可并行的发布流程,使得开发、测试、部署更加高效,同时降低了因系统变更给生产环境造成的风险。

3).技术选型架构

微服务架构下系统应用的技术选型是去中心化的,每个开发团队可根据自身应用的业务需求发展状况选择合适的体系架构与技术,从而更方便地根据实际业务情况获得系统应用最佳解决方案,并且每个微服务功能单一、结构简单,在架构转型或技术栈升级时面临较低风险,因此系统应用不会被长期限制在某个体系架构或技术栈上。

4).容错
在传统单体应用架构下,当某一模块发生故障时,该故障极有可能在整个应用内扩散,造成全局应用系统瘫痪。然而,在微服务架构下,由于各个微服务相互独立,故障会被隔离在单个服务中,并且系统其他微服务可通过重试、平稳退化等机制实现应用层的容错,从而提高系统应用的容错性。微服务架构良好的容错机制可避免出现单个服务故障导致整个系统瘫痪的情况。
5).松耦合,易扩展
传统单体应用架构通过将整个应用完整地复制到不同节点,从而实现横向扩展。但当系统应用的不同组件在扩展需求上存在差异时,会导致系统应用的水平扩展成本很高。微服务架构中每个服务之间都是松耦合的,可以根据实际需求实现独立扩展,体现微服务架构的灵活性。

2.微服务架构模式方案

1).聚合器微服务

2).链式微服务

3).数据共享微服务

4).异步消息传递微服务

3.微服务架构面临的问题与挑战

微服务是一种软件架构演变后的新型架构风格,是系统应用开发的一种设计思想,没有固定开发模式。
常见的微服务设计模式有聚合器微服务设计模式、代理微服务设计模式(聚合器变种)、链式微服务设计模式、分支微服务设计模式(聚合器的扩展)、数据共享微服务设计模式、异步消息传递微服务设计模式等。
1)聚合器微服务
①聚合模式
在聚合器微服务中,聚合器调用多个微服务实现系统应用程序所需功能,具体有两种形式,
一种是将检索到的数据信息进行处理并直接展示;
另一种是对获取到的数据信息增加业务逻辑处理后,再进一步发布成一个新的微服务作为一个更高层次的组合微服务,相当于从服务消费者转换成服务提供者。
与普通微服务特性相同,聚合器微服务也有自己的缓存和数据库。
聚合器调用多个服务实现应用程序所需的功能。它可以是一个简单的Web页面,将检索到的数据进行处理展示。它也可以是一个更高层次的组合微服务,对检索到的数据增加业务逻辑后进一步发布成一个新的微服务,这符合DRY原则。另外,每个服务都有自己的缓存和数据库。如果聚合器是一个组合服务,那么它也有自己的缓存和数据库。聚合器可以沿X轴和Z轴独立扩展
聚合器模式:用于将来自多个微服务的数据,聚合成一个统一的响应,提供给客户端

聚合模式的核心思想:是使用一个聚合器服务(Aggregator Service),负责接收客户端请求,调用多个下游微服务获取所需数据,聚合这些数据,并返回给客户端。

客户端只需调用聚合器服务,而无需处理多个微服务的调用、和数据整合逻辑。

微服务聚合模式,适合需要综合多种数据源的应用场景,但也需要注意潜在的单点故障、和性能瓶颈问题。

微服务聚合设计模式是一种基于微服务架构的设计模式,它根据业务流程处理的需要,以一定的顺序调用依赖的多个微服务,对依赖的微服务返回的数据进行组合、加工和转换,最后以一定的形式返回给使用方。

在微服务架构中,每个服务都是独立的、可单独部署和升级的,它们之间通过轻量级的通信机制(如HTTP/RESTful API)进行通信。而聚合设计模式则通过聚合器微服务来协调和整合多个微服务的功能,以满足复杂的业务需求。

聚合器微服务通常扮演一个中心协调者的角色,它负责接收来自客户端的请求,然后根据业务需求调用相应的微服务,并将这些微服务的响应结果进行组合和处理,最后返回给客户端。聚合器微服务可以根据具体的业务逻辑实现各种聚合逻辑,例如对多个响应结果进行组合、聚合或过滤等等。

微服务聚合设计模式的一些关键步骤:

  1. 识别需要聚合的功能模块:根据业务需求,确定需要调用哪些微服务来完成特定的功能。
  2. 开发和维护独立的微服务:对于每个需要聚合的功能模块,使用独立的微服务进行开发和维护,并尽可能地保持每个服务的独立性和可扩展性。
  3. 设计聚合器微服务:设计一个聚合器微服务,该服务将调用所有需要的功能模块,并将它们的响应结果汇总成一个单一的API响应。聚合器微服务可以被视为一个路由器,它将路由所有的请求到正确的服务。
  4. 实现聚合逻辑:在聚合器微服务中实现各种聚合逻辑,例如对多个响应结果进行组合、聚合或过滤等等。这些逻辑可以根据具体的业务需求进行定制。
  5. 部署和测试:将聚合器微服务和各个功能模块微服务部署到生产环境中,并进行充分的测试以确保系统的稳定性和可靠性。


通过微服务聚合设计模式,可以实现微服务之间的松耦合和高内聚,提高系统的可扩展性和可维护性。同时,由于每个微服务都是独立的,因此可以独立地进行开发、部署和升级,从而加快开发速度并降低风险。
                        

参考:
微服务架构-聚合设计模式_微服务架构 聚合服务和飞聚合服务-CSDN博客
https://zhuanlan.zhihu.com/p/694561162
②代理模式

微服务代理设计模式(Proxy Pattern),主要用于在客户端、和微服务之间,增加一个代理层,以处理一些通用的功能。它是聚合器模式的一个变种。

代理模式的核心思想:是通过一个代理服务在客户端、和实际服务之间进行中介,这个代理服务可以处理各种横切关注点。

在这种情况下,客户端并不聚合数据,但会根据业务需求的差别调用不同的微服务。代理可以仅仅委派请求,也可以进行数据转换工作。

常见的横切点:

  • 安全验证、和授权;

  • 请求路由、和负载均衡;

  • 日志记录、和监控等

API网关是一个典型的代理模式,作为所有客户端请求的统一入口点,处理:

  • 路由:将请求路由到相应的后端服务。

  • 认证和授权:验证用户身份和权限。

  • 缓存:缓存频繁访问的数据,减少后端服务压力。

  • 日志和监控:记录请求日志和监控服务状态。

需要注意的是,代理层本身也需要高可用、和高性能的设计,以避免成为系统的瓶颈、和单点故障。

微服务代理设计模式通过引入代理服务来隐藏底层微服务的复杂性,并提供额外的功能和保护。以下是关于微服务代理设计模式的一些关键点:

  1. 隐藏复杂性:代理微服务可以隐藏底层微服务的复杂性,对外提供简单的接口,使使用者无需了解底层微服务的实现细节。
  2. 提供额外功能:代理微服务可以在底层微服务的基础上提供额外的功能,如缓存、认证、鉴权、日志等,以增强服务的功能和性能。
  3. 控制访问:代理微服务可以对外部请求进行控制和管理,例如限流、熔断、降级等,以确保底层微服务的稳定性和可靠性。
  4. 解耦微服务:代理微服务可以将底层微服务解耦,使得各个微服务之间的依赖关系更加清晰,易于维护和升级

代理模式的实现方式可以包括静态代理和动态代理
静态代理是在代码编写时显式地编写的代理类,而动态代理则是在运行时动态生成代理类。
无论哪种方式,代理对象都在客户端和目标对象之间充当了中介的角色,客户端不再直接访问目标对象,而是通过代理对象间接访问目标对象。

代理模式的应用场景
在微服务架构中,代理设计模式的应用场景广泛。
例如,在跨多个微服务进行通信时,可以使用代理微服务来统一管理请求路由、认证和授权等。
此外,代理微服务还可以作为服务网关,集中处理诸如身份验证、安全性和负载均衡等横切关注点,从而简化微服务的开发。

参考:

微服务架构-代理设计模式-CSDN博客

https://zhuanlan.zhihu.com/p/694561162

③分支模式

这种模式是聚合器模式的扩展,允许同时调用两个微服务链

分支微服务设计模式是一种用于构建大型系统的微服务架构模式,其核心思想是 将复杂的业务逻辑拆解为多个小的、相互独立的子系统,每个子系统由一个或多个微服务负责处理。

以下是分支微服务设计模式的主要特点:

  1. 解耦性高:每个分支逻辑都由单独的微服务负责处理,使得系统各个组件之间解耦,降低了系统的耦合度。这种设计模式使得每个微服务可以独立开发、测试和部署,从而提高了系统的可伸缩性和可维护性。
  2. 灵活性:由于每个微服务都是独立的,它们可以使用不同的技术栈进行开发,这使得系统更加灵活,能够适应不同的业务需求和技术环境。
  3. 快速迭代:由于每个微服务都可以独立升级和扩展,因此系统可以更快地响应业务变化和市场需求,实现快速迭代。
  4. 可靠性:每个微服务都有自己独立的数据存储和处理逻辑,因此当某个微服务出现故障时,其他微服务仍然可以正常运行,保证了系统的整体可靠性。


在分支微服务设计模式中每个微服务都负责处理特定的业务逻辑,这些业务逻辑通常根据不同的条件或参数的取值来执行不同的业务流程。这种设计模式是聚合器模式的扩展,允许同时调用两个或多个微服务链,从而支持更复杂的业务场景。

为了实现分支微服务设计模式,需要遵循一些最佳实践

如明确定义服务接口、选择合适的通信方式、选型合适的技术栈、实现数据一致性、实现自动化部署以及建立全面的监控和故障处理系统等。此外,还需要关注微服务之间的交互和协作,确保它们能够高效、可靠地协同工作。

总之,分支微服务设计模式是一种灵活、可靠且易于扩展的微服务架构模式,适用于构建大型、复杂的业务系统。通过将其应用于实际项目中,可以提高系统的可伸缩性、可维护性和可靠性,同时支持快速迭代和灵活扩展。

参考:

微服务架构-分支微服务设计模式-CSDN博客

https://zhuanlan.zhihu.com/p/694561162

2)链式微服务

以下是链式微服务设计模式的一些关键特点和实现方式:

1.服务分解:

  • 将复杂的业务逻辑拆分成多个独立的、可重用的微服务。
  • 每个服务负责完成一个具体的业务功能,如用户认证、订单处理、支付等。

2.服务链构建:

  • 根据业务逻辑的需求,将多个微服务按照特定的顺序串联起来,形成一个服务链。
  • 每个服务在链中都有一个明确的位置和职责,接收上游服务的输出,处理并产生输出传递给下游服务。

3.请求传递:

  • 客户端向链的起始服务发送请求。
  • 起始服务处理请求后,将结果传递给下一个服务,以此类推,直到链的末尾。
  • 每个服务都可以对请求进行修改或增强,然后传递给下一个服务。

4.错误处理:

  • 在服务链中,每个服务都应该具备错误处理能力。
  • 如果某个服务处理失败,它可以选择回滚自己的操作,并将错误信息传递给上游服务或客户端。
  • 也可以设置补偿机制,以确保整个服务链的数据一致性和完整性。

5.可扩展性:

  • 由于每个服务都是独立的,因此可以单独进行扩展以满足不同的负载需求。
  • 可以根据业务需求动态地添加或移除服务,而不会影响整个服务链的运行。

6.服务发现与路由:

  • 在链式微服务中,服务之间的通信通常通过服务发现与路由机制实现。
  • 服务发现机制可以帮助服务找到链中的下一个服务的位置。
  • 路由机制可以根据业务逻辑和负载均衡策略将请求路由到合适的服务实例。

7.数据共享与一致性:

  • 在服务链中,数据可能需要在多个服务之间共享。
  • 为了确保数据的一致性和完整性,可以采用分布式事务、数据补偿机制或最终一致性策略。

8.监控与日志:

  • 为了确保服务链的稳定性和可维护性,需要对每个服务进行监控和日志记录。
  • 监控可以帮助及时发现和处理服务故障,而日志记录则可以用于问题追溯和性能分析。

9.安全性与权限控制:

  • 在服务链中,每个服务都应该具备安全性保障和权限控制能力。
  • 可以采用身份验证、授权、加密等技术手段来保护服务的安全性和数据的机密性。


链式微服务设计模式适用于需要按照特定顺序处理业务逻辑的场景,如电商平台的订单处理流程、金融系统的交易处理流程等。通过合理设计和实现链式微服务,可以提高系统的可扩展性、可维护性和灵活性,满足不断变化的业务需求。

参考:

微服务架构-链式微服务设计模式_微服务 拉链结构产品设计-CSDN博客

https://zhuanlan.zhihu.com/p/694561162

3)数据共享微服务

每个微服务拥有自己的数据库,可以独立地进行数据库架构设计、部署和维护。这种是属于常规的方式,不受其他微服务的影响,具有高度的自治性。

然而,在将单体应用拆分成微服务时,可能会遇到反规范化(denormalization)的挑战,会出现部分微服务可能会共享数据库存储。对于基于微服务的应用程序而言,这是一种反模式,可以作为过渡阶段来使用,最后,再一步步转到每个服务一套数据库的模式。

在微服务架构中,数据共享是一个重要的设计考虑因素,因为不同的微服务可能需要访问或操作相同的数据集。然而,由于微服务强调服务的独立性和自治性,直接的数据共享可能会破坏这些原则。因此,需要采用一种合适的数据共享设计模式来确保微服务之间的数据一致性和可用性。

以下是几种常见的微服务数据共享设计模式:

1.数据库共享模式:

  • 在这种模式下,多个微服务可能共享同一个数据库实例或数据库集群。虽然这种方法可以实现数据共享,但它也增加了微服务之间的耦合性,违反了微服务的独立性原则。此外,当数据库架构变得复杂时,这种方法可能难以维护。

2.API Gateway模式:

  • API Gateway作为所有微服务的入口点,负责处理客户端请求并路由到相应的微服务。它也可以作为数据聚合器,从多个微服务中获取数据并将其聚合后返回给客户端。这样,API Gateway就成为了微服务之间数据共享的中介。

3.消息队列模式:

使用消息队列(如RabbitMQ、Kafka等)来实现数据共享。当某个微服务需要向其他微服务发送数据时,它可以将数据发布到消息队列中。其他微服务可以订阅这些消息,并在需要时从队列中消费数据。这种模式允许微服务以异步方式进行数据共享,降低了服务之间的耦合性。

4.事件驱动模式:

  • 在事件驱动架构中,微服务通过发布和订阅事件来进行通信和数据共享。当一个微服务发生某种事件(如数据更新)时,它会发布一个事件消息。其他微服务可以订阅这些事件,并在事件发生时执行相应的操作(如读取数据)。这种模式允许微服务在保持独立性的同时实现高效的数据共享。

5.分布式缓存模式:

  • 使用分布式缓存(如Redis、Memcached等)来缓存微服务之间的共享数据。通过缓存,微服务可以快速访问常用数据,减少了对数据库的直接访问,提高了系统的性能。同时,缓存的失效策略可以确保数据的最终一致性。

6.数据总线模式:

  • 数据总线是一个中央化的数据共享平台,它允许微服务将数据发布到总线上,并允许其他微服务从总线上订阅数据。数据总线可以处理数据的路由、分发和同步,确保了数据的一致性和可用性。然而,实现一个高效且可靠的数据总线平台可能需要较大的技术投入。


在选择数据共享设计模式时,需要根据具体的业务需求、技术栈和团队能力进行权衡。同时,还需要考虑数据的一致性、可用性、安全性和性能等因素。在实际应用中,可能需要根据具体情况组合使用多种设计模式来实现高效的数据共享。

4)异步消息传递微服务

异步消息允许服务发送消息后立即返回,而不需要等待消息被处理完毕,这种异步方式可以大大提高系统的处理速度、和吞吐量。

微服务架构,通常涉及多个服务之间的相互调用,如果通信只是在少数几个微服务之间进行,那么同步通信就很好。

在某些情况下,用户不需要立即得到服务的响应,而是可以在后台异步处理。

例如:当用户提交一个表单时,不需要立即等待数据的处理结果,可以在后台处理并通过消息通知用户结果,从而提高用户体验。
这意味着:发送方可以继续处理其他请求,而不会被阻塞等待响应。
而且,服务之间的通信变得更加松散,也不再需要强依赖于对方。

微服务异步消息传递设计模式是一种在微服务架构中常用的通信方式,它允许服务之间以异步的方式传递消息和数据,从而实现解耦、提高系统的可扩展性和容错性。下面将详细解释微服务异步消息传递设计模式的概念、特点和实现方式。

概念
在微服务架构中,服务之间通常通过API接口(如RESTful API)进行同步通信。然而,在某些场景下,同步通信可能不是最佳选择,因为它会导致服务之间的紧密耦合和潜在的阻塞问题。异步消息传递设计模式通过引入消息队列或事件总线等中间件,实现服务之间的异步通信。

特点

  1. 解耦:异步消息传递使得服务之间可以独立运行,无需等待对方响应。这有助于降低服务之间的耦合度,提高系统的可扩展性。
  2. 提高性能:由于服务之间不需要实时等待响应,因此可以并行处理多个请求,从而提高系统的吞吐量和响应速度。
  3. 容错性:当某个服务出现故障时,消息队列或事件总线可以缓存待处理的消息,待服务恢复后再继续处理。这有助于增强系统的容错性和可用性。
  4. 灵活性:异步消息传递支持多种消息格式和通信协议,可以根据业务需求选择合适的通信方式。

实现方式
1.消息队列:消息队列是一种常用的异步通信中间件,它允许服务将消息发送到队列中,并由其他服务从队列中消费这些消息。常见的消息队列系统有RabbitMQ、Kafka等。

  • 生产者:发送消息到队列的服务,也称为消息发布者。
  • 消费者:从队列中接收并处理消息的服务,也称为消息订阅者。
  • 队列:存储消息的缓冲区,可以根据业务需求设置不同的存储策略(如持久化、优先级等)。

2.事件总线:事件总线是一种集中式的事件发布和订阅系统,它允许服务发布事件并通知所有对该事件感兴趣的服务。事件总线通常使用发布/订阅模式进行通信。

  • 发布者:发布事件的服务,将事件发送到事件总线。
  • 订阅者:订阅特定事件的服务,当事件发生时从事件总线接收通知。
  • 事件总线:负责事件的发布、订阅和分发。

使用场景

  1. 后台任务处理:如批量数据处理、发送邮件等耗时操作,可以通过异步消息传递将这些任务交给后台服务处理,避免阻塞主服务。
  2. 跨服务通信:当服务之间的通信需要解耦或提高性能时,可以使用异步消息传递进行通信。
  3. 事件驱动架构:在事件驱动架构中,服务之间通过发布和订阅事件进行通信。异步消息传递是实现事件驱动架构的重要手段之一。

总结
微服务异步消息传递设计模式通过引入消息队列或事件总线等中间件,实现服务之间的异步通信。它具有解耦、提高性能和容错性等特点,适用于多种场景下的微服务通信需求。

参考:

https://zhuanlan.zhihu.com/p/694561162

微服务架构-异步消息传递设计模式-CSDN博客

15.9构建SOA架构时应该注意的问题

15.9.1原有系统架构中的集成需求

当SOA架构师分析原有系统中的集成需求时,不应该只限定为基于组件构建的已有应用程序的集成,真正的集成比这要宽泛得多。在分析和评估一个已有系统体系结构的集成需求时,必须考虑一些更加具体的集成的类型,这主要包括以下几个方面:
应用程序集成的需求,终端用户界面集成的需求,流程集成的需求以及已有系统信息集成的需求。
  
当SOA架构师分析和评估现有系统中所有可能的集成需求时,可以发现实际上所有集成方式在任何种类的企业中都有一定程度的体现。针对不同的企业类型,这些集成方式可能是简化的,或者没有明确地进行定义的。因而,SOA架构师在着手设计新的体系结构框架时,必须要全面地考虑所有可能的集成需求。
例如,在一些类型的企业系统环境中可能只有很少的数据源类型,因此,系统中对消息集成的需求就可能会很简单。但在一些特定的系统中,例如航运系统中的电子数据交换(Electronic Data Interchange,EDI)系统,会有大量的电子数据交换处理的需求,因此也就会存在很多不同的数据源类型,在这种情况下整个系统对于消息数据的集成需求就会比较复杂。因此,如果SOA架构师希望所构建的系统架构能够随着企业的发展和变化成功地继续得以保持,则整个系统构架中的集成功能就应该由服务提供,而不是由特定的应用程序来完成。

15.9.2服务粒度的控制以及无状态服务的设计

当SOA架构师构建一个企业级的SOA系统架构时,关于系统中最重要的元素,也就是SOA系统中服务的构建有两点需要特别注意的地方:首先是对于服务粒度的控制,另外就是对于无状态服务的设计。

1.服务粒度的控制

简单来说就是粒度大小适中,根据实际项目来平衡控制粒度大小。

2.无状态服务的设计

SOA系统架构中的具体服务应该都是独立的、自包含的请求,在实现这些服务的时候不
需要前一个请求的状态,也就是说服务不应该依赖于其他服务的上下文和状态,即SOA架构
中的服务应该是无状态的服务。

15.10 SOA实施的过程 ---简单看看

1.尽量选择能进行全局规划的方案
2.选择时充分考虑企业自身的需求
3.从平台、实施等技术方面进行考察

15.10.1选择SOA解决方案

在实施SOA之前,选择最佳的解决方案,是保证SOA实施成功的前提条件。总体来说,
必须从以下三个方面进行选择。

1.尽量选择能进行全局规划的方案

SOA的实施,有很大的技术因素在其中,作为用户来讲,既需要选择适当的工具,还需要有专业的技术人才
 
作为用户,实施SOA,
首先要对自己的系统做全面的评估,要了解自己已有的系统能用多少,有多少需要改造,
还需要上哪些新的系统,自己将来的系统该如何满足自己的需求,自己可能为这个新的系统投入的资本大概有多少等。
总之,要有整体的规划,这也是实施SOA最为基础的一步。
其次,要选择适合的工具和技术。上什么系统,建什么平台,先改造哪个系统,需要一步一步来,而在这个过程中,所选择的产品也必然有所不同,一定要做到心中有数。
最后,就是开发的过程了,开发对于大多数的用户来说,也是一个边学习、边实践的过程。

2.选择时充分考虑企业自身的需求

评估SOA项目的方式与评估传统软件项目有所不同,SOA在企业范围内通过各种渠道表现自己的优势。SOA通过共享服务来优化业务流程,使全面创新成为可能,其“价值机会”远远超过了传统的软件项目。要建立强大的业务实例,通过SOA实现业务创新是一个重要的分水岭。必须认识到,用于构建SOA项目的前期投资将产生巨大效益,这些好处会随着时间的推移越来越明显地表现出来。
SOA具体实施的进度和资金投入一方面取决于企业对IT应用的沉淀,另一方面取决于实行SOA的目标层次。

3.从平台、实施等技术方面进行考察

用户在选择SOA产品和技术时,应该从平台的选择、实施方法与途径、供应商的选择三个方面进行考量。
在选择软件平台时,用户首先要考虑的是平台的开放性和对标准的支持
在实施方法与途径方面,以往的成功经验总结有6方面:业务战略和流程、基础架构、构建模块、项目和应用、成本和效益以及规划和管理
在实施SOA时,CIO应该综合考虑这6方面的因素。
SOA的实施涉及整个企业的IT系统以及业务流程的调整和改变,离不开相应的咨询和专业服务。因此,在选择供应商时,首先要看它的产品是否符合企业的实际需求、是否已经有很多成功的应用案例、现有客户对它的评价如何;其次,还要仔细考察供应商的专业服务能力,是否能够帮助用户分析企业IT现状,提出建设性的意见。

15.10.2业务流程分析

1.建立服务模型

1).自顶向下分析法
自上而下的领域分解方式从业务着手进行分析,选择端到端的业务流程进行逐层分解至业务活动,并对其间涉及的业务活动和业务对象进行变化分析。
 
业务组件模型是业务领域分解的输入之一。业务组件模型是一种业务咨询和转型的工具,
它根据业务职责、职责间的关系等因素,将业务细分为业务领域、业务执行层次和业务组件
 
由于企业内部和外部环境的不同,每个业务组件在成本、投资和竞争力等方面不尽相同。因此,
每个业务组件在企业发展的过程中战略职责和演化的路径也是不同的。由于角度的不同,就形
成了所谓的业务组件的“热点视图”。对于面向服务的分析和设计,业务组件模型提供了进行服
务划分的依据,而且这种划分的方法可以平滑地从业务视图细化到服务视图。
  
端到端的业务流程是业务领域分解的另一个输入。将业务流程分解成子流程或者业务活动,
逐级进行,直到每个业务活动都是具备业务含义的最小单元。流程分解得到的业务活动树上的
每一个节点,都是服务的候选者,构成了服务候选者组合。业务领域分解可以帮助发现主要的
服务候选者,加上自下而上和中间对齐方式发现的新服务候选者,最终会构成一个服务候选者
列表。在SOA的方法中,服务是业务组件间的契约,因此将服务候选者划分到业务组件,是
服务分析中不可或缺的一步。服务候选者列表经过业务组件的划分,会最终形成层次化的服务
目录。
变化分析的目的是将业务领域中易变的部分和稳定的部分区分开来,通过将易变的业务逻辑及相关的业务规则剥离出来,保证未来的变化不会破坏现有设计,从而提升架构应对变化的能力。变化分析可能会从未来需求的分析中发现一些新的服务候选者,这些服务候选者需要加入到服务候选者目录中。
2)业务目标分析法
通过关键性能指标分析来验证已有服务候选者以及发现遗漏的服务候选者,这也可以称为
“目标服务建模”。它的思想是这样的:从企业的业务目标出发,目标分解为子目标,子目标再
分派给相关的服务来实现,这样就形成了一棵“目标服务树”,处于叶子节点上的每个服务都能
回溯到具体的业务目标。第一步的工作必须基于之前对企业关键性能指标的分析之上
3)自底向上分析法
自底而上方式的目的是利用已有资产来实现服务,已有资产包括已有系统、套装或定制应用、行业规范或业务模型等。这也可以称为“遗留资产分析”,它的主要思想是:通过建立已有系统所具有的功能模块目录列表,可以方便地发现那些在不同的系统中被重复实现的功能模块以及可以复用的功能模块,从而将这些模块包装成服务发布出来
遗留资产分析的来源一般是原有系统的分析和设计文档,遗留系统分析的结果是可以重用的服务列表。
  
通过对已有资产的业务功能、技术平台、架构及实现方式的分析,除了能够验证服务候选者或者发现新的服务候选者,还能够通过分析已有系统、套装或定制应用的技术局限性,尽早验证服务实现决策的可行性,为服务实现决策提供重要的依据。

2.建立业务流程

1)建立业务对象

业务对象是对数据进行检索和处理的组件,是简单的真实世界的软件抽象。业务对象通常位于中间层或者业务逻辑层。
  
业务对象可以在一个应用中自动地加入一个特定的功能来获得增值效应,使知识重用变为可能。例如,如果要开发一个包含多货币处理的应用,可以选择使用一个已经开发完成的,包含所有多货币处理功能的业务对象来开始你的开发,使开发工作量极大地减少。
业务对象的分类如下。
(1)实体业务对象。表达了一个人、地点、事物或者概念。根据业务中的名词从业务域中提取,如客户、订单和物品。
(2)过程业务对象。表达应用程序中业务处理过程或者工作流程任务,通常依赖于实体业务对象,是业务的动词。
(3)事件业务对象,表达应用程序中由于系统的一些操作造成或产生的一些事件。
  
通过对业务对象的抽象,你的架构系统将体现更高的架构体系高度。
2)建立服务接口

在实现SOA解决方案的上下文中,服务接口的结构非常重要。

在构建SOA的过程中,将无状态接口视为最好的选择。无状态接口可以方便地供很多服务使用者应用程序重用,可以采用最适合每个应用程序的方式管理状态。传入操作的请求消息应该包含完成该操作所必要的所有信息,而不受到调用其他接口操作的顺序的影响。
3)建立业务流程

流程是指定的活动顺序,包含明确确定的用于提供业务值的输入和输出。例如,技术文档
搜索流程从Web页面提取客户的搜索请求,并生成可选的文档列表。
对流程进行建模应当确保捕获的相关信息的一致性及完整性,以便业务分析员及开发人员
能够理解模型所捕获的业务需求。在建模过程中,除了正常操作以外,标准流程的其他操作和
异常必须获取,具有不同领域兴趣的专职人员和专家可以构建适合于大范围业务对象的流程模
型。例如,分析员需要对流程有高度的见解以做出战略性决策,并进行诸如仿真之类的流程分
析;开发人员将流程模型作为输入来实现解决方案。
分析员基于从业务需求所有者中所收集的需求构建业务流程(Business Process,BP)模型。
通过使用适当的工具,例如PowerPoint、Spreadsheets、IBM Rational Requisite Pro或者其他任意
工具组合,并且在适当的时候(可能是流程建模工具本身)来收集这些需求,分析员将这些需
求及对现有流程的分析作为构建模型的输入条件,现有的流程模型用于对其进行分析或者通过
修改现有的模型来创建新的流程模型,而不用从头重新创建。
通过将BP分成子流程开始建模过程。随后是对感兴趣的各子流程进行分析以确定组件、
服务、输入输出数据、策略及测量。通过使用WebSphere Business Integration Modeler软件工具
(Business Integration Modeler)将这些元素编码到BP模型中。
使用一种名为流程元素的建模构件来定义BP段,将其设计为可复用。流程元素是一种定
义流程段的构件资产,在BP模型中,这种流程段被设计为可复用的构件来管理。它们将已建
立的一系列任务、决策、对数据对象的引用、策略、角色及测试合并起来,例如,登录流程元
素包含一系列活动,登录证书数据以及完成用户登录过程的登录规则。
这些流程元素表示可接受的操作行为,类似的需求也可复用它们。例如,作为子流程模型
可检验并为购物篮中的商品定价。
BP分析员与BP所有者及领域专家协作来获取所需的全部信息以构建BP模型。例如,分
析员使用适当的工具收集角色、任务、序列信息、资源、数据、叙述和需求等,并将它们作为
构建BP模型的输入内容。通过在Business Integration Modeler中创建流程模型,业务分析员所
获取的信息可以轻易地导出给工作流开发人员,使他们在Application Developer工具中使用这些
信息。
为流程建模的任务包括定义业务流程的细节,并为所有数据、资源及流程中所使用的其他
元素建模。业务流程包含一些流程步骤,它们通过控制流相连接,这些控制流将活动与决策点
相连。决策点遵循业务规则(转换条件),使用这些业务规则来确定流程应当依照什么路线进
行。建模包括将BP分解成子流程并将所需的流程元素添加到模型中;分析员可以将现有的模
型构件(例如,服务或流程元素)用于促进并加速模型的构建。

站在巨人的肩膀上:WebService——WSDL详解-CSDN博客

https://blog.csdn.net/thinkpet/category_12398447.html

https://zhuanlan.zhihu.com/p/694561162

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/680725.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python文档生成工具库之alabaster使用详解

概要 在编写文档时,美观和易读性是两个重要的方面。Sphinx 是一个广泛使用的文档生成工具,而 Alabaster 是 Sphinx 默认的主题。alabaster 主题以其简洁优雅的设计和易用的配置选项受到广大用户的欢迎。本文将详细介绍 alabaster 库,包括其安装方法、主要特性、基本和高级功…

php质量工具系列之PHPCPD

PHPCPD 用于检测重复代码&#xff0c;直观的说就是复制粘贴再稍微改改 该工具作者已经 停止维护 安装 composer global require --dev sebastian/phpcpd执行 phpcpd --log-pmd phpcpd_result.xml ./app参数介绍 --log-pmd 将结果保存在phpcpd_result.xml 中 ./app 是phpcpd扫…

【传知代码】偏标记学习+图像分类(论文复现)

前言&#xff1a;偏标记学习&#xff0c;顾名思义&#xff0c;就是在训练数据集中&#xff0c;每个样本的标签不是完全确定的&#xff0c;而是由多个可能的标签组成的集合。这种学习范式更加贴近现实世界的场景&#xff0c;因为在很多情况下&#xff0c;我们无法为图像提供精确…

可的哥(Codigger)推出Monaco编辑器插件,提升编程体验

Monaco编辑器&#xff0c;作为业界领先的代码编辑器&#xff0c;在编程体验中发挥着不可或缺的重要作用&#xff0c;能够在多种编程语言和开发环境中表现出色&#xff0c;为开发者提供高效、便捷的编程环境。可的哥&#xff08;Codigger&#xff09;在应用商店上线Monaco编辑器…

在618集中上新,蕉下、VVC们为何押注拼多多?

编辑&#xff5c;Ray 自前两年崛起的防晒产品&#xff0c;今年依旧热度不减。 头部品牌蕉下&#xff0c;2020年入驻拼多多&#xff0c;如今年销售额已过亿元。而自去年起重点押注拼多多的时尚防晒品牌VVC&#xff0c;很快销量翻番。这两家公司&#xff0c;不约而同在618之前上…

设备巡检系统是如何实现一次操作闭环管理的

设备巡检系统通过一系列功能设计&#xff0c;实现了从任务分配到问题处理的一次操作闭环管理。以下是具体的实现方式&#xff1a; 一、多类型任务无感操作 任务识别与整合&#xff1a;系统能够自动识别各种巡检、重大危险源排查及现场检修等任务的类型和优先级&#xff0c;并…

企业全面管理解决方案:基于Java技术的ERP管理系统源码

功能模块与描述&#xff1a; ERP首页&#xff1a; 销售统计与采购统计&#xff1a;实时展示销售和采购金额的统计数据。折线图统计&#xff1a;通过图表直观展示销售和采购趋势。 采购管理&#xff1a; 采购订单管理&#xff1a;处理采购订单的搜索、新增、导出等。采购入库与退…

进程同步的基本元素

目录 临界资源 临界区 信号量机制 整形信号量 记录型信号量 AND信号量 信号量集 信号量的应用 实现进程互斥 实现前驱关系 管程机制 总结 临界资源 I/O设备属于临界资源。著名的生产者-消费者问题就是关于临界资源的争夺产生的进程同步的问题。 生产者-消费者 描…

产品经理:做好有效的客户需求分析

需求分析是产品开发过程中的重要环节&#xff0c;它直接决定了产品是否能够满足市场需求和用户期望。通过深入了解客户需求&#xff0c;产品经理可以确保产品功能的设计符合用户的实际需求&#xff0c;从而提高产品的用户满意度和市场竞争力。 一、识别用户需求 识别用户需求…

mysql用户管理知识点

1、权限表 1.1、user表 1.1.1、用户列 Host、User、Password分别表示主机名、用户名、密码 1.1.2、权限列 决定了用户的权限&#xff0c;描述了在全局范围内允许对数据和数据库进行操作。 1.1.3、安全列 安全列有6个字段&#xff0c;其中两个是ssl相关的&#xff0c;2个是x509相…

虚拟仿真实训平台如何与不同专业进行融合?

虚拟仿真实训平台根据跨专业实训教学和职业培训的不同特点&#xff0c;兼顾实训课程设计的专业性和兼容性&#xff0c;根据不同专业特性确定虚拟仿真实训教学内容&#xff0c;研发虚拟仿真实训教学资源&#xff0c;优化人才培养方案和职业培训方案&#xff0c;改革实训教学体系…

游戏陪玩系统源码线上陪玩软件开发电竞陪练小程序陪玩APP

思维导图 规则说明 支持陪玩官&#xff0c;一级和二级&#xff0c;系统配置设置的是初始化佣金&#xff0c;可以单个设置某个人的佣金比例&#xff0c;分销模块只涉及到下单交易模块&#xff0c;其他的不参与&#xff0c;邀请的用户被下单&#xff0c;即可获得收益。 理解规则…

【面试笔记】C++ 软件开发工程师,智驾研发方向(非算法)

文章目录 1. 前言2. 基础问题2.1 什么是C++中的类?如何定义和实例化一个类?2.2 请解释C++中的继承和多态性。2.3 什么是虚函数?为什么在基类中使用虚函数?2.4 解释封装、继承和多态的概念,并提供相应的代码示例。2.5 如何处理内存泄漏问题?提供一些常见的内存管理技术。2…

LabVIEW冲击响应谱分析系统

LabVIEW冲击响应谱分析系统 开发了一种基于LabVIEW开发的冲击响应谱分析系统&#xff0c;该系统主要用于分析在短时间内高量级输入力作用下装备的响应。通过改进的递归数字滤波法和样条函数法进行冲击响应谱的计算&#xff0c;实现了冲击有效持续时间的自动提取和响应谱的精准…

13.56MHz电动车NFC刷卡解锁

随着电动车市场的快速发展&#xff0c;车主对车辆的智能化和便捷性的要求也在不断提升。仪表盘作为电动车的重要组成部分&#xff0c;不仅需要提供基本的行驶信息&#xff0c;还需要具备智能交互功能。 基于13.56MHz频率的NFC&#xff08;近场通信&#xff09;技术为电动车仪表…

李国武:六西格玛绿带项目的实施过程中可能遇到哪些问题?

作为六西格玛管理体系中的中坚力量&#xff0c;绿带项目在企业的转型升级中扮演着举足轻重的角色。然而&#xff0c;在实施六西格玛绿带项目的过程中&#xff0c;企业往往会遭遇一系列挑战。具体如深圳天行健企业管理咨询公司下文所述&#xff1a; 首先&#xff0c;人才与知识的…

雷士大路灯有必要买吗?雷士、书客、孩视宝护眼落地灯实测PK!

面对市面上众多的护眼大路灯品牌&#xff0c;其中雷士、书客和孩视宝这几款大路灯受到了广泛的青睐&#xff0c;也是热度比较高的几款产品&#xff0c;正是因为这么多款大路灯&#xff0c;很多伙伴在看到文章推荐后很纠结&#xff0c;不知道如何选择&#xff0c;也有一部分伙伴…

微信小游戏性能优化解决方案全新发布

小游戏凭借其简单易上手、玩法多样、互动性强的特点&#xff0c;迅速在市场中崭露头角。MMO、ARPG、卡牌等游戏类型也纷纷入局。玩家对启动时间长、发热、加载缓慢、闪退等问题也越来越敏感。 为了突破这些性能瓶颈&#xff0c;UWA全新发布了针对微信小游戏的性能优化解决方案…

水库大坝安全监测系统打通监控数据“最后一公里”

一、概述 我国有水库8万座左右&#xff0c;其中土石坝多数&#xff0c;病险水库占水库也很多。众所周知&#xff0c;水库在防洪、兴利上具有重要的调节作用&#xff0c;如何保证水库安全&#xff0c;及合理有效的利用水资源&#xff0c;是水利建设者需要探讨的主要内容。科学技…

OpenCV学习(4.2) 图像的几何变换

1.目标 学习将不同的几何变换应用到图像上&#xff0c;如平移、旋转、仿射变换等。你会看到这些函数: cv.getPerspectiveTransform 2.缩放 缩放是调整图片的大小。 OpenCV 使用 cv.resize() 函数进行调整。可以手动指定图像的大小&#xff0c;也可以指定比例因子。可以使用不…