微服务架构中的服务治理设计

目录

节点管理

注册中心主动摘除机制

服务消费者摘除机制

心跳检测机制

服务状态判断与摘除

服务列表更新与推送

负载均衡

基于DNS的负载均衡

基于网络层的负载均衡

基于应用层的负载均衡

负载均衡算法

健康检查与会话保持

实现方式的选择

一致性Hash算法

哈希函数选择

数据映射到圆环

节点映射到圆环

数据定位

虚拟节点

节点增减处理

容错与冗余

实现细节

服务路由

服务路由的基本概念

服务路由的应用场景

服务路由的规则

技术实现要点

常见的服务路由实现方式

服务容错

资源隔离

线程池隔离

信号量隔离

熔断

降级

超时与重试

限流

服务注册与发现

服务注册

服务发现

技术实现细节

API管理与测试

API管理

API设计

API开发

API部署

API文档管理

版本控制

安全性

API测试

单元测试

集成测试

性能测试

安全测试

自动化测试

数据库设计与优化

数据库设计

需求分析

概念设计

逻辑设计

物理设计

数据库优化

性能优化

存储优化

安全性优化

可伸缩性与可扩展性

规范化与数据完整性

应用无状态化

使用外部存储

JWT(JSON Web Tokens)

负载均衡和无粘性会话

避免使用服务器内部缓存

RESTful API设计

微服务架构

容器化和自动化部署

数据库连接池

安全性与隔离性

安全性技术实现

用户身份鉴别

存取控制

视图机制

审计

数据加密

隔离性技术实现

进程隔离

用户隔离

虚拟化技术

网络隔离技术

硬件隔离


在微服务架构中,服务治理是确保系统稳定、高效运行的关键环节。以下是一些常见的服务治理手段。

节点管理

注册中心主动摘除机制

服务提供者定时向注册中心汇报心跳,超时则认为服务提供者出现问题,并将其从服务列表中摘除。

服务消费者摘除机制

当服务提供者网络出现异常,服务消费者调用失败,如果持续错误就可以将服务提供者从节点列表中移除。

心跳检测机制

(1)服务提供者定时向注册中心发送心跳包:服务提供者需要定期(如每隔几秒或几分钟)向注册中心发送心跳包,以表明自己仍然处于活动状态。

2)注册中心接收并处理心跳包:注册中心需要能够接收并处理来自各个服务提供者的心跳包,通过对比上一次心跳的时间来判断服务提供者的状态。

服务状态判断与摘除

1)判断服务提供者状态:注册中心根据接收到的心跳包判断服务提供者的状态。如果某个服务提供者在规定的时间内没有发送心跳包,注册中心就认为该服务提供者已经宕机或者出现故障。

(2)摘除故障服务提供者:一旦注册中心判断出某个服务提供者出现故障,就会将其从服务列表中摘除,避免消费者调用到已经故障的服务。

服务列表更新与推送

(1)更新服务列表:注册中心在摘除故障服务提供者后,会更新服务列表,确保列表中只包含健康的服务提供者。

(2)推送更新后的服务列表:注册中心还需要将更新后的服务列表推送给服务消费者,以便消费者能够获取到最新的、可用的服务提供者信息。

负载均衡

负载均衡算法,如随机算法、轮询算法(可加权重)、最少活跃调用算法等,确保性能较好的服务节点能够承担更多流量。

基于DNS的负载均衡

通过DNS解析将来自客户端的请求分发到不同的服务器上,从而实现负载均衡。DNS服务器会返回多个IP地址,客户端会选择其中一个IP地址进行连接。

基于网络层的负载均衡

通过网络层的负载均衡设备(如交换机、路由器等),将来自客户端的请求分发到多个服务器上。这种方式通常依靠IP地址和端口号来完成。

基于应用层的负载均衡

在每个请求到达负载均衡设备之前,设备会检查请求的内容,并使用一定的逻辑算法将请求转发到最合适的服务器上。这种方式可以根据应用层细节进行精细的负载均衡。

负载均衡算法

常见的负载均衡算法包括轮询、最少连接、源地址哈希等。这些算法用于决定如何将请求分发给各个服务器。

(1)轮询算法:将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的负载。

(2)最少连接算法:由于后端服务器的配置不尽相同,对于请求的处理有快有慢,最少连接数法根据后端服务器当前的连接情况,动态地选取其中当前积压请求最少的服务器来处理当前的请求。

