Spring Cloud Alibaba-Nacos服务注册和配置中心

在这里插入图片描述

概述

Nacos(官方网站:nacos.io)是一个易于使用的平台,专为动态服务发现、配置和服务管理而设计。帮助您轻松构建云原生应用和微服务平台。

Nacos是 Dynamic Naming and Configuration Service 的首字母简称。
在这里插入图片描述
Spring Cloud Alibaba 是 Spring Cloud 的第二代实现,因此与其他注册中心关系如下:
Nacos = Eurake+Config+Bus
Nacos = Spring Cloud Consul

Nacos与其他注册中心就比较
在这里插入图片描述
技术选型的话,根据实际情况来定。

下载安装

Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要配置 Maven环境,请确保是在以下版本环境中安装使用:

64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
64 bit JDK 1.8+;
Maven 3.2.x+;

具体启动方式参考 Nacos 官网。

Nacos Server 启动成功之后,浏览器地址栏输入 http://ip:8848/nacos 查看 Nacos 控制台(默认账号名和密码为 nacos/nacos):
在这里插入图片描述
关于更多的 Nacos Server 版本,可以从 Nacos 官方 release 页面查看。

Nacos服务注册中心

通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery 实现服务的注册与发现。

原理

spring-cloud-starter-alibaba-nacos-discovery 遵循了 Spring Cloud Common 标准,实现了 AutoServiceRegistration、ServiceRegistry、Registration 这三个接口。

在 Spring Cloud 应用的启动阶段,监听了 WebServerInitializedEvent 事件,当 Web 容器初始化完成后,即收到 WebServerInitializedEvent 事件后,会触发注册的动作,调用 ServiceRegistry 的 register 方法,将服务注册到 Nacos Server。

配置服务提供者

从而服务提供者可以通过 Nacos 的服务注册发现功能将其服务注册到 Nacos server 上
1、添加依赖

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

注意:版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本。版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本。

2、在 application.yml 中配置 Nacos server 的地址

server:
  port: 9001

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #配置Nacos地址

3、 通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能

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

 

业务类

@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 的服务注册发现功能从 Nacos server 上获取到它要调用的服务。
1、添加依赖

<!--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>

在这里插入图片描述

2、配置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

3、 通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能

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

配置类

@Configuration
public class RestTemplateConfig
{
    @Bean
    @LoadBalanced //赋予RestTemplate负载均衡的能力
    public RestTemplate restTemplate()
    {
        return new RestTemplate();
    }
}

业务类

@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调用者。。。。。。";
    }
}

在这里插入图片描述

负载均衡

在之前LoadBalanced讲到过,是具备负载均衡能力的,因此,服务提供者+1,可以来试试Nacos+LoadBalanced的威力

在IDEA拷贝虚拟端口映射,偷个懒,不CV了
在这里插入图片描述
-DServer.port=9002
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

测试,输入http://localhost:83/consumer/pay/nacos/14,看到9001/9002交替出现,负载均衡成功

Nacos服务配置中心

通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更

新建一个配置中心服务

1、添加依赖

<!--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>

注意:版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本。版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本。

2、添加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
 

3、添加application.yml

server:
  port: 3377

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

4、主启动类

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

5、业务类
通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新

