一文快速上手 Nacos 注册中心+配置中心!

0e57535e9e6f77d31e6108a416c1fb0d.jpeg

作者 | 磊哥

来源 | Java中文社群(ID:javacn666)

转载请联系授权(微信ID:GG_Stone)

Spring Cloud Alibaba 是阿里巴巴提供的一站式微服务开发解决方案,目前已被 Spring Cloud 官方收录。而 Nacos 作为 Spring Cloud Alibaba 的核心组件之一,提供了两个非常重要的功能:注册中心和配置中心,我们今天来了解和实现一下二者。

1.Nacos 简介

Nacos 致力于帮助开发者发现、配置和管理微服务。它提供了一组简单易用的特性集,帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 特性介绍

Nacos 具有以下特性:

  • 服务发现和服务健康监测:支持基于DNS和基于RPC的服务发现,支持对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。

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

  • 动态 DNS 服务:动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单 DNS 解析服务。

  • 服务及其元数据管理:支持从微服务平台建设的视角管理数据中心的所有服务及元数据。

2.注册中心实现

注册中心有两个重要的功能:服务注册和服务发现,它解决了微服务集群中,调用者和服务提供者连接管理和请求转发的功能,让程序的开发者无需过多的关注服务提供者的稳定性和健康程度以及调用地址,因为这些都可以依靠 Nacos 进行监测、管理和自动转发。

注册中心中有两个角色:一个是服务提供者 Provider,另一个是服务调用者 Consumer,接下来我们分别来创建二者。

2.1 创建服务提供者

2.1.1 新建项目并添加依赖

新建一个 Spring Boot 项目,使用阿里云地址 http://start.aliyun.com 来创建 Spring Cloud Alibaba Nacos 项目,如下图所示:296c4a99160a63007e8f229cc31dd002.png点击 Next 下一步,如下图所示:3abb3ddeda20ed7cc03203e0fac046e3.png增加 Nacos Service Discovery 框架支持,如下图所示:8d62440f14a22d3656d42b892c116087.png对应的依赖框架如下:

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

PS:添加 Spring Web(Spring MVC)框架主要是为了方便后面测试。

2.1.2 配置 Nacos 连接信息

在配置文件 application.properties 中要填写 Nacos 的相关连接信息,具体信息如下:

# 应用名称(也是 Nacos 中的服务名)
spring.application.name=spring-cloud-nacos-producer
# 应用服务 WEB 访问端口
server.port=8082
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public

2.1.3 添加服务提供方法

新建一个控制器 Controller,添加一个 sayhi 方法,此方法可以使用 HTTP 协议进行访问,它是为后面的服务消费者提供的调用方法,具体实现如下:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@SpringBootApplication
@RestController
public class SpringCloudNacosProducerApplication {public static void main(String[] args) {SpringApplication.run(SpringCloudNacosProducerApplication.class, args);}@RequestMapping("/sayhi/{name}")public String sayHi(@PathVariable String name) {return "Hi Nacos Discovery " + name;}
}

编写完代码之后,运行项目就可以在 Nacos 的服务列表中看到它了,如下图所示:68017b1681ea8e594937a756ca0519db.png经过以上步骤,我们的服务提供者就创建好了,接下来我们创建一个服务消费者 Consumer。

2.2 创建服务消费者

2.2.1 新建项目并添加依赖

此步骤和上面的服务提供者类似,也是添加 nacos discovery 和 web 依赖,具体实现如下:37edd1d0220ef85c763d5a8994c063ea.png2285491e970bdcd762b657b69a5ac5a4.png

2.2.2 配置 Nacos 连接信息

# 应用名称
spring.application.name=springcloud-nacos-consumer
# 应用服务 WEB 访问端口
server.port=8082
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public

2.2.3 添加服务调用代码

