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

news2024/11/24 16:31:29

目录

十二、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

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

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

相关文章

Ollama vs VLLM:大模型推理性能全面测评!

最近在用本地大模型跑实验&#xff0c;一开始选择了ollama,分别部署了Qwen2.5-14B和Qwen2.5-32B&#xff0c;发现最后跑出来的实验效果很差&#xff0c;一开始一直以为prompt的问题&#xff0c;尝试了不同的prompt&#xff0c;最后效果还是一直不好。随后尝试了vllm部署Qwen2.5…

.NET9 - 新功能体验(一)

被微软形容为“迄今为止最高效、最现代、最安全、最智能、性能最高的.NET版本”——.NET 9已经发布有一周了&#xff0c;今天想和大家一起体验一下新功能。 此次.NET 9在性能、安全性和功能等方面进行了大量改进&#xff0c;包含了数千项的修改&#xff0c;今天主要和大家一起体…

LeetCode 144.二叉树的前序遍历

题目&#xff1a;给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 思路&#xff1a;根 左 右 代码&#xff1a; /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNod…

【论文阅读】WGSR

0. 摘要 0.1. 问题提出 1.超分辨率(SR)是一个不适定逆问题&#xff0c;可行解众多。 2.超分辨率(SR)算法在可行解中寻找一个在保真度和感知质量之间取得平衡的“良好”解。 3.现有的方法重建高频细节时会产生伪影和幻觉&#xff0c;模型区分图像细节与伪影仍是难题。 0.2. …

游戏引擎学习第21天

虽然没有上一节的难但是内容也很多 关于实现和使用脚本语言 以下是详细复述&#xff1a; 许多人经常问一个问题&#xff0c;反复问过好几次&#xff0c;那就是&#xff1a;是否会在项目中实现脚本语言。这个问题的具体形式通常是&#xff1a;你们会使用脚本语言吗&#xff1…

NVR接入录像回放平台EasyCVR视频融合平台加油站监控应用场景与实际功能

在现代社会中&#xff0c;加油站作为重要的能源供应点&#xff0c;面临着安全监管与风险管理的双重挑战。为应对这些问题&#xff0c;安防监控平台EasyCVR推出了一套全面的加油站监控方案。该方案结合了智能分析网关V4的先进识别技术和EasyCVR视频监控平台的强大监控功能&#…

springboot vue工资管理系统源码和答辩PPT论文

人类现已迈入二十一世纪&#xff0c;科学技术日新月异&#xff0c;经济、资讯等各方面都有了非常大的进步&#xff0c;尤其是资讯与网络技术的飞速发展&#xff0c;对政治、经济、军事、文化等各方面都有了极大的影响。 利用电脑网络的这些便利&#xff0c;发展一套工资管理系统…

部署实战(二)--修改jar中的文件并重新打包成jar文件

一.jar文件 JAR 文件就是 Java Archive &#xff08; Java 档案文件&#xff09;&#xff0c;它是 Java 的一种文档格式JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中&#xff0c;多出了一个META-INF/MANIFEST.MF 文件META-INF/MANIFEST.MF 文件在生成 JAR 文件的时候…

RabbitMQ4:work模型

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

SpringMVC——简介及入门

SpringMVC简介 看到SpringMVC这个名字&#xff0c;我们会发现其中包含Spring&#xff0c;那么SpringMVC和Spring之间有怎样的关系呢&#xff1f; SpringMVC隶属于Spring&#xff0c;是Spring技术中的一部分。 那么SpringMVC是用来做什么的呢&#xff1f; 回想web阶段&#x…

鸿蒙开发-文件与分享

文件分类 按所有者&#xff1a; 应用文件&#xff1a;所有者为应用&#xff0c;包括应用安装文件、应用资源文件、应用缓存文件等。 用户文件&#xff1a;所有者是登录到该终端设备的用户&#xff0c;包括用户私有的图片、视频、音频、文档等。 系统文件&#xff1a;与应用和…

内存级文件原理——Linux

目录 进程与文件 Linux下的文件系统 文件操作&#xff0c;及文件流 C语言函数 文件流 文件描述符 系统调用操作 系统调用参数 重定向与文件描述符 输出重定向 输入重定向 文件内容属性 Linux下一切皆文件 进程与文件 当我们对文件进行操作时&#xff0c;文件必…

KubeSphere 最佳实战:K8s 构建高可用、高性能 Redis 集群实战指南

首发&#xff1a;运维有术。 本指南将逐步引导您完成以下关键任务&#xff1a; 安装 Redis&#xff1a;使用 StatefulSet 部署 Redis。自动或手动配置 Redis 集群&#xff1a;使用命令行工具初始化 Redis 集群。Redis 性能测试&#xff1a;使用 Redis 自带的 Benchmark 工具进…

apr共享内存

下载&#xff1a; Download - The Apache Portable Runtime Project 编译&#xff1a; 使用cmake-gui生成库&#xff1a; apr-1.lib aprapp-1.lib libapr-1.lib libaprapp-1.lib libapr-1.dll 在Developer PowerShell for VS 2019中&#xff1a; 执行nmake -f Makefile.win来…

Javaweb前端HTML css 整体布局

最后一个是线条颜色 盒子&#xff0c;整体还是300&#xff0c;400

5.STM32之通信接口《精讲》之USART通信---实验串口接收程序

根据上节&#xff0c;我们一已经完成了串口发送程序的代码&#xff0c;并且深入的解析探索了串口的原理&#xff0c;接下来&#xff0c;Whappy小编将带领大家进入串口接收程序的探索与实验&#xff0c;并将结合上一节串口发送一起来完成串口的发送和接收实验。 上来两张图 上图…

借助算力云跑模型

算力平台&#xff1a;FunHPC | 算力简单易用 AI乐趣丛生 该文章只讲述了最基本的使用步骤&#xff08;因为我也不熟练&#xff09;。 【注】&#xff1a;进入平台&#xff0c;注册登录账号后&#xff0c;才能租用。学生认证&#xff0b;实名认证会有免费的算力资源&#xff0…

SpringMVC 执行流程详解

目录 前言1. SpringMVC 的核心组件概述1.1 DispatcherServlet1.2 HandlerMapping1.3 HandlerAdapter1.4 拦截器&#xff08;HandlerInterceptor&#xff09;1.5 ViewResolver 2. SpringMVC 的执行流程详解2.1 接收请求并分发2.2 获取 HandlerExecutionChain2.3 获取 HandlerAda…

安卓应用安装过程学习

声明&#xff1a;此文章来自http://shuwoom.com/?p60的学习记录 启动式安装 public static final IPackageManager main(Context context, Installer installer,boolean factoryTest, boolean onlyCore) {PackageManagerService m new PackageManagerService(context, inst…

如何通过OpenSSL来创建自签名的CA证书?

通过创建自签名CA证书可以让我们在没有商业支持的情况下学习与研究PKI&#xff08;公钥基础设施&#xff09;和SSL/TLS技术&#xff0c;本文将详细介绍如何通过OpenSSL来创建自签名的CA证书。 1. 初衷&#xff1a;为什么需要创建自签名CA证书&#xff1f; 除了开篇引言中提到的…