Nacos 简介

Nacos 是一个易于使用的动态服务发现、配置和服务管理平台,用于构建云原生的应用程序

Nacos 的关键特性包括以下几项:

  • 服务发现和服务健康监测:服务提供者使用原生 SDK、OpenAPI 等注册服务后,服务消费者可以使用 HTTP&API 查找和发现服务。Nacos 提供对服务的实时健康检查,阻止向不健康的主机或服务实例发送请求
  • 动态配置服务:动态配置服务可以让你以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷
  • 动态 DNS 服务:动态 DNS 服务支持权重路由,让你更容易实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单 DNS 解析服务
  • 服务及其元数据管理:Nacos 从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及首要的 metrics 统计数据

Nacos 快速开始

1. Nacos Server 单机模式

在使用 Nacos 之前,需要先下载 Nacos 并启动 Nacos Server,Nacos Server 有两种运行模式:standalone(单机)和 cluster(集群),这里以 2.2.3.release,windows 环境为例

前往 Github 下载 Nacos Server:GitHub - alibaba/nacos: an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications.

解压压缩包,在 bin 目录下执行命令 .\startup.cmd -m standalone

在浏览器中访问:http://localhost:8848/nacos,输入用户名和密码 Nacos/Nacos 便可进入 Nacos 首页

如要关闭 Nacos,在 bin 目录下执行命令 .\shutdown.cmd

0.7 版本之前的 Nacos 在单机模式时使用入式数据库实现数据的存储,不方便观察数据存储的基本情况,0.7 版本之后支持 MySQL 数据源能力,具体的操作步骤如下:

  • 安装 MySQL 数据库(版本要求5.6.5+)

  • 创建数据库 nacos_config,在 conf 目录下找到 mysql-schema.sql 初始化文件并进行初始化

  • 修改 conf/applicationproperties 文件,增加 MySQL 数据源配置

    ### Count of DB:
    db.num=1
    ### Connect URL of DB:
    db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
    db.user.0=root
    db.password.0=123
  • 之后 Nacos 所有的数据都会保存到 MySQL

2. Nacos Server 集群模式

Nacos 单机模式仅仅适用于测试和单机适用,生产环境大多适用集群模式以确保高可用

接下来讲解如何搭建 Nacso 集群环境,具体步骤如下:

  • 将下载的 Nacos 安装包复制两份,分别命名为 Nacos-01,Nacos-02、Nacos-03,注意,集群模式必须使用配置数据库(如 MySQL)

  • 修改 Nacos-02、Nacos-03 的配置文件 conf/applicationproperties,将服务启动端口分别改为 8850 和 8852

    #*************** Config Module Related Configurations ***************#
    ### If use MySQL as datasource:
    ### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
    spring.datasource.platform=mysql
    spring.sql.init.platform=mysql
    #*************** Spring Boot Related Configurations ***************#
    ### Default web context path:
    server.servlet.contextPath=/nacos
    ### Include message field
    server.error.include-message=ALWAYS
    ### Default web server port:
    server.port=8850

    注意:nacos 在 2.0 版本以后,除对外的端口外,还占用另外三个端口:

    • raft port: ${server.port} - 1000
    • grpc port: ${server.port} + 1000
    • grpc port for server: ${server.port} + 1001

    假设对外端口为 8848,即总共会有4个端口被占用,分别为 7848、8848、9848、9849,因此,在同一台机启动多个 nacos 节点时要注意避开所有占用的端口

  • 在 Nacos-01、Nacos-02、Nacos-03 的 conf 目录下添加 cluster.conf 集群配置文件

    ### 这里简单将3个nacos实例部署在同一个机器下
    #
    127.0.0.1:8848
    127.0.0.1:8850
    127.0.0.1:8852
  • 分别进入 Nacos-01、Nacos-02、Nacos-03 的 bin 目录执行命令 .\startup.cmd,没有参数默认就是集群模式

3. Nacos+Nginx 集群模式

在 Nginx 核心配置文件 nginx.conf 添加如下配置