服务消费者的实现有两个关键点,第一,先 new 一个 RestTemplate 对象,此对象是 Spring 框架提供用于进行 HTTP 请求的类,实现代码如下:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;@SpringBootApplication
@EnableDiscoveryClient
public class SpringcloudNacosConsumerApplication {public static void main(String[] args) {SpringApplication.run(SpringcloudNacosConsumerApplication.class, args);}@LoadBalanced@Beanpublic RestTemplate restTemplate() {// 用于进行 HTTP 请求的对象return new RestTemplate();}
}

第二,新建一个控制器,注入 RestTemplate 对象,并调用 Nacos 中的服务提供者接口,实现代码如下:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;@RestController
public class TestController {@Autowiredprivate RestTemplate restTemplate;@RequestMapping("/hi")public String hi(String name) {// 调用生产者 sayhi 方法,并返回结果return restTemplate.getForObject("http://spring-cloud-nacos-producer/sayhi/" + name,String.class);}
}

其中 spring-cloud-nacos-producer 是服务提供者的 ID,而 sayhi 是服务提供者提供的接口地址。

通过以上配置,我们的服务消费者也创建好了,启动项目,执行结果如下图所示:e5e7c1539decc09b1a280c35671dacda.png从上述结果可以看出,服务消费者通过 Nacos 已经成功调用到服务提供者了,这就是 Nacos 中注册中心的基本使用。

3.配置中心实现

配置中心的作用是将本地配置文件云端话,所谓的云端也就是 Nacos 的服务器端,这样既能保证配置文件中的敏感数据不会暴露,同时又提供了实时的修改、查看、回滚和动态刷新配置文件的功能,非常实用。

但是需要注意的是配置中心和注册中心的依赖包是不同的,注册中心的依赖包是 nacos discovery,而配置中心的依赖包是 nacos config,它的具体如下。

3.1 新建项目并添加依赖

创建一个 Spring Boot 项目,添加 nacos config 和 web 依赖包,如下图所示:7cf7aa972e5113c973a819e870079b4e.png

PS:添加 web 依赖主要是为了方便后面测试。

对应的配置依赖信息如下:

<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-config</artifactId>
</dependency>

3.2 配置 Nacos Config 信息

在应用的 /src/main/resources/ 目录下,创建引导配置文件 bootstrap.yml(或 bootstrap.properties),添加以下 Nacos Config 配置:

spring:application:name: nacosconfig # 项目名称和 nacos DataId 相匹配cloud:nacos:config:server-addr: 127.0.0.1:8848 # nacos 地址和端口file-extension: yaml # 获取配置文件的格式:yamlusername: nacos # nacos 认证用户名password: nacos # nacos 认证密码
server:port: 9001 # 项目启动端口

3.3 编写代码读取配置文件

新建控制器,使用 @Value 注解读取配置信息,实现代码如下:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestController {// 从 nacos 中读取配置项 config.info@Value("${config.info}")private String configInfo;@GetMapping("/getconfig")public String getConfigInfo(){return configInfo;}
}

3.4 Nacos 控制台添加配置信息

在 Nacos 控制台创建并设置配置文件,执行步骤如下所示。首先,在配置列表中点击“添加”按钮,如下图所示:abe40ed81d4c7ea0064300bc08514089.png进入配置页面,新建 YAML 或 Properties 配置文件,如下图所示:251aa844dbe32cd34ded40cefe96c119.png以上关键参数的含义和规则说明如下。

3.4.1 Data ID

Data ID 的拼接格式如下:

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

其中

  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix 来配置。

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

