SpringCloud框架学习(第五部分:SpringCloud Alibaba入门和 nacos)

目录

十二、SpringCloud Alibaba入门简介

1. 基本介绍

 2.作用

3.版本选型 

十三、 SpringCloud Alibaba Nacos服务注册和配置中心

1.简介

2.各种注册中心比较 

3.下载安装

4.Nacos Discovery服务注册中心

(1) 基于 Nacos 的服务提供者

(2)基于 Nacos 的服务消费者

(3)负载均衡 

5.Nacos Config服务配置中心

(1)准备工作

(2)在 Nacos 中添加配置信息(重点)

(3)动态刷新

(4)历史配置

6.Nacos 数据模型之 Namespace-Group-DataId

(1)多环境多项目管理

 (2)三种方案加载配置

Ⅰ. DataID 方案

Ⅱ. Group 方案 

Ⅲ.  Namespace方案

7. 配置共享

(1)同服务内配置共享

(2)不同微服务共享配置

(3)配置共享的优先级


十二、SpringCloud Alibaba入门简介

1. 基本介绍

诞生:2018.10.31,Spring Cloud Alibaba 正式入驻了 Spring Cloud 官方孵化器,并在 Maven 中央库发布了第一个版本。

 2.作用

3.版本选型 

有关详细说明,请看下方,这里不再过多赘述

SpringCloud框架学习(第一部分:初始项目搭建)_idea2024创建springcloud项目-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/xpy2428507302/article/details/143419140?spm=1001.2014.3001.5502

十三、 SpringCloud Alibaba Nacos服务注册和配置中心

1.简介

命名由来:前四个字母分别为 Naming 和 Configuration 的前两个字母,最后的 为 Service

Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

        (Nacos就是注册中心 + 配置中心的组合,等价于 Spring Cloud Consul)

作用:

  • 替代 Eureka / Consul 做服务注册中心
  • 替代 (Config+Bus) / Consul  做服务配置中心和满足动态刷新广播通知

2.各种注册中心比较 

注:CAP原则又称 CAP 定理,指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。

据说 Nacos 在阿里巴巴内部有超过 10 万的实例运行,已经过了类似双十一等各种大型流量的考验,Nacos 默认是 AP 模式,

但也可以调整切换为 CP,我们一般用默认AP即可。

3.下载安装

官网:Nacos官网| Nacos 配置中心 | Nacos 下载| Nacos 官方社区 | Nacos 官网

解压安装包,在 bin 目录下的打开 cmd 运行:startup.cmd -m standalone

 命令运行成功后,直接访问:http://localhost:8848/nacos

注意:

① 如果需要登录, 默认账号密码都是 nacos

关闭 cmd 窗口,nacos服务器也就自动关闭了

4.Nacos Discovery服务注册中心

SpringCloud Alibaba参考中文文档:快速开始 | Spring Cloud Alibabaicon-default.png?t=O83Ahttps://spring-cloud-alibaba-group.github.io/zh-cn/docs/2023.0.0.0-RC1/user-guide/nacos/quick-start

为了和之前的做区分,我们这里重新创建 服务提供者 和 服务消费者模块!!!

(1) 基于 Nacos 的服务提供者

步骤:

① 新建 Module(cloudalibaba-provider-payment9001)

②  导入依赖

    <dependencies>
        <!--nacos-discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- 引入自己定义的api通用包 -->
        <dependency>
            <groupId>com.mihoyo.cloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--SpringBoot通用依赖模块-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--hutool-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.28</version>
            <scope>provided</scope>
        </dependency>
        <!--test-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

③ 修改 application.yml

server:
  port: 9001

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #配置Nacos地址

④ 修改主启动类

@SpringBootApplication
@EnableDiscoveryClient
public class Main9001
{
    public static void main(String[] args)
    {
        SpringApplication.run(Main9001.class,args);
    }
}

⑤ 编写业务类(PayAlibabaController)

@RestController
public class PayAlibabaController
{
    @Value("${server.port}")
    private String serverPort;

    @GetMapping(value = "/pay/nacos/{id}")
    public String getPayInfo(@PathVariable("id") Integer id)
    {
        return "nacos registry, serverPort: "+ serverPort+"\t id"+id;
    }
}

⑥ 打开 nacos 服务器,启动 9001,访问地址:http://localhost:8848/nacos

我们发现,9001 已成功入驻 nacos 服务器!

同时,访问地址:http://localhost:9001/pay/nacos/11,检测 9001 是否正常

(2)基于 Nacos 的服务消费者

步骤:

① 新建 Module(cloudalibaba-consumer-nacos-order83)

②  导入依赖

    <dependencies>
        <!--nacos-discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--loadbalancer-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
        <!--web + actuator-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

注意:

服务消费者作为客户端,要调用服务提供者,所以必然涉及到负载均衡,要导入 loaderBalancer 的依赖。

③ 修改 application.yml

server:
  port: 83

spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        
#消费者将要去访问的微服务名称(nacos微服务提供者叫什么你写什么)
service-url:
  nacos-user-service: http://nacos-payment-provider

④ 修改主启动类

@EnableDiscoveryClient
@SpringBootApplication
public class Main83
{
    public static void main(String[] args)
    {
        SpringApplication.run(Main83.class,args);
    }
}

⑤ 编写业务类(OrderNacosController)

注意:

我们现在讲的,仍然是通过 RestTemplate 进行服务的调用,并结合 LoadBalancer 实现负载均衡。当然它也支持 openfeign,具体操作我们后面再说。

所以,服务消费者需要配置 RestTemplate:

@Configuration
public class RestTemplateConfig
{
    @Bean
    @LoadBalanced //赋予RestTemplate负载均衡的能力
    public RestTemplate restTemplate()
    {
        return new RestTemplate();
    }
}

OrderNacosController:

@RestController
public class OrderNacosController
{
    @Resource
    private RestTemplate restTemplate;

    @Value("${service-url.nacos-user-service}")
    private String serverURL;

    @GetMapping("/consumer/pay/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Integer id)
    {
        String result = restTemplate.getForObject(serverURL + "/pay/nacos/" + id, String.class);
        return result+"\t"+"    我是OrderNacosController83调用者。。。。。。";
    }
}

⑥ 打开 nacos 服务器,启动 83,访问地址:http://localhost:8848/nacos

我们发现,83 已成功入驻 nacos 服务器!

同时,访问地址:http://localhost:83/consumer/pay/nacos/14,检测 83 是否正常

(3)负载均衡 

在过去,我们参照 9001 重新创建了一个同样的模块 9002,来检测负载均衡,但过于麻烦。

现在,我们采用一种新的办法:直接拷贝虚拟端口映射

同时启动 9001、9002 和 83 

打开 nacos,我们发现服务提供者的实例已经变成了 2 个,说明 9002 入驻成功!

测试,访问地址: http://localhost:83/consumer/pay/nacos/11

我们发现,9001 和 9002 交替轮询出现,负载均衡实现成功!

5.Nacos Config服务配置中心

之前案例 Consul8500 服务配置动态变更功能可以被 Nacos 取代

通过 Nacos 和 spring-cloud-starter-alibaba-nacos-config 实现中心化全局配置的动态变更!

(1)准备工作

步骤:

① 新建 Module(cloudalibaba-config-nacos-client3377)

② 导入依赖

    <dependencies>
        <!--bootstrap-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
        <!--nacos-config-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--nacos-discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--web + actuator-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

③ 修改 aplication.yml 和 bootstrap.yml

Question:为什么要配置两个 yml ?

Nacos 同 Consul 一样,在项目初始化时,要保证先从配置中心进行配置拉取。

拉取配置之后,才能保证项目的正常启动,为了满足动态刷新和全局广播通知

bootstrap.yml:

# nacos配置
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定yaml格式的配置

# nacos端配置文件DataId的命名规则是:
# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# 本案例的DataID是:nacos-config-client-dev.yaml

application.yml:

server:
  port: 3377

spring:
  profiles:
    active: dev # 表示开发环境
       #active: prod # 表示生产环境
       #active: test # 表示测试环境

④ 修改主启动类

@EnableDiscoveryClient
@SpringBootApplication
public class Main3377
{
    public static void main(String[] args)
    {
        SpringApplication.run(NacosConfigClient3377.class,args);
    }
}

⑤ 编写业务类(NacosConfigClientController)

@RestController
@RefreshScope //在控制器类加入@RefreshScope注解使当前类下的配置支持Nacos的动态刷新功能。
public class NacosConfigClientController
{
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo() {
        return configInfo;
    }
}

细节:通过 SpringCloud 原生注解 @RefreshScope 实现配置自动更新

(2)在 Nacos 中添加配置信息(重点)

我们注意到,在 nacos 配置管理中,有一个 Data Id,它代表什么呢?怎么取值呢?

最后公式:
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

联系说明: 

所以,本案例的 Data ID 是:nacos-config-client-dev.yaml

它就代表 3377 服务在 nacos 上的进行配置管理时的配置信息的名称!

Question:如何在 nacos 上进行配置管理?

发布后,配置列表中可以看到:

测试:启动 3377,访问地址: http://localhost:3377/config/info

说明,已经成功获取到 nacos 中编写的配置信息!

(3)动态刷新

我们还可以通过编辑,修改 nacos 中的配置信息。 

再次访问地址:http://localhost:3377/config/info,无需重启服务,即可实现动态刷新!

(4)历史配置

Nacos 会记录配置文件的历史版本,默认保留30天。

此外还有一键回滚功能,回滚操作将会触发配置更新!

6.Nacos 数据模型之 Namespace-Group-DataId

(1)多环境多项目管理

Question1:

实际开发中,通常一个系统会准备