(3)源地址哈希算法:根据获取客户端的IP地址,通过哈希函数计算得到一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。

健康检查与会话保持

(1)健康检查:负载均衡设备会定期检查后端服务器的运行状态,以保证只有正常的服务器才会接收到请求。当服务器宕机或不可达时,负载均衡设备会将其从负载均衡池中移除。

(2)会话保持:为了保证一次会话的连续性,负载均衡设备可以通过IP地址绑定、Cookie插入等方式将来自同一客户端的请求定向到同一台后端服务器上。

实现方式的选择

(1)硬件负载均衡:基于专用硬件设备的负载均衡实现方式,性能较高,适用于对性能和可用性要求较高的应用场景。

(2)软件负载均衡:基于软件的负载均衡实现方式,成本较低,易于部署和维护,适用于各种规模的应用场景。常见的软件负载均衡器包括NginxHAProxy等。

一致性Hash算法

相同参数的请求总是发送到同一服务节点,当服务节点出现故障时,请求会基于虚拟节点机制平摊到其他节点,以减少剧烈变动。

一致性Hash算法是一种特殊的哈希技术,它通过将所有的数据映射到一个固定范围的圆环上,以实现数据的均匀分布,并且在节点增减时能够最小化数据迁移。以下是一致性Hash算法的技术实现要点。

哈希函数选择

选择一个合适的哈希函数,如MD5SHA-1等,这些函数能够将输入均匀地映射到一个固定范围的值域内。在一致性Hash中,这个值域通常是一个圆环,其范围从02^32-1(如果使用32位哈希值)。

数据映射到圆环

当一个数据项(如键值对的键)通过哈希函数计算后,其哈希值会被映射到圆环上的某个位置。

节点映射到圆环

同样地,系统中的每个节点(如服务器、缓存实例等)也会通过哈希函数计算其哈希值,并被映射到圆环上的某个位置。

数据定位

数据项被放置在圆环上顺时针方向最近的节点上。这意味着数据的定位是沿着圆环顺时针查找,直到找到第一个节点。

虚拟节点

(1)为了更均匀地分布负载并解决数据倾斜问题,一致性Hash算法引入了虚拟节点的概念。每个实际节点可以对应多个虚拟节点,这些虚拟节点是通过在实际节点标识后添加不同的后缀并再次哈希得到的。

(2)虚拟节点的使用增加了节点的数量,使得数据分布更加均匀,减少了“热点”出现的可能性。

节点增减处理

(1)当一个新节点加入时,它只会接管一部分原本属于其他节点的数据,这部分数据是新节点在圆环上位置与下一个节点之间的数据。

(2)当一个节点退出时,其负责的数据会被分配到圆环上的下一个节点。

(3)由于一致性Hash的特性,节点的增减只会影响到相邻节点的数据分布,其他大部分节点的数据不会发生变化,这大大减少了数据迁移的开销。

容错与冗余

一致性Hash算法通常与其他容错机制(如复制、冗余备份等)结合使用,以确保数据的可用性和可靠性。

实现细节

(1)在具体实现时,可以使用有序数据结构(如红黑树、平衡二叉树或跳跃表等)来维护圆环上的节点顺序和数据定位。

(2)为了提高效率,可以预先计算并存储一部分虚拟节点的哈希值,以减少实时计算的成本。

服务路由

通过一定的规则如条件表达式或正则表达式来限定服务节点的选择范围,这通常用于灰度发布、多版本A/B测试或根据IP段规则进行多机房就近访问。

服务路由的基本概念

服务路由是指服务消费者在发起服务调用时,根据特定的规则来选择服务节点,以满足某些特定的需求。这些规则可以基于条件、脚本或其他逻辑来确定。

服务路由的应用场景

(1)分组调用:在服务部署在多个数据中心或不同云平台上时,服务路由可以根据消费者的需求,选择调用特定分组的服务节点。

(2)灰度发布:通过服务路由,可以实现灰度发布的功能,将部分流量导向新版本的服务节点,以进行测试和验证。

(3)异地多活与灾备:服务路由可以根据地理位置、网络延迟等因素,优先选择近距离或低延迟的服务节点,提高服务的响应速度和可用性。

服务路由的规则

(1)条件路由:基于预设的条件来选择服务节点,如根据请求的来源IP、用户ID等条件进行路由。