@RestController
@RefreshScope //在控制器类加入@RefreshScope注解使当前类下的配置支持Nacos的动态刷新功能。
public class NacosConfigClientController
{
    @Value("${config.info}")
    private String configInfo;

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

Nacos控制台配置

在 Nacos Spring Cloud 中,dataId 的完整格式如下:

${prefix}-${spring.profiles.active}.${file-extension}
  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 p r e f i x . {prefix}. prefix.{file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
    在这里插入图片描述

按照上面案例来说,dataId就是【nacos-config-client-dev.yaml】

在这里插入图片描述
在这里插入图片描述
测试
1、启动配置中心服务,调用接口http://localhost:3377/config/info查看当先配置信息。
2、改动Nacos刚创建的yaml配置,重新调用接口,会发现接口返回的配置信息与控制台修改的配置一致,成功

历史配置回滚

上一步修改了Nacos控制台的yaml配置,在这里可以看到历史记录,也可以选择右侧的按钮进行回滚
在这里插入图片描述

Nacos数据模型三元组

三元组指的是Namespace、Group、DataId,用来作为配置隔离的。
在这里插入图片描述

是什么

类似Java里面的package名和类名,最外层的Namespace是可以用于区分部署环境的,Group和DataID逻辑上区分两个目标对象

默认值

默认情况:Namespace=public,Group=DEFAULT_GROUP
Nacos默认的命名空间是public,Namespace主要用来实现隔离。比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组里面去

Service就是微服务

一个Service可以包含一个或者多个Cluster(集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。见下一节:服务领域模型-补充说明

在这里插入图片描述

Nacos图形界面

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

三种方案加载配置

制定颗粒度,按照隔离的颗粒度优先级从Nacos拉取配置更新项目配置
spring-cloud-starter-alibaba-nacos-config 在加载服务配置时:

不仅仅加载了以 dataId 为 s p r i n g . a p p l i c a t i o n . n a m e . {spring.application.name}. spring.application.name.{file-extension:properties } 为前缀的基础配置,

还加载了 dataId 为 s p r i n g . a p p l i c a t i o n . n a m e − {spring.application.name}- spring.application.name{profile}.${file-extension:properties } 的基础配置。

在日常开发中如果遇到多套环境下的不同配置,可以通过 Spring 提供的 ${spring.profiles.active} 这个配置项选择不同情况下的配置。

DataId方案

这种方案在上面将配置中心的时候已经举例过,关键字搜索【dataId就是【nacos-config-client-dev.yaml】】

在Nacos控制台再新建一个配置文件叫做 nacos-config-client-test.yaml(里面内容可自行修改),可以在端口3377项目,修改application.yml配置文件,切换test环境

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

重启3377项目,再调用接口http://localhost:3377/config/info,可查看最新配置信息是从Nacos拉取的test配置文件

Group方案

Nacos控制台新建Group分组,新建nacos-config-client-prod.yaml配置文件

利用Group实现环境区分
在这里插入图片描述
在这里插入图片描述
修改bootstrap.yml文件
在这里插入图片描述
修改application.yml文件
在这里插入图片描述
重启3377项目,访问http://localhost:3377/config/info,可查看最新配置信息是从Nacos拉取的prod配置文件

Namespace方案

创建多个Namespace
在这里插入图片描述
不填的话会自动生成命名空间id
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

选中Prod_Namespace新建配置
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
修改bootstrap.yml文件
在这里插入图片描述
修改application.yml文件
在这里插入图片描述
重启3377项目,访问http://localhost:3377/config/info,可查看最新配置信息是从Nacos拉取的prod配置文件

文献参考

Nacos中文文档:https://sca.aliyun.com/docs/2023/user-guide/nacos/overview/?spm=5176.29160081.0.0.74801a152Cfdp0
Nacos官网:https://nacos.io/docs/latest/quickstart/quick-start/
Nacos Github:https://github.com/alibaba/Nacos
Spring Cloud Alibaba Github:https://github.com/alibaba/spring-cloud-alibaba

就先说到这 \color{#008B8B}{ 就先说到这} 就先说到这
在下 A p o l l o \color{#008B8B}{在下Apollo} 在下Apollo
一个爱分享 J a v a 、生活的小人物, \color{#008B8B}{一个爱分享Java、生活的小人物,} 一个爱分享Java、生活的小人物,
咱们来日方长,有缘江湖再见,告辞! \color{#008B8B}{咱们来日方长,有缘江湖再见,告辞!} 咱们来日方长,有缘江湖再见,告辞!

在这里插入图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值