如何整合spring cloud常用组件?

news2024/12/25 12:57:10

目录

一、SpringCloud Alibaba 简介

1、简介

2、为什么使用

3、版本选择

4、项目中的依赖

二、SpringCloud Alibaba-Nacos[作为注册中心]

1、下载 nacos-server

2、启动 nacos-server

3、将微服务注册到 nacos 中

三、SpringCloud Alibaba-Nacos[作为配置中心]

四、gateway

1、简介

2、核心概念

3、使用

(1)HelloWorld

(2)断言

(3)过滤器

五、SpringCloud Alibaba-OSS

(一)、简介

(二)、使用步骤

1、开通阿里云对象存储服务

2、引入 SpringCloud Alibaba-OSS

3、配置阿里云 oss 相关的账号信息

4、测试使用 OssClient 上传


SpringCloud Alibaba 简介

1、简介

Spring Cloud Alibaba 致力于提供 微服务开发的 一站式解决方案 。此项目包含开发分布式应用
微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布
式应用服务。
依托 Spring Cloud Alibaba ,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用
接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
https://github.com/alibaba/spring-cloud-alibaba

2、为什么使用

SpringCloud 的几大痛点
SpringCloud 部分组件停止维护和更新,给开发带来不便;
SpringCloud 部分环境搭建复杂,没有完善的可视化界面,我们需要大量的二次开发和定制
SpringCloud 配置复杂,难以上手,部分配置差别难以区分和合理应用
SpringCloud Alibaba 的优势:
阿里使用过的组件经历了考验,性能强悍,设计合理,现在开源出来大家用
成套的产品搭配完善的可视化界面给开发运维带来极大的便利
搭建简单,学习曲线低。
结合 SpringCloud Alibaba 我们最终的技术搭配方案:
SpringCloud Alibaba - Nacos :注册中心(服务发现 / 注册)
SpringCloud Alibaba - Nacos :配置中心(动态配置管理)
SpringCloud - Ribbon :负载均衡
SpringCloud - Feign :声明式 HTTP 客户端(调用远程服务)
SpringCloud Alibaba - Sentinel :服务容错(限流、降级、熔断)
SpringCloud - Gateway API 网关( webflux 编程模式)
SpringCloud - Sleuth :调用链监控
SpringCloud Alibaba - Seata :原 Fescar ,即分布式事务解决方案

3、版本选择

由于 Spring Boot 1 Spring Boot 2 Actuator 模块的接口和注解有很大的变更,且spring-cloud-commons 从 1.x.x 版本升级到 2.0.0 版本也有较大的变更,因此我们采取跟SpringBoot 版本号一致的版本 :
1.5.x 版本适用于 Spring Boot 1.5.x
2.0.x 版本适用于 Spring Boot 2.0.x
2.1.x 版本适用于 Spring Boot 2.1.x

在官网alibaba/spring-cloud-alibaba: Spring Cloud Alibaba provides a one-stop solution for application development for the distributed solutions of Alibaba middleware. (github.com)也可找到版本对应

4、项目中的依赖

在 common 项目中引入如下。进行统一管理,我的springboot版本为2.7.1
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.0.4.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

SpringCloud Alibaba-Nacos[作为注册中心]

Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理
平台。他是使用 java 编写。需要依赖 java 环境
Nacos 文档地址: https://nacos.io/zh-cn/docs/quick-start.html

1、下载 nacos-server

https://github.com/alibaba/nacos/releases

2、启动 nacos-server

  • 双击 bin 中的 startup.cmd 文件
  • 访问 http://localhost:8848/nacos/
  • 使用默认的 nacos/nacos 进行登录

3、将微服务注册到 nacos

(1) 、首先,修改 pom.xml 文件,引入 Nacos Discovery Starter
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

(2)、在应用的 /src/main/resources/application.properties 配置文件中配置 Nacos Server 地址

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
(3) 、使用 @EnableDiscoveryClient 开启服务注册发现功能
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallCouponApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallCouponApplication.class, args);
    }

}
(4) 、启动应用,观察 nacos 服务列表是否已经注册上服务
注意:每一个应用都应该有名字,这样才能注册上去。修改 application.properties 文件
spring.application.name=service-provider
server.port=8000
(5) 、注册更多的服务上去,测试使用 feign 远程调用
Nacos 使用三步
1 、导包 nacos-discovery
2 、写配置,指定 nacos 地址,指定应用的名字
3 、开启服务注册发现功能 @EnableDiscoveryClient
Feign 使用三步
1 、导包 openfeign
2 、开启 @EnableFeignClients 功能
3 、编写接口,进行远程调用

