【springcloud 微服务】Spring Cloud Alibaba Nacos使用详解

目录

一、前言

二、nacos介绍

2.1  什么是 Nacos

2.2 nacos 核心能力

2.2.1 服务发现和服务健康监测

2.2.2 动态配置服务

2.2.3 动态 DNS 服务

2.2.4 服务及其元数据管理

2.2.5 nacos生态地图

2.3 与其他配置中心对比

三、nacos快速部署

3.1 获取安装包

3.2 修改脚本启动模式

3.3  启动nacos 服务

3.4 访问控制台

四、连接mysql

4.1 前置准备

4.2 操作步骤

4.2.1 导入安装包下nacos的建表sql

4.2 修改配置文件

4.3 重启nacos服务

五、nacos配置管理

5.1 配置管理菜单

5.1.1 配置列表

5.1.2 历史版本

六、nacos权限管理

6.1 用户

6.2 角色

6.3 权限

七、nacos命名空间

7.1 创建命名空间

7.2 创建配置文件

八、Spring Cloud 使用 Nacos

8.1  前置准备

8.2  读取nacos配置

8.2.1 配置文件

8.2.2 nacos添加一个配置文件

8.2.3 添加测试接口

8.2.4 模拟测试

8.3  namespace与group使用

8.3.1 同一个namespace不同dataid

8.3.2 不同namespace的配置读取

 8.3.3 不同group的配置读取

8.4  nacos动态刷新配置

 九、写在最后


一、前言

nacos作为Spring Cloud Alibaba微服务体系中一个非常重要的组件,在微服务治理中担当着不可替代的角色,比如作为分布式配置中心,服务注册中心,相比其他的配置中心和注册中心来说,nacos具有更出色的性能以及云原生优势,本篇将从多个维度全面深入的学习nacos这个组件。

二、nacos介绍

nacos官网:nacos官网 ,中文参考手册地址:中文手册

2.1  什么是 Nacos

  • Nacos 致力于帮助您发现、配置和管理微服务。帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理;
  • Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施;

2.2 nacos 核心能力

2.2.1 服务发现和服务健康监测

Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。

1、Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求;

2、Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式;

3、Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量

2.2.2 动态配置服务

  • 动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
  • 动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
  • 配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。

Nacos 提供了一个简洁易用的控制台,可以管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

2.2.3 动态 DNS 服务

动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。

Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表

2.2.4 服务及其元数据管理

Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

2.2.5 nacos生态地图

2.3 与其他配置中心对比

在微服务治理生态中,作为配置中心来说其实是有很多选择的,比如大家熟知的zk,apollo,consul等,如下是springcloud生态中可以作为技术选型的配置中心对比,从各项指标对比来看,nacos可以说是非常完美的存在,其优势是不言而喻的。

三、nacos快速部署

在之前的一篇,springcloud-alibaba整合nacos 中分享了如何快速部署单机nacos,还是比较简单的,为了方便后面的演示说明,这里再简单做一下说明;

3.1 获取安装包

安装包下载地址:下载地址

选择完版本后,可以选择linux或者windows环境的安装包下载即可

我这里选择了zip压缩包

3.2 修改脚本启动模式

nacos启动脚本里面提供了集群模式和单机模式启动两种方式,由于本机搭建使用,选用单机模式即可,修改启动脚本中如下的关键参数;

3.3  启动nacos 服务

修改并保存脚本之后,双击启动服务

3.4 访问控制台

启动成功之后,按上图中地址访问nacos的客户端控制台,默认登录用户名和密码:nacos/nacos

登录成功后,看到如下的控制台界面;

四、连接mysql

配置文件的信息在实际的生产环境中是需要持久化保存的,nacos服务默认启动之后,配置信息是保存在本地内存中,一旦重新启动就丢失了,因此安全起见,我们将其配置信息持久化到数据库,配置的话也很简单,按照下面的操作步骤

4.1 前置准备