server {
listen 8847;
server_name localhost; location /nacos {
proxy pass http://nacos-server/nacos;
} upstream nacos-server {
server 127.0.0.1:8848;
server 127.0.0.1:8850;
server 127.0.0.1:8852;
}
}

启动 Nginx,访问:http://localhost:8847/nacos,至此我们完成 Nacos+Nginx 的搭建

SpringBoot 注册到 Nacos

1. Nacos 配置管理

以 SpringBoot 2.3.12.RELEASE 为例,在项目的 pom.xml 文件添加如下依赖:

<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.12</version>
</dependency>

在 application.properties 中配置 Nacos Server 的地址

# 如果搭建了集群只需要填其中一个节点的ip:port即可
nacos.config.server-addr=127.0.0.1:8848
# 如果配置了Nginx,则输入配置的地址,如上面我配置的
# nacos.config.server-addr=127.0.0.1:8847/nacos

在启动类中使用 @NacosPropertySource 加载 dataId 为 springboot-nacos-config 的配置源,并开启自动更新

@SpringBootApplication
@NacosPropertySource(dataId = "springboot-nacos-config", autoRefreshed = true)
public class SpringbootNacosApplication { public static void main(String[] args) {
SpringApplication.run(SpringbootNacosApplication.class, args);
}
}

当然,我们需要在 Nacos 的配置列表中添加 Data-Id: springboot-nacos-config 的配置文件

test.name=hahaha

通过 Nacos 的 @NacosValue 注解设置属性值

@RestController("config")
public class ConfigCon { @NacosValue(value = "${test.name}", autoRefreshed = true)
private String name; @GetMapping("get")
public String get() {
return name;
}
}

2. Nacos 服务注册

在项目的 pom.xml 文件添加如下依赖:

<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
<version>0.2.12</version>
</dependency>

在 application.properties 中配置 Nacos Server 的地址

spring.application.name=springboot-nacos
server.port=8080
server.address=127.0.0.1 # 如果搭建了集群只需要填其中一个节点的ip:port即可
nacos.discovery.server-addr=127.0.0.1:8848
# 如果配置了Nginx,则输入配置的地址,如上面我配置的
nacos.discovery.server-addr=127.0.0.1:8847/nacos

修改启动类,运行即可

@SpringBootApplication
@NacosPropertySource(dataId = "springboot-nacos-config", autoRefreshed = true)
public class SpringbootNacosApplication implements CommandLineRunner { // 使用@NacosInjected注入Nacos的NamingService实例
// NamingService是Nacos对外提供给使用者的接口
@NacosInjected
private NamingService namingService; @Value("${spring.application.name}")
private String applicationName; @Value("${server.port}")
private Integer serverPort; @Value("${server.address}")
private String serverAddress; public static void main(String[] args) {
SpringApplication.run(SpringbootNacosApplication.class, args);
} @Override
public void run(String... args) throws Exception {
//应用启动时,将服务注册到Nacos
namingService.registerInstance(applicationName, serverAddress, serverPort);
}
}

Nacos SpringCloud

本节主要讲解 SpringCloud 的如何通过 Nacos 实现配置管理和服务发现,以 SpringBoot 2.3.12.RELEASE 为例

1. Nacos 配置管理

在项目的 pom.xml 文件添加如下依赖:

<dependencies>

    <dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> </dependencies> <dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.10-RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

在 application.properties 中配置 Nacos Server 的地址

server.port=8080
spring.application.name=springcloud-nacos spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# spring.cloud.nacos.config.server-addr=127.0.0.1:8847/nacos