(2)脚本路由:使用脚本语言编写的更复杂的路由规则,可以实现更灵活的服务节点选择逻辑。

技术实现要点

(1)路由表维护:服务注册中心或路由组件需要维护一个路由表,记录服务节点的地址、状态及路由规则等信息。

(2)规则匹配:当服务消费者发起调用请求时,路由组件根据请求的上下文信息和路由表中的规则进行匹配,确定目标服务节点。

(3)负载均衡:在服务路由过程中,还需要考虑负载均衡的因素,以确保各个服务节点的负载均匀分布。

(4)容错与备份:当某个服务节点出现故障时,服务路由应能够自动切换到其他可用的服务节点,确保服务的连续性和可用性。

常见的服务路由实现方式

(1)基于注册中心的服务路由:如NacosEureka等注册中心提供了服务发现和服务路由的功能。服务提供者将自己的信息注册到注册中心,服务消费者从注册中心获取服务提供者的信息,并根据路由规则进行调用。

(2)基于API网关的服务路由:API网关作为服务的统一入口,可以根据路由规则将请求转发到不同的服务节点。例如,Spring Cloud GatewayZuul等都是常见的API网关实现。

服务容错

在分布式系统中,服务间的调用并不总是成功,因此需要实现服务容错机制,比如熔断、降级等策略,以确保系统的稳定性。

服务容错的技术实现主要包括以下几种手段。

资源隔离

线程池隔离

通过Java的线程池进行隔离,为每个依赖的服务分配一个固定的线程池,这样即使某个服务出现故障,也不会影响到其他服务。比如,当B服务调用C服务时,可以给予固定的线程数量,如12个线程,以防止C服务的故障影响到B服务的其他工作线程。

信号量隔离

使用Semaphore(信号量)来实现资源隔离。当无法获取信号量时,请求将被拒绝,从而避免超时占用其他工作线程。这种方式非常轻量级,仅限制对某个资源的并发调用数。

熔断

当下游服务出现故障或响应过慢时,上游服务会主动断开与它的连接,直接返回,以快速释放资源。熔断器模型有三个状态:关闭状态(所有请求正常访问)、打开状态(所有请求被降级)、半开状态(部分请求被允许通过以测试服务的健康状况)。

降级

当服务压力增大时,系统可以主动降低某些不重要业务或接口的功能,以提供有限的服务,保证核心功能的运行。

超时与重试

设置超时时间,避免无限制的等待下游系统响应,造成线程堆积。同时,对于因网络抖动等导致的服务调用失败,可以通过重试机制来保证数据的可靠性或一致性。

限流

在服务提供端限制进入的流量,以确保服务不会因为超负荷的流量而崩溃。

这些技术实现可以单独或结合使用,以提高系统的容错能力和稳定性。在实际应用中,需要根据具体的业务需求和系统特点来选择适合的容错技术。同时,这些技术也需要与其他系统设计和运维策略相结合,以实现最佳的效果。

服务注册与发现

服务在启动时向注册中心注册自己的信息,并通过注册中心查询目标服务的信息,实现动态的服务间通信。

服务注册与发现是微服务架构中的核心概念,它们对于实现服务的动态管理和调用至关重要。以下是服务注册与发现的技术实现的详细归纳。

服务注册

服务注册是指将服务实例的信息注册到服务注册中心,以便其他服务能够发现和调用它。服务注册通常包括以下几个步骤:

(1)服务实例启动:当服务实例启动时,它会向服务注册中心发送注册请求。

(2)发送注册信息:注册请求中包含服务实例的详细信息,如服务名称、IP地址、端口号、健康检查URL等。

(3)服务注册中心处理:服务注册中心接收到注册请求后,会将服务实例的信息保存在服务注册表中。

(4)心跳检测:为了确保服务实例的可用性,服务实例会定期向注册中心发送心跳信号,以表明自己仍然处于活动状态。

服务发现

服务发现是指通过服务注册中心来查询和发现可用的服务实例。服务发现的流程通常如下:

(1)服务消费者请求:当服务消费者需要调用某个服务时,它会向服务注册中心发送查询请求。

(2)查询服务注册表:服务注册中心根据查询请求,在服务注册表中查找相应的服务实例信息。

(3)返回服务实例列表:服务注册中心将找到的服务实例列表返回给服务消费者。

(4)负载均衡与选择:服务消费者根据负载均衡策略,从返回的服务实例列表中选择一个合适的服务实例进行调用。