/*
 * 这是声明式的远程调用
 */
@Component
@FeignClient("gulimall-coupon")
public interface CouponFeignService {
    @RequestMapping("/coupon/coupon/member/list")
    public R membercoupons();
}
(6) 、更多配置
https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/na
cos-example/nacos-discovery-example/readme-zh.md#more

三、SpringCloud Alibaba-Nacos[作为配置中心]

1pom.xml 引入 Nacos Config Starter

<!--nacos作为配置中心-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2.1.0.RELEASE</version>
        </dependency>

 注意,新版的nacos作为配置中心,需要导入spring-cloud-starter-bootstrap,而且nacos新导入的config版本要与原本的nacos注册中心相同

<!--nacos作为配置中心而bootstrap被禁用,因此还需导入bootstrap依赖-->
        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-bootstrap -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>3.0.3</version>
        </dependency>

2、在应用的 /src/main/resources/bootstrap.properties 置文件中配置 Nacos Config 元数据

spring.application.name=nacos-config-example
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
主要配置应用名和配置中心地址
3 、在 nacos 中添加配置
nacos 中创建一个 应用名 .properties 配置文件并编写配置
Nacos Config 数据结构
Nacos Config 主要通过 dataId 、namespace和  group 来唯一确定一条配置。
Nacos Client Nacos Server 端获取数据时,调用的是此接口 ConfigService.getConfig(String dataId, String group, long timeoutMs)
Spring Cloud 应用获取数据
dataID
Nacos Config Starter 中, dataId 的拼接格式如下
${prefix} - ${spring.profiles.active} . ${file-extension} prefix 默认为 spring.application.name
的值,也可以通过配置项 spring.cloud.nacos.config.prefix 来配置。
spring.profiles.active 即为当前环境对应的 profile
注意,当 activeprofile 为空时,对应的连接符 - 也将不存在, dataId 的拼接格式变成
${prefix}.${file-extension}
file-extension 为配置内容的数据格式,可以通过配置项
spring.cloud.nacos.config.file-extension 来配置。 目前只支持 properties 类型。
Group
Group 默认为 DEFAULT_GROUP ,可以通过 spring.cloud.nacos.config.group 配置。

 4、在应用中使用@Value @RefreshScope

完成上述两步后,应用会从 Nacos Config 中获取相应的配置,并添加在 Spring Environment
PropertySources 中 。 这 里 我 们 使 用 @Value 注 解 来 将 对 应 的 配 置 注 入 到
SampleController userName age 字段,并添加 @RefreshScope 打开动态刷新功能
@RefreshScope
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {

    @Value("${coupon.user.name}")
    private String userName;
    @Value("${coupon.user.age}")
    private Integer age;

    @RequestMapping("/test")
    public R test() {
        return R.ok().put("name", userName).put("age", age);
    }
}

5、进阶

(1) 、核心概念
命名空间:
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group Data ID
配置。 Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生
产环境的资源(如配置、服务)隔离等。
配置集: 一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配
置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级
别等配置项。
配置集 ID
Nacos 中的某个配置集的 ID 。配置集 ID 是组织划分配置的维度之一。 Data ID 通常用于组
织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有
意义的名称标识。 Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level )的命名
规则保证全局唯一性。此命名规则非强制。
配置分组:
Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy
Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个
配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置
分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和
MQ_topic 配置。

nacos作为配置中心,可以通过以下实现隔离性

1、使用命名空间区分环境。比如说开发,测试,生成阶段不同,可以在bootstrap.properties中配置上需要使用哪个命名空间下的配置

2、使用命名空间区分服务。每一个微服务之间相互隔离配置。每一个微服务都创建自己的命名空间,只加载自己命名空间下的所有配置

(2)、原理

自动注入:
NacosConfigStarter 实现了 org.springframework.cloud.bootstrap.config.PropertySourceLocator
接口,并将优先级设置成了最高。
Spring Cloud 应用启动阶段,会主动从 Nacos Server 端获取对应的数据,并将获取到的数据转换成 PropertySource 且注入到 Environment PropertySources 属性中,所以使用@Value 注解也能直接获取 Nacos Server 端配置的内容。
动态刷新:
Nacos Config Starter 默认为所有获取数据成功的 Nacos 的配置项添加了监听功能,在监听到服务端配置发生变化时会实时触发 org.springframework.cloud.context.refresh.ContextRefresher 的 refresh 方法 。
如果需要对 Bean 进行动态刷新,请参照 Spring Spring Cloud 规范。 推荐给类添加 @RefreshScope @ConfigurationProperties 注解
(3)、 加载多配置文件
可以将各种不同的配置分开,比如数据库的、整合mybatis的、其他的各种都分开成不同的配置文件
spring.cloud.nacos.config.server-addr=localhost:8848

