微服务架构设计中的常见的10种设计模式
微服务架构设计的概念
微服务架构(Microservices Architecture)是一种用于构建分布式系统的软件设计模式。它将大型应用程序拆分成一组小型、自治的服务,每个服务都运行在其独立的进程中,服务之间通过轻量级的通信机制(如HTTP REST API)进行交互。这种架构模式具有高度的可伸缩性、可重用性、可维护性和可测试性,特别适用于构建大规模、高并发、复杂的应用系统。
微服务架构设计的常见10种设计模式
虽然直接列出并详细阐述10种微服务设计模式并达到4000字的要求较为困难,但我可以概述几种常见的微服务设计模式,包括它们的描述、优缺点、实现方式、可用技术示例以及使用场景。
1. 独享数据库(Database per Microservice)
描述:
当一家公司将大型单体系统替换成一组微服务,首先要面临的最重要决策是关于数据库。单体架构会使用大型中央数据库。即使转移到微服务架构许多架构师仍倾向于保持数据库不变。虽然有一些短期收益,但它却是反模式的,特别是在大规模系统中,微服务将在数据库层严重耦合,整个迁移到微服务的目标都将面临失败(例如,团队授权、独立开发等问题)。
更好的方法是为每个微服务提供自己的数据存储,这样服务之间在数据库层就不存在强耦合。这里我使用数据库这一术语来表示逻辑上的数据隔离,也就是说微服务可以共享物理数据库,但应该使用分开的数据结构、集合或者表,这还将有助于确保微服务是按照领域驱动设计的方法正确拆分的。
优缺点:
- 优点:服务间数据隔离清晰,减少数据冲突和依赖;每个服务可以独立选择最适合其业务需求的数据库技术。
- 缺点:跨服务的数据一致性管理复杂;分布式事务处理困难;数据冗余和同步问题。
实现方式:
每个微服务在启动时配置自己的数据库连接信息,并通过ORM(对象关系映射)框架或数据访问层(DAO)与数据库进行交互。
可用技术示例:
MySQL、MongoDB、Cassandra等数据库系统,以及Spring Data JPA、MyBatis等ORM框架。
使用场景:
适用于业务复杂度高、数据模型差异大、需要高度自治的微服务系统。
2. 聚合器(Aggregator)
描述:
聚合器模式是一种将多个微服务的响应聚合起来,以形成一个统一的响应返回给客户端的设计模式。这种模式常用于构建复杂的业务场景,其中客户端需要的数据分散在多个微服务中。
为了尽量减少服务之间的通信,我们可以使用服务聚合模式。基本上,服务聚合设计模式是接收来自客户端或 API 网关的请求,然后分配给内部多个后端微服务,再将结果合并,并在一个响应结构中发给请求发起人。
通过实现服务聚合模式,可以减少客户端和微服务之间的通信量和通信开销
服务聚合模式
微服务通信设计模式------服务聚合模式设计
优缺点:
- 优点:提高系统的灵活性和可扩展性;减少客户端的调用次数和复杂度。
- 缺点:聚合器可能成为性能瓶颈;增加了系统的复杂性和维护成本。
实现方式:
聚合器微服务通过同步或异步方式调用其他微服务,并将结果聚合后返回给客户端。
可用技术示例:
Spring Cloud Gateway、Zuul等API网关,以及Spring Boot、Node.js等后端技术栈。
使用场景:
适用于需要跨多个微服务获取数据并展示给用户的场景,如电商平台的商品详情页。
3. 链式(Chain)
描述:
链式模式是指微服务之间按照特定的顺序进行调用,形成一条服务调用链。每个服务在接收到请求后,处理部分业务逻辑,并将请求传递给链中的下一个服务。
优缺点:
- 优点:实现服务间的松耦合;提高系统的灵活性和可维护性。
- 缺点:调用链过长可能导致性能问题;服务间的依赖关系复杂。
实现方式:
通过HTTP请求或消息队列等方式实现服务间的顺序调用。
可用技术示例:
Spring Cloud OpenFeign、Apache Dubbo等RPC框架,以及RabbitMQ、Kafka等消息队列。
使用场景:
适用于业务流程具有明确顺序和依赖关系的场景,如订单处理流程。
4. 命令和查询职责分离(CQRS)
描述:
如果我们使用事件源,那么从事件存储中读取数据就变得困难了。要从数据存储中获取实体,我们需要处理所有的实体事件。有时我们对读写操作还会有不同的一致性和吞吐量要求。
这种情况,我们可以使用 CQRS 模式。在该模式中,系统的数据修改部分(命令)与数据读取部分(查询)是分离的。而 CQRS 模式有两种容易令人混淆的模式,分别是简单的和高级的。 其简单形式中,不同实体或 ORM 模型被用于读写操作,如下所示:
它有助于强化单一职责原则和分离关注点,从而实现更简洁的设计。
在其高级形式中,会有不同的数据存储用于读写操作。高级的 CQRS 通常结合事件源模式。根据不同情况,会使用不同类型的写数据存储和读数据存储。写数据存储是“记录的系统”,也就是整个系统的核心源头。
对于读频繁的应用程序或微服务架构,OLTP 数据库(任何提供 ACID 事务保证的关系或非关系数据库)或分布式消息系统都可以被用作写存储。对于写频繁的应用程序(写操作高可伸缩性和大吞吐量),需要使用写可水平伸缩的数据库(如全球托管的公共云数据库)。标准化的数据则保存在写数据存储中。
对搜索(例如 Apache Solr、Elasticsearch)或读操作(KV 数据库、文档数据库)进行优化的非关系数据库常被用作读存储。许多情况会在需要 SQL 查询的地方使用读可伸缩的关系数据库。非标准化和特殊优化过的数据则保存在读存储中。
数据是从写存储异步复制到读存储中的,所以读存储和写存储之间会有延迟,但最终是一致的。
微服务架构及其最重要的10个设计模式
原文链接: https://www.infoq.cn/article/kdw69bdimlx6fsgz1bg3
优缺点:
优点:
-
在事件驱动的微服务中数据读取速度更快。
-
数据的高可用性。
-
读写系统可独立扩展。
缺点:
-
读数据存储是弱一致性的(最终一致性)。
-
整个系统的复杂性增加了,混乱的 CQRS 会显着危害整个项目。
可用技术示例:
写存储: EventStoreDB, Apache Kafka, Confluent Cloud, AWS Kinesis, Azure Event Hub, GCP Pub/Sub, Azure Cosmos DB, MongoDB, Cassandra. Amazon DynamoDB
读存储:Elastic Search, Solr, Cloud Spanner, Amazon Aurora, Azure Cosmos DB, Neo4j
框架:Lagom, Akka, Spring, akkatecture, Axon, Eventuate
使用场景
-
在高可扩展的微服务架构中使用事件源。
-
在复杂领域模型中,读操作需要同时查询多个数据存储。
-
在读写操作负载差异明显的系统中。
5. 异步消息传递(Asynchronous Messaging)
描述:
同步调用模式在调用的过程中会阻塞线程,如果服务提供方迟迟没有返回,则服务消费方会一直阻塞,严重的会撑满服务的线程池,出现雪崩效应。因此,在构建服务架构系统时,通常会梳理核心系统的最小化服务集合,这些核心的系统服务使用同步调用。而其他核心链路以外的服务可以使用异步消息队列进行异步化
优缺点:
- 优点:提高系统的可靠性和可扩展性;减少服务间的直接依赖。
- 缺点:增加了系统的复杂性和维护成本;消息的一致性和顺序性管理困难。
实现方式:
使用RabbitMQ、Kafka等消息队列产品。
可用技术示例:
RabbitMQ、Kafka、ActiveMQ等。
使用场景:
适用于对实时性要求不高,但需要高可靠性和可扩展性的场景,如订单处理、日志收集等。在这些场景中,服务之间的调用不必立即响应,可以通过消息队列进行异步处理,从而提高系统的整体性能和稳定性。
6. 事件驱动(Event-Driven)
描述:
事件驱动模式通过事件来触发服务之间的交互。当一个微服务发生特定事件时,它会发布该事件到事件总线或消息队列中,其他微服务可以订阅这些事件并在事件发生时进行相应的处理。
优缺点:
- 优点:实现服务间的松耦合;提高系统的可扩展性和灵活性。
- 缺点:事件处理的一致性和顺序性管理困难;系统复杂度增加。
实现方式:
使用事件总线(如Apache Kafka、RabbitMQ等)或分布式消息系统来实现事件的发布和订阅。
可用技术示例:
Apache Kafka、RabbitMQ、Azure Event Grid等。
使用场景:
适用于需要高度解耦、实时性要求不高的场景,如订单状态变更通知、用户行为跟踪等。
7. 服务发现(Service Discovery)
描述:
服务发现模式允许微服务在运行时自动发现其他服务的地址和端口信息,从而实现服务的自动注册和发现。这有助于实现服务的动态扩展和容错。
优缺点:
- 优点:提高系统的灵活性和可扩展性;减少服务间的硬编码依赖。
- 缺点:服务注册和发现的复杂性和开销。
实现方式:
使用服务注册中心(如Eureka、Consul、Zookeeper等)来管理服务的注册和发现。
可用技术示例:
Eureka、Consul、Zookeeper等。
使用场景:
适用于需要动态扩展和容错能力的微服务系统,特别是在云环境或容器化部署中。
8. Saga
描述:
如果微服务使用独享数据库,那么通过分布式事务管理一致性是一个巨大的挑战。你无法使用传统的两阶段提交协议,因为它要么不可伸缩(关系数据库),要么不被支持(多数非关系数据库)。
但您还是可以在微服务架构中使用 Saga 模式实现分布式事务。Saga 是 1987 年开发的一种古老模式,是关系数据库中关于大事务的一个替代概念。但这种模式的一种现代变种对分布式事务也非常有效。Saga 模式是一个本地事务序列,其每个事务在一个单独的微服务内更新数据存储并发布一个事件或消息。Saga 中的首个事务是由外部请求(事件或动作)初始化的,一旦本地事务完成(数据已保存在数据存储且消息或事件已发布),那么发布的消息或事件则会触发 Saga 中的下一个本地事务。
优缺点:
优点:
-
为高可伸缩或松耦合的、事件驱动的微服务架构提供一致性事务。
-
为使用了不支持 2PC 的非关系数据库的微服务架构提供一致性事务
缺点:
-
需要处理瞬时故障,并且提供等幂性。
-
难以调试,而且复杂性随着微服务数量增加而增加。
实现方式:
使用熔断器库(如Netflix的Hystrix、Resilience4j等)来实现熔断逻辑。
可用技术示例:
Axon, Eventuate, Narayana
使用场景:
-
在使用了事件源的高可伸缩、松耦合的微服务中。
-
在使用了分布式非关系数据库的系统中。
9. 缓存(Caching)
描述:
缓存模式通过在服务之间添加缓存层来减少对底层数据源的访问频率,从而提高系统的响应速度和吞吐量。
优缺点:
- 优点:提高系统的响应速度和吞吐量;减少对底层数据源的访问压力。
- 缺点:数据一致性问题;缓存击穿和雪崩问题。
实现方式:
使用缓存中间件(如Redis、Memcached等)来实现缓存逻辑。
可用技术示例:
Redis、Memcached等。
使用场景:
适用于读多写少、数据更新频率不高的场景,如商品信息、用户信息等。
10.边车模式(Sidecar Pattern)
描述:
边车模式(Sidecar Pattern)是一种在微服务架构中常见的模式,它通过将辅助性质的服务(通常被称为sidecar)与主要的服务实例部署在一起,以提供额外的功能、能力或支持。边车模式的设计思想是将控制和逻辑分离,使得主要服务实例可以更专注于其核心业务逻辑,而边车则负责处理如日志记录、监控、安全性、通信等辅助功能。这种设计模式允许主服务更加单一职责,便于维护和升级,同时也提高了系统的灵活性和可扩展性。
优点:
- 解耦与模块化:将服务治理功能从业务逻辑中分离出来,实现了关注点的分离和模块化,使得业务逻辑更加清晰和简洁,同时治理功能也更加可重用和灵活。
- 可扩展性:允许对治理功能进行独立的扩展和升级,而不需要修改业务逻辑代码,提高了系统的可扩展性。
- 多语言支持:对业务逻辑的代码侵入性较小,支持多种编程语言和技术栈,使得在混合语言环境中进行微服务治理变得更加容易。
- 灵活性:可以灵活地添加或移除治理功能,以满足不同业务场景的需求,降低了维护成本。
缺点:
- 复杂性增加:引入边车模式会增加系统的复杂性,需要额外管理和维护边车进程,增加了开发和运维的工作量。
- 资源消耗:每个微服务实例都需要一个边车进程,可能会导致资源(如CPU、内存等)的消耗增加,在资源受限的环境中可能成为一个问题。
- 网络延迟:边车进程需要与微服务实例进行通信,可能会增加网络延迟,尽管可以通过优化网络配置来降低延迟。
实现方式:
边车模式的实现通常涉及使用特定的技术或工具,这些工具可以作为辅助性质的服务与主服务实例一起部署。常见的实现方式包括:
- 使用容器化技术:如Docker容器,将边车服务作为独立的容器与主服务容器部署在同一个Pod中(在Kubernetes等容器编排系统中)。
- 部署代理:如Envoy、Linkerd等高性能的代理和通信总线,负责处理服务之间的网络通信、负载均衡、故障恢复等任务。
可用技术示例:
- Istio:一个开源的服务网格框架,通过在应用程序的每个服务实例旁边部署一个Envoy Sidecar来实现边车模式,提供了流量管理、安全性、可观察性等功能。
- Linkerd:由Buoyant公司开源的服务网格实现,通过在每个服务实例旁边部署一个Linkerd Proxy来实现边车模式,提供了负载均衡、故障注入、监控和可观察性等功能。
- Consul Connect:HashiCorp公司的Consul服务发现和配置管理工具的一部分,通过在每个服务实例旁边运行一个代理来实现边车模式,提供安全的服务到服务通信功能。
- NGINX:虽然主要作为Web服务器和反向代理服务器使用,但也可以作为Sidecar部署在每个服务实例旁边,通过配置NGINX作为反向代理,实现负载均衡、安全性和其他网络功能。
使用场景:
- 老系统的改造和扩展:对于已有的复杂系统,边车模式可以帮助逐步引入微服务治理功能,而不需要对整个系统进行重构。
- 多语言环境:在由多种语言构建的微服务系统中,边车模式可以提供一种统一的服务治理方式,降低跨语言集成的难度。
- 控制和逻辑分离:当需要将服务治理逻辑与业务逻辑分离时,边车模式是一个很好的选择,有助于降低代码的耦合度,提高系统的可维护性。
- 微服务治理:包括服务注册、发现、负载均衡、熔断、限流等功能,边车模式可以很容易地集成这些服务治理功能,而无需修改主服务的代码。
- 监控和日志记录:通过将监控和日志记录功能封装在边车中,可以实现对所有服务实例的统一监控和日志记录,便于快速定位问题和优化系统性能。
- 安全性和认证授权:边车可以处理所有的网络通信,并应用适当的安全协议来保护服务间的通信,确保数据传输的安全性和授权服务的相互通信。
上面是对微服务架构设计中常见设计模式的简要介绍,每种模式都有其独特的优缺点、实现方式和使用场景。在实际应用中,开发者需要根据项目的具体需求和约束条件来选择合适的设计模式,并结合其他最佳实践来构建高质量的微服务系统。
相关文章:

微服务架构设计中的常见的10种设计模式
微服务架构设计的概念 微服务架构(Microservices Architecture)是一种用于构建分布式系统的软件设计模式。它将大型应用程序拆分成一组小型、自治的服务,每个服务都运行在其独立的进程中,服务之间通过轻量级的通信机制(…...

stripe Element 如何使用
这里要准备好几个东西: 一个支付成功过后的回调 还有一个下单的接口 一旦进入这个下单界面,就要去调下单的接口的,用 post, 这个 接口你自己写,可以写在后端中,也可以放到 nextjs 的 api 中。 首先说的是这个下单…...
vue3动态引入图片不显示问题
方法1.(打包后动态引用的图片未被打包入工程中,webpack,vite) 1.图片放到public 目录会更省事,不管是开发环境还是生产环境,可以始终以根目录保持图片路径的一致. 假设: 静态文件目录:src/assets/images/ 我们的目标静态文件在 …...
【流媒体】RTMPDump—AMF编码
目录 1. AMF类型2. AMF编码2.1 AMF_Number (AMF_EncodeNumber)2.2 AMF_BOOLEAN (AMF_EncodeBoolean)2.3 AMF_STRING 和 AMF_LONG_STRING (AMF_EncodeString)2.3.1 AMF_EncodeInt162.3.2 AMF_EncodeInt32 2.4 AMF_OBJECT (AMF_Encode)2.4.1 AMF_EncodeInt24 2.5 AMF_ECMA_ARRAY …...

Mysql双主双从
双主双从 1.安装Mysql1.1 查看linux版本1.2 下载Mysql安装包1.3 上传并解压1.4 安装Mysql1.5 编辑端口号1.6 Mysql启动命令1.7 更新密码 2.搭建Mysql主从复制2.1 搭建Master主服务器2.1.1 修改mysql配置文件2.1.2 重启Mysql服务2.1.3 创建Slave用户, 并授权2.1.4 查看主服务器当…...

安卓主板_MTK联发科主板定制开发|PCBA定制开发
MTK联发科安卓主板,采用MT6762八核平台方案,支持谷歌Android 11.0系统,MT6762采用ARM八核A53内核芯片、主频高达2.0GHz,GPU采用ARM PowerVR GE8329650MHZ,支持主流19201080分辨率,支持硬解H.264,…...

结合GPT与Python实现端口检测工具(含多线程)
端口检测器是一个非常实用的网络工具,它主要用于检测服务器或本地计算机上的特定端口是否处于开放状态。通过这个工具,你可以快速识别和诊断网络连接问题,确保关键服务的端口能够正常接收和处理数据。这对于网络管理员和开发者来说是一个不可…...

数字媒体产业发展现状剖析,洞悉数字产业园的创新之举
在当今数字化时代,数字媒体产业发展迅猛,呈现出一片繁荣景象。然而,在这繁荣的背后,数字媒体产业发展现状也存在着诸多挑战与机遇。 数字媒体产业发展现状的一个显著特点是技术的快速更新换代。从虚拟现实(VR…...

PDF文件转换为HTML文件
推荐使用 pdf2htmlEX(因为确实做的比较全) pdf2htmlEX 是一个开源工具,可以将PDF文件转换为HTML文件。你需要先安装pdf2htmlEX工具,并确保它在你的系统路径中可用。(花时间最多就是找包) 安装 pdf2htmlEX …...
简易版PHP软文发稿开源系统
软文发稿系统源码(软文发布系统)基于旧版本的媒介软文项目基础上整理出一套简易版,以满足不同客户群体。虽然是简易版 但麻雀虽小五脏俱全,基本能满足小众群体需求 具体功能如下: 大模块功能: 1、媒体发布 …...
React.createContext 的 多种使用方法 详细实现方案代码
React.createContext 是 React 的上下文 API 的核心方法之一,提供了一种无需通过组件树逐层传递 props 的方式来共享数据。它特别适合于全局状态的管理,比如用户信息、主题设置等。下面我将详细介绍 React.createContext 的多种使用方法,并提…...

计算机网络之IPv4深度解析
一.IP地址 IP地址的组成方式:网络号 主机号 可以这样理解,根据网络号找路由器,根据主机号找连着路由器的主机 早期分类的IP地址 表示如下: 其中,有些特殊的IP地址: 主机号全为0,表示本网…...

TinyGPT-V:微型视觉语言模型【VLM】
AI技术正在不断融入我们的日常生活。人工智能的一个应用包括多模态化,例如将语言与视觉模型相结合。这些视觉语言模型可以应用于视频字幕、语义搜索等任务。 本周,我将重点介绍一种名为 TinyGPT-V(Arxiv | GitHub)的最新视觉语言…...
pytorch自动微分
一、torch.autograd.backward(tensors, grad_tensorsNone, retain_graphNone, create_graphFalse)功能:自动求取梯度 grad_tensors:多梯度权重 # 自动求取梯度 # import torch # w torch.tensor([1.],requires_gradTrue) # x torch.tensor([2.],requir…...

TCP协议为什么是三次握手和四次挥手
1.一次握手&&二次握手 一次握手就能成功的话,也就代表着不需要进行确认,那么万一有恶意的服务器一直发送SYN,而服务器需要维护大量的连接,维护连接又需要成本,那么就很容易引发SYN洪水,导致服务器…...
利用ChatGPT提升学术论文撰写效率:从文献搜集到综述撰写的全面指南
大家好,感谢关注。我是七哥,一个在高校里不务正业,折腾学术科研AI实操的学术人。关于使用ChatGPT等AI学术科研的相关问题可以和作者七哥(yida985)交流,多多交流,相互成就,共同进步,为大家带来最酷最有效的智能AI学术科研写作攻略。 本文旨在介绍如何利用AI辅助工具,…...

智能、高效、安全,企业桌面软件管理系统,赋能企业数字化转型!提升工作效率不是梦!
为了在激烈的市场竞争中脱颖而出,实现可持续发展,数字化转型已成为企业不可或缺的战略选择!而在这一过程中,一款智能、高效、安全的企业桌面软件管理系统,如安企神,正逐步成为企业数字化转型的重要驱动力。…...
第N7周:调用Gensim库训练Word2Vec模型
本文为365天深度学习训练营 中的学习记录博客原作者:K同学啊 任务: ●1. 阅读NLP基础知识里Word2vec详解一文,了解并学习Word2vec相关知识 ●2. 创建一个.txt文件存放自定义词汇,防止其被切分 数据集:选择《人民的名义…...

基于Crontab调度,实现Linux下的定时任务执行。
文章目录 引言I 预备知识Crontab的基本组成Crontab的配置文件格式Crontab的配置文件Crontab不可引用环境变量杀死进程命令II Crontab实践案例Crontab工具的使用重启tomcat服务每分钟都打印当前时间到一个文件中30s执行一次III 常见问题并发冗余执行任务&& 和|| 和 ;的区…...

Centos系统中创建定时器完成定时任务
Centos系统中创建定时器完成定时任务 时间不一定能证明很多东西,但是一定能看透很多东西,坚信自己的选择,不动摇,使劲跑,明天会更好。 在 CentOS 上,可以使用 systemd 定时器来创建一个每十秒执行一次的任务…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...

spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...
第14节 Node.js 全局对象
JavaScript 中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量。 在浏览器 JavaScript 中,通常 window 是全局对象, 而 Node.js 中的全局…...