技术实现细节

在服务注册与发现的技术实现中,需要注意以下几个细节:

(1)服务注册中心的选型:有多种开源的服务注册中心可供选择,如EurekaConsulZookeeperNacos等。这些注册中心各有特点,需要根据实际需求进行选择。

(2)数据一致性:服务注册表中的数据需要保持一致性,以确保服务消费者能够准确查询到可用的服务实例。

(3)容错与灾备:服务注册中心需要具备高可用性和容错能力,以防止单点故障导致整个系统的瘫痪。

(4)安全性:服务注册与发现过程中需要确保数据的安全性,防止恶意攻击和信息泄露。

综上所述,服务注册与发现是微服务架构中的关键环节,它们通过服务注册中心实现了服务的动态管理和调用。在实际应用中,需要根据具体的业务需求和系统特点来选择合适的技术实现方案。

API管理与测试

使用API管理工具如API FortressPostman等进行API的功能测试、健康监控和负载测试。

API管理与测试的技术实现涉及多个方面,以下是一些关键的技术点和实现方法。

API管理

API设计

(1)定义API的接口和功能,如用户管理API可包括获取用户列表、获取指定用户信息、创建新用户、更新用户信息和删除用户等功能。

(2)使用RESTful风格进行设计,使得API更加清晰、一致和易于理解。

API开发

(1)选择合适的编程语言和框架进行API的开发,如PythonFlaskDjango框架。

(2)编写API的代码,实现定义好的接口和功能。

API部署

(1)将开发好的API部署到服务器上,确保API的稳定性和可用性。

(2)配置服务器环境,如设置防火墙、安装必要的软件和库等。

API文档管理

(1)编写清晰的API文档,说明每个接口的参数、返回值和使用方法。

(2)使用Swagger或类似工具自动生成API文档,并保持更新。

版本控制

(1)API进行版本控制,以便在更新API时能够保持向后兼容性。

(2)使用版本号或时间戳来标识不同的API版本。

安全性

(1)使用HTTPS协议进行通信,确保数据在传输过程中的安全性。

(2)API进行身份验证和授权,防止未经授权的访问和修改。

API测试

单元测试

(1)针对每个API接口编写单元测试,确保接口功能的正确性。

(2)使用断言来验证接口的返回值和预期结果是否一致。

集成测试

(1)测试API之间的交互和依赖关系,确保整个系统的协同工作。

(2)验证数据流和业务流程的正确性。

性能测试

(1)使用工具如JMeterAPI进行性能测试,模拟多用户并发请求的情况。

(2)分析响应时间、吞吐量、错误率等指标,确保API能够满足性能要求。

安全测试

(1)对API进行安全测试,如SQL注入、跨站脚本攻击(XSS)等。

2)使用工具如OWASP Zap进行安全扫描和漏洞检测。

自动化测试

(1)使用自动化测试工具如SeleniumPostman等,编写自动化测试脚本,提高测试效率。

(2)定期运行自动化测试脚本,确保API的稳定性和可靠性。

综上所述,API管理与测试的技术实现需要从设计、开发、部署、文档管理、版本控制到测试等多个环节进行综合考虑和实施。通过合理的技术选型和严谨的测试流程,可以确保API的质量和可用性。

数据库设计与优化

良好的数据库设计对微服务架构至关重要,应避免大量的联合查询,而是通过应用层进行数据聚合或使用Elasticsearch等工具进行查询优化。

数据库设计

需求分析

(1)在开始设计之前,深入了解用户需求和业务流程。

(2)确定数据库系统的功能、性能、安全性等方面的具体需求。

概念设计

(1)通过E/R图(实体关系图)等工具对现实世界进行建模。

2)识别主要实体及其之间的关系,形成清晰的概念模型。

逻辑设计

(1)将概念模型转化为数据库管理系统支持的数据模型(如关系模型)。

(2)定义表结构、属性和关系,确保数据的完整性和准确性。

物理设计

(1)确定数据的存储结构、索引设计和安全性措施。

(2)考虑数据的访问速度、存储效率和备份恢复策略。

数据库优化

性能优化

(1)选择最适用的字段属性,例如使用合适的数据类型,避免NULL值等。

(2)优化查询语句,减少不必要的JOIN操作和子查询。

(3)使用索引提高查询速度,但要注意不要过度索引,以免影响写入性能。

存储优化