  • file-extension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 类型。

3.4.2 Group

Group 分组选项,主要是用来隔离不同的配置项目的,它的默认值为 DEFAULT_GROUP,可以通过 spring.cloud.nacos.config.group 配置。

配置好相应的内容之后,点击底部的“发布”按钮即可,添加成功之后会自动返回配置列表,如下图所示:a5798e8e41511452a79ea0370245a1ac.png经过以上步骤,Nacos 配置中心的功能就实现完了,接下来启动项目,程序的执行结果如下图所示:f19103d145477c4b92f92495597952d3.png

3.5 动态刷新功能

动态刷新功能是指,在 Nacos 配置中心修改了配置文件,在不重启项目的前提下,可以实时读取到最新的配置内置。

Nacos 默认会为所有获取数据成功的 Nacos 的配置项添加了监听功能,在监听到服务端配置发生变化时会实时触发 org.springframework.cloud.context.refresh.ContextRefresher 的 refresh 方法。

如果需要对 Bean 进行动态刷新,需要参照 Spring 和 Spring Cloud 规范,推荐给类添加 @RefreshScope 或 @ConfigurationProperties 注解,就可以实现配置中心的动态刷新功能了。

4.项目源码

https://gitee.com/mydb/spring-cloud-alibaba-example

小结

Nacos 作为 Spring Cloud Alibaba 的核心组件之一,提供了两个非常重要的功能:注册中心和配置中心。注册中心有两个重要的功能:服务注册和服务发现,它解决了微服务集群中,调用者和服务提供者连接管理和请求转发的功能,保证了服务调用者能够稳定的调用到健康的服务。而注册中心的本质是将项目中的本地配置文件云端化,解决了配置文件的安全性与统一性的问题,并且提供了配置文件历史版本回滚和配置文件动态刷新的功能。

参考文档

Nacos 官方文档:https://nacos.io/zh-cn/docs/what-is-nacos.html

是非审之于己,毁誉听之于人,得失安之于数。

公众号:Java中文社群

Java面试合集:https://gitee.com/mydb/interview

1e202691ac93067e8739c411da7f1989.gif

往期推荐

b868302d614fa5ed31e6c84272c8b95a.jpeg

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


3ca805a335ed43a1a57ed3500e53ce27.jpeg

20 图|Nacos 手摸手教程


1f2416b3b0ff55ee824a5933f28c0859.jpeg

SpringCloud OpenFeign + Nacos正确打开方式!

360f9d6f19dae290d0922057c3683c70.gif

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

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

相关文章

所有子序列的逆序对总和_一个数字的所有子串的总和

所有子序列的逆序对总和Problem statement: 问题陈述&#xff1a; Given an integer, S represented as a string, get the sum of all possible substrings of this string. 给定一个以字符串形式表示的整数S &#xff0c;得到该字符串所有可能的子字符串的和 。 Input: 输入…

synchronized:使用不规范,老板泪两行!

线程安全问题一直是系统亘古不变的痛点。这不&#xff0c;最近在项目中发了一个错误使用线程同步的案例。表面上看已经使用了同步机制&#xff0c;一切岁月静好&#xff0c;但实际上线程同步却毫无作用。关于线程安全的问题&#xff0c;基本上就是在挖坑与填坑之间博弈&#xf…

SQL --运算符

2019独角兽企业重金招聘Python工程师标准>>> 一、<> (安全等于运算符) mysql中的 、<>或!运算符&#xff0c;相信大家已经很清楚了。今天看到了<>这个运算符&#xff0c;记录下来。 1><>和号的相同点 他们都是两个值比较符&#xff0c;相…

linux 文件浏览器_浏览Linux文件系统

linux 文件浏览器你为什么要学习&#xff1f; (Why would you want to learn?) Linux is probably the most used operating system when it comes to development. For a developer, Linux provides all the required tools. Learning how to navigate the Linux file system…

@Autowired 和 @Resource 的 5 点区别!

作者 | 磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;Autowired 和 Resource 都是 Spring/Spring Boot 项目中&#xff0c;用来进行依赖注入的注解。它们都提供了将依赖对…

rsync同步数据到内网

最近公司要求将IDC的APP日志备份到公司办公网内部&#xff0c;思前想后&#xff0c;结合以前学过的知识&#xff0c;决定用rsync直接推送&#xff0c;即从APP服务器上直接将日志推送到公司内网。这样避免了在生产服务器上额外安装更多软件而且只需要进行简单的配置&#xff0c;…

SpringBoot 时间格式化的 5 种实现方法!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;在我们日常工作中&#xff0c;时间格式化是一件经常遇到的事儿&#xff0c;所以本文我们就来盘点一下 Spring Boot 中时间格…

SpringBoot 解决跨域问题的 5 种方案!

作者 | 磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;跨域问题指的是不同站点之间&#xff0c;使用 ajax 无法相互调用的问题。跨域问题本质是浏览器的一种保护机制&#…

Java 中的 Lombok 到底能不能用?

一、摘要Java&#xff0c;作为一款非常热门的编程语言&#xff0c;尽管它有着非常丰富的语言特性&#xff0c;完全面向对象编程&#xff0c;编程高度规范化&#xff0c;但是也有一个最受大家诟病的一个缺点&#xff1a;啰嗦&#xff0c;尤其是当你开发了很多年之后&#xff0c;…

旅行商问题

旅行商问题 (Travelling Salesman problem) This problem can be stated as- "Given n number of cities and a travelling salesman has to visit each city. Then we have to find the shortest tour so that the travelling salesman can visit each and every city on…

分页 + 模糊查询竟然有坑?

不知道你有没有使用过Mysql的like语句&#xff0c;进行模糊查询&#xff1f;不知道你有没有将查询结果&#xff0c;进行分页处理&#xff1f;模糊查询&#xff0c;加上分页处理&#xff0c;会有意想不到的坑&#xff0c;不信我们继续往下看。我之前提供过一个品牌查询接口&…

导致事务@Transactional失效的5种场景!

作者 | 磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;一个程序中不可能没有事务&#xff0c;而 Spring 中&#xff0c;事务的实现方式分为两种&#xff1a;编程式事务和声…

操作系统 cpu调度_CPU调度| 操作系统

操作系统 cpu调度调度标准 (Scheduling Criteria) There are many criteria which have been suggested for comparing the CPU scheduling algorithms. The characteristics which are used for comparison and then used to determine the best algorithms, for this some of…

IOS中KVO模式的解析与应用

最近老翁在项目中多处用到了KVO&#xff0c;深感这种模式的好处。现总结如下&#xff1a; 一、概述 KVO,即&#xff1a;Key-Value Observing&#xff0c;它提供一种机制&#xff0c;当指定的对象的属性被修改后&#xff0c;则对象就会接受到通知。简单的说就是每次指定的被观察…

使用 lambda 实现超强的排序功能

我们在系统开发过程中&#xff0c;对数据排序是很常见的场景。一般来说&#xff0c;我们可以采用两种方式&#xff1a;借助存储系统&#xff08;SQL、NoSQL、NewSQL 都支持&#xff09;的排序功能&#xff0c;查询的结果即是排好序的结果查询结果为无序数据&#xff0c;在内存中…

java 的23种设计模式 之单身狗和隔壁老王的故事

2019独角兽企业重金招聘Python工程师标准>>> 觉得代码写的别扭了&#xff0c;回头翻翻java 的23种设计模式。today,额,这么晚了&#xff0c;困了。就弄个最简单的单例模式吧。单例模式&#xff1a;俗称单身狗 package singleton; public class SingleTon { private …

使用python学线性代数_二项式过程| 使用Python的线性代数

使用python学线性代数When we flip a coin, there are two possible outcomes as head or tail. Each outcome has a fixed probability of occurrence. In the case of fair coins, heads and tails each have the same probability of 1/2. In addition, there are cases in …

工作中常见的 6 种设计模式,你用过几种?

前言 哈喽&#xff0c;大家好。平时我们写代码呢&#xff0c;多数情况都是流水线式写代码&#xff0c;基本就可以实现业务逻辑了。如何在写代码中找到乐趣呢&#xff0c;我觉得&#xff0c;最好的方式就是&#xff1a;使用设计模式优化自己的业务代码。今天跟大家聊聊日常工作中…

这12款idea插件,能让你代码飞起来!

前言基本上每个程序员都会写代码&#xff0c;但写代码的速度不尽相同。为什么有些人&#xff0c;一天只能写几百行代码&#xff1f;而有些人&#xff0c;一天可以写几千行代码&#xff1f;有没有办法&#xff0c;可以提升开发效率&#xff0c;在相同的时间内&#xff0c;写出更…