三.Nacos

本文详细介绍了Nacos在SpringBoot项目中的集成,包括服务注册与发现、统一配置管理、配置文件的切换以及数据库配置。还涵盖了如何实现实时热更新和集群模式部署以提高系统的健壮性。

本文档中的Nacos为Alibaba Nacos

目录

1.Nacos基本概念

2.Nacos安装

3.Nacos集成SpringBoot实现服务注册与发现

3.1 在pom中添加依赖

3.2 在application.yml中配置如下信息

3.3 将RestTemplate注册到Ioc容器中

3.4 配置服务提供者和消费者

领域模型:

4.Nacos实现统一配置管理

4.1基础概念及配置

4.1.1⬇️ 在项目中添加依赖

4.1.2⬇️ 在配置文件中添加config相关属性

application.yml和bootstrap.yml的区别

4.1.3⬇️ 在Nacos配置中心添加配置文件

4.1.4▶️ 在Nacos中的配置文件中添加属性

4.1.5 热更新

4.2.6 配置文件的切换

4.2.7 配置数据库

4.2.7.1⬇️ 添加Mysql数据库

4.2.7.2⬇️ 转储sql文件

4.2.7.3▶️ 修改配置文件

4.2 Nacos集群模式

4.2.1⬇️ 模拟集群环境

4.2.2⬇️修改配置文件

4.2.3▶️运行即可


1.Nacos基本概念

Nacos是阿里巴巴推出来的一个新开源项目,致力于帮助发现,配置和管理微服务.Nacos提供了一组简单易用的特性集,帮助快速实现动态服务发现,服务配置,服务元数据,及流量管理

Nacos是以服务为主要服务对象的中间件,Nacos支持所有主流的服务发现,配置和管理,Nacos主要提供以下四个功能:

  • 服务发现和服务健康检测
  • 动态配置服务
  • 动态DNS服务
  • 服务及其元数据管理

nacos服务客户端(要注册到nacos的服务)启动时会每隔一段时间(默认5秒)向nacos发生心跳包,nacos注册中心15秒内没有检测到心跳包会默认认为nacos处于一种不健康的状态,30秒还没收到则认为这个服务已不可用。

2.Nacos安装

下载链接

将文件夹直接拷贝到指定盘(路径不能有中文),随后修改bin目录下的startup.cmd文件,集群模式改为单机模式

set MODE="cluster"修改为set MODE="standalone"

保存后单击此文件运行即可

启动后,直接在浏览器访问 localhost:8848/nacos,账号密码都是nacos

3.Nacos集成SpringBoot实现服务注册与发现

3.1 在pom中添加依赖

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

3.2 在application.yml中配置如下信息

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        # 因部分本机可能安装了VMware虚拟机,因此可能不止一个网卡,所以需指定ip,如果没有则不需指定
        ip: 127.0.0.1

3.3 将RestTemplate注册到Ioc容器中

 @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

3.4 配置服务提供者和消费者

服务提供者:

package com.bdqn.qianmo.user.controller;

import com.bdqn.beans.User;
import com.bdqn.qianmo.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    UserService userService;
    @Value("${server.port}")
    int port;
    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        System.out.println("port: "+port);
        return userService.getById(id);
    }
}

服务消费者:

package com.bdqn.qianmo.order.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bdqn.beans.Order;
import com.bdqn.beans.User;
import com.bdqn.qianmo.order.service.OrderService;
import com.bdqn.qianmo.order.mapper.OrderMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;