(1)把数据、日志、索引放到不同的I/O设备上,以提高读取速度。

(2)纵向或横向分割表,减少表的尺寸。

(3)根据查询条件,建立合适的索引,优化访问方式。

安全性优化

(1)实施严格的用户认证和授权机制,确保只有合法用户可以访问数据库。

(2)对敏感数据进行加密存储和传输,保护数据的安全性。

(3)定期进行安全审计和漏洞扫描,及时发现并修复安全问题。

可伸缩性与可扩展性

1)设计时应考虑数据库的未来增长,选择合适的数据库管理系统和硬件架构。

(2)使用分区、分片等技术提高数据库的可伸缩性。

(3)监控数据库性能,根据实际情况进行扩展或调整配置。

规范化与数据完整性

(1)遵循数据库设计的规范化理论,减少数据冗余和避免更新异常。

(2)使用触发器、约束等机制确保数据的完整性和一致性。

综上所述,数据库设计与优化的技术实现需要从需求分析、概念设计、逻辑设计到物理设计等多个阶段进行细致规划和执行。在优化方面,要关注性能、存储、安全性、可伸缩性与可扩展性以及规范化与数据完整性等多个方面。通过综合考虑这些因素并采取相应措施,可以构建一个高效、稳定且安全的数据库系统。

应用无状态化

为了实现横向扩展和提高系统的可用性,应用应设计成无状态的,这样服务实例可以随意增减而不影响整体服务。

应用无状态化是指将应用程序设计成不依赖于特定实例或会话状态的架构模式。这意味着应用程序的每个请求都是独立的,不依赖于先前的请求或状态,从而可以更容易地扩展和容错。以下是实现应用无状态化的一些关键技术。

使用外部存储

(1)避免在应用程序内部存储状态信息,如用户会话数据。

(2)将会话状态信息存储在外部系统,如RedisMemcached或其他键值存储系统中。

(3)使用持久化存储(如数据库)来保存需要长期存储的状态信息。

JWT(JSON Web Tokens)

(1)使用JWT来进行用户认证和授权,将用户状态信息编码在token中。

(2)客户端在每个请求中附带JWT,服务器通过验证token来确认用户身份,无需在服务器端维护会话状态。

负载均衡和无粘性会话

(1)使用负载均衡器分发请求到不同的应用实例,确保请求可以均匀地分布到各个实例上。

(2)配置负载均衡器以禁用会话粘性(session stickiness),这样用户的连续请求就不会总是被路由到同一个实例。

避免使用服务器内部缓存

(1)减少或避免在应用程序服务器内部使用缓存来存储状态信息。

(2)如果需要缓存,考虑使用分布式缓存解决方案,如Redis集群。

RESTful API设计

(1)设计RESTful API,确保每个请求都是独立的,不依赖于先前的请求状态。

(2)使用HTTP协议的无状态特性,通过URLHTTP方法来定位和操作资源。

微服务架构

(1)将应用程序拆分为多个微服务,每个服务都是无状态的,可以独立扩展和部署。

2)使用消息队列或事件总线来进行服务间的通信,减少状态共享的需求。

容器化和自动化部署

(1)使用容器技术(如Docker)来部署应用程序,确保每个容器实例都是无状态的。

(2)利用Kubernetes等容器编排工具进行自动化部署、扩展和管理无状态的应用容器。

数据库连接池

(1)使用数据库连接池来管理数据库连接,避免在应用程序实例中维护持久的数据库连接状态。

(2)确保连接在使用后正确关闭和释放,避免资源泄露。

通过实现上述技术,你可以构建一个无状态的应用程序,从而提高系统的可扩展性、可靠性和容错能力。无状态化设计也使得应用程序更容易进行水平扩展,因为每个实例都不需要知道其他实例的状态或数据。

安全性与隔离性

通过访问控制、加密通信、数据备份恢复等手段确保系统的安全性;同时,利用NamespaceGroup等机制实现服务的隔离性。

安全性技术实现

用户身份鉴别

通过用户身份鉴别来确保只有合法用户可以进入系统。常见的鉴别方法包括静态口令、动态口令、生物特征鉴别等。

存取控制

(1)定义用户权限和进行合法权限检查,确保用户只能访问其被授权的资源。

(2)C2级数据库管理系统支持自主存取控制,而B1级系统则支持强制存取控制。

视图机制

