系统架构设计高级技能 · 面向服务架构设计理论与实践
点击进入系列文章目录
系统架构设计高级技能 · 面向服务架构设计理论与实践
- 一、SOA的相关概念
- 1.1SOA的定义
- 1.2 业务流程与业务流程执行语言
- 二、SOA的发展史
- 三、SOA与微服务的区别
- 三、SOA的参考架构
- 四、SOA的主要协议规范
- 五、SOA的设计标准要求
- 六、SOA的作用与设计原则
- 七、SOA的设计模式
- 7.1 服务注册表模式
- 7.2 企业服务总线模式(EBS)
- 7.3 微服务模式
- 7.4 微服务架构模式方案
- 7.5 微服务架构面临的问题与挑战
- 八、构建SOA架构时应该注意的问题
- 九、SOA实施的过程
一、SOA的相关概念
1.1SOA的定义
从软件的基本原理定义,可以认为SOA是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的 需接口和契约 联系起来。接口是采用中立的方式进行定义的,它应该独立与实现服务的硬件平台、操作系统和编程语言。这使得构建在各种这样的系统中的服务可以一种统一和通用的方式进行交互。
1.2 业务流程与业务流程执行语言
业务流程与业务流程执行语言(Business Process Execution Language,BPEL) 。业务流程是指为了实现某种业务目的行为所进行的流程或一系列动作。使用BPEL,用户可以通过组合、编排和协调Web服务自上而下地实现面向服务的体系结构。BPEL目前用于整合现有的Web Services,将现有的Web Service按照要求的业务流程整理成为一个新的Web Service,在这个基础上,形成一个从外界看来和单个Service一样的Service。
二、SOA的发展史
(1) 萌芽阶段 :这种广泛使用XML,允许组织定义文档的元数据,实现企业内部和企业之间的电子数据交换,规定了服务之间以及服务内部数据交换的格式和结构。
(2) 标准化阶段 :国际标准和规范 - 简单对象访问协议(Simple Objec Access Protocol,SOAP)、Web服务描述语言(Web Service Description,UDDI)。
(3) 成熟阶段 :3个重量级规范 - SCA、SDO、WS-Policy。SCA和SDO构成了SOA编程模型的基础,而WS-Policy建立了SOA组件之间安全交互的规范。
三、SOA与微服务的区别
(1) 微服务相比于SOA更加精细,微服务更多地以独立的进程的方式存在,相互之间并无影响。
(2) 微服务提供的接口方式更加通用化,例如HTTP RESTful方式,各种终端都可以调用,无关语言、平台限制。
(3) 微服务更倾向于分布式去中心化的部署方式,在互联网业务场景下更适合。
如下,SOA架构与微服务架构的对比图:
三、SOA的参考架构
IBM的Websphere业务集成参考架构是典型的以服务为中心的企业集成架构,它可划分为6大类:
(1) 业务逻辑服务(Business Logic Service)。
(2) 控制服务(Control Service)。
(3) 连接服务(Connectivity Service)。
(4) 业务创新和优化服务(Business Innovation and Optimization Service)。
(5) 开发服务(Development Service)。
(6) IT服务管理(IT Service Management)。
四、SOA的主要协议规范
如下,基于Web服务协议:
(1) UDDI协议 :统一描述、发现和集成协议。包含了服务描述与发现的标准规范,它使得商业实体能够彼此发现;定义它们怎样在Internet上相互作用,并在一个全球的注册体系架构中共享信息。
(2) Web服务描述语言(Web Service Description Language, WSDL) :WSDL是一个用来描述Web服务和说明如何与Web服务通信的XML语言。描述了Web服务的3个基本属性:
- 服务做些什么 - 服务所提供的操作(方法)。
- 如何访问服务 - 和服务交互的数据格式以及必要协议。
- 服务位于何处 - 协议相关的地址,如URL。
如下,是文档基本结构框架:
(3) SOAP协议 :SOAP是在分散或分布式的环境中交换信息的简单协议,是一个基于XML的协议。
(4) REST规范 :为了让不同的软件或者应用程序在任何网络环境下都可以进行信息的互相传递。微服务对外就是以REST API的形式暴露给调用者。RESTful即REST形式的,是对遵循REST设计思想同时满足设计约束的一类架构设计或应用程序的统称,这一类都可称为RESTful,可以理解为资源表述性状态转移:
- 资源 :将在互联网中一切暴露给客户端的事务都可以看做是一种资源。
- 表述 :REST中用表述描述资源在Web中某一个时间的状态。
- 状态转移 :分为两种,
应用状态 - 对某个时间内用户请求会话相关信息的快照,保存在客户端。
资源状态 - 在服务端保存,是对某个时间资源请求表述的快照。 - 超链接 : 通过在页面中嵌入链接和其他资源建立联系。
五、SOA的设计标准要求
(1) 文档标准化。
SOA服务具有平台独立的自我描述XML文档。Web服务描述语言是用于描述服务的标准语言。
(2) 通信协议标准。
SOA服务用消息进行通信,该消息通常使用XML Schema来定义(也称作XML schema Definition,XSD)。
(3) 应用程序统一登记与集成。
在一个企业内部,SOA服务通过一个扮演目录列表(Director Listing)角色的登记(Registry)来进行维护。应用程序在登记处(Registry)寻找并调用某项服务。统一描述、定义和集成是服务登记的标准。
(4) 服务质量(Qos)。主要包括:
- 可靠性:服务消费者和服务提供者之间传输文档时的传输特性(且仅仅传送一次、最多传送一次、重复消息过滤、保证消息传送)
- 安全性:Web服务安全规范用来保证消息的安全性。
- 策略:服务提供者有时候会要求服务消费者与某种策略通信。例如,服务提供商可能会要求消费者提供Kerberos安全标示才能取得某项服务。
- 控制:在SOA中,进程是使用一组离散的服务创建的。BPEL4WS或者WSBPEL(Web Service Business Process Execution Language)是用来控制这些服务的语言。
- 管理:针对运行在多种环境下的所有服务,必须有一个统一管理系统,以便系统管理员能够有效管理。任何根据WSDM实现的服务都可以由一个WSDM适应(WSDM-companyliant)的管理方案来管理。
六、SOA的作用与设计原则
(1) SOA的主要作用:打破信息孤岛,把应用和资源转换成服务。以及把这些服务变成标准的服务,形成资源的共享。
(2) SOA的设计原则 主要有:
- 无状态 。
以避免服务请求者依赖于服务提供者的状态。 - 单一实例 。
以高内聚的实现方法,来避免功能冗余。 - 明确定义的接口 。
服务的接口由WSDL定义,用于指明服务的公共接口与其内部专用实现之间的界限。 - 自包含和模块化 。
服务封装了那些在业务上稳定、重复出现的活动和组件,实现服务的功能实体是完全独立自主的,独立进行部署、版本控制、自我管理和恢复。 - 粗粒度 。
服务数量不应该太大,依靠消息交互而不是远程过程调用(Remote Procedure Call,RPC),通常消息量较大,但是服务之间的交互频度较低。 - 服务之间的松耦合性 。
服务使用者看到的是服务的接口,其位置、实现技术和当前状态等对使用者是不可见的,服务私有数据对服务使用者是不可见的。 - 互操作性、兼容和策略声明 。
为了确保服务规约的全面和明确,利用策略来定义可配置的互操作语义,来描述特定服务的期望、控制其行为。利用策略声明确保服务期望和语义兼容性方面的完整和明确。
七、SOA的设计模式
7.1 服务注册表模式
服务注册表支持驱动SOA治理的服务合同、策略和元数据的开发、发布和管理。
(1) 服务注册 :应用开发者,也叫服务提供者,向注册表公布它们的功能。
(2) 服务位置 :也就是服务应用的开发者,帮助他们查询注册服务,寻找符合自身要求的服务。
(3) 服务绑定 :服务的消费者利用检索到的服务合同来开发代码,开发的代码与注册的服务绑定、调用注册的服务以及它们实现互动。
7.2 企业服务总线模式(EBS)
企业服务总线模式提供一种标准的软件底层架构,各种程序组件能够以服务单元的方式“插入”到该平台上运行,并且组件之间能够以标准的消息通信方式来进行交互。其核心功能如下:
(1)提供位置透明性的消息路由和寻址服务。程序组件之间无须关注对方的路由和寻址。
(2)提供服务注册和命名的管理功能。
(3)支持多种消息传递规范(如请求 / 响应、发布订阅)。
(4)支持多种可以广泛使用的传输协议。
(5)支持多种数据格式及其相互转换。
(6)提供日志和监控功能。
如下,EBS示意图 :
7.3 微服务模式
微服务架构 将 一个大型的单个应用或服务拆分成多个微服务,可扩展单个组件而不是整个应用程序堆栈,从而满足服务等级协议。微服务架构围绕业务领域将服务进行拆分,每个服务可以独立进行开发、管理和迭代,彼此之间使用统一接口进行交流,实现了在分散组件中的部署、管理与服务功能,使产品交付变得更加简单,从而达到有效拆分应用,实现敏捷开发与部署的目的。 微服务模式的特点如下:
(1) 复杂应用解耦 :微服务架构将单一模块应用分解为多个微服务,同时保持总体功能不变。
(2) 独立 :微服务在系统软件生命周期中是独立开发、测试及部署的。
(3) 技术选型灵活 :微服务架构下系统应用的技术选型是去中心化的,每个开发团队可根据自身应用的业务需求发展状况选择合适的体系架构与技术。
(4) 容错 :各个微服务相互独立,故障会被隔离在单个服务中,并且系统其他微服务可以通过重试、平稳退化等机制实现应用层的容错,从而提高系统应用的容错性。
(5) 松耦合,易扩展 :微服务架构中每个服务之间都是松耦合的,可以根据实际需求实现独立扩展,体现微服务架构的灵活性。单体应用架构与微服务架构的,示意图如下:
7.4 微服务架构模式方案
微服务架构模式 方案主要包括:
(1) 聚合器微服务 :聚合器充当流程指挥者,调用多个微服务实现系统应用程序所需功能。
(2) 链式微服务 :客户端或服务器在收到请求后,会发生多个服务间的嵌套递归调用,返回经过处理的响应。
(3) 数据共享微服务 :该模式适用于在单体架构应用到微服务架构的过渡阶段,服务之间允许存在强耦合关系,例如存在多个微服务共享缓存与数据库存储的现象。
(4) 异步消息传递微服务 :对于一些不必要以同步方式运行的业务逻辑,可以使用消息队列代替REST实现请求、响应,加快服务调用的响应速度。
如下,单体架构与微服务架构:
7.5 微服务架构面临的问题与挑战
(1) 服务发现与服务调用链跟踪变得困难。
(2) 很难实现传统数据库的强一致性,转而追求最终一致性。
八、构建SOA架构时应该注意的问题
(1) 原有系统架构中的集成需求 包括:应用程序集成的需求、终端用户界面集成的需求、流程集成的需求以及已有系统信息集成的需求。
(2) 服务粒度的控制以及无状态服务的设计 的表述如下:
- 服务粒度的控制 :对于将暴露在整个系统外部的服务推荐使用粗粒度的接口,而相对较细粒度的服务接口通常用于企业系统架构的内部。
- 无状态服务的设计 :SOA系统架构中的具体服务应该都是独自的、自包含的请求,在实现这些服务的时候不需要前一个请求的状态,也就是说服务不应该依赖于其他服务的上下文和状态,即SOA架构中的服务应该是无状态的服务。
九、SOA实施的过程
(1) 选择SOA解决方案 主要从以下3个方面进行:
- 尽量选择能进行全局规划的方案。
- 选择时充分考虑企业自身的需求。
- 从平台、实施等技术方面进行考察。
(2) 业务流程分析 主要关注:
- 建立服务模型:
自顶向下分解法、业务目标分析法、自底向上分析法。 - 建立业务流程:
建立业务对象(实体、过程、事件等业务对象)、建立服务接口、建立服务流程。
点击进入系列文章目录
相关文章:

系统架构设计高级技能 · 面向服务架构设计理论与实践
点击进入系列文章目录 系统架构设计高级技能 面向服务架构设计理论与实践 一、SOA的相关概念1.1SOA的定义1.2 业务流程与业务流程执行语言 二、SOA的发展史三、SOA与微服务的区别三、SOA的参考架构四、SOA的主要协议规范五、SOA的设计标准要求六、SOA的作用与设计原则七、SOA的…...

QT注册界面练习(信号与槽实现页面跳转)
一、注册界面练习思路以及具体代码 在完成注册页面搭建的前提下,通过信号与槽机制实现多组件之间的相互通信,实现页面跳转。 基本步骤: 首先,将注册页面的登录按钮与成功登陆信号绑定,当用户名与密码均匹配时…...

MySQL从入门到精通【进阶篇】之 主从复制详解
文章目录 0.前言1. 主从复制简介2. 主从复制的工作流程主从复制过程中的日志文件作用(Binary Log)和中继日志(Relay Log) 3. MySQL主从复制的配置4. 参考资料 0.前言 MySQL的主从复制和读写分离是数据库领域的基本概念࿰…...

vue使用qrcodejs2生成二维码
目录 概要 构建展示的vue组件qrcode.vue 组件的使用 概要 项目中用到需要展示二维码的样式,想到了qrcode 例如: 前提:安装包 npm install qrcodejs2 --save 构建展示的vue组件qrcode.vue <template><div style"width: …...

