Nacos详解使用

一、概述

Nacos 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

https://github.com/alibaba/nacos
https://nacos.io/

作用:服务的注册与发现,服务的配置与刷新

二、实战:服务注册与发现

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

image-20240827193446350

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

2.1、改POM

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

image-20240827112418709

2.2、写YAML

  cloud:
    nacos:
      discovery:
        server-addr: 192.168.200.129:8848 #配置Nacos地址

image-20240827112518665

2.3、写代码

image-20240827112634217

https://nacos.io/zh-cn/docs/v2/ecology/use-nacos-with-spring-cloud.html

image-20240827181559576

package com.nacos.consmer.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @Author: 史小创
 * @Time: 2024/8/26 下午7:44
 * @Description:
 */


@Configuration
public class RestTemplateConfig {
    /**
     * 这个注解用于启用客户端负载均衡功能。
     * 注解作用在 RestTemplate 上时,Spring 会为 RestTemplate 配置一个拦截器,
     * 这个拦截器会在你调用服务时自动根据服务名称(例如通过 Consul 注册中心注册的服务名)进行负载均衡。
     * 也就是说,当你在 RestTemplate 中使用服务名称来调用服务时,@LoadBalanced 会确保请求被分发到不同的服务实例上,以实现负载均衡。
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

image-20240827113013289

2.4、测试一

启动服务的提供者有消费者

image-20240827113206721

http://localhost:9002/nacos/consumer/id/66

image-20240827113237616

2.5、测试二

克隆服务的提供者

-Dserver.port=9003

image-20240827113430685

image-20240827113511884

http://localhost:9002/nacos/consumer/id/66

6bd4a049-60c4-413b-a76c-e0359e60b1eb

三、实战:服务配置与刷新

3.1、改POM

 <dependencies>
        <!--bootstrap-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>3.1.1</version>
        </dependency>
        <!--nacos-config-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
    </dependencies>

image-20240827175308604

3.2、写YAML

微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。

但如果尚未读取application.yml,又如何得知nacos地址呢?

因此spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,流程如下:

image-20240827193635306

Nacos同Consul一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动,为了满足动态刷新和全局广播通知。

springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application

# nacos配置
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.200.129:8848 #Nacos服务注册中心地址
      config:
        server-addr: 192.168.200.129:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定yaml格式的配置
# nacos端配置文件DataId的命名规则是:
# ${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
# 本案例的DataID是:nacos-config-client-dev.yaml  nacos-config-client-test.yaml

image-20240827175548467

server:
  port: 3377

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

image-20240827175633192

3.3、主启动

package com.nacos.config;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @Author: 史小创
 * @Time: 2024/8/27 下午5:41
 * @Description:
 */

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

3.4、在Nacos添加配置信息

3.4.1、Nacos匹配规则

https://nacos.io/zh-cn/docs/v2/ecology/use-nacos-with-spring-cloud.html

image-20240827180044112

image-20240827180533154

3.4.2、Nacos实操

image-20240827180706075

image-20240827180810482

nacos-config-client-dev.yaml
config:
    info: nacos-config-client-dev.yaml  version=1

image-20240827180858571

3.4.3、代码实操

package com.nacos.config.web;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author: 史小创
 * @Time: 2024/8/27 下午5:42
 * @Description:
 */

@RestController
public class NacosConfigClientController {
    @Value("${config.info}")
    private String configInfo;

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

image-20240827181017982

3.4.4、测试

http://localhost:3377/config/info

image-20240827181107094

3.5、配置热更新

我们最终的目的,是修改nacos中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新

image-20240827181228205

https://nacos.io/zh-cn/docs/v2/ecology/use-nacos-with-spring-cloud.html

image-20240827181303692

@RefreshScope

image-20240827181343132

看图:

7a4fa5f7-f08f-41bb-bbc6-b97212f99485

3.6、回滚

image-20240827183439327

四、实战:进阶

4.1、问题

问题1:

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

dev开发环境

test测试环境

prod生产环境。

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

问题2:

一个大型分布式微服务系统会有很多微服务子项目,每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境…那怎么对这些微服务配置进行分组和命名空间管理呢?

4.2、概述

https://nacos.io/zh-cn/docs/architecture.html

Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。

nacos_data_model

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

image-20240827184727416

服务领域模型

nacos_naming_data_model

4.3、三种方案加载配置

4.3.1、DataID

1️⃣默认空间public+默认分组DEFAULT_GROUP+新建DatalD

指定spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置

nacos-config-client-test.yaml
config:
    info: nacos-config-client-test.yaml  version=1

image-20240827185817164

image-20240827185827486

修改yaml

image-20240827190014280

http://localhost:3377/config/info

image-20240827190107443

4.3.2、Group

2️⃣默认空间public+新建PROD_GROUP+新建DatalD

nacos-config-client-prod.yaml
config:
    info: nacos-config-client-pro.yaml  version=1
PROD_GROUP

image-20240827190603428

修改yaml

 group: PROD_GROUP

image-20240827190727403

http://localhost:3377/config/info

image-20240827190824249

4.3.3、Namespace

3️⃣新建public+新建PROD_GROUP+新建DatalD

Prod_Namespace

image-20240827191100145

Prod2_Namespace

image-20240827191240013

image-20240827191252802

image-20240827191724546

新建yaml

nacos-config-client-prod.yaml
PROD_GROUP
config:
    info: nacos-config-client-prod-group.yaml  version=1

image-20240827193153736

image-20240827193128898

image-20240827192034250

配置本地的yaml

        group: PROD_GROUP
        namespace: Prod_Namespace

image-20240827192149373

http://localhost:3377/config/info

image-20240827193233422

五、环境搭建

SpringBoot+SpringCloud

   <spring.boot.version>3.2.0</spring.boot.version>
        <spring.cloud.version>2023.0.0</spring.cloud.version>
        <spring.cloud.alibaba.version>2022.0.0.0</spring.cloud.alibaba.version>

docker

image-20240827194204811

Nacos

docker pull nacos/nacos-server:v2.0.3
docker run --env MODE=standalone --name nacos --restart=always -d -p 8848:8848 -p 9848:9848 -p 9849:9849 -e JVM_XMS=512m -e JVM_XMX=512m -v /opt/nacos:/home/nacos/nacos-server-2.0.3/nacos/standalone/data nacos/nacos-server:v2.0.3
http://192.168.200.129:8848/nacos/#/login

jdk:

image-20240824171950942

Maven

image-20240823181810973

IDEA

image-20240823181906302

代码汇总:

https://github.com/shixiaochuangjob/markdownfile/tree/main/20240827

image-20240827194556533

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值