通过视图机制,可以为不同用户定义不同的视图,隐藏保密数据,从而实现对数据的保护。

审计

利用审计功能记录用户对数据库的所有操作,便于监控和发现非法存取数据的行为。

数据加密

对存储和传输的数据进行加密,以防止数据失密。包括存储加密和传输加密两种方式。

隔离性技术实现

进程隔离

操作系统采用进程隔离机制,使得每个进程拥有独立的虚拟地址空间和资源,确保进程间不会相互干扰。

用户隔离

通过用户身份和权限的隔离,保证不同用户之间的数据和操作互不干扰,提供安全的用户环境。

虚拟化技术

(1)利用虚拟化技术实现资源的逻辑隔离,将物理资源虚拟化为多个逻辑资源,提高系统的利用率和安全性。

(2)例如,Docker等技术可以为应用程序提供隔离的运行空间,实现进程隔离。

网络隔离技术

通过网络隔离技术将网络划分为多个不同安全级别的区域,如设立安全边界、使用VLAN虚拟化技术、子网划分以及网络访问控制等手段,有效控制数据流动和信息访问。

硬件隔离

利用专用安全硬件模块提供相对安全的硬件隔离环境,例如使用MMU(内存管理单元)实现进程隔离,或者利用IOMMUs(输入/输出内存管理单元)实现设备驱动的隔离。

综上所述,安全性和隔离性在技术上可以通过多种方法实现,包括用户身份鉴别、存取控制、视图机制、审计、数据加密、进程隔离、用户隔离、虚拟化技术、网络隔离技术以及硬件隔离等。这些方法可以单独或结合使用,以提高系统的整体安全性和隔离性。

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

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

相关文章

基于Java SpringBoot+Vue的体育用品库存管理系统

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

链路加密技术:保护数据传输的盾牌

在数字时代,数据安全已经成为我们日常生活和工作中的重要议题。随着网络技术的飞速发展和信息量的爆炸式增长,数据的安全传输变得尤为重要。链路加密技术作为一种重要的网络安全措施,为数据的传输提供了强有力的保障。本文将深入探讨链路加密…

2024第十五届蓝桥杯 Java B组 填空题

声明:博主比较菜,以下均为个人想法。解决方法仅供参考。欢迎大家一起讨论交流! 编程题在文末链接 第一题: 题目: (简洁版)从小到大排列是20或24倍数的正整数,前10个数依次是&…

C语言结课实战项目_贪吃蛇小游戏

目录 最终实现效果: 实现基本的功能: 根据游戏进程解释代码: 游戏初始化: 首先进入游戏,我们应该将窗口名称改为 “贪吃蛇” 并将光标隐藏掉。再在中间打印游戏信息。 之后我们要把地图打印出来: 然后…

【动态规划】C++简单多状态dp问题(打家劫舍、粉刷房子、买卖股票的最佳时机...)

文章目录 前言1. 前言 - 理解动态规划算法2. 关于 简单多状态的dp问题2.5 例题按摩师/打家劫舍 3. 算法题3.1_打家劫舍II3.2_删除并获得点数3.3_粉刷房子3.4_买卖股票的最佳时机含冷冻期3.5_买卖股票的最佳时机含手续费3.6_买卖股票的最佳时机III3.7_买卖股票的最佳时机IV 前言…

开源模型应用落地-chatglm3-6b-gradio-入门篇(七)

一、前言 早前的文章,我们都是通过输入命令的方式来使用Chatglm3-6b模型。现在,我们可以通过使用gradio,通过一个界面与模型进行交互。这样做可以减少重复加载模型和修改代码的麻烦, 让我们更方便地体验模型的效果。 二、术语 2.…

oracle 清空回收站

参考官方文档 select * from user_recyclebin; select * from dba_recyclebin; ---清除回收站中当前用户下的对象 purge recyclebin; ---清除回收站中所有的对象 purge dba_recyclebin; ---清除回收站中指定用户的表 PURGE TABLE owner.table_name; ---清除回收站中指…

精通MongoDB聚合操作API:深入探索高级技巧与实践

MongoDB 聚合操作API提供了强大的数据处理能力,能够对数据进行筛选、变换、分组、统计等复杂操作。本文介绍了MongoDB的基本用法和高级用法,高级用法涵盖了setWindowFields、merge、facet、expr、accumulator窗口函数、结果合并、多面聚合、查询表达式在…

