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

news2024/12/23 18:42:41

在这里插入图片描述

目录

  • 概述
    • 下载安装
  • Nacos服务注册中心
    • 原理
    • 配置服务提供者
    • 配置服务消费者
    • 负载均衡
  • Nacos服务配置中心
    • 新建一个配置中心服务
    • Nacos控制台配置
    • 历史配置回滚
  • Nacos数据模型三元组
    • 是什么
    • 默认值
    • Service就是微服务
    • Nacos图形界面
    • 三种方案加载配置
      • DataId方案
      • Group方案
      • Namespace方案
  • 文献参考

概述

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}{咱们来日方长,有缘江湖再见,告辞!} 咱们来日方长,有缘江湖再见,告辞!

在这里插入图片描述

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

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

相关文章

2024软件设计师经验贴(一考就过)

2024软件设计师经验贴&#xff08;一考就过&#xff09; 第一阶段、基础积累&#xff1a;把书读厚 这一阶段可以跟着视频、书籍或文章进行基础知识的学习。 推荐的视频系列&#xff1a; 「软件设计师」 上午题 #1 计算机系统_哔哩哔哩_bilibili 40–14.3设计模式 推荐的文…

C++编程(九)异常处理机制、模板、容器库

文章目录 一、异常处理机制&#xff08;一&#xff09;概念&#xff08;二&#xff09;语法格式&#xff08;三&#xff09;使用示例&#xff08;四&#xff09;异常处理库 二、模板&#xff08;一&#xff09;概念&#xff08;二&#xff09;函数模板&#xff08;三&#xff0…

生产者消费模式

前言&#x1f440;~ 上一章我们介绍设计模式中的单例模式&#xff0c;今天我们来讲讲生产者消费模式 阻塞队列&#xff08;重要&#xff09; 生产者消费模式&#xff08;重要&#xff09; 阻塞队列在生产者消费模型中的作用 标准库的阻塞队列 手动实现阻塞队列 如果各位对…

【python报错】已解决 ERROR: Could not find a version that satisfies the requirement

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 一、报错场景 在使用 pip 管理 Python 包时&#xff0c;您可能会遇到以下错误&#xff1a; ERROR: Could not find a version…

萌啦跨境工具箱有什么作用,萌啦跨境工具箱OZON营销神器

萌啦OZON数据平台&#xff0c;作为专为OZON平台商家打造的数据分析工具&#xff0c;集成了多种强大功能&#xff0c;旨在帮助商家在激烈的市场竞争中获得数据驱动的优势&#xff0c;实现精准运营与高效增长。那么萌啦跨境工具箱有什么作用&#xff1f;接下来介绍萌啦跨境工具箱…

opencv颜色识别,hsv采用滑块调节

识别效果如图所示&#xff0c;尽量排除了蓝色背景的干扰&#xff0c;hsv可用滑块进行调节&#xff0c;更加方便 import cv2 import numpy as np# 创建一个命名窗口&#xff0c;用于显示滑块 cv2.namedWindow("TrackBar")def nothing(x):pass# 创建滑块控件 cv2.cre…

对Transformer的一些理解

在学习Transformer这个模型前对seq2seq架构有个了解时很有必要的 先上图 输入和输出 首先理解模型时第一眼应该理解输入和输出最开始我就非常纠结 有一个Inputs&#xff0c;一个Outputs(shift right)和一个Output Probabilities&#xff0c;首先需要借助这三个输入/输出来初步…

UI自动化三之APP自动化

day06 能独立搭建app测试相关环境能通过命令在电脑端操作android系统中的应用&#xff08;adb命令&#xff09; day07 掌握appium基础操作api的使用&#xff08;安装、卸载、…&#xff09; 掌握appium高级api操作(拖拽、滑动、…) 掌握appium手机操作api&#xff08;按键…&am…

煤矿可视化:提升安全与效率

采用图扑先进的可视化技术&#xff0c;实时监控煤矿环境、设备运行和生产等数据。全方位展示与分析&#xff0c;有效提升安全管理水平和生产效率&#xff0c;助力煤矿智能化和高效运作。

基于正点原子FreeRTOS学习笔记——时间片调度实验

