【Spring Cloud Alibaba】:Nacos 使用全详解

发布于:2025-04-05 ⋅ 阅读:(11) ⋅ 点赞:(0)

在这里插入图片描述

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!

🌟了解分布式系统的 Gossip协议 请看 : Gossip协议:分布式系统中的“八卦”传播艺术

其他优质专栏: 【🎇SpringBoot】【🎉多线程】【🎨Redis】【✨设计模式专栏已完结)】…等

如果喜欢作者的讲解方式,可以点赞收藏加关注,你的支持就是我的动力
✨更多文章请看个人主页: 码熔burning

前言:
上文我们了解到 Nacos 的作用,以及在本地启动 Nacos 的服务器,接下来,在本篇文件会详细的讲解 Nacos 的使用和配置。🎈

一、服务注册发现

整合 Spring Cloud AlibabaNacos 简单的很,直接启动 Alibaba提供的 Nacos 服务即可,这样就能让程序员把更多的经历放在核心业务上。

看本文之前先看:【Spring Cloud Alibaba】:Nacos 入门讲解

以下是一个简单的架构图:
在这里插入图片描述

接下来我要按照这个简单的架构图来讲解!

参考上面的架构图,需要创建两个模块,分别是nacos-provider(服务提供者)、nacos-consumer(服务消费者)

  • nacos-provider:注册进入nacos-server,对外暴露服务
  • nacos-consumer:注册进入nacos-server,调用nacos-provider的服务

1、nacos-provider服务提供者创建

1. 添加 Maven 依赖
在pom文件中需要添加 spring-cloud-starter-alibaba-nacos-discovery 这个依赖,代码如下:

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

这里没有指定版本是因为父模版指定了 spring-cloud-alibaba-dependencies 的版本,所以子模块直接引入依赖即可,因为这样能够更好地达到版本管理的效果。
具体还请看:【Spring Cloud Alibaba】:Nacos 入门讲解

2.配置YML文件

server:
  port: 9901
spring:
  application:
  	# 指定服务名称,在nacos中的名字
    name: nacos-provider
  cloud:
    nacos:
      discovery:
      	# nacos的服务地址,nacos-server中IP地址:端口号
        server-addr: 127.0.0.1:8848

3.开启服务注册和发现功能
大部分 SpringBoot 引入了某些功能模块之后都要手动的在启动类添加@EnableXxxx 来开启某个功能,否则无法引入自动配置。这里开启服务注册发现功能的注解是:@EnableDiscoveryClient

@EnableDiscoveryClient     //开启服务注册发现功能
@SpringBootApplication
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProvideApplication.class, args);
    }
}

4.编写接口
由于 nacos-provider 作为服务的提供者,肯定是需要提供服务的,这里编写一个接口来供消费者服务。

@RestController
@RequestMapping("/nacos")
public class testController {

    @GetMapping("/test")
    public String test(){
        return "调用了服务者提供服务接口";
    }
}

5.启动项目
启动项目就是在项目的启动类中启动,点这绿色的小三角符号。
在这里插入图片描述

启动完成之后,可以在 Nacos 中查看是否以及进行了服务的注册,可以看到 nacos-provider 已经成功注册到了 Nacos 中。
在这里插入图片描述


2、nacos-consumer服务消费者创建

nacos-consumernacos-provider 步骤差不多
1.添加 Maven 依赖
nacos-consumer 服务的pom文件添加 spring-cloud-starter-alibaba-nacos-discovery

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

2.配置YML文件

server:
  port: 9902

spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

service-url:
  nacos-provider: http://nacos-provider    #微服务的访问名称

3.开启服务注册和发现功能
使用 @EnableDiscoveryClient 注解来开启服务注册和发现功能

@SpringBootApplication
@EnableDiscoveryClient    //开启功能的注解
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

4.调用 nacos-provider 的接口
首先创建一个 RestTemplate ,将其注册到 IOC 容器中,然后添加@LoadBalanced注解来开启负载均衡。
开启负载均衡前需要添加依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
public class AutoBeanConfig {

    @Bean
    @LoadBalanced    //开启负载均衡
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

编写调用接口:

@RestController
public class ConsumerController {

    @Resource
    private RestTemplate restTemplate;

    //获取配置文件中的微服务访问地址
    @Value("${service-url.nacos-provider}")
    private String servicePrivadeUrl;

    @GetMapping("/test")
    public ResponseEntity<String> test() {
        return restTemplate.getForEntity(servicePrivadeUrl + "/nacos/test", String.class);
    }
}

注意: 因为已经将 nacos-provider 注入到了 Nacos 中了,所以是可以直接通过服务名直接找到对应的服务的,而 servicePrivadeUrl 注入的就是服务名。

5.启动项目
启动之后就能看到 Nacos 中已经有两个服务了
在这里插入图片描述

然后进行接口的调用看看能不能调用成功,在浏览器中访问:http://localhost:9902/test,可以看到调用成功了。
在这里插入图片描述
总结:可以看到,Nacos 的服务注册和发现是如此的简单。还不需要自己搭建注册中心,直接提供好了。

二、配置管理

为什么需要配置管理呢?🤔试想一下、如果你的一个线上项目想要修改某个配置,比如数据源变了,要添加新的数据源,这个时候修改完了应该怎么办?把项目停掉重启?你觉得这样做合理吗,显然是不合理的吧。

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

Nacos 一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。

在这里插入图片描述

1、添加配置文件

首先,在 Nacos 添加配置文件,如下图步骤:
在这里插入图片描述
填写完配置信息之后,进行发布

在这里插入图片描述

Data ID是什么?dataId是一个配置的唯一标识,怎么取值呢?格式如下
${prefix}-${spring.profiles.active}.${file-extension}

