Nacos简介

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

Nacos提供两个主要的能力:

  •       服务注册中心

    Nacos 支持基于 DNS 和基于 RPC 的服务发现。

    服务提供者使用原生SDK、OpenApi注册 Service 后,服务消费者可以使用DNS TODO或HTTP&API查找和发现服务。

    Nacos提供对服务的健康监测,阻止向不健康的服务或者实例发送请求。

  •      动态配置中心

    动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。

    动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。

    配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。

中文官网 : https://nacos.io/zh-cn/

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

部署方式

Nacos支持三种部署方式

单机模式:用户测试和单机使用。

集群模式:生产环境使用,保证服务的高可用。

多集群模式: 用于多数据中心场景。

本地测试使用单机模式部署

Linux/Unix/Mac: 运行命令 startup.sh -m standalone

Windows: 双击 startup.cmd 文件

另外单机模式还支持mysql(默认使用内嵌数据库),具体的操作步骤:

· 1.安装数据库,版本要求:5.6.5+

· 2.初始化mysql数据库,数据库初始化文件:nacos-mysql.sql

· 3.修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。

spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=youdontknow

单机模式启动nacos,nacos所有写嵌入式数据库的数据都写到了mysql。

SpringCloud使用Nacos实现服务的注册与发现

服务注册

1. 首先进行Maven配置,在pom文件中引入SpringCloud-Nacos的依赖。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.13.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>service-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>service-provider</name>
<description>Demo project for Service Provider</description>
<properties>
<java.version>1.8</java.version>
<nacos.version>2.1.2.RELEASE</nacos.version>
</properties> <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>
<version>${nacos.version}</version>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

2. 配置Nacos连接信息,新建application.yaml配置文件。

server:
port: 7001
spring:
application:
name: service-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: d95b5b39-cc31-422b-895d-6b56aed294c8
group: tydd

3. 配置启动类,添加SpringCloud的服务注册发现标签(@EnableDiscoveryClient)。

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

启动项目时在日志中可以看到服务注册信息日志  (NacosServiceRegistry    : nacos registry, tydd service-provider 199.168.24.239:7001 register finished)。服务启动成功在Nacos控制台中查看到服务的注册信息。服务的注册信息详情中可以查看到实例的IP、端口、健康状态、自定义元数据等信息。(控制台访问地址:http://127.0.0.1:8848/nacos/index.html#/login

图:服务注册信息

图:服务实例信息

通常微服务架构中,一个服务一般会部署多个实例来确保服务的高可用和提升服务的性能。下面演示服务注册多个实例的场景。

创建配置文件 application-A.yaml 和 application-B.yaml ,配置项不变,只修改端口号避免端口重复(因为在是一台机器上演示,所以端口号要区分)。

然后执行Maven打包命令生成Jar包,通过命令启动两个项目实例 java -jar service-provider-0.0.1-SNAPSHOT.jar --spring.profiles.active=A /  java -jar service-provider-0.0.1-SNAPSHOT.jar --spring.profiles.active=B ,项目启动成功在控制台中可以看到 service-provide 服务有两个实例注册成功,如下图所示。

服务发现

通过一个简单的例子演示如何在Spring Cloud项目中启用Nacos的服务发现功能。

1. 首先创建新的应用 service-consumer,应用的Maven依赖和application.yaml配置如下。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.13.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>service-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>service-consumer</name>
<description>Demo project for service-consumer</description>
<properties>
<java.version>1.8</java.version>
<nacos.version>2.1.2.RELEASE</nacos.version>
</properties>
<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>
<version>${nacos.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
server:
port: 7003
spring:
application:
name: service-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: d95b5b39-cc31-422b-895d-6b56aed294c8
group: tydd

2. 创建启动类 ServerConsumerApplication,添加Spring原生注解 @EnableDiscoveryClient ,并注入 RestTemplate 用于调用注册的服务。

@SpringBootApplication
@EnableDiscoveryClient
public class ServerConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ServerConsumerApplication.class, args);
}
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}

3. 创建测试接口,在应用service-consumer中创建测试接口,调用service-provider服务。

