十一、SOA(SOA的具体设计模式)
我们现在深入学习SOA的具体设计模式。SOA架构中的设计模式主要是指导服务如何设计、实现、部署和管理,确保服务的松耦合、高可用性、扩展性和复用性。SOA常见的设计模式可以分为以下几类:
1. 服务层次设计模式
1.1. 基础服务(Fundamental Service)
基础服务提供核心的功能,通常是企业的基本业务能力。例如,订单处理服务、客户管理服务等。这些服务是面向具体业务逻辑的,通常不会直接与用户交互。
- 示例:订单服务(Order Service)提供下单、订单查询、订单状态更新等功能,它被多个上层应用调用。
1.2. 实体服务(Entity Service)
实体服务是对业务实体进行操作的服务,负责处理与具体业务实体(如客户、订单、产品等)相关的CRUD(创建、读取、更新、删除)操作。
- 示例:客户服务(Customer Service)负责所有与客户相关的操作,例如创建客户、更新客户信息、查询客户订单历史等。
1.3. 实用服务(Utility Service)
实用服务提供与业务无关的通用功能,如认证、日志记录、审计等。它们通常在多个业务服务中复用。
- 示例:身份验证服务(Authentication Service)为所有系统提供统一的用户认证和授权功能。
2. 服务组合设计模式
2.1. 服务编排(Service Orchestration)
服务编排是将多个独立的服务组合在一起,以实现一个复杂的业务流程。通过业务流程管理系统(BPM)或工作流引擎来定义和管理服务的执行顺序、并行处理、条件判断等。
- 示例:一个电商系统中的订单处理流程可能涉及支付服务、库存服务和物流服务。服务编排可以协调这些服务的调用,使得订单处理过程自动化。
2.2. 服务代理(Service Broker/Proxy)
服务代理模式通过代理服务来封装实际服务的调用逻辑。代理服务可以处理复杂的通信、路由、负载均衡、消息转换等功能,从而隐藏服务的实现细节。
- 示例:某个支付网关服务可能需要与多个第三方支付服务提供商交互。使用服务代理模式,客户端不需要知道每个支付提供商的接口细节,只需通过支付代理服务来完成支付操作。
3. 消息处理设计模式
3.1. 面向消息的中间件(Message-Oriented Middleware, MOM)
这种模式利用消息队列、消息总线等机制来处理异步通信,确保服务之间的松耦合和高可用性。服务之间通过消息传递进行通信,消息可以异步处理,不会阻塞调用者。
- 示例:订单服务下单后,会将消息发送到“库存更新队列”,库存服务从队列中读取消息并异步处理库存更新操作。
3.2. 事件驱动架构(Event-Driven Architecture, EDA)
在SOA中,事件驱动模式是一种常见的设计模式。服务不直接相互调用,而是通过事件通知来触发操作。事件驱动架构具有高度的松耦合性和扩展性。
- 示例:当客户下单后,系统触发“订单已创建”事件。其他服务(如库存服务、物流服务)可以订阅这个事件,并根据事件进行相应处理。
4. 服务治理设计模式
4.1. 服务注册与发现(Service Registry and Discovery)
在大型SOA系统中,服务注册与发现是关键的设计模式。服务提供者在注册中心注册其服务,服务消费者通过查询注册中心来查找和调用服务。
- 示例:使用ZooKeeper、Eureka等服务注册工具来管理和发现系统中的服务。服务提供者启动时,自动注册到服务注册中心,消费者根据服务名动态获取服务地址。
4.2. 服务版本控制(Service Versioning)
服务版本控制是确保在SOA架构中不同版本的服务能够共存,以支持向后兼容性和灵活的服务演进。
- 示例:一个订单服务的API可能会存在多个版本(如v1、v2),客户端可以选择调用哪个版本,旧版本的API可以继续支持,而新版本可以提供增强的功能。
4.3. 服务监控和日志管理
为了确保服务的稳定运行,需要对每个服务进行监控和日志管理。服务监控能够提供服务性能、可用性等方面的实时信息,而日志管理可以帮助开发团队进行调试和分析。
- 示例:使用Prometheus、ELK(Elasticsearch, Logstash, Kibana)等工具来监控服务的健康状况,并通过日志系统分析服务的行为和错误信息。
5. 企业服务总线设计模式
**企业服务总线(ESB,Enterprise Service Bus)**是SOA架构中的一个重要组件,负责协调服务之间的通信、消息路由、协议转换等。
5.1. 路由模式(Routing Pattern)
ESB可以根据消息的内容或元数据将消息路由到不同的服务,这使得服务之间的交互更加灵活。
- 示例:根据不同客户的订单类型(普通订单或加急订单),ESB将消息路由到不同的订单处理服务。
5.2. 协议转换模式(Protocol Transformation)
ESB可以实现不同通信协议之间的转换,例如将基于HTTP的请求转换为消息队列服务。
- 示例:客户端通过HTTP发送请求,ESB将其转换为JMS消息发送到后台处理服务。
5.3. 消息增强(Message Enrichment)
ESB可以在消息传输过程中,添加额外的信息来丰富消息内容,便于服务处理。
- 示例:在订单消息被传递到物流服务之前,ESB可以从用户数据库中获取用户的位置信息并添加到消息中。
总结
SOA架构设计模式提供了多种解决方案,帮助架构师在设计、集成和管理分布式服务时处理各种复杂场景。这些设计模式涵盖了从服务的设计与组合到消息处理、服务治理和企业服务总线的实现。通过合理使用这些模式,企业可以构建出高效、灵活、可扩展的系统架构,支持复杂业务需求。
相关文章:
十一、SOA(SOA的具体设计模式)
我们现在深入学习SOA的具体设计模式。SOA架构中的设计模式主要是指导服务如何设计、实现、部署和管理,确保服务的松耦合、高可用性、扩展性和复用性。SOA常见的设计模式可以分为以下几类: 1. 服务层次设计模式 1.1. 基础服务(Fundamental S…...
Mybatis原理
一. 为什么要使用Mybatis? 1.1 jdbc的使用步骤 首先,在pox.xml中引入MySQl驱动的依赖 第一步, Class.forName 注册驱动 第二步,获取一个Connection。 第三步,创建一个Statement对象。 第四步,execute()方法执行SQL。execute()方…...
黑马头条day3-2 自媒体文章管理
前边还有一个 素材列表查询 没什么难度 就略过了 查询所有频道和查询自媒体文章也是和素材列表查询类似 就是普通的查询 所以略过了 文章发布 这个其实挺复杂的 一共三张表 一个文章表 一个素材表 一个文章和素材的关联表 区分修改与新增就是看是否存在id 如果是保存草稿…...
JinDouYun性能测试工具使用方法
1.功能介绍 2. 安卓端支持安卓6及以上的版本,ios支持大部分版本 3. 可以测试游戏,视频,普通应用的性能数据,数据精准,低延迟,无侵入 4.工具下载链接 筋斗云 5.后续功能添加,高版本支持&…...
操作系统 | 学习笔记 | | 王道 | 5.3 磁盘和固态硬盘
5.3 磁盘和固态硬盘 5.3.1 磁盘 磁盘结构 磁盘:磁盘的表面由一些磁性物质组成,可以用这些磁性物质来记录二进制数据 磁道:磁盘的盘面被划分成一个个磁道。这样的一个“圈”就是一个磁道 扇区:一个磁道又被划分成一个个扇区&am…...
【Oauth2整合gateway网关实现微服务单点登录】
文章目录 一.什么是单点登录?二.Oauth2整合网关实现微服务单点登录三.时序图四.代码实现思路1.基于OAuth2独立一个认证中心服务出来2.网关微服务3产品微服务4.订单微服务5.开始测试单点登录 一.什么是单点登录? 单点登录(Single Sign On&…...
WEB领域是不是黄了还是没黄
进入2024年后,WEB领域大批老表失业,一片哀嚎,个个饿的鬼叫狼嚎,为啥呢,下面是我个人的见解和看法。 中国程序员在应用层的集中 市场需求:中国的互联网行业在过去几年中经历了爆炸性增长,尤其是…...
Android系统:系统架构
文章目录 分层设计分块设计总结 分层设计 自上而下分为:应用层、应用架构层、系统运行层、硬件抽象层、Linux内核层 应用层 封装一系列系统App 应用架构层(Framework) 封装一系列运行App需要的Java框架 提供App开发需要的API 系统运行层(Libraries) 封装一系…...
NCNN 源码(1)-模型加载-数据预处理-模型推理
参考 ncnn 第一个版本的代码。 0 整体流程 demo:squeezenet ncnn 自带的一个经典 demo:squeezenet 的代码: // 网络加载 ncnn::Net squeezenet; squeezenet.load_param("squeezenet_v1.1.param"); squeezenet.load_model("squeezenet_…...
重修设计模式-结构型-享元模式
重修设计模式-结构型-享元模式 复用不可变对象,节省内存 享元模式(Flyweight Pattern)核心思想是通过共享对象方式,达到节省内存和提高性能的目的。享元对象需是不可变对象,因为它会被多处代码共享使用,要避…...
JavaScript 运算符
JavaScript 中的运算符可以根据其功能和用途分为几类。以下是主要的运算符类型及其用法: 1. 算术运算符 用于执行基本的数学运算。 : 加法 let sum 5 3; // 8- : 减法 let difference 5 - 3; // 2* : 乘法 let product 5 * 3; // 15/ : 除法 let quotient 5…...
3.js - 运动曲线
这个球,绕着这个红色的线圈转 代码 import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControlslet scene,camera,renderer,controls nulllet moon,earth null// 根据,一系列的点,创建曲线 le…...
免费ppt模板哪里找?职场必备这些利器
一眨眼,9月份的尾声渐近,无论是学生还是职场人士,都开始准备着新一轮的演讲和报告。在这个忙碌的时期,一份精美的PPT模板能够大幅提升你的工作效率,让你的演示更加引人入胜。 不用担心高昂的版权费用,市场…...
wampserve 配置本地域名,出现错误
概述 今天更换了电脑,在本地安装和配置docker的时候,想用自定义域名访问NGINX容器,127.0.0.1和localhost都可以访问,但是自定义域名无法访问, 接着去捯饬已经使用的wampserver的集成环境,出现了同样的问题…...
MySQL慢查询优化指南
博客主页: 南来_北往 系列专栏:Spring Boot实战 前言 当遇到慢查询问题时,不仅影响服务效率,还可能成为系统瓶颈。作为一位软件工程师,掌握MySQL慢查询优化技巧至关重要。今天,我们就来一场“数据库加速之旅…...
怎么录制游戏视频?精选5款游戏录屏软件
对于热爱游戏的你来说,记录游戏中的精彩瞬间并分享给朋友或粉丝,无疑是一种享受。然而,在众多录屏软件中,如何选择最适合你的那一款?今天,我们就为大家精选了五款游戏录屏软件,需要的朋友快来选…...
论文阅读 - MDFEND: Multi-domain Fake News Detection
https://arxiv.org/pdf/2201.00987 目录 ABSTRACT INTRODUCTION 2 RELATED WORK 3 WEIBO21: A NEW DATASET FOR MFND 3.1 Data Collection 3.2 Domain Annotation 4 MDFEND: MULTI-DOMAIN FAKE NEWS DETECTION MODEL 4.1 Representation Extraction 4.2 Domain Gate 4.…...
LabVIEW软件出现Bug如何解决
在LabVIEW开发中,程序出现bug是不可避免的。无论是小型项目还是复杂系统,调试与修复bug都是开发过程中的重要环节。下文介绍如何有效解决LabVIEW软件中的bug,包括常见错误类型、调试工具、错误处理机制。 1. 常见Bug类型分析 在LabVIEW中&am…...
【数据结构-栈】力扣844. 比较含退格的字符串
给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。 注意:如果对空文本输入退格字符,文本继续为空。 示例 1: 输入:s “ab#c”, t “…...
DataFrame生成excel后为什么多了一行数字
问题描述 python查询数据生成excel文件,生成的excel多了第一行数字索引,1,2,3,4,5...... 代码: df pd.DataFrame(data)df.to_excel(filename, sheet_name用户信息表, indexFalse) 解决: 原理也很简单,就是设置个参…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