  • prefix:前缀,默认是spring.application.name的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profiles.active: 即为当前环境对应的 profile。当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。

2、拉取配置

创建一个模块,名叫 config-demo 父类为 ,来获取 Nacos 的配置内容

首先添加依赖:


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

<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

创建一个 bootstrap.yml 文件,该文件是用来设置 Nacos 的配置,该文件会在 application.yml 之前被读取
在这里插入图片描述
配置如下

spring:
  application:
    name: nacos-config # 服务名称
  profiles:
    active: dev #开发环境,这里是dev 
  cloud:
    nacos:
      server-addr: localhost:8848 # Nacos地址
      config:
        file-extension: yaml # 文件后缀名

根据配置文件的内容,他会去 Nacos 中读取作为 nacos-config-dev.yaml 的Data ID里面的内容,也就是我们上面在 Nacos 中添加的。

在这里插入图片描述

application.yml 文件设置改模块的端口为9903

server:
  port: 9903

3、读取配置

创建一个 controller 来测试一下

@RestController
public class NacosController {

    @Value("${datas.version}")    //读取Nacos的配置信息
    private String version;

    @GetMapping("/test")
    public String test(){
        return "这是在Nacos中添加的配置信息: version = " + version;
    }
}

启动项目,访问 http://localhost:9903/test ,结果如下:
在这里插入图片描述

恭喜你,读取 Nacos 的配置信息成功!🎉

但是目前还不能动态刷新(热更新), 也就是修改了 Nacos 中的配置信息,无需启动项目就能实时的读取新的配置信息。不相信?🤔那你请看!
在这里插入图片描述

不启动,重新访问 http://localhost:9903/test

在这里插入图片描述

那怎么才能实现热更新呢?别急,往下看!

4、配置热更新

方式一:添加 @RefreshScope 注解

@Value 注入的变量所在类上添加注解 @RefreshScope
在这里插入图片描述

重新启动项目,访问http://localhost:9903/test
在这里插入图片描述
修改 Nacos 中的配置信息:

在这里插入图片描述
再次访问http://localhost:9903/test

在这里插入图片描述

方式二:使用@ConfigurationProperties注解代替@Value注解。

添加一个类,来读取 Nacos 的配置信息

@Component
@Data
@ConfigurationProperties(prefix = "datas")
public class DatasProperties {
    private String version;
}

然后再 controller 中使用这个类来代替@Value

在这里插入图片描述
重启应用,访问http://localhost:9903/test

在这里插入图片描述

修改 Nacos 的配置内容:

在这里插入图片描述

访问http://localhost:9903/test

在这里插入图片描述

5、多环境共享

其实微服务启动时,会去 nacos 读取多个配置文件,例如:

  • [spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml
  • [spring.application.name].yaml,例如:userservice.yaml
    [spring.application.name].yaml不包含环境,因此可以被多个环境共享。
1)添加环境共享配置

我们首先在 nacos 中添加一个 nacos-config.yaml

在这里插入图片描述

在这里插入图片描述

2)读取环境共享配置

在 nacos-config 服务中修改 DatasProperties 类,读取新添加的属性内容:

在这里插入图片描述

修改 controller 类的内容

在这里插入图片描述

3)运行两个ConfigApplication

复制一个 nacos-config 服务,修改端口号为,修改Active profiles,然后运行两个程序。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

分别访问 http://localhost:9903/testhttp://localhost:9904/test

在这里插入图片描述

在这里插入图片描述

可以看出来,不管是 dev ,还是 test 环境,都读取到了 content 这个属性的值。

4)配置共享的优先级

在这里插入图片描述

三、多环境配置隔离

一般在业务开发的时候,至少会有三个环境,也就是开发(dev),测试(test),生产环境(prod)

每个环境肯定配置是大部分是不一样的,所以说,怎么才能很好的在不同的环境使用不一样的配置呢?🤔是的,Nacos 就能够很好的区分以上三种不同的配置。

Nacos 是如何区分的呢?答案就是 Namespace

Namespace(命名空间):解决多环境及多租户数据的隔离问题 在多套不同的环境下,可以根据指定的环境创建不同的Namespace,实现多环境的数据隔离

查看配置信息所处在那个命名空间:

在这里插入图片描述

1、命名空间的创建

创建一个命名空间:

在这里插入图片描述

作者这里创建了3个不同的命名空间

在这里插入图片描述

创建完成之后,那应该怎么使用呢?怎么指定那个命名空间呢?答案就是: 命名空间ID