Spring Boot | Spring Boot 应用的 “打包” 和 “部署”

目录: Spring Boot 应用的 “打包” 和 “部署” :一、Jar包方式打包部署 ( SpringBoot默认以 "Jar包" 形式进行 “打包部署” ) :1.1 "Jar包" 方式 “打包” :① 添加Maven “打包插件”② 使用IDEA开发工具进行 "打包" 1.2 "Jar包" …

构建Python中的分布式日志系统:ELK与Fluentd的结合

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在现代软件开发中,日志系统是至关重要的组成部分。它们不仅用于故障排查和性能监…

户外运动用什么耳机?五款主流运动耳机推荐!

城市的喧嚣和繁忙,常常让我们渴望逃离,去寻找一片属于自己的宁静天地。大自然,便是那个能够抚慰我们心灵、让我们重新找回宁静与美好的地方。对于热爱自然、钟情户外的你,一款合适的运动耳机,无疑是探索自然、享受运动…

贪吃蛇游戏源码(VS编译环境)

贪吃蛇游戏源码(VS编译环境) 🥕个人主页:开敲🍉 🔥所属专栏:C语言🍓 🌼文章目录🌼 1. Snake.h 头文件 2. Snake.c 源文件 3. Test.c 头文件 1. Snake.h 头…

只需几步,即可享有笔记小程序

本示例是一个简单的外卖查看店铺点菜的外卖微信小程序,小程序后端服务使用了MemFire Cloud,其中使用到的MemFire Cloud功能包括: 其中使用到的MemFire Cloud功能包括: 云数据库:存储外卖微信小程序所有数据表的信息。…

二进制OpenStack

二进制搭建OpenStack 1.环境准备 1.1机器的准备 主机名服务器配置操作系统IP地址controller-node4C8Gcentos7.9172.17.1.117computer-node4C8Gcentos7.9172.17.1.118 1.2网络架构 [rootcotroller-node ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noque…

dy号转uid和sec_uid

如何将抖dy号转换为uid和sec_uid&#xff1f; 摘要&#xff1a;本文将介绍如何实dy号与uid、sec_uid之间的转换过程&#xff0c;并提供相关的代码示例。 正文&#xff1a; dy作为一款热门的短视频社交平台&#xff0c;每个用户都有着唯一的用户ID&#xff08;uid&#xff09…

VisualGLM-6B的部署步骤

对于如下命令&#xff0c;你将完全删除环境和环境中的所有软件包 conda remove -n env_name --all 一、VisualGLM-6B环境安装 1、硬件配置 操作系统&#xff1a;Ubuntu_64&#xff08;ubuntu22.04.3&#xff09; GPU&#xff1a;4050 显存&#xff1a;16G 2、配置环境 建…

如何在Windows 11上退出安全模式?这里提供详细步骤

序言 安全模式是对电脑进行故障排除的强大工具。通过仅使用关键和必要的软件和服务启动电脑,它可以帮助你确定后台进程是否干扰了你的正常日常使用,或者是否有任何第三方软件导致电脑出现问题并使其难以使用。 如果你想退出安全模式,最简单的方法是重新启动你的电脑。只要…

Spring Boot入门(17):秒懂Spring Boot整合Knife4j,让你的Swagger界面秒变高颜值

前言 在使用Swagger进行API文档编写时&#xff0c;我们不可避免的会遇到Swagger的一些瓶颈。例如&#xff0c;Swagger的UI界面不太友好&#xff0c;样式单调且难看&#xff0c;交互体验也不是很好。为了解决这些问题&#xff0c;我们可以使用Knife4j对Spring Boot进行整合&…

C++笔记:类和对象(一)

类和对象 认识类和对象 先来回忆一下C语言中的类型和变量&#xff0c;类型就像是定义了数据的规则&#xff0c;而变量则是根据这些规则来实际存储数据的容器。类是我们自己定义的一种数据类型&#xff0c;而对象则是这种数据类型的一个具体实例。类就可以理解为类型&#xff0c…

ViM-UNet:用于生物医学细分的 Vision Mamba

ViM-UNet&#xff1a;用于生物医学细分的 Vision Mamba 摘要IntroductionMethod and Experiments结果与讨论 ViM-UNet: Vision Mamba for Biomedical Segmentation 摘要 卷积神经网络&#xff08;CNNs&#xff09;&#xff0c;尤其是UNet&#xff0c;是生物医学分割的默认架构…