spring.cloud.nacos.config.namespace=c207b94f-c1a3-426e-8e71-dd70002cfcd6
spring.cloud.nacos.config.group=dev

spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].refresh=true

spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yml
spring.cloud.nacos.config.ext-config[1].group=dev
spring.cloud.nacos.config.ext-config[1].refresh=true

spring.cloud.nacos.config.ext-config[2].data-id=other.yml
spring.cloud.nacos.config.ext-config[2].group=dev
spring.cloud.nacos.config.ext-config[2].refresh=true
(4) namespace group 最佳实践
每个微服务创建自己的 namespace 进行隔离, group 来区分 dev beta prod 等环境

四、gateway

1、简介

网关作为流量的入口,常用功能包括路由转发、权限校验、限流控制等。而 springcloud gateway
作为 SpringCloud 官方推出的第二代网关框架,取代了 Zuul 网关。

网关提供 API 全托管服务,丰富的 API 管理功能,辅助企业管理大规模的 API ,以降低管理成本和安全风险,包括协议适配、协议转发、安全策略、防刷、流量、监控日志等功能。
Spring Cloud Gateway 旨在提供一种简单而有效的方式来对 API 进行路由,并为他们提供切面,例如:安全性,监控/ 指标 和弹性等。
官方文档地址:
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.1.3.RELEASE/single/spring-clo
ud-gateway.html

Spring Cloud Gateway 特点 :
  1. 基于 Spring5,支持响应式编程和 SpringBoot2.0
  2. 支持使用任何请求属性进行路由匹配
  3. 特定于路由的断言和过滤器
  4. 集成 Hystrix 进行断路保护
  5. 集成服务发现功能
  6. 易于编写 Predicates Filters
  7. 支持请求速率限制
  8. 支持路径重写
思考:
为什么使用 API 网关?
API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部
客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服
务通信,会有以下的 问题
  1. 客户端会多次请求不同的微服务,增加了客户端的复杂性。
  2. 存在跨域请求,在一定场景下处理相对复杂。
  3. 认证复杂,每个服务都需要独立认证。
  4. 难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信,那么重构将会很难实施。
某些微服务可能使用了防火墙 / 浏览器不友好的协议,直接访问会有一定的困难。
以上这些问题可以借助 API 网关解决。 API 网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过 API 网关这一层。也就是说, API 的实现方面更多的考虑业务逻辑,而安全、性能、监控可以交由 API 网关来做,这样既提高业务灵活性又不缺安全性。
使用 API 网关后的 优点 如下:
  1. 易于监控。可以在网关收集监控数据并将其推送到外部系统进行分析。
  2. 易于认证。可以在网关上进行认证,然后再将请求转发到后端的微服务,而无须在每个微服务中进行认证。
  3. 减少了客户端与各个微服务之间的交互次数。

2、核心概念

路由。路由是网关最基础的部分,路由信息有一个 ID 、一个目的 URL 、一组断言和一组Filter 组成。如果断言路由为真,则说明请求的 URL 和配置匹配
断言。Java8 中的断言函数。 Spring Cloud Gateway 中的断言函数输入类型是 Spring5.0 框架中的 ServerWebExchange Spring Cloud Gateway 中的断言函数允许开发者去定义匹配来自于 http request 中的任何信息,比如请求头和参数等。
过滤器。一个标准的 Spring webFilter Spring cloud gateway 中的 filter 分为两种类型的Filter,分别是 Gateway Filter Global Filter 。过滤器 Filter 将会对请求和响应进行修改处理

工作原理 

客户端发送请求给网关,弯管 HandlerMapping 判断是否请求满足某个路由,满足就发给网关的 WebHandler 。这个 WebHandler 将请求交给一个过滤器链,请求到达目标服务之前,会执行所有过滤器的 pre 方法。请求到达目标服务处理之后再依次执行所有过滤器的 post 方法