创建一个mysql数据库

4.2 操作步骤

4.2.1 导入安装包下nacos的建表sql

导入完成后,可以看到nacos的一些表

 

4.2 修改配置文件

修改conf下的application.properties,主要修改mysql的连接信息

4.3 重启nacos服务

重启之后,后面再操作nacos的数据将会存储到nacos的数据表中。

五、nacos配置管理

接下来详细说明一下配置管理中相关重要的菜单项的使用说明,如下图所示

5.1 配置管理菜单

配置管理是用于集中管理微服务中的各类配置信息的,比如为了减少开发,测试,生产等不同的环境下因为配置文件带来的麻烦,可以在这里进行分门别类的做管理。

5.1.1 配置列表

配置列表维护环境中所有的配置文件,使用很简单,直接创建即可

 对上面的配置参数做简单的补充说明:

  • Data ID命名时,建议使用具有业务通识含义的全局唯一的名称,比如以 dev,test等区分不同的环境;

  • Group,具有相同业务归属的建议使用相同的分组,避免都使用DEFAULT_GROUP;

  • 配置内容中建议不要包含敏感信息;

最佳实践

5.1.2 历史版本

通过该项,可以查看指定配置的历史变更信息,便于信息的追溯

六、nacos权限管理

使用权限管理可以更好的对配置文件的读写权限进行控制,nacos的权限体系比较简单,主要涉及到用户,角色和权限三个模块;

使用权限管理需要在application.properties配置文件中开启下面的配置项

### If turn on auth system:
nacos.core.auth.enabled=true

6.1 用户

即具体登录nacos控制台的账户,你可以在这里管理nacos的账户,如添加新的账户,删除账户等,比如使用的默认账户nacos;

6.2 角色

即操作资源的身份,某个账户要能使用某个功能,必须具备这个角色才有操作权限,你可以在这个创建一个新的角色,并为某个账户绑定这个角色;

6.3 权限

具体的权限项,比如为某个具体的角色,具体的资源授权,权限可以是读或写,或者读写,那么被角色关联的账户就具备了操作这个资源的权限;

七、nacos命名空间

命名空间这个概念相信大家并不陌生,也不是nacos的独创,命名空间是为了更好的区分微服务之间的使用边界的一种用于实现逻辑隔离的概念,有点像docker容器的概念,即你只能在自己的容器内使用,使用过apollo的同学对此应该有较深的体会,apollo在使用的时候,不同的应用之间一定要通过nacos去管理;

7.1 创建命名空间

为你的微服务创建一个新的命名空间,名称最好见名知意

创建完成后,回到配置列表,可以看到在默认的public右侧就多了order和user这两个命名空间

7.2 创建配置文件

后续如果我们需要在user微服务下创建配置文件,就可以切换到user这个命名空间下创建,就能更好的区分和维护不同命名空间的配置文件了;

八、Spring Cloud 使用 Nacos

接下来将从多个维度详细介绍下在springcloud中如何使用Nacos

8.1  前置准备

导入依赖,在工程中导入如下依赖,第一个是使用nacos的配置使用,第二个是将nacos作为配置中心时使用;

        <!--nacos-config 配置中心-自带动态刷新-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

        <!--nacos-discovery 注册中心-服务发现与注册-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

8.2  读取nacos配置

上面在某个命名空间下创建完成配置文件后,就可以在程序中进行读取了,具体使用步骤如下:

8.2.1 配置文件

使用nacos时,关于nacos的连接配置需要在一个bootstrap.yaml 中进行设置

springboot加载配置文件优先级:bootstrap.yaml > application.yaml

bootstrap.yaml 配置如下:


server:
  port: 8087

spring:
  application:
    #这里的名称和nacos中的配置文件名称保持一致
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        server-addr: localhost:8848
        #指定要加载的配置文件的格式后缀名
        file-extension: yaml

application.yaml配置如下:

spring:
  profiles:
    active: dev

关于这里两个配置文件的内容为什么要这么做,官方文档给了如下说明:

 简单来说可以这么理解:

1、spring.application.name 的值为nacos配置文件的名称;

2、nacos配置文件的名称需要拼接application.yaml中的环境变量名,比如上文的:dev;

3、通过这种写法,可以在本地的配置文件中,根据环境的不同,快速切换不同的环境;

8.2.2 nacos添加一个配置文件

在默认的public命名空间下添加如下配置文件

配置内容如下:

config:
    info:
        name: nacos center

8.2.3 添加测试接口

为了测试效果,使用一个接口读取nacos的配置

@RestController
@RefreshScope
public class ConfigController {

    @Value("${config.info.name}")
    private String configName;

    @GetMapping("/get/config")
    public String getConfigName(){
        return configName;
    }

}

8.2.4 模拟测试

启动工程后,调用接口测试,发现可以正常读取到上面的配置信息

8.3  namespace与group使用

通过上文中对于namespace的讲述了解了namespace在nacos中的使用,从微服务配置管理的设计思想来说,通过namespace + group的划分,可以更加精准的管控应用归属的配置信息,真正做到比较安全的隔离,下面来具体说说不同场景下namespace + group的组合使用。

8.3.1 同一个namespace不同dataid

在上文,我们使用的是默认的namespace即public,nacos-config-client-dev.yaml 配置文件名称即应用层级的唯一名称,这里叫做 Data Id;

再创建一个新的配置文件,名为:nacos-config-client-test.yaml,配置内容如下

config:
    info:
        name: config center,test

创建完成后可以看到列表中新增了一个配置文件

修改如下配置文件

启动工程后,再次测试接口,此时读取到的就是test的配置文件中的信息

8.3.2 不同namespace的配置读取

再在user这个namespace下面也创建一个nacos-config-client-dev.yaml的配置文件

config:
    info:
        name: config center,ns user

工程中bootstrap.yaml加上namespace的配置,注意namespace的值是那一长串字符串;

 启动工程后再次读取配置,可以看到本次读取的就是新的配置文件里的信息

 8.3.3 不同group的配置读取

上文在public命名空间下没有配置分组的情况下,默认使用的都是DEFAULT_GROUP这个分组,如果希望读取自己分组下的配置怎么做呢?可以自定义一个新的分组。

这样在user这个命令空间下就多了一个分组user_test_group,并且在这个分组下,有一个nacos-config-client-test.yaml的配置文件;

修改bootstrap.yaml配置文件,添加group信息

启动工程后再次读取配置,可以看到本次读取的就是新的配置文件里的信息

8.4  nacos动态刷新配置

还记得在最早使用springcloud 的config配置中心的时候,如果某个配置文件发生了变更,程序中无法实时加载到这个最新的配置信息,而是需要配合其他的组件才能使用,而在nacos中就不必这么麻烦了;

nacos提供了@RefreshScope注解,在需要动态获取配置的类上面加上该注解就可以准实时的获取nacos中发生变更的配置信息;

在上面的接口类中,加上这个注解

@RestController
@RefreshScope
public class ConfigController {

    @Value("${config.info.name}")
    private String configName;

    @GetMapping("/get/config")
    public String getConfigName(){
        return configName;
    }

}

再最后一个测试用例中,我们去user这个命名空间下,修改一下nacos-config-client-test.yaml中的配置信息;

修改完毕后保存发布,在不重启工程的情况下,再次调用接口,可以看到最新的配置信息已经读取到;

有心的同学可能会发现,当修改了配置文件信息后,控制台中输出了如下的内容,我们猜测可能是这个@RefreshScope注解的背后存在某种机制,能够动态的感知或者说监听到nacos中的配置文件内容的变化;

 九、写在最后

