Nacos是一种工具,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
在SpringCloudAlibaba微服务架构中,Nacos用于注册中心和配置中心。
下图为微服务架构图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-whSotykG-1660923621837)(…/blog_img/20220728161129.png)]
注册中心用于管理所有服务、解决服务与服务之间调用关系错综复杂、难以维护的问题;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Qvlr7xq-1660923621839)(…/blog_img/nacos_20220729113837.png)]
第一代:直接通过网址调用其他服务。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5PWPnpxR-1660923621840)(…/blog_img/nacos_20220729113855.png)]
第二代:通过注册表维护其他服务的网址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H8f90kTJ-1660923621841)(…/blog_img/nacos_20220729113919.png)]
第三代:通过nginx来维护其他服务的网址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZOoywcnp-1660923621842)(…/blog_img/nacos_20220729113935.png)]
第四代:通过简单注册中心来维护服务网址和服务名称
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-asonRUrD-1660923621844)(…/blog_img/nacos_20220729113955.png)]
第五代:给注册中心加上心跳机制,并且通过部署注册中心集群等方式来维护服务网址和服务名称
Nacos作为注册中心提供的核心功能:
startup.cmd -m standalone
,启动nacos服务端。下面是nacos启动截图[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6O4B3zwm-1660923621845)(…/blog_img/20220728175719.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-660xKzGu-1660923621847)(…/blog_img/20220728175810.png)]
注意:nacos集群运行需要使用外部数据源mysql。3个或3个以上Nacos节点才能构成集群
连接外部数据源mysql步骤:
1. 先把/conf/nacos-mysql.sql文件运行到mysql数据库中,建库建表。
2. 修改/conf/application.properties文件中的数据库配置。将下面配置的注释解除
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos-mysql?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root
# 这里由于nacos都是运行在同一台机器上所以ip相同。实际根据具体情况来
192.168.11.109:8848
192.168.11.109:8850
192.168.11.109:8852
注意:在nacos2.x版本中,每启动一个nacos,会有3个端口被nacos使用。例如:若某个nacos端口为8848,则9848(8848+1000)端口和9849(8848+1001)会被启用。所以设置集群nacos端口时,不要设置连续端口号。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bzVrxnfM-1660923621848)(…/blog_img/nacos20220801151426.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VOwAtNDD-1660923621849)(…/blog_img/nacos20220801151853.png)]
# 多个nacos注册中心地址
spring.cloud.nacos.discovery.server‐addr=192.168.11.109:8848,192.168.11.109:8850,192.168.11.109:8852
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8YKO0pQO-1660923621851)(…/blog_img/nacos20220803144427.png)]
①:下载nginx,修改nginx配置文件,之后启动nginx
upstream nacos-cluster {
# nacos节点地址
server 192.168.11.109:8848;
server 192.168.11.109:8850;
server 192.168.11.109:8852;
}
server {
listen 7070;
server_name localhost;
location /nacos {
proxy_pass http://nacos-cluster;
}
}
②:访问nacos图形化界面 http://192.168.11.109:7070/nacos
③:修改application.properties配置文件
# nacos注册中心地址
# 若使用nginx对nacos进行负载均衡,这里则填上nginx对nacos代理的地址
spring.cloud.nacos.discovery.server‐addr=192.168.11.109:7070/nacos
注意:示例为使用springbootalibaba微服务架构的项目
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>Hoxton.SR12version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>2.2.8.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
注意
1.此处不用写版本号,是因为父项目pom引入了spring-cloud-alibaba的依赖,该依赖中包含了nacos-discovery的版本号.
2.若写了版本号,则表示是当前子项目单独引入nacos-discovery依赖,而不是继承父项目alibaba依赖中的nacos依赖。
# 服务端口
server.port=9090
# 服务名称
spring.application.name=user-service
# 是否启用nacos注册中心
spring.cloud.nacos.discovery.enabled=true
# nacos注册中心地址
spring.cloud.nacos.discovery.server‐addr=localhost:8848
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7AjJo78A-1660923621855)(…/blog_img/20220729150653.png)]
//启动类UserApplication.java
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
///
//控制层类userController.java
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/rest1")
public String restTemplate(){
//用restTemplate调用注册中心的服务
//这里调用其他服务接口的时候,不填写ip端口,直接填写nacos注册中心的服务名。例如:user-service
String a = restTemplate.getForObject("http://user-service/user/get",String.class);
return a;
}
@RequestMapping("/rest2")
public String restTemplate2(){
//用restTemplate调用注册中心的服务
String a = restTemplate.getForObject("http://order-service/order/get",String.class);
return a;
}
@RequestMapping("/rest3")
public String restTemplate3(){
//用restTemplate调用注册中心的服务
String a = restTemplate.getForObject("http://product-service/product/get",String.class);
return a;
}
配置项 | Key | 默认值 | 说明 |
---|---|---|---|
服务端地址 | spring.cloud.nacos.discovery.server-addr | 无 | Nacos Server 启动监听的ip地址和端口 |
服务名 | spring.cloud.nacos.discovery.service | ${spring.application.name} | 给当前的服务命名 |
服务分组 | spring.cloud.nacos.discovery.group | DEFAULT_GROUP | 设置服务所处的分组 |
命名空间 | spring.cloud.nacos.discovery.namespace | 无 | 常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等 |
是否启用nacos注册中心 | spring.cloud.nacos.discovery.enabled | true | 是否启用nacos注册中心 |
下图为微服务架构图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-izcj1eWE-1660923621856)(…/blog_img/20220728161129.png)]
在微服务架构中,配置中心就是统一管理各个微服务配置文件的服务。每个微服务都有自己的配置文件,为了统一维护,方便管理,所以出现了配置中心的概念。所有的微服务配置文件都在配置中心中管理和读取,因此,出现了配置中心的概念。
nacos配置中心有三个要点:命名空间Namespace,分组Group,配置集DataId。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gx7KIYvy-1660923621857)(…/blog_img/nacos20220809104932.png)]
① 新增命名空间Namespace
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AEafj3ZC-1660923621859)(…/blog_img/nacos20220809105912.png)]
命名空间默认值为public,如果不单独配置命名空间,那么默认所有的配置信息都在public命名空间中。若配置了命名空间,则namespace的值为命令空间id
Namespace 的常用场景是不同环境的配置的区分隔离,例如开发测试环境和生产环境的隔离等。
② 新增配置文件:分组Group,配置集DataId
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IDz4ZO57-1660923621861)(…/blog_img/nacos20220809110513.png)]
Data ID是配置项的唯一标识,它的命名是有一定规范的。
Data ID的命名规范是:
${prefix}-${spring.profiles.active}.${file-extension}
* prefix 默认为spring.application.name的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置。
* spring.profiles.active 即为当前环境对应的 profile。
注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
* file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。默认为properties类型。目前只支持 properties 和 yaml 类型。
例如:某个微服务服务名叫user-service,开发环境为dev。file-extension扩展格式为yaml,则该微服务对应的配置文件的Data ID要命名为user-service-dev.yaml。
① 给某个微服务引入Nacos配置中心依赖
该依赖是从父项目继承来的,所以无需填写版本号。
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
② 创建bootstrap.properties配置文件
微服务客户端拉取nacos配置中心的数据,是在读取application.yml文件之前。因此需要在项目中创建bootstrap.properties配置文件。bootstrap.yml配置文件是先于application.yml文件加载到项目中。微服务客户端根据bootstrap.properties配置文件去拉取nacos配置中心数据。
spring.application.name和spring.profiles.active配置可以不写在bootstrap.properties配置文件中,这里是为了方便展示
# 服务名称
spring.application.name=user-service
# 当前环境
spring.profiles.active=dev
# 配置中心地址
spring.cloud.nacos.config.server‐addr=localhost:8848
# 配置文件命名空间,不定义的时候默认为public,定义的时候,namespace值为命令空间的ID
# spring.cloud.nacos.config.namespace=public
# 配置文件分组,默认为DEFAULT_GROUP
spring.cloud.nacos.config.group=DEFAULT_GROUP
# 配置文件后缀,默认为properties
spring.cloud.nacos.config.file-extension=properties
根据上面例子的配置,该微服务会拉取public命名空间下DEFAULT_GROUP分组下的user-service-dev.properties配置文件。
注意:只有在配置文件中不定义namespace=public,微服务可以读取配置中心public命令空间中的数据。否则不行。此处为Nacos的一个bug。
③:读取配置中心的配置信息
//@Value注解可以获取到配置中心的值,
//但是无法动态获取配置中心实时修改后的值,需要利用@RefreshScope注解进行动态刷新
package com.example.user.controller;
@RestController
@RequestMapping("/userConfig")
@RefreshScope
public class UserConfigController {
@Value("${username}")
private String username;
@Value("${age}")
private String age;
@RequestMapping("/getConfig")
public String getConfig(){
System.out.println("username:"+username);
System.out.println("age:"+age);
return username+","+age;
}
}
④:重启服务运行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LEcYoUHR-1660923621863)(…/blog_img/nacos20220809154539.png)]
当微服务正确监听到配置中心数据后,nacos配置中心可以查询到配置文件正在被那个服务端进行监听。
nacos配置中心支持自定义扩展的 Data Id 配置。可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件。
bootstrap.properties配置文件
# 配置中心地址
spring.cloud.nacos.config.server‐addr=localhost:7070/nacos
# 配置文件命名空间,不定义的时候默认为public,定义的时候,namespace值为命令空间的ID
# spring.cloud.nacos.config.namespace=public
# 配置文件分组,默认为DEFAULT_GROUP
spring.cloud.nacos.config.group=DEFAULT_GROUP
# 配置文件后缀,默认为properties
spring.cloud.nacos.config.file-extension=properties
## 通过shared-configs可以支持读取多个配置文件,数组形式
# 不同工程下的通用配置 支持共享的 DataId
spring.cloud.nacos.config.shared-configs[0].data-id=shared01.properties
spring.cloud.nacos.config.shared-configs[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.shared-configs[0].refresh=true
## 通过extension-configs可以支持读取多个配置文件,数组形式
# 支持一个应用多个 DataId 的配置 一定要加扩展名
spring.cloud.nacos.config.extension-configs[0].data-id=extension01.properties
spring.cloud.nacos.config.extension-configs[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.extension-configs[0].refresh=true
不同Data Id 配置的优先级关系:
优先级从高到低:
当bootstrap.properties配置文件同时出现上面三种DataID设置时。对于同一个属性,高优先级的会覆盖低优先级的。例如高优先级的username属性会覆盖低优先级的username属性。