@RestController
@RequestMapping(value = "consumer")
public class ConsumerController { private static String SERVICE_NAME = "service-provider"; @Autowired
private RestTemplate restTemplate; @GetMapping(value = "provider/info")
public String getClientServerResult() {
return restTemplate.getForObject("http://" + SERVICE_NAME + "/provider/info", String.class);
}
}

启动service-consumer应用后,在Nacos控制台汇总可以看到新的服务注册成功,并且意味着可以消费其他的服务。调用测试接口,获取 service-provider服务的实例信息。接口返回信息如下所示:

 Service Info, service name : service-provider, port : 7001
Service Info, service name : service-provider, port : 7002
Service Info, service name : service-provider, port : 7001
Service Info, service name : service-provider, port : 7002

每一次调用返回的实例信息都不相同,是因为集成的 spring-cloud-riboon 客户端负载均衡的默认模式是轮询模式。

自定义元数据

在启动类中添加如下代码,添加我们的自定义元数据,记录实例启动时间。

 @Bean
@ConditionalOnMissingBean
public NacosDiscoveryProperties nacosProperties() {
return new NacosDiscoveryProperties();
} @Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(value = {"spring.cloud.nacos.discovery.watch.enabled"}, matchIfMissing = true)
public NacosWatch nacosWatch(NacosDiscoveryProperties nacosDiscoveryProperties) {
Map<String, String> metadataMap = nacosDiscoveryProperties.getMetadata();
if (metadataMap == null) {
metadataMap = new HashMap<>();
}
metadataMap.put("startup.time", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
metadataMap.put("spring.profiles.active", profile);
nacosDiscoveryProperties.setMetadata(metadataMap);
return new NacosWatch(nacosDiscoveryProperties);
}

重启服务后,可以在控制台中看到新添加的自定义元数据。

配置中心

使用Nacos的配置中心功能,通过Nacos去进行项目配置。

1. 首先新建配置文件bootstrap.yaml,注意这里不是application.yaml,原因是Nacos同SpringBoot一样,在项目初始化的时要先从配置中心拉取配置文件,Spring的加载是存在优先顺序的,bootstrap优先级高于application。

配置文件内容如下:

 server:
port: 7001 #端口
spring:
application:
name: service-provider #服务名称
profiles:
active: dev #环境
cloud:
nacos:
config:
file-extension: yaml # 配置后缀
server-addr: 127.0.0.1:8848 #配置服务地址
namespace: d95b5b39-cc31-422b-895d-6b56aed294c8 #配置文件命名空间ID
group: tydd #配置分组
prefix: ${spring.application.name}
discovery:
server-addr: ${spring.cloud.nacos.config.server-addr} #注册服务Nacos地址
namespace: ${spring.cloud.nacos.config.namespace} #注册服务命名空间ID
group: tydd #注册服务分组

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

${prefix}-${spring.profile.active}.${file-extension}

spring.application.name 它是构成Nacos配置管理dataId字段的一部分。

spring.profile.active 当前环境对应的profile注意:当 spring.profile.active为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}。

file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config。

file-extension 来配置。目前只支持 properties 和 yaml 类型。

2. 写好配置文件后,在pom文件中加入Naocs-config的Maven引用。

 <dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${nacos.version}</version>
</dependency>

3. 添加Nacos配置文件,在Nacos控制台的创建命名空间dev,创建成功后会生成一个命名空间ID(将这个ID写入到bootstrap.yaml文件中的spring.cloud.nacos.config.namespace项)。然后在“配置列表”菜单中选择对应的命名空间,创建配置文件service-provider.yaml。

图:创建命名空间

图:创建配置文件

4. 创建测试接口,读取Nacos配置。通过Spring的原生注解 @Value 注入配置项的值,并通过 @RefreshScop 实现配置自动更新。

 @RefreshScope
@RestController
public class NacosConfigController { @Value("${provider.name}")
private String providerName; @RequestMapping(value = "config/getValue")
public String getConfigValue() {
return this.providerName;
}
}

调用接口获取到Nacos的配置值,如下图所示。