本文通过大量的篇幅详细介绍了nacos的各种场景的使用,对于使用springcloud alibaba这一套微服务治理框架的同学来说,nacos可以说必须要熟练掌握,同时,可以通过阅读源码深入了解其背后的架构设计思路,对于自身也是不错的借鉴。本文源码:源码地址

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电阻器的原理、类型、参数以及生活中常见的应用

电阻器是电子电路中最基本的元件之一&#xff0c;它的作用是限制电流流过的大小&#xff0c;在电子电路中广泛应用于电流控制、电压分压、信号衰减等方面。在本文中&#xff0c;我们将详细介绍电阻器的原理、类型、参数以及生活中常见的应用。 一、电阻器的原理 电阻器是一种…

go语言切片做函数参数传递+append()函数扩容

go语言切片函数参数传递append()函数扩容 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 二叉树递归go代码&#xff1a; var ans [][]int func pathSum(root *TreeNode, targetSum int) ( [][…

ActiveMQ使用(四):在JavaScript中发送的MQTT消息在SpringBoot中变为字节数组

ActiveMQ使用(四):在JavaScript中发送的MQTT消息在SpringBoot中变为字节数组 1. 问题描述 JmsListener(destination "test_producer", containerFactory "topicListenerContainer")public void receiveTestProducer(String message) throws JMSExceptio…

spring bean

图灵课堂学习笔记 1. BeanFactory与ApplicationContext的关系 p56 ApplicationContext在BeanFactory基础上对功能进行了扩展&#xff0c;例如&#xff1a;监听功能、国际化功能等。BeanFactory的API更偏向底层&#xff0c;ApplicationContext的API大多数是对这些底层API的封…

JVM OOM问题排查与解决思路

OOM原因 1. 堆溢出 报错信息&#xff1a; java.lang.OutOfMemoryError: Java heap space 代码中可能存在大对象分配&#xff0c;无法获得足够的内存分配 可能发生内存泄露&#xff0c;导致内存被无效占用以至于耗尽 2. 永久代/元空间溢出 报错信息&#xff1a; java.lang.O…

C#,码海拾贝(19)——一般实矩阵的QR分解(QR Decomposition)方法之C#源代码,《C#数值计算算法编程》源代码升级改进版

1 实矩阵 实矩阵&#xff0c;指的是矩阵中所有的数都是实数的矩阵。如果一个矩阵中含有除实数以外的数&#xff0c;那么这个矩阵就不是实矩阵。 2 QR&#xff08;正交三角&#xff09;分解法 QR&#xff08;正交三角&#xff09;分解法是求一般矩阵全部特征值的最有效并广泛应…

Flowable从入门到源码分析

什么是工作流&#xff1f; 工作流&#xff0c;是把业务之间的各个步骤以及规则进行抽象和概括性的描述。使用特定的语言为业务流程建模&#xff0c;让其运行在计算机上&#xff0c;并让计算机进行计算和推动。 工作流解决的痛点在于&#xff0c;解除业务宏观流程和微观逻辑的…

jenkins gitlab asp.net core持续集成

什么是jenkins Jenkins直接取自其官方文档&#xff0c;是一个独立的开源自动化服务器&#xff0c;您可以使用它来自动执行与构建、测试、交付或部署软件相关的各种任务。 jenkins可以干什么 Jenkins 通过自动执行某些脚本来生成部署所需的文件来工作。这些脚本称为JenkinsFi…

2023_深入学习HTML5

H5 基于html5和 css3和一部分JS API 结合的开发平台(环境) 语义化标签 header : 表示头部&#xff0c;块级元素 footer &#xff1a; 表示底部&#xff0c;块级元素 section &#xff1a;区块 nav &#xff1a; 表示导航链接 aside &#xff1a; 表示侧边栏 output &am…

二叉搜索树(BSTree)