/**
 *
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order>
        implements OrderService {
    @Autowired
    RestTemplate restTemplate;

    @Override
    public Order selectById(Long id) {
        Order order = this.getBaseMapper().selectById(id);
        User forObject = restTemplate.getForObject("http://user-service/user/" + order.getUserId(), User.class);
        order.setUser(forObject);
        return order;
    }
}




注:服务提供者和服务消费者为两个分开运行的SpringBoot项目中,项目启动后效果如图

领域模型:

4.Nacos实现统一配置管理

4.1基础概念及配置

当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。而Nacos一方面可以将配置集中配置,另一方面可以在配置变更时,及时通知微服务,实现配置的热更新

那么,如何在Nacos中配置管理呢,步骤如下

4.1.1⬇️ 在项目中添加依赖

在pom文件中添加nacos-config依赖

<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

4.1.2⬇️ 在配置文件中添加config相关属性

需要注意的是,此处的文件名应该为bootstrap.yml文件

spring:
  cloud:
    nacos:
      config:
        #nacos配置中心的地址
        server-addr: localhost:8848
        #文件后缀
        file-extension: yml
        #共享的配置文件列表
        shared-configs:
          - application-common.yml
    #微服务名称
  application:
    name: user-service
application.yml和bootstrap.yml的区别

在SpringCloud的官方文档中有描述两个文件的区别

官网链接

原文经过翻译后,大致意思如下:

Spring Cloud 构建于 Spring Boot 之上,在 Spring Boot 中有两种上下文,一种是 bootstrap, 另外一种是 application, bootstrap 是应用程序的父上下文,也就是说 bootstrap 加载优先于 applicaton。bootstrap 主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一个环境,它是任何Spring应用程序的外部属性的来源。bootstrap 里面的属性会优先加载,它们默认也不能被本地相同配置覆盖。

因此,对比application文件,bootstrap配置文件有以下几个特性

  • bootstrap由父ApplicationContext记载,优先级比application高
  • bootstrap中的属性不能被application中的相同属性覆盖

bootstrap/application的应用场景:

application主要用于SpringBoot项目的自动配置

bootstrap配置文件则有以下几个应用场景:

  • 使用SpringCloud Config配置中心时,需要在bootstrap中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
  • 一些固定的不能被覆盖的属性
  • 一些加密/解密的场景

总结:

优先级为:bootstrap.properties>bootstrap.yml>application.properties>application.yml

bootstrap为系统级别,application为应用级别

4.1.3⬇️ 在Nacos配置中心添加配置文件

需要注意的是,此处的Data ID必须要和项目中配置的微服务名称和文件后缀一样,比如在4.2中配置的是user-service的微服务名称,后缀为yml,那么此处的Data ID就必须为"user-service.yml"

4.1.4▶️ 在Nacos中的配置文件中添加属性

添加完后,即可正常启动项目了

启动流程如下:

4.1.5 热更新

Nacos中的配置文件更新时,如何在项目不重新启动的情况下也能做到热更新呢,其实很简单,只需要在Controller中添加@RefreshScope注解修饰类即可

@RestController
@RequestMapping("/user")
@RefreshScope
public class UserController {
    @Autowired
    UserService userService;

    @Value("${server.port}")
    int port;

    @Value("${activeTest}")
    String activeTest;



    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        System.out.println("port: "+port);
        return userService.getById(id);
    }

    @GetMapping("/getTest")
    public String get() {
        return activeTest;
    }
}

这样,当配置文件中的属性被修改时,则可以在不重启项目的情况下进行属性值的更新

@RefreshScope: 经过@RefreshScope注解修饰的Bean,将被RefreshScope进行代理,当配置变更时可以在不重启jvm的前提下刷新Bean中相关的属性值和Bean的热更新。

4.2.6 配置文件的切换

在实际应用场景中,运行的环境可能分为测试环境和dev环境或本地环境,预发布环境,线上环境,那如何在不修改微服务名称的情况下,进行配置文件的切换呢?只需要在bootstrap中添加一个属性即可

profiles.active的规则:

active的值,直接影响项目在nacos中寻找配置文件:微服务名称+"-"+"."+文件类型,例如:

  • 此处的active值若为test,则项目在Nacos配置列表中查找的就是user-service-test.yml的配置文件
  • 此处的active值若为dev,则项目在Nacos配置列表中查找的就是user-service-dev.yml的配置文件

4.2.7 配置数据库

在Nacos单机模式中,nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况,因此需要配置mysql数据库,可视化的查看数据的存储情况,步骤如下:

4.2.7.1⬇️ 添加Mysql数据库

先创建一个空的数据库

4.2.7.2⬇️ 转储sql文件

在nacos的安装路径下,找到conf文件夹下的nacos-mysql.sql文件

转储此文件,效果如下:

4.2.7.3▶️ 修改配置文件

在nacos的安装路径下,找到conf文件夹下的application.properties文件

修改后如下:

4.2 Nacos集群模式

为了避免在实际项目中会产生的单点故障,Nacos的运行模式要从单机转为集群

以下操作,所有nacos都需要进行,有一个没有修改则无法运行集群模式

4.2.1⬇️ 模拟集群环境

安装三个nacos来模拟集群环境

然后检查启动器(安装路径下bin目录的startup.cmd文件)的运行模式:

4.2.2⬇️修改配置文件

a. 修改nacos安装路径下config文件夹中的application.properties文件,修改端口号

注意的是,三个nacos的端口号都应该避免重复,以避免端口号占用

b. 同样的文件,修改ip号(如果本机没有安装虚拟机,且只有一个网卡则无需配置)

c. 复制一个安装路径下conf文件夹下的cluster.conf.example文件,并删除.example后缀

d.修改cluster.conf文件,将三个修改后的nacos端口号添加进去

4.2.3▶️运行即可

依次启动三个nacos,效果如图:

微服务项目中的配置如图:

<think>好的,我现在需要回答用户关于Spring Cloud Nacos中`spring.cloud.nacos.discovery.server-addr`和`spring.cloud.nacos.server-addr`的区别及作用的问题。用户之前已经问过关于`server-addr`配置的问题,现在进一步希望了解这两个具体参数的区别。 首先,我需要回忆之前给出的回答,确保一致性。之前的回答中提到`server-addr`分为配置中心和服务发现两种场景,分别对应`config.server-addr`和`discovery.server-addr`。但用户现在提到的`spring.cloud.nacos.server-addr`看起来是一个顶层的配置,可能和之前的分类不同。 接下来,我需要检查用户提供的引用内容。引用[1]中的例子使用了`spring.cloud.nacos.server-addr`,而引用[3]中的例子使用的是`spring.cloud.nacos.discovery.server-addr`。这说明用户可能在实际配置中遇到了两种不同的写法,需要明确它们的区别。 我需要确认在Spring Cloud Alibaba Nacos的官方文档中,这两种配置方式的区别。通常,顶层的`spring.cloud.nacos.server-addr`可能是一个通用的配置,如果单独配置了`discovery`或`config`下的`server-addr`,则会覆盖顶层的配置。如果没有单独配置,则使用顶层的通用配置。但需要验证这一点是否正确。 然后,用户的问题具体是询问`spring.cloud.nacos.discovery.server-addr`与`spring.cloud.nacos.server-addr`的区别。需要明确,前者是专门用于服务发现的地址,而后者是通用配置,可能同时影响配置中心和服务发现,如果子模块没有单独配置的话。 另外,引用[1]中的例子将`spring.cloud.nacos.server-addr`用于配置中心,而引用[3]中的`discovery.server-addr`用于服务发现。这说明在某些情况下,顶层配置可能被不同模块隐式使用,但为了明确性,最好分开配置。 需要指出,`spring.cloud.nacos.server-addr`是一个旧版或简化的配置方式,可能会同时设置配置中心和服务发现的地址,但官方推荐分开配置,尤其是在需要不同地址的情况下。例如,当配置中心和服务发现部署在不同的Nacos集群时,必须分开配置各自的`server-addr`。 此外,需要提到版本兼容性问题,不同版本的Spring Cloud Alibaba可能对顶层配置的支持不同,因此检查文档版本很重要。引用[2]提到了依赖的版本是2021.0.4.0,这可能对应Spring Cloud 2021.x版本,需要注意配置方式是否有变化。 最后,总结两者的区别:顶层配置是通用设置,而子模块配置是专用设置,后者会覆盖前者。建议用户显式配置`discovery.server-addr`和`config.server-addr`以避免混淆和潜在的问题。</think>### Spring Cloud Nacos 中 `spring.cloud.nacos.server-addr` 与 `spring.cloud.nacos.discovery.server-addr` 的区别及作用 #### 一、核心区别 1. **作用范围不同** - **`spring.cloud.nacos.server-addr`** 这是一个**通用配置**,若未显式指定 `config.server-addr` 或 `discovery.server-addr`,则此配置会同时作用于 **Nacos 配置中心** 和 **Nacos 服务发现** 模块[^1][^3]。 *示例*(引用[1]中的配置): ```properties spring.cloud.nacos.server-addr=107.55.111.157:8848 # 同时影响配置中心和服务发现 ``` - **`spring.cloud.nacos.discovery.server-addr`** 这是**服务发现专用配置**,仅用于指定服务注册与发现的 Nacos 服务器地址[^3]。 *示例*(引用[3]中的配置): ```yaml spring: cloud: nacos: discovery: server-addr: localhost:8848 # 仅服务发现生效 ``` 2. **优先级不同** - 若同时配置了 `spring.cloud.nacos.server-addr` 和 `spring.cloud.nacos.discovery.server-addr`,则服务发现模块会优先使用后者[^1][^3]。 - 类似地,若单独配置 `spring.cloud.nacos.config.server-addr`,则配置中心模块也会优先使用专用配置。 --- #### 二、典型场景对比 | 配置方式 | 影响范围 | 适用场景 | |------------------------------|-----------------------------------|----------------------------------------| | `spring.cloud.nacos.server-addr` | 配置中心 + 服务发现(若未单独配置) | 快速开发环境,Nacos 集群统一地址 | | `spring.cloud.nacos.discovery.server-addr` | 仅服务发现模块 | 需将服务发现与配置中心分离的复杂环境 | *示例场景*: - **单集群环境**:使用通用配置 `spring.cloud.nacos.server-addr` 简化配置。 - **多集群环境**: ```yaml spring: cloud: nacos: config: server-addr: 192.168.1.100:8848 # 配置中心集群地址 discovery: server-addr: 192.168.1.101:8848 # 服务发现集群地址 ``` --- #### 配置建议与注意事项 1. **显式分离配置** - 为避免歧义,建议始终**显式指定** `config.server-addr` 和 `discovery.server-addr`,即使它们地址相同[^1][^3]。 - *错误示例*: ```yaml spring: cloud: nacos: server-addr: 192.168.1.100:8848 # 可能无意中覆盖其他模块 ``` 2. **版本兼容性** - Spring Cloud 2020.0.0 及以上版本要求将配置放在 `bootstrap.yml` 中,并添加 `spring-cloud-starter-bootstrap` 依赖[^2]。 - 若未正确配置,可能导致 `server-addr` 不生效。 3. **域名解析与网络连通性** - 若使用域名(如 `nacos-cluster.com:8848`),需确保 DNS 解析正常且防火墙开放端口。 - 建议通过 `telnet` 或 `curl` 验证连通性。 --- #### 四、常见问题排查 1. **服务未注册到指定地址** - 检查是否误用通用配置 `spring.cloud.nacos.server-addr`,而未显式配置 `discovery.server-addr`。 - 查看 Nacos 控制台的服务列表,确认注册 IP 是否符合预期[^3]。 2. **配置拉取失败** - 若配置中心地址被通用配置覆盖,可能导致拉取错误的命名空间(namespace)或分组(group)。 --- ### 相关问题 1. 如何验证 `server-addr` 配置是否生效? 2. 若同时配置通用地址和专用地址,Nacos 模块的初始化顺序是怎样的? 3. 在 Kubernetes 环境中如何动态配置 `server-addr`?
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值