spring.application.name 之后会构成 Nacos 配置管理 datald 字段的一部分,在 Nacos Spring Cloud中,datald 的完整格式如下:${prefix}-${spring.profile.active}.${file-extension}

  • ${prefix}:默认为 spring.application.name 的值,也可以通过 spring.cloud.Nacos.config.prefix 配置项来配置
  • ${spring.profile.active}:当前环境对应的 profile,当 spring.profile.active 为空时,对应的连接符 - 也将不存在,datald 的拼接格式变成 ${prefix}.${file-extension}
  • ${file-extension}:配置内容的数据格式,可以通过 `spring.cloud.Nacos.config.file-extension· 来配置 properties 或 yaml 类型

在 Nacos 配置列表中创建 springcloud-nacos.properties 配置文件

test.name=hahah

开发 Controller 获取配置

@RefreshScope
@RestController("config")
public class ConfigCon { @Value("${test.name}")
private String name; @GetMapping("get")
public String get() {
return name;
}
}

2. Nacos 服务注册

在项目的 pom.xml 文件添加如下依赖:

<dependencies>

    <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency> </dependencies> <dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.10-RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

在 application.properties 中配置 Nacos Server 的地址

server.port=8080
spring.application.name=springcloud-nacos spring.cloud.nacos.discovery.server-addr=127.0.0.1:8847/nacos

在启动类上添加 @EnableDiscoveryClient 注解开启服务注册发现功能

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

在 Nacos 管理页面查看服务列表,发现服务已经注册到 Nacos,服务提供端和消费端都用这种方式进行注册,之后消费端可直接通过服务名直接调用提供端的接口

命名空间 & 分组

除了 DataId,Nacos 还提供了命名空间(Namespace)和 配置分组(Group)用于组织配置。不同的 Namespace 下,可以存在相同的 Group 或 DataId 的配置。同理,不同的 Group 下,可以存在相同的 DataId

一般情况下,最好使用 Namespace 区分环境(dev、sit、uat、prod),Group 区分微服务或项目。Nacos 的权限管理可以控制到命名空间,但不能控制分组。不同的账号对应不同的环境,能够将各个环境隔离开

在 Nacos 控制台名为 dev 的 Namespace,在其下创建名为 springcloud-project 的分组以及名为 service-01.yml 的配置文件

项目下创建 bootstrap.yml 配置文件

server:
port: 8000
spring:
application:
name: service-01
cloud:
nacos:
config:
server-addr: 127.0.0.1:8847/nacos
namespace: 0178e474-2cfb-47c3-bded-da7cfa260f99 # 命名空间id
group: springcloud-project # 分组名
file-extension: yml # 指定格式
discovery:
server-addr: 127.0.0.1:8847/nacos
namespace: 0178e474-2cfb-47c3-bded-da7cfa260f99 # 命名空间id
group: springcloud-project # 分组名

创建 TestCon 类,获取配置值

@Slf4j
@RestController
public class TestCon { @Value("${test.value}")
private String testValue; @GetMapping("/test/getConfig")
public void getConfig() {
log.info("testValue: {}", testValue);
}
}

注册中心/配置管理 —— SpringCloud Alibaba Nacos的更多相关文章

  1. SpringCloud Alibaba Nacos服务注册与配置管理

    Nacos SpringCloud Alibaba Nacos是一个狗抑郁构建云原生应用的动态服务发现.配置管理和服务管理平台. Nacos:Dynamic Naming and Configurat ...

  2. SpringCloud Alibaba Nacos 服务注册

    业务服务接入Nacos服务治理中心 启动Nacos访问地址为:http://101.200.201.195:8848/nacos/ 创建bom工程用于管理依赖(下方附加源码地址) 准备工作完成后开始接 ...

  3. 微服务实战系列(四)-注册中心springcloud alibaba nacos

    1.场景描述 因要用到微服务,关于注册中心这块,与同事在技术原型上做了讨论,初步定的方案是使用:阿里巴巴的nacos+springcloud gateway,下面表格是同事整理的注册中心对比,以前用的 ...

  4. SpringCloud Alibaba Nacos 服务治理中心

    目录 一.什么是Nacos? 二.Nacos能干吗? 三.Nacos关键特性 四.Nacos中的基本概念 五.如何安装部署Nacos? 六.Nacos数据持久化 一.什么是Nacos? 英文全称Dyn ...

  5. SpringCloud Alibaba Nacos注册中心源码浅析

    一.前置了解 1.1 简介 Nacos是一款阿里巴巴推出的一款微服务发现.配置管理框架.我们本次对将对它的服务注册发现功能进行简单源码分析. 1.2 流程 Nacos的分析分为两部分,一部分是我们的客 ...

  6. 快速搭建 SpringCloud Alibaba Nacos 配置中心!

    Spring Cloud Alibaba 是阿里巴巴提供的一站式微服务开发解决方案,目前已被 Spring Cloud 官方收录.而 Nacos 作为 Spring Cloud Alibaba 的核心 ...

  7. 注册中心ZooKeeper,Eureka,Consul,Nacos对比

    简介 ​ 服务注册中心本质上是为了解耦服务提供者和服务消费者.对于任何一个微服务,原则上都应存在或者支持多个提供者,这是由微服务的分布式属性决定的.更进一步,为了支持弹性扩缩容特性,一个微服务的提供者 ...

  8. SpringCloud Alibaba实战(7:nacos注册中心管理微服务)

    源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 在上一节我们已经完成了Nacos Server的本地部署,这一节我们学习如何将Nac ...

  9. Spring Cloud 系列之 Alibaba Nacos 注册中心(一)

    前言 从本章节开始,我们学习 Spring Cloud Alibaba 相关微服务组件. Spring Cloud Alibaba 介绍 Spring Cloud Alibaba 致力于提供微服务开发 ...

  10. 11.SpringCloud Alibaba

    SpringCloud的几大痛点 SpringCloud部分组件停止维护和更新,给开发带来不便 SpringCloud部分环境搭建复杂,没有完善的可视化界面,我们需要大量的二次开发和定制 Spring ...

随机推荐

  1. Codeforces Round #696 (Div. 2) (A~C题解)

    写在前边 链接:Codeforces Round #696 (Div. 2) A. Puzzle From the Future 链接:A题链接 题目大意: 给定一个\(a\),\(b\),\(d = ...

  2. Linux 运维人员最常用 150+命令汇总

    版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 目录 版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 命令帮助手册1 命令帮助手册2 ...

  3. 从物理机到K8S:应用系统部署方式的演进及其影响

    公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 概述 随着科技的进步,软件系统的部署架构也在不断演进,从以前传统的物理机到虚拟机.Docker和Kubernetes,我们 ...

  4. 【Codeforces Global Round 12】 C2 - Errich-Tac-Toe题解(思维)

    题面 题目要求不能有有三个连续相同的'X'或'O',注意到这样的连续串它们的横纵坐标之和是连续变化的,考虑将它们按照横纵坐标之和对 \(3\)的模值分组,因为这样分组后相邻的三个相同字符就被分到了三个 ...

  5. 你真的了解HashSet 和HashMap的区别、优缺点、使用场景吗?

    HashSet 和 HashMap 是 Java 集合框架中的两个常用类,它们都用于存储和管理数据,但在使用方式.功能和性能上有很大的区别. HashSet 和 HashMap 的区别 区别一:用途不 ...

  6. 带你玩转 Vite + Vue3 高低版本常用玩法

    一.首先来个 Vite 的通用简介 Vite 是一种新型前端构建工具,在我们保险前端项目中已经推动并应用很久了,Vite 能够显著降低构建时间,提升前端开发效率. 它主要由两部分组成: 一个开发服务器 ...

  7. 有序对的LCP

    求\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n} LCP(s_i, s_j)\) 方法一 \(1.\)Trie . \(2.\)求\(cnt\),\(cnt[ ...

  8. ConcurrentModificationException日志关键字报警引发的思考

    本文将记录和分析日志中的ConcurrentModificationException关键字报警,还有一些我的思考,希望对大家有帮助. 一.背景 近期,在日常的日志关键字报警分析时,发现我负责的一个电 ...

  9. 学习tinyriscv(1):安装tinyriscv的工具链

    因为毕设是CPU的低功耗设计,所以开始看cpu,打算还是先从这个tinyriscv学起,昨天把环境下好了,第一步是用git去clone代码,这个首先要下载git,然后在目标文件夹鼠标右键,选择&quo ...

  10. 数据仓库主流开发语言——SQL

    数仓开发语言概述  SQL语言介绍 数仓与SQL 结构化数据 二维表结构 SQL语法分类