python注释
任何编程语言都少不了注释,Python也不例外,以下是Python注释的具体用法: 单行注释 Python编程语言的单行注释常以#开头,单行注释可以作为单独的一行放在被注释代码行之上,也可以放在语句或者表达式之后。 实例&…...

update-alternatives详解
1.功能作用 update-alternatives是dpkg的实用工具,用来维护系统命令的符号链接,以决定系统默认使用什么命令。 在Debian系统中,我们可能会同时安装有很多功能类似的程序和可选配置,如Web浏览器程序(firefox,konquero…...

JavaScript 编写更好的条件语句
在任何编程语言中,代码需要根据不同的条件在给定的输入中做不同的决定和执行相应的动作。 例如,在一个游戏中,如果玩家生命点为0,游戏结束。在天气应用中,如果在早上被查看,显示一个日出图片,如…...

聊聊PBE算法
序 本文主要研究一下PBE算法 PBE PBE即Password Based Encryption,基于口令的加密,它是一种组合算法,即一般是哈希对称算法,比如PBEWithMD5AndDES,就是用MD5做哈希,用DES做加解密,而其密钥则…...

用MFC打开外部程序
在MFC(Microsoft Foundation Classes)中,你可以使用ShellExecute函数来打开Notepad并加载指定的文件。ShellExecute函数是Windows API的一部分,它可以执行与操作系统相关的操作,例如打开文件、运行程序等。 以下是在M…...

基于全新电脑环境安装pytorch的GPU版本
前言: 距离第一次安装深度学习的GPU环境已经过去了4年多(当时TensorFlow特别麻烦),现在发现安装pytorch的GPU版本还是很简单方便的,流程记录如下。 安装步骤: 步骤一:官网下载Anaconda Free…...

[当前就业]2023年8月25日-计算机视觉就业现状分析
计算机视觉就业现状分析 前言:超越YOLO:计算机视觉市场蓬勃发展 如今,YOLO(You Only Look Once)新版本的发布周期很快,每次迭代的性能都优于其前身。每 3 到 4 个月就会推出一个升级版 YOLO 变体…...

虚拟化技术原理
计算虚拟化 介绍 把物理主机上物理资源(CPU,内存,IO外设),通过虚拟化层抽象成超量、等量的逻辑资源(虚拟CPU,虚拟内存,虚拟IO设备),然后重新组合形成新的虚…...

opencv-答题卡识别判卷
#导入工具包 import numpy as np import argparse import imutils import cv2# 设置参数 ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", required=True,help="path to the input image") args = vars(ap.parse_args())# 正确…...

【Linux】基础IO
目录 一、回顾C语言文件操作二、文件系统调用接口1. open2.write3.read 三、文件描述符四、重定向1.输出重定向2.输入重定向 五、dup2 一、回顾C语言文件操作 1 #include<stdio.h>2 #include<stdlib.h>3 4 #define LOG "log.txt"5 6 int main()7 {8 //…...

【Go 基础篇】深入探索:Go语言中的二维数组
在计算机编程中,数组是一种基本的数据结构,用于存储相同类型的元素。而二维数组作为数组的一种扩展,允许我们以类似表格的方式存储和处理数据。在Go语言中,二维数组是一个重要的概念,本文将深入探讨Go语言中的二维数组…...

IntelliJ IDEA 2023.2.1使用Git时弹出“使用访问令牌登录”问题解决
这里写目录标题 一、内网Git环境GitLabGogsGitea 二、外网Git环境GitHubGitee 升级为IntelliJ IDEA 2023.2.1后,使用Git时弹出“使用访问令牌登录”的窗口,习惯使用Git帐号密码登录的用户,面对这个突如其来的弹窗真的很懵。 一、内网Git环境 …...

前端开发学习路线
无前端基础学习路线: B站免费视频1 B站免费视频2 有HTML、CSS、JavaScript基础,可直接通过以上视频中Vue2Vue3中实战项目学习Vue。...

1、英飞凌-AURIX-TC297简介
目录 TC297简介TC297特点:系统优势最具创新性的安全应用场景 printf("欢迎关注公众号:Kevin的学习站/车载嵌入式探索者,博主建立了一个车规级开发交流群, 感兴趣的朋友可以关注公众号,加个人WX:_kevin…...

Android 音频框架 基于android 12
文章目录 前言音频服务audioserver音频数据链路hal 提供什么样的作用 前言 Android 的音频是一个相当复杂的部分。从应用到框架、hal、kernel、最后到硬件,每个部分的知识点都相当的多。而android 这部分代码在版本之间改动很大、其中充斥着各种workaround的处理&a…...

项目实践:类平面抓取点计算(占位,后面补充)
文章目录 文章目录:3D视觉个人学习目录微信:dhlddxB站: Non-Stop_...

中央空调秒变智能 青岛中弘P15面板式空调网关初体验
在智能家居逐步渗透进千家万户的今天,如何将中央空调融入到智能化场景,以实现场景联动、提升家居生活的智能化和科技化程度,中弘给出了新的答案。本期智哪儿就带大家测评一下青岛中弘P15面板式空调网关,一起看看它的价值所在。 高…...

vue create -p dcloudio/uni-preset-vue my-project创建文件报错443
因为使用vue3viteuniappvant4报错,uniapp暂不支持vant4,所以所用vue2uniappvant2 下载uni-preset-vue-master 放到E:\Auniapp\uni-preset-vue-master 在终端命令行创建uniapp vue create -p E:\Auniapp\uni-preset-vue-master my-project...

本地电脑搭建Plex私人影音云盘教程,内网穿透实现远程访问
文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语6 总结 1.前言 用手机或者平板电脑看视频,已经算是生活中稀松平常的场景了,特…...

CI/CD 持续集成 持续交付
CI(Continuous integration)持续集成 参考:https://www.jianshu.com/p/2132949ff84a 持续集成是指多名开发者在开发不同功能代码的过程当中,可以频繁的将代码行合并到一起并切相互不影响工作。 持续集成的目的,是让…...

《Go 语言第一课》课程学习笔记(十一)
控制结构 if 的“快乐路径”原则 针对程序的分支结构,Go 提供了 if 和 switch-case 两种语句形式;而针对循环结构,Go 只保留了 for 这一种循环语句形式。 if 语句 if 语句是 Go 语言中提供的一种分支控制结构,它也是 Go 中最常…...

C++--完全背包问题
1.【模板】完全背包_牛客题霸_牛客网 你有一个背包,最多能容纳的体积是V。 现在有n种物品,每种物品有任意多个,第i种物品的体积为vivi ,价值为wiwi。 (1)求这个背包至多能装多大价值的物品? ࿰…...

显示本地 IP 地址和相应的 QR 码,方便用户共享和访问网络信息
这段代码使用了 wxPython、socket、qrcode 和 PIL(Python Imaging Library)模块来生成一个具有本地 IP 地址和相应 QR 码的窗口应用程序。 C:\pythoncode\new\showipgenqrcode.py 让我们逐行解释代码的功能: import wx:导入 wx…...

为什么建议同时学多门编程语言
晨读一本名叫《4点起床》的书,书中有一段描述与最近学习编制语言时自己的感受完全一致。算是一个小经验,分享给大家。 书中有一章的标题为《同时学六国语言记起来比较快》,其中有两段描述如下: 为什么我推荐大家同时学不同的语言…...

langchain agent
zero-shot-react-description 代码 from langchain.agents import initialize_agent from langchain.llms import OpenAI from langchain.tools import BaseTool import os os.environ[OPENAI_API_KEY]"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"# 搜索…...

Zabbix下载安装及SNMP Get使用
帮助文档:6. Zabbix Appliance 一、zabbix下载安装 1、获取Zabbix Appliance镜像 Download Zabbix appliance 2、使用该镜像创建虚拟机 3、打开虚拟机控制台自动安装,等待安装完成即可 默认配置 系统/数据库:root:zabbix Zabbix 前端&am…...