2、添加配置信息

首先在 dev 这个命名空间下添加配置信息

在这里插入图片描述

3、读取不同环境下的配置信息

修改配置文件 bootstrap.yml

在这里插入图片描述

配置完毕,启动项目,访问 http://localhost:9903/test

在这里插入图片描述

四、业务配置隔离

在实际项目中,是有很多的微服务的,不同服务之间的配置是不一样的,那这个时候如果都创建在一起,那会显得非常的臃肿,难以区分,Nacos 针对这个问题是如何做的呢?🤔
答案就是 Group,该单词大家都认识吧,也就是分组的意思。😁

Group:Nacos 中的一组配置集,是组织配置的维度之一,简单的说则是不同的系统或微服务的配置文件可以放在一个组里。Nacos如果不指定Group,则默认的分组是DEFAULT_GROUP。

对于有多个微服务而言,比如订单系统,用户系统,针对这两个不同的微服务,可以将他们单独的分为一个组,订单系统分在ORDER_GROUP、用户系统分在USER_GROUP

1、创建配置信息指定Group分组

在命名空间 dev 环境下创建一个配置信息,指定分组

在这里插入图片描述

在这里插入图片描述

2、读取Group的配置信息

修改配置文件 bootstrap.yml 的内容

在这里插入图片描述

配置完成,启动项目,访问 http://localhost:9903/test

在这里插入图片描述

五、Nacos实现共享配置

共享配置,主要体现在随着项目中的微服务数量越来越多😣,而这些微服务多多少少都会有一些共同的配置,比如数据源信息啊。而这个时候我们就可以将这些共同的配置抽取出来,作为项目中共有的配置。

Nacos 就能很好的实现共享配置,接下来让我来带你一步一步地操作。😁

1、添加一个环境共享配置

在这里插入图片描述
在这里插入图片描述

注意: 因为我们是在public命名空间下创建的共享配置,所以在微服务的配置文件中不指定namespace的值默认就是读取在public命名空间下的配置信息

2、读取共享配置

修改 nacos-config 的配置文件 bootstrap.yaml 的内容

在这里插入图片描述

这里就通过 @Value 注解来获取 Nacos 的配置内容

在这里插入图片描述
启动项目,访问 http://localhost:9903/test1

在这里插入图片描述

注意: 如果共享配置信息放在了其他命名空间或者指定了分组,需要填写相应的namespace和Group

在这里插入图片描述

六、Nacos的持久化

Nacos默认使用的是内嵌的数据库 Derby ,如果想要更换数据库,比如 mysql ,也是非常简单的。

首先在 MySQL 中创建一个数据库,名为 nacos_config(名字随意哈),然后执行 Nacos 提供的 SQL 脚本,在 Nacos 下载目录的 conf 文件夹下


在这里插入图片描述

SQL 脚本执行完成之后,生产的表如下:


在这里插入图片描述

然后修改配置文件的数据源


在这里插入图片描述

在配置文件中取消 MySQL 数据源的注释,配置成自己的数据源即可


在这里插入图片描述

修改完毕,重启 Nacos-server

七、Nacos集群的搭建

Nacos推荐集群模式部署,这样可以避免单点故障,官方给出的 Nacos 的集群图:


在这里插入图片描述
其中包含3个nacos节点,然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx。

企业中大致会是这样的架构:


在这里插入图片描述

那如何搭建集群呢?
首先进入到 conf 文件下,找到 cluster.conf.example 文件复制一份并修改名称为 cluster.conf 放到当前目录下


在这里插入图片描述

修改内容如下:

192.168.124.1:8847
192.168.124.1:8848
192.168.124.1:8849

192.168.124.1就是你的服务器IP,后面的是Nacos的端口号

修改完成之后,将nacos文件复制两份


在这里插入图片描述

然后分别修改两个个文件夹中的application.properties
nacos1:

server.port=8847

nacos2:

server.port=8849

然后分别启动三个 nacos 节点,我这里先启动两个,来查看效果,双击 startup.cmd 文件
访问 http://localhost:8848/nacos ,点击集群管理,可以看到
在这里插入图片描述

但是一般会使用 nginx 来进行反向代理,这里就不演示 nginx 的搭建了。

nginx 配置文件的内容大致为:

upstream nacos{
    server 192.168.124.1:8847
	server 192.168.124.1:8848
	server 192.168.124.1:8849
}

server{
   listen 80;
   location / {
       proxy_pass http://nacos;
   }
}

你以为这样就完了? 不,还没有完!
你既然搭建了集群,那肯定是要修改项目的 bootstrap.yaml


在这里插入图片描述

或者:


在这里插入图片描述

到目前为止,你已经掌握了Nacos的大部分知识了,该文章也告一段落了

拓展

Nacos 默认是 AP,但可以通过配置切换到 CP 模式。 选择哪种模式取决于你的业务需求。 如果对可用性要求更高,选择 AP;如果对数据一致性要求更高,选择 CP。

深入了解CAP知识请看:CAP定理和BASE理论 趣学!


网站公告

今日签到

点亮在社区的每一天
去签到