一句话: 满足某些断言( predicates )就路由到指定的地址( uri ),使用指定的过滤器(f ilter

3、使用

(1)HelloWorld

1、创建网关项目,引入网关
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2、编写网关配置文件
spring:
  cloud:
    gateway:
      routes:
        - id: test_route
          uri: https://www.baidu.com
          predicates:
            - Query=url,baidu
        - id: qq_route
          uri: https://www.qq.com
          predicates:
            - Query=url,qq

3、注意
各种 Predicates 同时存在于同一个路由时,请求必须同时满足所有的条件才被这个路
由匹配。
一个请求满足多个路由的谓词条件时,请求只会被首个成功匹配的路由转发

4、测试
可以使用 postman 进行测试网关的路由功能

(2)断言

 (3)过滤器

GatewayFilter

GlobalFilter

五、SpringCloud Alibaba-OSS

(一)、简介

对象存储服务( Object Storage Service OSS )是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本。

(二)、使用步骤

1、开通阿里云对象存储服务

https://www.aliyun.com/product/oss

2、引入 SpringCloud Alibaba-OSS

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alicloud-oss</artifactId>
</dependency>

3、配置阿里云 oss 相关的账号信息

注意:必须申请 RAM 账号信息,并且分配 OSS 操作权限
spring:
  cloud:
    alicloud:
      access-key: xxxx
      secret-key: xxxx
      oss:
        endpoint: xxxxx

4、测试使用 OssClient 上传

    @Test
    public void testUpload() throws FileNotFoundException {
        FileInputStream inputStream = new FileInputStream("C:\\Users\\86133\\Pictures\\CSDN\\向日葵.jpg");
        ossClient.putObject("gulimall-2345", "向日葵.jpg", inputStream);
        System.out.println("上传完成");
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

天猫精灵狄耐克联合研发新品, 携手打造智慧居家新体验

2023年6月28日&#xff0c;以“以Ai相伴&#xff0c;智慧赋能”为主题的2023厦门人工智能产业高峰论坛&#xff0c;在素有“中国软件特色名城”美誉的厦门隆重举行。 2023厦门人工智能产业高峰论坛现场 厦门狄耐克智能科技股份有限公司与阿里巴巴智能互联成为战略合作伙伴&…

智能抄表建设方案

城市基础设施改造是智慧城市升级建设的基础。如供水&#xff0c;水资源是人类生存发展和经济社会可持续发展的重要基础。然而&#xff0c;传统的人工抄表方式已经无法满足水资源管理和水务公司对高效、准确抄表管理的需求。由于人工抄表工作的不便捷性、耗时长和易出错性&#…

全方位对比 Postgres 和 MySQL (2023 版)

根据 2023 年 Stack Overflow 调研&#xff0c;Postgres 已经取代 MySQL 成为最受敬仰和渴望的数据库。 随着 Postgres 的发展势头愈发强劲&#xff0c;在 Postgres 和 MySQL 之间做选择变得更难了。 如果看安装数量&#xff0c;MySQL 可能仍是全球最大的开源数据库。 Postgre…

Jmeter接口关联(四)【使用正则表达式提取值】关联上下接口实际当中的运用

文章目录 前言一、Jmeter中正则表达式的运用&#xff08;使用案例讲解&#xff09;注意 前言 这篇主要是用一个实际的例子讲解正则表达式在2个有关联的接口中运用。 天气预报接口&#xff1a; 请求Key&#xff1a;79a35e2a5997710f3bdc86de81f21dbb 根据城市查询天气 接口地…

【missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun】

报错信息 安装xcode xcode-select --install 打开跳板效率会更高。

【Matlab】智能优化算法_人工蜂鸟算法AHA

【Matlab】智能优化算法_人工蜂鸟算法AHA 1.背景介绍2.数学模型2.1 初始化2.2 指导觅食2.3 领地觅食2.4 迁徙觅食 3.文件结构4.伪代码5.详细代码及注释5.1 AHA.m5.2 BenFunctions.m5.3 FunRange.m5.4 main.m5.5 SpaceBound.m 6.运行结果7.参考文献 1.背景介绍 蜂鸟是一种令人惊…

Java实现站内信

假如后台某个任务比较耗时&#xff0c;这时就需要任务完成时&#xff0c;通知一下用户&#xff0c;如下图&#xff0c;实现站内信的效果 两张表即可实现 t_message_content内容表 CREATE TABLE t_message_content (c_id int(11) NOT NULL AUTO_INCREMENT COMMENT 消息的id,se…

SpringCloud(4) Eureka 如何主动下线服务节点

目录 1.直接停掉客户端服务2.发送HTTP请求1&#xff09;调用DELETE接口2&#xff09;调用状态变更接口 3.客户端主动通知注册中心下线1&#xff09;代码示例2&#xff09;补充3&#xff09;测试 一共有三种从 Eureka 注册中心剔除服务的方式&#xff1a; 1.直接停掉客户端服务…

多个input相加计算结果为NaN的处理

为什么会出现NaN?&#xff08;复现一下&#xff09; NaN的出现&#xff1a;是因为input框绑定的都是同一个方法导致的。 因为我的需求&#xff1a;购买数量*优惠价(单价)-平台补贴-店铺补贴实付金额 的实时计算 原因&#xff1a;第一个input输入的时候&#xff0c;相应的其…

货币政策和汇率波动——使用Python进行量化分析

货币政策和汇率波动是国际贸易和投资中的重要问题&#xff0c;对于投资者来说具有重要的影响。本文将介绍如何使用Python进行量化分析&#xff0c;以揭示货币政策和汇率波动之间的关系。 一、货币政策与汇率波动 货币政策作为国家宏观调控的一种手段&#xff0c;对汇率波动具…

选读SQL经典实例笔记06_日期处理(上)

1. 计算一年有多少天 1.1. 方案 1.1.1. 找到当前年份的第一天 1.1.2. 加上1年以得到下一年的第一天 1.1.3. 得到的结果减去第一步得到的结果 1.2. DB2 1.2.1. sql select days((curr_year 1 year)) - days(curr_year)from (select (current_date -dayofyear(current_d…

数字电路设计——流水线处理器

数字电路设计——流水线处理器 从内存或是寄存器组读写、操作ALU是处理器中最耗时的操作。我们将一个指令拆成五个流水线阶段&#xff0c;每个阶段同时执行耗时的组合逻辑。这五个阶段分别是取指令、解码、执行、访存和写回。 在取指令阶段&#xff0c;处理器从指令存储器中读…

python -m 是什么命令

python -m 命令是什么意思 首先python --help 可以看到-m的含义&#xff1a;意思是将库中的python模块用作脚本去运行。 python --help 命令显示结果 python -m xxx.py 和python xxx.py 有什么区别 这是两种加载py文件的方式: 叫做直接运行&#xff08;python xxx.py&#xf…

Android 音频可视化:频谱特效的探索与实践

音频可视化&#xff0c;一言以蔽之&#xff0c;就是声音到图像的转换。 随着视觉工业时代的到来&#xff0c;用户逐渐重视产品的极致体验&#xff0c;在市场上诸多优秀的音乐类APP中&#xff0c;频谱动效 是一个经典的应用场景&#xff1a; 图片来源&#xff1a;咪咕音乐 本文…

【C++】C++的IO流

目录 一、C语言的输入与输出 二、流的概念 三、CIO流 1、C标准IO流 2、C文件IO流 四、stringstream的简单介绍 一、C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据&#xff0c;并将值存放在变量…

项目管理:如何减少项目中的信息差

在项目管理中&#xff0c;信息差的存在是难以避免的。 一方面&#xff0c;由于项目干系人各自的角色不同&#xff0c;项目经理不可能让每个人都知道所有的事情&#xff0c;以免在信息的海洋中产生更多的干扰。 另一方面&#xff0c;项目干系人需要了解项目的情况&#xff0c…

华为OD机试真题 Java 实现【数字序列比大小】【2023 B卷 100分】,田忌赛马,永远比你大,你服不服?

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 大家好&#xff0c;我是哪吒。 做技术&#xff0c;我是认真的&#xff0c;立志于打造最权威的华为OD机试真题专栏&#xff0c;帮助那些与我有同样需求的人&#xff…

ES6——Promise

promise 含义&#xff1a;异步编程解决方案 特点&#xff1a;1、状态不受外界影响&#xff0c;状态有三种&#xff1a;pending、fulfilled、rejected 2、状态不可逆&#xff0c;只能pending -> fulfilled、pending -> rejected 缺点&#xff1a;无法取消、不设置回调函…

常见的人体静电消除器的工作原理

人体静电消除器是一种用于消除人体带有静电的装置。静电是指物体表面具有电荷的现象&#xff0c;当人体带有静电时&#xff0c;会导致一些不舒适的感觉&#xff0c;同时也容易引起电击事故。 人体静电消除器的工作原理主要通过以下几个方面来实现&#xff1a; 1.接地&#xf…

深入篇【Linux】学习必备:认识冯诺依曼系统+理解操作系统(‘‘管理‘‘)

深入篇【Linux】学习必备&#xff1a;认识冯诺依曼系统理解操作系统(管理&#xff09; Ⅰ.冯诺依曼系统结构1.特点(what)2.理解(why)3.案例(how) Ⅱ.操作系统概念与定位1.概念(what)2.设计OS目的(why)3.管理(how) Ⅰ.冯诺依曼系统结构 1.特点(what) 我们认识的计算机&#xff…