  • dev开发环境
  • test测试环境
  • prod生产环境

如何保证指定环境启动时服务能正确读取到 Nacos上相应环境的配置文件呢?

Question2:

一个大型分布式微服务系统会有很多微服务子项目,

每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境......

那怎么对这些微服务配置进行分组和命名空间管理呢?

为此,nacos 设计了其独特的数据模型,可以通过 namespace,group,Data Id 定位到唯一 一个配置集,三者关系如下:

1 是什么
类似 Java 里面的 package 名和类名,最外层的  Namespace 是可以用于区分部署环境的Group 和 DataID 逻辑上区分两个目标对象
2 默认值
默认情况:Namespace=public,Group=DEFAULT_GROUP
Nacos 默认的命名空间是 public,Namespace 主要用来实现隔离。比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个 Namespace, 不同的 Namespace 之间是隔离的。Group默认是DEFAULT_GROUP, Group可以把不同的微服务划分到同一个分组里面去
Service就是微服务
一个Service可以包含一个或者多个Cluster(集群),一个 Cluster 包含一个或多个 instance(实例)
Nacos 默认 Cluster 是 DEFAULT,Cluste r是对指定微服务的一个虚拟划分。

 namespace,group,Data Id 在 nacos 的图形化管理界面具体体现如下:

 (2)三种方案加载配置

通过 namespace,group,Data Id 可以定位到唯一 一个配置集,接下来我们将通过三种方式来进行不同环境下读取不同的配置:

Ⅰ. DataID 方案

通过 DataID 实现环境区分:默认空间public + 默认分组DEFAULT_GROUP + 新建DataID

nacos 中新建 DataID 表示 test 环境配置

修改 application.yml:

通过spring.profile.active属性就能进行多环境下配置文件的读取

基于第一种方式,只修改 Data Id,不修改 namespace 和 group,所以不需要修改 bootstrap.yml


测试:启动 3377,访问地址:http://localhost:3377/config/info

Ⅱ. Group 方案 

通过Group实现环境区分:默认空间 public + 新建GROUP + 新建DataID

nacos 中新建 group 和 DataID 表示 prod 环境配置 

修改 application.yml:

修改 bootstrap.yml:

在 config 下增加一条 group 的配置,为 PROD_GROUP(group 默认值是 DEFAULT_GROUP)

# nacos配置
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定yaml格式的配置
        group: PROD_GROUP

测试:启动 3377,访问地址:http://localhost:3377/config/info

Ⅲ.  Namespace方案

通过Namespace实现命名空间环境区分:新建空间Namespace + 新建GROUP + 新建DataID

nacos 中新建 namespace 表示 prod 环境配置

注意:如果第一行命名空间ID不填,则会自动生成一串ID,这个ID 后续要配置进 bootstrap.yml 中

在 Prod_Namespace 下新建 GROUP 和 DataID

修改 application.yml:

修改 bootstrap.yml:

在 config 下增加一条 namespace 的配置,为 Prod_Namespace(namespace 默认值是 public)

# nacos配置
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定yaml格式的配置
        group: PROD_GROUP
        namespace: Prod_Namespace #命名空间的 ID

测试:启动 3377,访问地址:http://localhost:3377/config/info

7. 配置共享

当配置越来越多的时候,我们就发现有很多配置是重复的,这时候就考虑可不可以将公共配置⽂件提取出来

(1)同服务内配置共享

步骤:

新建⼀个以 spring.application.name 命名的配置文件,然后将其所有环境的公共配置放在里面

这里就不测试了,感兴趣的可以自己测试一下。(注意 group 和 namespace 两边应该相吻合)

可以新建一个 3377 的副本 module,检测两个实例是否都能连接数据库。


我这里只是配置了一下端口号,显示可以获取到

 

(2)不同微服务共享配置

不同服务之间实现配置共享的原理类似于文件引入,就是定义⼀个公共配置,然后在当前配置中引入。

步骤:

在 nacos 中定义⼀个 DataID 为 datasource.yaml 的配置,用于所有微服务共享

②  修改 bootstrap.yaml

# nacos配置
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定yaml格式的配置
        shared-dataids: datasource.yaml # 配置要引入的配置
        refreshable-dataids: datasource.yaml # 配置要实现动态配置刷新的配置

这里也不做测试了,感兴趣的可以自己测试一下(注意 group 和 namespace 两边应该相吻合)

可以将不同微服务配置进 nacos,修改它们的 bootstrap.yaml,看看都是否能连接上数据库。


同样,我这里只是配置了一下端口号,显示可以获取到

(如果你也想这样,注意先把 nacos 中 nacos-config-client.yaml 的内容修改掉,因为它的优先级更高,会覆盖)

(3)配置共享的优先级

当nacos 、nacos服务器、本地同时出现相同属性时,优先级有高低之分:

服务名-环境.yaml > 服务名.yaml > datasource.yaml > bootstrap.yaml > application.yaml

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

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

相关文章

Ubuntu下用Docker部署群晖系统---Virtual DSM --zerotier实现连接

Ubuntu下用Docker部署群晖系统—Virtual DSM --zerotier实现连接 1. Docker 安装 安装最新docker curl -fsSL get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo docker run hello-world2.docker-compose 安装 sudo pip install docker-compose测试安装是否成功…

【排版教程】Word、WPS 分节符(奇数页等) 自动变成 分节符(下一页) 解决办法

毕业设计排版时&#xff0c;一般要求每章节的起始页为奇数页&#xff0c;空白页不显示页眉和页脚。具体做法如下&#xff1a; 1 Word 在一个章节的内容完成后&#xff0c;在【布局】中&#xff0c;点击【分隔符】&#xff0c;然后选择【奇数页】 这样在下一章节开始的时&…

241125学习日志——[CSDIY] [InternStudio] 大模型训练营 [17]

CSDIY&#xff1a;这是一个非科班学生的努力之路&#xff0c;从今天开始这个系列会长期更新&#xff0c;&#xff08;最好做到日更&#xff09;&#xff0c;我会慢慢把自己目前对CS的努力逐一上传&#xff0c;帮助那些和我一样有着梦想的玩家取得胜利&#xff01;&#xff01;&…

JVM类加载和垃圾回收算法详解

文章目录 JVM一、JVM运行流程1. JVM执行流程 二、JVM运行时数据区1. 程序计数器&#xff08;线程私有&#xff09;2. 虚拟机栈 &#xff08;线程私有&#xff09;3. 本地方法栈&#xff08;线程私有&#xff09;4. 堆&#xff08;线程共享&#xff09;5. 元空间&#xff08;线程…

1、正则表达式

grep匹配 grep用来过滤文本内容&#xff0c;以匹配要查询的结果。 grep root /etc/passwd&#xff1a;匹配包含root的行 -m 数字&#xff1a;匹配几次后停止 -v&#xff1a;取反-i&#xff1a;忽略字符的大小写&#xff0c;默认的&#xff0c;可以不加-n&#xff1a…

Java学习笔记--继承的介绍,基本使用,成员变量和成员方法访问特点

目录 一&#xff0c;继承 1.什么是继承 2.怎么去继承: 3.注意: 4.继承怎么学 二&#xff0c;继承基本使用 三&#xff0c;成员变量和成员方法访问特点 1.成员变量访问特点 1&#xff0c;子类和父类中的成员变量不重名: 总结: 2&#xff0c;子类和父类中的成员变量重…

初级数据结构——二叉树题库(c++)

这里写目录标题 前言[1.——965. 单值二叉树](https://leetcode.cn/problems/univalued-binary-tree/)[2.——222. 完全二叉树的节点个数](https://leetcode.cn/problems/count-complete-tree-nodes/)[3.——144. 二叉树的前序遍历](https://leetcode.cn/problems/binary-tree-…

redmi 12c 刷机

刷机历程 一个多月前网购了redmi 12c这款手机, 价格只有550,用来搞机再适合不过了, 拆快递后就开始倒腾,网上有人说需要等7天才能解锁,我绑定了账号过了几天又忍不住倒腾,最后发现这块手机不用等7天解锁成功了,开始我为了获取root权限, 刷入了很火的magisk,但是某一天仍然发现/…

Python 爬虫入门教程:从零构建你的第一个网络爬虫

网络爬虫是一种自动化程序&#xff0c;用于从网站抓取数据。Python 凭借其丰富的库和简单的语法&#xff0c;是构建网络爬虫的理想语言。本文将带你从零开始学习 Python 爬虫的基本知识&#xff0c;并实现一个简单的爬虫项目。 1. 什么是网络爬虫&#xff1f; 网络爬虫&#x…

计算机毕业设计Hadoop+Spark音乐推荐系统 音乐预测系统 音乐可视化大屏 音乐爬虫 HDFS hive数据仓库 机器学习 深度学习 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

JAVA题目笔记(二十)Stream流综合练习+方法引用

一、数据过滤 import java.util.*; import java.util.stream.Collectors;public class Co {public static void main(String[] args) {List<Integer> listnew ArrayList<>();Collections.addAll(list,1,2,3,4,5,6,7,8,9,10);List<Integer> newlist list.str…

Python学习34天

import random class Game: peo0 rob0 # # def __init__(self,peo,rob): # self.peopeo # self.robrob def Play(self): """ 石头剪刀布游戏&#xff0c;0代表石头&#xff0c;1代见到&#xff0c;2代表石头 …

MATLAB支持的距离度量

距离度量是用于量化两个点或样本之间差异的一种方法。在不同的领域和应用场景中&#xff0c;距离度量的选择可能会有所不同。 欧几里得距离&#xff08;Euclidean Distance&#xff09;&#xff1a;这是最直观的距离定义&#xff0c;适用于n维空间中的两点。对于二维空间中的点…

Jmeter中的测试片段和非测试原件

1&#xff09;测试片段 1--测试片段 功能特点 重用性&#xff1a;将常用的测试元素组合成一个测试片段&#xff0c;便于在多个线程组中重用。模块化&#xff1a;提高测试计划的模块化程度&#xff0c;使测试计划更易于管理和维护。灵活性&#xff1a;可以通过模块控制器灵活地…

【1.2 Getting Started--->Installation Guide】

NVIDIA TensorRT DOCS 此 NVIDIA TensorRT 10.6.0 安装指南提供安装要求、TensorRT 包中包含的内容列表以及安装 TensorRT 的分步说明。 安装指南 摘要&#xff1a; 本 NVIDIA TensorRT 10.3.0 安装指南提供了安装要求、TensorRT 软件包中包含的内容列表以及安装 TensorRT 的…

ubuntu设置程序开机自启动

文章目录 1、概述2、图形界面设置3、设置为Systemd服务 1、概述 测试环境&#xff1a;ubuntu22.04 带图形界面 实现方式1&#xff1a;通过图形界面的【启动应用程序】设置开机自启动&#xff1b; 实现方式2&#xff1a;通过配置为服务实现开机自启动。 2、图形界面设置 优点&am…

IDEA2024创建一个spingboot项目

以下是创建一个基本的 Spring Boot 项目的步骤和示例&#xff1a; 初始化一个springboot工程其实有许多方法&#xff0c;笔者这里挑了一个最快捷的方式搭建一个项目。我们直接通过官方平台&#xff08;start.spring.io&#xff09;进行配置&#xff0c;然后下载压缩包就可以获取…

商用密码应用安全性评估,密评整体方案,密评管理测评要求和指南,运维文档,软件项目安全设计相关文档合集(Word原件)

一、 密码应用安全性评估方案 &#xff08;一&#xff09; 密码应用测评工作思路 1.1.1. 测评准备活动的主要任务 1.1.2. 测评准备活动的输出文档 1.2. 方案编制活动 1.2.1. 方案编制活动的主要任务 1.2.2. 方案编制活动的输出文档 1.3. 现场预评估活动 1.3.1. 现场测评…

音视频技术扫盲之预测编码的基本原理探究

预测编码是一种数据压缩技术&#xff0c;广泛应用于图像、视频和音频编码等领域。其基本原理是利用数据的相关性&#xff0c;通过对当前数据的预测和实际值与预测值之间的差值进行编码&#xff0c;从而实现数据压缩的目的。 一、预测编码的基本概念 预测编码主要包括预测器和…

标定系列——关于cv::calibrateHandEye的介绍

关于cv::calibrateHandEye的介绍 介绍函数原型所在头文件原理说明 介绍 函数原型 void cv::calibrateHandEye ( InputArrayOfArrays R_gripper2base, InputArrayOfArrays t_gripper2base, InputArrayOfArrays R_target2cam, InputArrayOfArrays t_target2cam, OutputArra…