目录 一、时间片调度介绍 二、实验演示 1、宏修改 1.1、滴答定时器宏 1.2、调度器宏 2、实验程序 2.1.1、任务1&#xff0c;任务2不加临界区程序 2.1.2 实验现象 2.2.1、任务1&#xff0c;任务2加临界区程序 2.2.2 实验现象 一、时间片调度介绍 时间片&#xff1a;同…

仓储物流行业的好帮手-转运机器人

在物流行业快速发展的今天&#xff0c;一款高效、智能的转运机器人无疑是企业的得力助手。富唯智能转运机器人凭借其卓越的性能和智能化的特点&#xff0c;正成为越来越多企业的首选。 1、智能避障&#xff0c;安全无忧 富唯智能转运机器人采用无轨化激光SLAM导航技术&#x…

vue2 接口文档

const assetmanagementIndex (params) > getAction("/asset/assetmanagementsystem/page", params); //资产管理制度表分页列表 const assetmanagementPost (params) > postAction("/asset/assetmanagementsystem", params); //资产管理制度表新增…

BUG TypeError: GPT2Model.forward() got an unexpected keyword argument ‘past’

TypeError: GPT2Model.forward() got an unexpected keyword argument past’ 环境 transformers 4.38.1详情 这是由于新版的transformers 对GPT2Model.forward() 参数进行了改变导致的错误。具体是past名称改为了 past_key_values 。 解决方法 找到错误语…

2024广州国际米粉产业展览会暨米粉节

2024广州国际米粉产业展览会 时间&#xff1a;2024年11月16-18日 地点&#xff1a;广州中国进出口商品交易会展馆 主办单位&#xff1a;企阳国际会展集团 【展会简介】 米粉作为一种历史悠久&#xff0c;人们日常食用的食物&#xff0c;其市场需求稳定&#xff0c;且随着人…

深度探索“目录名称无效“:原因、解决方案与最佳实践

目录名称无效&#xff1a;现象背后的秘密 在日常使用电脑或移动设备时&#xff0c;我们时常会遇到“目录名称无效”的错误提示&#xff0c;这一提示仿佛是一道无形的屏障&#xff0c;阻断了我们与重要数据的联系。从本质上讲&#xff0c;“目录名称无效”意味着系统无法识别或…

Firewalld防火墙基础

Firewalld 支持网络区域所定义的网络连接以及接口安全等级的动态防火墙管理工具 支持IPv4、IPv6防火墙设置以及以太网桥 支持服务或应用程序直接添加防火墙规则接口 拥有两种配置模式 运行时配置&#xff1a;临时生效&#xff0c;一旦重启或者重载即不生效 永久配置&#xff1a…

产品设计的8大步骤

产品设计&#xff0c;通俗来说就是将创新想法或概念转化为落地实体的过程。一般来说&#xff0c;一个成功的产品应当具有创新性、美观性、实用性、可持续性以及经济效益&#xff0c;从而满足用户的使用需求以及市场的发展需求。产品设计也并不是一件简单的事情&#xff0c;产品…

AndroidStudio activity-1.8.0.aar依赖报错

在使用Androidstudio自帶的創建activity及配套 xml時&#xff0c;構建項目失敗&#xff0c;報錯内容&#xff1a; Null extracted folder for artifact: ResolvedArtifact(componentIdentifierandroidx.activity:activity:1.8.0, variantNamenull, artifactFileC:\Users\hhhh\.…

如何提高LLMs的文本表征(Text Embedding)能力?

目前&#xff0c;大模型落地的可靠方案还是以RAG&#xff08;retrieval-augmented-generation&#xff0c;检索增强生成&#xff09;为主&#xff0c;那么检索在大模型落地中就起着重要的作用。而稠密检索可以从语义层面找到与用户Query相关的文档片段&#xff0c;文本表征&…

C++:C与C++混合编程

混合编程 为什么需要混合编程 (1)C有很多优秀成熟项目和库&#xff0c;丢了可惜&#xff0c;重写没必要&#xff0c;C程序里要调用 (2)庞大项目划分后一部分适合用C&#xff0c;一部分适合用C (3)其他情况&#xff0c;如项目组一部分人习惯用C&#xff0c;一部分习惯用C 为什么…