SpringCloud 学习笔记2(Nacos)

news2025/4/21 20:13:40

Nacos

Nacos 下载

Nacos Server 下载 | Nacos 官网

下载、解压、打开文件:

image-20250315133920393

更改 Nacos 的启动方式

Nacos 的启动模式默认是集群模式。在学习时需要把他改为单机模式。

image-20250315134418420

cluster 改为 standalone,记得保存!

image-20250315134709848

启动startup.cmd

Ubuntu 启动命令:bash startup.sh -m standalone

image-20250315134850970

启动成功后进入 http://127.0.0.1:8848/nacos/

image-20250315135032630

Nacos 使用

引入依赖

在父项目引入:

<properties>
	<spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version>
</properties>

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>${spring-cloud-alibaba.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

<scope>import</scope> 表示这个依赖直接注入到父项目中。

子项目中引入:

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>

修改配置

子项目的 yml 文件:

spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        # Nacos 的服务器地址
        server-addr: 101.201.246.67:8848

更改代码

更改之前在项目中写死的 url。

        // 更改之前写死的 url
        // String url = "http://127.0.0.1:9090/product/" + orderInfo.getProductId();
        String url = "http://product-service/product/" + orderInfo.getProductId();

加上 @LoadBalanced 注解

@Configuration
public class BeanConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

启动服务,打开 Nacos 页面。

image-20250315164856289

服务下线

选择要进行管理的服务,点击详情

image-20250315165026714

选择要进行下线的服务器,点击下线。

image-20250315165107671

image-20250315165234047

权重配置

选择要进行管理的服务,点击详情

image-20250315165026714

选择要进行管理的服务器,点击编辑。

image-20250315165458357

进行权重设置。

image-20250315165517499

如果权重没有生效,可以查看:如何解决MSE Nacos上修改服务实例的权重不生效问题_微服务引擎(MSE)-阿里云帮助中心

因为我在项目中使用了 Loadbalance 所以设置的权重并没有生效。

要想让权重生效,需要在消费者应用的配置文件中添加:

# 开启 Nacos 的负载均衡策略
spring:
  cloud:
    loadbalancer:
      nacos:
        enabled: true

需要注意的是,服务配置权重是非严格的。

什么叫非严格呢?

举个例子:服务 A 占权重的 50%,服务 B 占权重的 50%,如果来了两个请求,不一定是 A 处理一个请求,B处理一个请求。 如果来了 2 千万次的请求,A、B 处理的请求数接近 1 千万,而不是严格的等于 1 千万。

同集群优先访问

修改配置文件:

spring:
  cloud:
    nacos:
      discovery:
        # 修改集群名称
        cluster-name:  BJ

效果:

image-20250315194509042

修改同一个服务,不同端口号的配置:

复制配置(右键你要修改的配置,按下图顺序点击)

image-20250315195018691

选择要修改的服务,点击 Edit

image-20250315194845501

修改配置,如果要修改多个配置,中间使用空格分隔。

image-20250315195211978

生产者服务有3个,分别是 9090、9091 和 9092,9090 在集群 BJ 中,而9091 和 9092 在 集群 SH 中 。

image-20250315195545063

消费者服务有一个,它在集群 BJ 中。

image-20250315200012526

此时,多次调用消费者服务,发现消费者服务会优先访问同集群下的生产者服务,也就是 9090。

image-20250315200146101

image-20250315200159855

image-20250315200231957

这就是同集群优先访问。

如果同集群下的生产者服务都挂掉了,那么本集群下的消费者服务就会转而访问不同集群下的生产者服务。

比如说,上述的 9090 挂掉了,那么 8080 就会开始访问 9091 和 9092 。

Nacos 健康检查

Nacos 提供了两种健康检查机制。

  1. 客户端主动上报机制。
    • 客户端通过心跳上报方式告知服务器健康状态,默认的心跳间隔为 5 秒。
    • Nacos 会在超过 15 秒未收到心跳后将实例设置为不健康状态,超过 30 秒就会将实例删除。
  2. 服务器端反向探测机制。
    • Nacos 主动探知客户端健康状态,默认间隔为 20 秒。
    • 健康检查失败后实例会标记为不健康,不会被立即删除。

image-20250315202436455

Nacos 服务实例类型介绍

Nacos 的服务实例类型分为临时实例和非临时实例。

  • 临时实例(默认类型):实例处于不健康状态超过一定时长,会被从服务列表删除。临时实例采用的是客户端主动上报机制。
  • 非临时实例(也叫做永久实例):实例哪怕一直处于不健康状态,也不会被删除。非临时实例采用的是服务器反向探测机制。
image-20250315204522661

非临时实例设置方法:

在配置文件中添加

spring:
  cloud:
    nacos:
      discovery:
        # false 表示修改为非临时实例
        ephemeral: false 

由于 Nacos 会记录每一个实例的 IP,端口号以及实例类型,Nacos 不允许将临时实例修改为非临时实例,非临时实例也不能修改为临时实例。如果想修改,则需要停止 Nacos 并删除 Nacos 中的 raft 文件夹。

raft 文件夹在 nacos/data/protocol/目录下。

删除后重启 Nacos,即可修改成功。

环境隔离

创建命名空间

image-20250315211304607

起名字

image-20250315211328555

将实例放在指定环境

查看命名空间 ID

image-20250315211753949

修改 yml 配置

spring:
  cloud:
    nacos:
      discovery:
        # 设置服务管理的命名空间,后面跟命名空间的 ID
        namespace: 031fd6a5-8ead-4999-bdeb-4733fb730182

不在同一命名空间下的服务不能互相访问,这就是 Nacos 的环境隔离。

Nacos 配置中心

配置中心的流程
image-20250315212731526
  1. 服务启动时,从配置中心读取配置内容,进行初始化。
  2. 配置修改时,通知微服务,实现配置的更新功能。
Nacos 配置中心使用

添加配置

image-20250315213502329

image-20250315213707268

image-20250315220545561

Data ID 介绍

image-20250317164736119

当三个配置同时存在,且各不相同时,它们的优先级为:

1. ${prefix}-${spring.profiles.active}.${file-extension}
2. ${prefix}.${file-extension}
3. ${prefix}

例如有如下三个配置:

image-20250317170024692

它们的优先级为:

image-20250317170441984

在生产者服务中引入依赖

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!-- SpringCloud 2020.*之后版本需要引⼊bootstrap-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

修改配置文件

在生产者服务中创建 bootstrap.yml 或者 bootstrap.properties 文件。

在 bootstrap.yml 或者 bootstrap.properties 中添加以下配置。

spring:
  application:
    name: product-service
  cloud:
    nacos:
      config:
        # Nacos 的服务器地址(从哪里获取配置信息)
        server-addr: 101.201.246.67:8848

从 nacos 读取配置文件

// @RefreshScope 这个注解的作用是当 nacos 中的配置发生更改,服务实例也同步更改配置。也就是配置热更新。
@RefreshScope
@RestController
public class NacosController {
    @Value("${nacos.config}")
    private String nacosConfig;

    @RequestMapping("getConfig")
    public String getConfig() {
        return "从 Nacos 中获取配置项 nacos.config:" + nacosConfig;
    }
}

image-20250315220720394

Nacos 配置管理的命名空间和服务器列表的命名空间是分别设置的,默认是public。

Nacos 命名空间配置依然在 bootstrap.properties 中进行设置。

程序会先读取 bootstrap 中的配置,然后再读取 application 中的配置。

设置命名空间:

  1. 复制命名空间 ID

    image-20250317163501928

  2. 修改 bootstrap.properties 或 bootstrap.yml 文件

    spring:
      cloud:
        nacos:
          config:
            namespace: 031fd6a5-8ead-4999-bdeb-4733fb730182   #配置中心的命名空间 ID
    

重启服务、访问接口,可以看到修改成功了!

image-20250317163710587

部署到服务器

参考 博客系统笔记总结 2( Linux 相关) 中的部署 Web 项目到 Linux

有一点不同的是,由于程序会先读取 bootstrap 中的配置,然后再读取 application 中的配置。

为了方便管理,我们可以把 application.yml 删除,此时目录结构就变成了这样:

image-20250317172133727

然后在 bootstrap 中添加:

spring:
  profiles:
    active: @profile.name@

但是因为 bootstrap 并不能识别 @ 符号,所以我们还需要在 pom 中添加:

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <includes>
                    <include>**/**</include>
                </includes>
            </resource>
        </resources>
    </build>

本文到这里就结束啦~

在这里插入图片描述

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

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

相关文章

Blender-MCP服务源码4-初始化项目解读

Blender-MCP服务源码4-初始化项目解读 上篇文章针对Blender开发框架完成了一个基础模板的搭建&#xff0c;并在Blender中成功进行了运行&#xff0c;那这个初始化项目中是如何进行页面效果呈现的&#xff0c;尝试手动进行功能精简来拆解项目代码 1-核心知识点 1&#xff09;如…

基于eNSP的IPV4和IPV6企业网络规划

基于eNSP的IPV4和IPV6企业网络规划 前言网络拓扑设计功能设计技术详解一、网络设备基础配置二、虚拟局域网&#xff08;VLAN&#xff09;与广播域划分三、冗余协议与链路故障检测四、IP地址自动分配与DHCP相关配置五、动态路由与安全认证六、广域网互联及VPN实现七、网络地址转…

C#特性和反射

1。特性概念理解&#xff1f; 特性&#xff08;Attribute&#xff09;是用于在【运行时】传递程序中各种元素&#xff08;比如类、属性、方法、结构、枚举、组件等&#xff09;行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所…

mysql5.x和mysql8.x查看和设置隔离级别

MySQL的隔离级别 级别标志值描述读未提交READ-UNCOMMITTED0存在脏读、不可重复读、幻读的问题读已提交READ-COMMITTED1解决脏读的问题&#xff0c;存在不可重复读、幻读的问题可重复读REPEATABLE-READ2mysql 默认级别&#xff0c;解决脏读、不可重复读的问题&#xff0c;存在幻…

3.17学习总结

写了两道题 刚开始用的之前做组合输出的方法&#xff0c;时间超限了&#xff0c;想不出怎么优化&#xff0c;后面看了题解&#xff0c;代码如下 #include <stdio.h> #include <stdlib.h> int n,min2e9; int a[11],b[11]; //搜索 void hly(int s,int x,int y) {//当…

Blender材质 - 层权重

层权重 混合着色器 可以让 面朝向的一面显示一种材质 另一面显示另一种材质 就能实现挺不错的材质效果 移动视角 材质会跟着变化 有点类似虚幻的视差节点BumpOffset

【JavaEE】Spring Boot 日志

目录 一、日志概述二、使用日志2.1 打印日志2.2 日志框架2.2.1 门面 / 外观 模式 2.3 日志级别2.3.1 六大分类2.3.2 使用 2.4 日志级别配置2.5 日志的持久化2.6 日志文件分割2.7 日志文件格式2.8 Slf4j 简单打印日志 一、日志概述 ⽇志主要是为了发现问题, 分析问题, 定位问题…

如何用solidworks画齿轮

齿轮还是很有技术含量的,专业名词太多看不懂, 只会画 (这个东西不能自己想当然画, 齿轮之间不啮合是很有问题的,会积累磨损) 步骤1 打开设计库里的toolbox 选择正齿轮,右键生成零件 需要改的有几个关键的地方,我是只知道内圆外圆所以,对我来说最重要的是标称轴直径 (即正中间…

详解布隆过滤器及其模拟实现

目录 布隆过滤器 引入 概念 工作原理 模拟实现布隆过滤器 哈希函数集 布隆过滤器基本框架 add函数&#xff08;添加到布隆过滤器中&#xff09; contains函数&#xff08;判断是否存在该值&#xff09; 完整代码 布隆过滤器的删除 布隆过滤器的误判率 布隆过滤器的…

element-plus中DatePicker 日期选择器组件的使用

1.选择某一天 代码&#xff1a; <el-date-pickerv-model"invoice_date"type"date"placeholder"请选择日期"style"width: 200px;"clearable /> 运行效果&#xff1a; 问题所在&#xff1a;这个数据的格式不是我们后端需要的那种&…

SvelteKit 最新中文文档教程(4)—— 表单 actions

前言 Svelte&#xff0c;一个语法简洁、入门容易&#xff0c;面向未来的前端框架。 从 Svelte 诞生之初&#xff0c;就备受开发者的喜爱&#xff0c;根据统计&#xff0c;从 2019 年到 2024 年&#xff0c;连续 6 年一直是开发者最感兴趣的前端框架 No.1&#xff1a; Svelte …

力扣hot100二刷——二叉树

第二次刷题不在idea写代码&#xff0c;而是直接在leetcode网站上写&#xff0c;“逼”自己掌握常用的函数。 标志掌握程度解释办法⭐Fully 完全掌握看到题目就有思路&#xff0c;编程也很流利⭐⭐Basically 基本掌握需要稍作思考&#xff0c;或者看到提示方法后能解答⭐⭐⭐Sl…

字符串哈希从入门到精通

一、基本概念 字符串哈希是将任意长度的字符串映射为固定长度的哈希值&#xff08;通常为整数&#xff09;的技术&#xff0c;核心目标是实现O(1)时间的子串快速比较和高效查询。其本质是通过数学运算将字符串转换为唯一性较高的数值&#xff0c;例如&#xff1a; ​​​​​​…

C语言:编程设计猜数游戏

先由计算机想一个数给用户猜&#xff0c;如果猜对了&#xff0c;提示“right&#xff01;”&#xff0c;猜错了&#xff0c;提示“wrong&#xff01;及大小” 思路&#xff1a;用随机函数rand&#xff08;&#xff09;取到计算机想的数 代码&#xff1a; #include <stdio.…

win10 c++ VsCode 配置PCL open3d并显示

win10 c VsCode配置PCL open3d并显示 一、效果图二、配置步骤2.1 安装vscode2.2 pcl-open3d配置2.3 vscode中设置 三、测试代码四、注意事项及后续 一、效果图 二、配置步骤 2.1 安装vscode vscode下载链接 下载中文插件、c相关插件 2.2 pcl-open3d配置 1&#xff09;下载…

Vala 开发环境搭建

介绍 Vala 是一种使用现代高级抽象的编程语言&#xff0c;与用 C 语言编写的应用程序和库相比&#xff0c;没有施加额外的运行时要求&#xff0c;也不需要使用不同的 ABI。 Vala 使用 GObject 类型系统&#xff0c;并具有额外的代码生成例程&#xff0c;使面向 GNOME 堆栈变得简…

【网页】自制流光卡片

概述 小红书有个博主自己搞的笔记排版工具叫“流光卡片”&#xff0c;类似的还有个Markdown排版工具叫MD2Card。 我这个版本类似&#xff0c;但是自己写的东西&#xff0c;控制性更好。 初期就写了个静态页面&#xff0c;后期结合Godot快速生成&#xff0c;并可能结合JS库&a…

CSP-J/S冲奖第18天:真题解析

解题步骤 读取输入&#xff1a;首先读取整数n&#xff0c;然后读取n个正整数并存储在一个数组或容器中。 排序数组&#xff1a;对数组进行排序&#xff0c;以便后续使用双指针法高效查找。 遍历数组&#xff1a;对于每个数target&#xff0c;检查是否存在另外两个不同的数a和…

【linux】虚拟机执行sudo yum isntall perl报错 could not retrieve mirrorlist htt:

项目场景&#xff1a; 提示&#xff1a;虚拟机安装拓展包&#xff0c;sudo yum install perl Virtualbox 在不安装增强功能扩展的情况下, 无法自适应分辨率和共享剪切板等操作 问题描述 原因分析&#xff1a; 提示&#xff1a;这里填写问题的分析&#xff1a; 出现这个错误是因…

旅游类小程序界面设计

产品概述 艾啦游是一款互联网旅游类小程序&#xff0c;致力于国内精品旅游&#xff0c;以及拥有自由行、专属热榜单、出行攻略等诸多功能&#xff0c;汇聚了许多国内的人气景点&#xff0c;与诸多城市的酒店也保持合作&#xff0c;打造一体式旅行服务&#xff0c;更有不断上新…