十一、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) 解决: 原理也很简单,就是设置个参…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...

Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...

Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

如何在Windows本机安装Python并确保与Python.NET兼容
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...