目录 一、二叉搜索树 二、二叉搜索树的接口及实现 1、二叉搜索树的查找 2、二叉搜索树的插入 3、二叉搜索树的删除 三、二叉搜索树的递归版本 本期博客主要分享二叉搜索树的底层实现。(主要是笔记&#xff0c;供自己复习使用&#x1f602;) 一、二叉搜索树 二叉搜索树(B…

MybatisPlus主键策略

Mybatis默认主键策略是TableId(type IdType.ASSIGN_ID) 这是默认策略雪花算法 此时主键类型可以是String 数据表字段类型可以是bigint int varchar 无需数据表主键自增 TableId(type IdType.ASSIGN_AUTO) 是主键自增策略:该策略为跟随数据库表的主键递增策略&…

一致性框架设计方案

补充组件依赖 前言 对于供应链业务&#xff0c;一般对数据一致性要求高。且由于业务复杂&#xff0c;可能会存在一个业务功能触发几个异步操作的场景&#xff0c;且要保证相关操作同时触发或不触发。 为了降低技术设计难度、代码编写难度&#xff0c;特意设计最终一致性框架&a…

ChatGPT+Ai绘图【stable-diffusion实战】

ai绘图 stable-diffusion生成【还有很大的提升空间】 提示词1 Picture a planet where every living thing is made of light. The landscapes are breathtakingly beautiful, with mountains and waterfalls made of swirling patterns of color. What kind of societies m…

程序员跳槽,要求涨薪50%过分吗?

如果问在TI行业涨工资最快的方式是什么&#xff1f; 回答最多的一定是&#xff1a;跳槽&#xff01; 前段时间&#xff0c;知乎上这样一条帖子引发了不少IT圈子的朋友的讨论 &#xff0c;有网友提问 “程序员跳槽要求涨薪50%过分吗&#xff1f;” 截图来源于知乎&#xff0c;…

摄影知识整理

目录 焦距 焦距分类 对焦 相机的MF与AF 自动对焦操作 自动对焦方式 镜头防抖 防抖模式 景深 景深的作用 影响景深的因素 景深预览 摄影三大元素 光圈 光圈的作用 光圈与景深的关系 感光度&#xff08;ISO) 注意 感光度的作用 快门 B门与T门 快门速度 闪…

【SSM】SpringMVC(三:SpringMVC拦截器)

文章目录 1. 登录案例2. 拦截器2.1 应用2.2 拦截器的执行原理2.3 拦截器执行的时机2.4 拦截器的实现方法2.5 拦截器的实现步骤2.6 开发拦截器 1. 登录案例 【login.jsp】 <%--Created by IntelliJ IDEA.User: BeyongDate: 2023/4/17Time: 11:43To change this template use…

SQL的函数

文章目录 一、SQL LCASE() 函数二、SQL MID() 函数三、SQL LEN() 函数四、SQL ROUND() 函数五、SQL NOW() 函数六、SQL FORMAT() 函数总结 一、SQL LCASE() 函数 LCASE() 函数把字段的值转换为小写。 SQL LCASE() 语法 SELECT LCASE(column_name) FROM table_name;用于 SQL …

入行IC选择国企、私企还是外企?(内附各IC大厂薪资福利情况)

不少人想要转行IC&#xff0c;但不知道该如何选择公司&#xff1f;下面就来为大家盘点一下IC大厂的薪资和工作情况&#xff0c;欢迎大家在评论区补充。 一&#xff0e;老 牌 巨 头 在 IC 设计领域深耕许久&#xff0c;流程完善、技术扎实&#xff0c;公司各项制度都很完善、前…

IT知识百科:什么是暴力破解?

暴力破解是一种常见的网络安全攻击方法&#xff0c;它利用计算机程序自动尝试大量的密码组合来破解密码。这种攻击方法通常用于获取未经授权的访问权限&#xff0c;如入侵网络系统或个人账户。在本文中&#xff0c;我们将探讨暴力破解的原理、工具和防范方法。 暴力破解的原理 …

TCP/UDP协议 (详解)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…
最新文章