禁止商业转载,转载请注明本文原文地址:https://blog.csdn.net/wangguohui0726/article/details/115863913
本文编写自2021年4月8日,当前最新版本为 2021年3月30日发布的2.0.0版本
本文使用版本为SpringCloudAlibaba2.0.0欢迎来到 Nacos 的世界!
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。SpringCloudAlibaba官网:https://spring.io/projects/spring-cloud-alibaba/
Nacos 官网:https://nacos.io/zh-cn/docs/what-is-nacos.html
Nacos GitHub:https://github.com/alibaba/spring-cloud-alibaba一些概念性东西等,源于官方文档,可以直接阅读官方文档。
服务(Service)是 Nacos 世界的一等公民。Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:
Kubernetes Service
gRPC & Dubbo RPC Service
Spring Cloud RESTful Service
在SpringCloud环境中,Nacos的功能覆盖了服务注册中心、服务配置中心、服务总线。
相当于Nacos = Eureka + Config + Bus
服务发现和服务健康监测
Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。
Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。
动态配置服务
动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。
动态 DNS 服务
动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。
Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.
服务及其元数据管理
Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。
更多的特性列表 …
你可以通过源码和发行包两种方式来获取 Nacos。
git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
ls -al distribution/target/
// 将 $version 更改为您的实际路径
cd distribution/target/nacos-server-$version/nacos/bin
(个人推荐,因为它方便)
您可以从 最新稳定版本 下载 nacos-server-$version.zip
包。
unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
cd nacos/bin
我们现在最新版本是 2.0.0-bugfix (Mar 30th, 2021) 我就使用这个版本了。
启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:
bash startup.sh -m standalone
启动命令(standalone代表着单机模式运行,非集群模式):
cmd startup.cmd -m standalone
比如我为了方便,直接在Windows本机安装的Nacos,就把它下载、解压,然后进入到bin目录中,执行命令启动:
startup.cmd -m standalone
启动之后不要关闭此页面!
在控制台最后会有这么一段内容,表示Nacos启动成功,默认使用端口8848
2021-04-08 16:32:58,980 INFO Tomcat started on port(s): 8848 (http) with context
path '/nacos'
2021-04-08 16:32:58,986 INFO Nacos started successfully in stand alone mode. use
embedded storage
Nacos自带图形化页面,地址 http://localhost:8848/nacos (根据安装机器对应修改ip)
在浏览器中打开 http://localhost:8848/nacos 可以看到如下页面(默认用户名密码都是nacos):
curl -X POST "http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080"
根据参数可以看出,注册一个名字叫做nacos.naming.serviceName、ip是20.18.7.10、端口是8080的服务。
curl -X GET "http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName"
根据参数可以看出,获取一个名字叫做nacos.naming.serviceName的服务信息。
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"
根据参数可以看出,发布一个id为nacos.cfg.dataId、group为test、内容为HelloWorld的配置。
curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"
根据参数可以看出,获取id为nacos.cfg.dataId、group为test的配置内容。
sh shutdown.sh
cmd shutdown.cmd
或者双击shutdown.cmd运行文件。
Nacos官方使用文档:
- Nacos Spring 快速开始
- Nacos Spring Boot 快速开始
- Nacos Spring Cloud 快速开始
- Nacos Docker 快速开始
- Dubbo 融合 Nacos 成为注册中心
- Kubernetes Nacos
- NacosSync 介绍
此处我们是为了使用SpringCloudAlibaba的,所以讲得是Nacos关于SpringCloud的使用。
SpringCloudAlibaba官方文档:
https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.htm
也可以自己打开Spring官网 https://spring.io/ 自己进入文档,进入方式如下图。
可以看到Spring Cloud Alibaba Nacos的主要功能:
Spring Cloud Alibaba Nacos Discovery
Spring Cloud Alibaba Nacos Config
学习此模块最好先了解Eureka
先自己创建一个maven或是Spring Initializr项目,然后再创建我们所需要的子模块,我们要创建好多个子模块,作为服务的提供者和消费者。具体创建过程项目、子模块过程略。。。
对于依赖管理,我们可以在项目的 pom.xml 中加入如下配置控制SpringCloudAlibaba各组件的版本。
具体获取位置:在我们进入到官方文档后,左侧目录第二项 2. Dependency Management 里面就有。页面位置链接:https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html#_dependency_management
最终完整版父项目的 pom.xml 文件添加以下配置,统一管理子模块的依赖坐标版本(如果父pom不写也行,那么每个子模块就都要写一遍了)。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>2.4.4version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>2020.0.2version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>2.1.0.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
我这里创建的的服务提供者模块叫做 nacos-provider-9001
然后再在pom.xml文件中引入如下坐标,以使用nacos:
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
完整版的pom.xml大致是这样的:
<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.0modelVersion>
<groupId>org.examplegroupId>
<artifactId>SpringCloudAlibabaNacosartifactId>
<version>1.0-SNAPSHOTversion>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
dependencies>
project>
application.properties 配置文件:
server.port=9001
spring.application.name=nacos-provider
# Nacos服务的地址、端口
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 应当包含的端点ID,或全部包含的"*"。
management.endpoints.web.exposure.include=*
如果您不想使用Nacos进行服务注册和发现,则可以设置 spring.cloud.nacos.discovery 为 false。
启动类 NacosProvider9001Application.java:
org.example.springcloudalibaba.NacosProvider9001Application
package org.example.springcloudalibaba;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @Auth: guohui.wang
* @Blog: https://blog.csdn.net/wangguohui0726
* @Date: 2021-04-09 10:33
* @desc:
*/
@SpringBootApplication
@EnableDiscoveryClient //开启服务注册
public class NacosProvider9001Application {
public static void main(String[] args) {
SpringApplication.run(NacosProvider9001Application.class, args);
}
}
测试Controller ProviderTestProviderController.java:
org.example.springcloudalibaba.controller.ProviderTestProviderController
package org.example.springcloudalibaba.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
/**
* @Auth: guohui.wang
* @Blog: https://blog.csdn.net/wangguohui0726
* @Date: 2021-04-09 10:35
* @desc:
*/
@RestController
public class ProviderTestProviderController {
@GetMapping(value = "/echo/{string}")
public String echo(@PathVariable String string) {
return "Hello Nacos Discovery, " + string;
}
}
验证:
创建消费者服务可能不像创建提供者服务那样容易,因为消费者需要调用提供程序的RESTful服务。在此示例中,我们将使用最原始的方式,即,将LoadBalanceClient和RestTemolate显式组合以访问RESTful服务。
为了省事,我们消费者这边就把所有的类(启动类、配置类、Controller层)都写在一起了。(我图个省事,实际开发别这么干,别打死别找我)
pom.xml
<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">
<parent>
<artifactId>SpringCloudAlibabaNacosartifactId>
<groupId>org.examplegroupId>
<version>1.0-SNAPSHOTversion>
parent>
<modelVersion>4.0.0modelVersion>
<artifactId>nacos-consumer-9011artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
dependencies>
project>
application.properties:
server.port=9011
spring.application.name=nacos-consumer
# Nacos服务的地址、端口
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 应当包含的端点ID,或全部包含的"*"。
management.endpoints.web.exposure.include=*
NacosConsumer9001Application.java:
org.example.springcloudalibaba.NacosConsumer9001Application
package org.example.springcloudalibaba;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @Auth: guohui.wang
* @Blog: https://blog.csdn.net/wangguohui0726
* @Date: 2021-04-09 10:33
* @desc:
*/
@SpringBootApplication
@EnableDiscoveryClient //开启服务注册
public class NacosConsumer9011Application {
public static void main(String[] args) {
SpringApplication.run(NacosConsumer9011Application.class, args);
}
//Instantiate RestTemplate Instance
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@RestController
public class NacosController {
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private RestTemplate restTemplate;
@Value("${spring.application.name}")
private String appName;
@GetMapping("/echo/app-name")
public String echoAppName() {
//Access through the combination of LoadBalanceClient and RestTemplate
ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider");
String path = String.format("http://%s:%s/echo/%s", serviceInstance.getHost(), serviceInstance.getPort(), appName);
System.out.println("request path:" + path);
return restTemplate.getForObject(path, String.class);
}
}
}
也可以不在echoAppName()
方法中使用loadBalancerClient获取serviceInstance,直接在我们注入的restTemplate上面加上注解@LoadBalanced
,在调用的的时候,restTemplate调用的url就不是http:ip+port/接口了,就是http:服务名/接口,这样也可以(具体原因,看Ribbon教程)。
package org.example.springcloudalibaba;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @Auth: guohui.wang
* @Blog: https://blog.csdn.net/wangguohui0726
* @Date: 2021-04-09 10:33
* @desc:
*/
@SpringBootApplication
@EnableDiscoveryClient //开启服务注册
public class NacosConsumer9011Application {
public static void main(String[] args) {
SpringApplication.run(NacosConsumer9011Application.class, args);
}
//Instantiate RestTemplate Instance
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@RestController
public class NacosController {
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private RestTemplate restTemplate;
@Value("${spring.application.name}")
private String appName;
@GetMapping("/echo/app-name")
public String echoAppName() {
//Access through the combination of LoadBalanceClient and RestTemplate
String providerAppName = "nacos-provider";
String path = String.format("http://%s/echo/%s", providerAppName, appName);
System.out.println("request path:" + path);
return restTemplate.getForObject(path, String.class);
}
}
}
验证:
在成功的同时,可能会有人疑惑,我们也没有引入什么远程服务调用的工具的依赖啊,怎么就能够调用了呢?
这是因为:在我们引入的 spring-cloud-starter-alibaba-nacos-discovery 坐标中,内部就包含了ribbon的依赖,所以我们也就可以使用ribbon实现远程服务调用了。
配置 | 钥匙 | 默认值 | 描述 |
---|---|---|---|
服务器地址 | spring.cloud.nacos.discovery.server-addr |
Nacos服务器侦听器的IP和端口 | |
服务名称 | spring.cloud.nacos.discovery.service |
${spring.application.name} |
命名当前服务 |
权重 | spring.cloud.nacos.discovery.weight |
1 |
值范围:1到100。值越大,重量越大。 |
网卡名称 | spring.cloud.nacos.discovery.network-interface |
如果未指定IP地址,则注册的IP地址是网卡的IP地址。如果也未指定,默认情况下将使用第一个网卡的IP地址。 | |
注册IP地址 | spring.cloud.nacos.discovery.ip |
最高优先级 | |
注册端口 | spring.cloud.nacos.discovery.port |
-1 |
默认情况下将自动检测。不需要配置。 |
命名空间 | spring.cloud.nacos.discovery.namespace |
一个典型的场景是隔离针对不同环境的服务注册,例如测试和生产环境之间的资源(配置,服务等)隔离。 | |
快捷键 | spring.cloud.nacos.discovery.access-key |
阿里云帐户访问密钥 | |
密钥 | spring.cloud.nacos.discovery.secret-key |
阿里云账户密钥 | |
元数据 | spring.cloud.nacos.discovery.metadata |
您可以使用地图格式为服务定义一些元数据 | |
日志文件名 | spring.cloud.nacos.discovery.log-name |
||
集群名称 | spring.cloud.nacos.discovery.cluster-name |
DEFAULT |
Nacos的群集名称 |
终点 | spring.cloud.nacos.discovery.endpoint |
特定服务在特定区域中的域名。您可以使用该域名动态检索服务器地址 | |
是否整合Ribbon | ribbon.nacos.enabled |
true |
在大多数情况下设置为true |
启用Nacos监听 | spring.cloud.nacos.discovery.watch.enabled |
true |
设置为false以关闭监听 |
CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。
一个问题:
nacos-discovery 2020.0.0版本,发现里面的ribbon被删除了,@LoadBalanced RestTemplate失效了,这个版本需要怎么做负载均衡?
pring cloud2020版本也移除了ribbin。转而使用自己的loadbalance模块了。参考一下spring cloud common模块的文档。
具体怎么搞,之后研究,研究完了补上来
学习此模块最好先了解 SpringCloud Config
创建子模块 nacos-config-9021
pom.xml
(重点关注下这个pom的 spring-cloud-starter-bootstrap 坐标,SpringCloud 2020.X.X版本之后需要额外加入一个依赖 spring-cloud-starter-bootstrap
,旧版本的不需要,因为bootstrap.yml文件的识别在旧版本的时候能直接识别,第一个pom是符合我这个最新版本的,第二个pom是通过降为了旧版本的依赖,看版本选择怎么使用吧)
pom.xml
<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">
<parent>
<artifactId>SpringCloudAlibabaNacosartifactId>
<groupId>org.examplegroupId>
<version>1.0-SNAPSHOTversion>
parent>
<modelVersion>4.0.0modelVersion>
<artifactId>nacos-config-9021artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-bootstrapartifactId>
dependency>
dependencies>
project>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>2.2.2.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>Hoxton.SR1version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>2.1.0.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
dependencies>
bootstrap.yml
server:
port: 9021
spring:
profiles:
active: dev
application:
name: nacos-config
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
application.yml
#没错,就是空的
启动类 NacosConfig9021Application.java
org.example.springcloudalibaba.NacosConfig9021Application
package org.example.springcloudalibaba;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @Auth: guohui.wang
* @Blog: https://blog.csdn.net/wangguohui0726
* @Date: 2021-04-09 15:49
* @desc:
*/
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfig9021Application {
public static void main(String[] args) {
SpringApplication.run(NacosConfig9021Application.class, args);
}
}
controller层测试类 ConfigTestController.java
org.example.springcloudalibaba.controller.ConfigTestController
package org.example.springcloudalibaba.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Auth: guohui.wang
* @Blog: https://blog.csdn.net/wangguohui0726
* @Date: 2021-04-09 16:16
* @desc:
*/
@RestController
@RefreshScope
public class ConfigTestController {
@Value("${info}")
public String info;
@GetMapping("/getInfo")
public String getInfo() {
return info;
}
}
Nacos添加配置:
登录控制台 http://localhost:8848/nacos,用户名密码都是nacos
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 的拼接格式变成 ${prefix}.${file-extension}
file-exetension
为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension
来配置。目前只支持 properties
和 yaml
类型。如果没看懂,对应看下配置文件就知道了。
举例:
${prefix}-${spring.profiles.active}.${file-extension}
${prefix}.${file-extension}
验证:
@RefreshScope
注解,Nacos中配置修改之后,无需重启,重新访问http://localhost:9021/getInfo可以获取到最新的配置数据的。Nacos配置基本的三个概念:命名空间、GROUP、DataId。
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
做到现在了,我觉得后面这几个配置应该直接都能看懂咋回事,就不截图上代码举例子了
如果未指定名称空间,则使用Nacos的“public”名称空间${spring.cloud.nacos.config.namespace}
。您还可以通过以下方式指定自定义名称空间:
spring.cloud.nacos.config.namespace=b3404bc0-d7dc-4855-b519-570ed34b62d7
此配置必须在bootstrap文件中。spring.cloud.nacos.config.namespace
的值是名称空间的ID,可以从Nacos控制台中检索ID的值。添加配置时,请勿选择其他名称空间。否则,将无法正确检索配置。
{spring.cloud.nacos.config.group}
未定义配置时,默认情况下使用DEFAULT_GROUP 。如果需要定义自己的组,则可以在以下属性中进行定义:
spring.cloud.nacos.config.group=DEVELOP_GROUP
此配置必须在bootstrap文件中,并且Group的值必须与 spring.cloud.nacos.config.group
的值相同。
从Spring Cloud Alibaba Nacos Config开始,数据ID可以自定义。有关此部分的详细设计,请参阅Github问题。以下是一个完整的示例:
spring.application.name=opensource-service-provider
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# config external configuration
# 1. Data Id is in the default group of DEFAULT_GROUP, and dynamic refresh of configurations is not supported.
spring.cloud.nacos.config.ext-config[0].data-id=ext-config-common01.properties
# 2. Data Id is not in the default group, and dynamic refresh of configurations is not supported.
spring.cloud.nacos.config.ext-config[1].data-id=ext-config-common02.properties
spring.cloud.nacos.config.ext-config[1].group=GLOBALE_GROUP
# 3. Data Id is not in the default group and dynamic referesh of configurations is supported.
spring.cloud.nacos.config.ext-config[2].data-id=ext-config-common03.properties
spring.cloud.nacos.config.ext-config[2].group=REFRESH_GROUP
spring.cloud.nacos.config.ext-config[2].refresh=true
我们可以看到:
通过配置支持多个数据ID spring.cloud.nacos.config.ext-config[n].data-id
。
通过配置来定制数据ID组spring.cloud.nacos.config.ext-config[n].group
。如果未指定,则使用DEFAULT_GROUP。
通过配置spring.cloud.nacos.config.ext-config[n].refresh
更改配置时数据ID是否支持配置的动态刷新。默认情况下不支持。
当同时配置多个数据ID时,优先级由中的"n"值定义spring.cloud.nacos.config.ext-config[n].data-id
。值越大,优先级越高。
spring.cloud.nacos.config.ext-config[n].data-id
** 的值必须具有文件扩展名,并且可以是属性或yaml / yml。spring.cloud.nacos.config.file-extension
**中的设置对自定义数据ID文件扩展名没有任何影响。
**
自定义数据ID的配置允许在多个应用程序之间共享配置,还可以为一个应用程序支持多种配置。
要更清晰地在多个应用程序之间共享数据标识,您还可以使用以下方法:
spring.cloud.nacos.config.shared-dataids=bootstrap-common.properties,all-common.properties
spring.cloud.nacos.config.refreshable-dataids=bootstrap-common.properties
spring.cloud.nacos.config.shared-dataids
用于配置多个共享数据ID时,我们同意共享配置之间的以下优先级:优先级是根据配置出现的顺序来确定的。较晚出现的优先级比最先出现的优先级高。spring.cloud.nacos.config.shared-dataids
时,数据ID必须具有文件扩展名,并且可以是属性或yaml / yml。并且 spring.cloud.nacos.config.file-extension
中的配置****对自定义的Data Id文件扩展名没有任何影响。spring.cloud.nacos.config.refreshable-dataids
指定支持动态刷新的数据ID时,数据ID的相应值还应指定文件扩展名。传统我们启动Nacos都是以单机(standalone)的方式进行启动的,同时我们也会发现一个现象,就是我们设置的配置在Nacos重启之后依旧存在,这就说明了它有将配置进行了一个持久化存储(因为内存存储关掉就没了)。这是因为我们的Nacos中其实内部集成了一个小型数据库(Derby)。
但是我们在生产环境的时候,首先不可能只启动一个Nacos服务,这样很容易就产生单点故障。其次,既然单机不大合适,那就上集群环境吧,这时候我们的另一个问题就出来了。Nacos每一台机器的都会把它的配置存储在它本地的Derby数据库上,多台服务之间的数据是不同步的,这对于集群来说可不能行啊。所以,Nacos同时也支持使用外部数据库的方式进行数据的存储。
以下我们开始介绍一下Nacos的集群化部署以及它的持久化配置。
因此开源的时候推荐用户把所有服务列表放到一个vip下面,然后挂到一个域名下面
http://ip1:port/openAPI 直连ip模式,机器挂则需要修改ip才可以使用。
http://SLB:port/openAPI 挂载SLB模式(内网SLB,不可暴露到公网,以免带来安全风险),直连SLB即可,下面挂server真实ip,可读性不好。
http://nacos.com:port/openAPI 域名 + SLB模式(内网SLB,不可暴露到公网,以免带来安全风险),可读性好,而且换ip方便,推荐模式
SLB:服务器负载均衡(Server Load Balancing)
既然是要使用MySQL进行持久化,那我们必须要有两个重要的要素:MySQL数据库和数据库表结构。
MySQL服务怎么安装这里就不说了,那就说数据库表吧,我们应该从哪获取到这个数据库表相关信息呢?
一键直达:https://github.com/alibaba/nacos/blob/master/distribution/conf/nacos-mysql.sql
但是这个链接我不推荐,谁也不确定以后版本是不是这个文件,万一以后出新的版本了,表结构变了,人家单独又写了一个脚本文件呢,那这个链接不就不对劲儿了,所以我不喜欢直接给链接。下面简单介绍下从哪找到这个文件。
在上面的获取sql数据源文件的下方就有一个 “application.properties配置文件”,我们可以在这里获取application.properties配置文件。这个和我们Nacos安装目录下面的conf中的这个文件是大致相同的。
单机模式切换数据库:
就在文件后面追加如下配置(用户名密码等配置项的值根据实际情况修改成自己的):
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。
我们先搭建一个 “1个Nginx–>3个Nacos–>1个Mysql” 这样的集群。
搭建集群:
加一个这玩意,里面的三个server对应部署的三个Nacos
至此,Nacos算是结束了,更多详细内容,推荐查看官网。
笔记代码:https://download.csdn.net/download/wangguohui0726/16754503
禁止商业转载,转载请注明本文原文地址:https://blog.csdn.net/wangguohui0726/article/details/115863913