如果在Naocs控制台修改了配置值,会更新本地的配置文件,通过日志可以看出刷新了修改配置项的值。

o.s.c.e.event.RefreshEventListener       : Refresh keys changed: [provider.name]

再次请求接口可以验证配置项的值已经更新。

Nacos学习笔记的更多相关文章

  1. 图灵学院JAVA互联网架构师专题学习笔记

    图灵学院JAVA互联网架构师专题学习笔记 下载链接:链接: https://pan.baidu.com/s/1xbxDzmnQudnYtMt5Ce1ONQ 密码: fbdj如果失效联系v:itit11 ...

  2. Spring Cloud微服务学习笔记

    Spring Cloud微服务学习笔记 SOA->Dubbo 微服务架构->Spring Cloud提供了一个一站式的微服务解决方案 第一部分 微服务架构 1 互联网应用架构发展 那些迫使 ...

  3. 肝了很久,冰河整理出这份4万字的SpringCloud与SpringCloudAlibaba学习笔记!!

    写在前面 不少小伙伴让我整理下有关SpringCloud和SpringCloudAlibaba的知识点,经过3天的收集和整理,冰河整理出这份4万字的SpringCloud与SpringCloudAli ...

  4. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  5. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  6. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  7. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  8. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  9. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

随机推荐

  1. 关于vue的多页面标签功能,对于嵌套router-view缓存的最终无奈解决方法

    最近写我自己的后台开发框架,要弄一个多页面标签功能,之前有试过vue-element-admin的多页面,以为很完美,就按它的思路重新写了一个,但发现还是有问题的. vue-element-admin ...

  2. vc程序设计--对键盘与鼠标的响应(1)

    // WindowsProject2.cpp : 定义应用程序的入口点. // /** * 当按下CTRL键时输出信息:CTRL键被压下 * 当按下K键时输出信息:K键被压下 * 当按下CTRL+K键 ...

  3. win服务器管理系统全面升级,教您如何成为运维达人

    作为服务器运维人员都知道,日常检查服务器问题并处理问题几乎占据了所有时间,检查服务器的繁琐也只有他们自己能体会,这些外界看似的“工作本分职责”,真是有苦难言.为此我专门研究了市面上三款主打的服务器管理 ...

  4. HttpServletRequest对象,请求行、请求头、请求体

    HttpServletRequest 公共接口类HttpServletRequest继承自ServletRequest.客户端浏览器发出的请求被封装成为一个HttpServletRequest对象.对 ...

  5. Java实现 LeetCode 334 递增的三元子序列

    334. 递增的三元子序列 给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列. 数学表达式如下: 如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ...

  6. Java实现 LeetCode 318 最大单词长度乘积

    318. 最大单词长度乘积 给定一个字符串数组 words,找到 length(word[i]) * length(word[j]) 的最大值,并且这两个单词不含有公共字母.你可以认为每个单词只包含小 ...

  7. IDEA,PyCharm系列软件常用快捷键

    首先介绍一下小编常用的快捷键: 注释 ctrl+/ 当想看某个类或者某个方法的时候 ctrl+鼠标左键单击 运行程序 ctrl+shift+f10 调试程序 ctrl+shift+f9 撤销 ctrl ...

  8. java实现第五届蓝桥杯信号匹配

    信号匹配 从X星球接收了一个数字信号序列. 现有一个已知的样板序列.需要在信号序列中查找它首次出现的位置.这类似于串的匹配操作. 如果信号序列较长,样板序列中重复数字较多,就应当注意比较的策略了.可以 ...

  9. Python接口自动化测试脚本-实现禅道登录

    未来应用方向:UI自动化测试或接口自动化测试发现的Bug可自动录入禅道,带截图与相关报错信息. #!/usr/bin/env python # -*- coding: UTF-8 -*- '''=== ...

  10. 本地存储 localStorage

    本地存储localStorage 概念:window对象下面的属性,html5新增的,将5M大小的数据存储本地的浏览器上面. 浏览器支持存储5M大小 本地存储localStorage特点 本地存储属于 ...