环境部署参考:
《Docker部署Nacos-2.0.3单机环境》
《Docker部署Nacos-2.0.3集群环境》
《Linux部署Nacos-2.0.3单机环境》
《Linux部署Nacos-2.0.3集群环境》
Nacos 致力于微服务的发现、配置和管理,快速实现动态服务发现、服务配置、服务元数据及流量管理。
使用 Nacos 简化服务发现、配置管理、服务治理及管理的解决方案,让微服务的发现、管理、共享、组合更加容易。
Nacos 的关键特性包括:
服务发现是微服务架构体系中最关键的组件之一。如果尝试着用手动的方式来给每一个客户端来配置所有服务提供者的服务列表是一件非常困难的事,而且也不利于服务的动态扩缩容。Nacos Discovery Starter 可以帮助您将服务自动注册到 Nacos 服务端并且能够动态感知和刷新某个服务实例的服务列表。除此之外,Nacos Discovery Starter 也将服务实例自身的一些元数据信息-例如 host,port,健康检查URL等信息注册到 Nacos。
1、 在pom依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
2、 @EnableDiscoveryClient注解
@SpringBootApplication
// 开启注册中心
@EnableDiscoveryClient
public class XxxApplication {
public static void main(String[] args) {
SpringApplication.run(XxxApplication .class, args);
}
}
3 、配置yml
spring:
cloud:
nacos:
discovery:
#如果是nacos集群环境则指向nginx的地址+端(80端口可以省略)
server-addr: 127.0.0.1:8848
# 同一个项目下的服务,要在同一个分组下,相互间才能通信
group: xxxx
# 除了public外的命令空间
namespace: xxx.xxx.xxx.xxx
5、服务间调用
通过UserService
调用WageService
user-service代码:
// 1、在启动类中,加入RestTemplate 的配置
@SpringBootApplication
@EnableDiscoveryClient
public class DemoWageServiceApplication {
public static void main(String[] args) {
SpringApplication.run(DemoWageServiceApplication.class, args);
}
@Bean(name="remoteRestTemplate")
public RestTemplate restTemplateRemote() {
return new RestTemplate();
}
}
// 2、UserController代码编写
@RestController
public class UserController {
@Resource(name = "remoteRestTemplate")
@LoadBalanced
private RestTemplate remoteRestTemplate;
@Resource
private DiscoveryClient discoveryClient;
/**
* 通过nacos调用WageService服务
*
* @return
*/
@GetMapping("wage")
public Wage userWage() {
System.out.println("调用Wage-Service服务");
//从nacos中获取服务地址
ServiceInstance serviceInstance = discoveryClient.getInstances("wage-service").get(0);
String url = serviceInstance.getHost() + ":" + serviceInstance.getPort();
//通过rest进行服务间调用
return remoteRestTemplate.getForObject("http://" + url + "/wage/list", Wage.class);
}
}
wage-service代码:
@RestController
public class WageController {
@GetMapping("list")
public String listUser() throws InterruptedException {
System.out.println("工资列表");
return "成功";
}
}
配置项 | key | 默认值 | 说明 |
---|---|---|---|
服务端地址 | spring.cloud.nacos.discovery.server-addr | ||
服务名 | 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地址 | spring.cloud.nacos.discovery.ip | 优先级最高 | |
注册的端口 | spring.cloud.nacos.discovery.port | -1 | 默认情况下不用配置,会自动探测 |
命名空间 | spring.cloud.nacos.discovery.namespace | 常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。 | |
AccessKey | spring.cloud.nacos.discovery.access-key | ||
SecretKey | spring.cloud.nacos.discovery.secret-key | ||
Metadata | spring.cloud.nacos.discovery.metadata | 使用Map格式配置 | |
日志文件名 | spring.cloud.nacos.discovery.log-name | ||
接入点 | spring.cloud.nacos.discovery.endpoint | UTF-8 | 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址 |
是否集成Ribbon | ribbon.nacos.enabled | true |
当微服务配置文件过多以后,不好维护,配置文件无法实时更新。我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一个正在运行的项目来说是非常不友好的,我们就需要配置中心来解决这些问题。
注意:启用配置中心后,需要配置文件写到bootstrap文件中。
配置中心的思路是:
配置到nacos配置中心的配置文件,只能是
bootstrap.yml或者bootstrap.properties
优先级:bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml
引入
spring-cloud-starter-alibaba-nacos-config
后,一定要使用bootstrap.yml或者bootstrap.properties
作为配置文件
pom
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
我们将原有的application.yml文件内容迁移到配置上,步骤如下:
1、原有application.yml:
# 实际内容
server:
port: 8083
servlet:
context-path: /user
spring:
application:
name: user-service
# nacos注册中心配置
cloud:
nacos:
discovery: #nacos注册中心
server-addr: 162.14.115.18:8848
group: cloud-dev
# 自定义配置参数
sys:
test: 123456
2、建立bootstrap.yaml
spring:
application:
name: user-service
cloud:
nacos:
config:
#如果是nacos集群环境则指向nginx的地址+端口(80可以不写)
server-addr: 111.229.160.175:8848 # nacos的服务端地址
file-extension: yaml
group: cloud-dev
# namespace: 指定分组空间的namespace值
# 如果存在多环境配置,则可以在配置中心为不同的环境建立不同配置文件,比如:user-service-dev/test.yaml,没有多环境则不写
profiles:
active: dev
配置时一定要配置
spring.application.name
,是因为它是构成 Nacos 配置管理dataId
字段的一部分。
在 Nacos Spring Cloud 中,dataId
的完整格式如下:
${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
和yaml
类型。
3、在nacos中添加配置文件
点击配置列表,点击右边+号,新建配置:
在新建配置过程中,要注意下面的细节:
1)Data ID不能随便写,要跟配置文件中的对应,对应关系如图所示。
2)配置文件格式要跟服务的配置文件的格式对应。
3)配置内容为本地服务的配置内容(比如:application.yaml内容)
配置中心内容:
server:
port: 8083
servlet:
context-path: /user
spring:
cloud:
nacos:
discovery: #nacos注册中心
server-addr: 162.14.115.18
group: cloud-dev
# 自定义配置参数
sys:
test: 123456
4、验证:
我们在user-service
服务中,写一个接口,用于获取配置中心的参数,如果成功打印则表示配置成功,代码如下:
@RestController
public class UserController {
@Value("${sys.test}")
private String test;
@GetMapping("config")
public void config() {
System.out.println("自定义参数内容:" + test);
}
}
通过nacos配置中心将配置的远程存放,但是此时如果修改了配置,程序是无法读取到的,我们需要重启服务,或者开启配置的动态刷新功能。
开启配置刷新,需要在修改配置参数的类加上注解@RefreshScope
,然后再修改naocs
中配置文件以后,请求接口时即可获取到最新的配置信息。
配置动态刷新接口:
@RestController
// 只需要在需要动态读取配置的类上添加此注解就可以
@RefreshScope
public class NewConfigController {
// 需要修改的配置key
@Value("${sys.test}")
private String testStr;
// 第一步:先到nacos配置中心将sys.test参数的值修改为123321(或者任意值)
// 第二步:请求该接口加载最新的配置信息到本地,如果返回成功则表示修改成功
@GetMapping("/updateConifg")
public String updateConifg() {
System.out.println("修改自定义参数后的内容:" + testStr);
return testStr;
}
}
当配置越来越多的时候,我们就发现有很多配置是重复的,这时候就可以将公共配置文件提取出来,然后实现共享。
只需要提取一个以 spring.application.name 命名的配置文件,然后将其所有环境的公共配置放在里面即可;项目在启动后会自动加载该文件,不需要进行指定操作。
比如: spring.application.name: user-sevice
则配置微服务的公共配置文件名称即为user-sevice.yaml
,而不同的环境配置则放到对应的环境文件user-sevice-dev(prod...).yaml
中
1、在nacos中建立公共配置文件:all-service.yaml (名称前缀任意),内容为:
sys:
all: this is all-service
2、修改bootstrap.yaml文件,加入以下配置shared-configs
:
spring:
cloud:
nacos:
config:
#如果是nacos集群环境则指向nginx的地址+端口(80可以不写)
# nacos的服务端地址
server-addr: 162.14.115.18
# 配置文件后缀
file-extension: yaml
# 默认为DEFAULT_GROUP
group: cloud-dev
# 读取公用配置优先读取数组靠后的配置文件
shared-configs:
- data-id: all-service.yaml
group: GLOBALE_GROUP
refresh: true
....
....
3、验证:
@RestController
public class UserController {
@Value("${sys.all}")
private String all;
@GetMapping("config")
public void config() {
System.out.println("获取自定义参数内容:" + all);
}
}
配置项 | key | 默认值 | 说明 |
---|---|---|---|
服务端地址 | spring.cloud.nacos.config.server-addr | 服务器ip和端口 | |
DataId前缀 | spring.cloud.nacos.config.prefix | spring.application.name | |
Group | spring.cloud.nacos.config.group | DEFAULT_GROUP | |
dataID后缀及内容文件格式 | spring.cloud.nacos.config.file-extension | properties | dataId的后缀,同时也是配置内容的文件格式,目前只支持 properties |
配置内容的编码方式 | spring.cloud.nacos.config.encode | UTF-8 | 配置的编码 |
获取配置的超时时间 | spring.cloud.nacos.config.timeout | 3000 | 单位为 ms |
配置的命名空间 | spring.cloud.nacos.config.namespace | 常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源隔离等。 | |
AccessKey | spring.cloud.nacos.config.access-key | ||
SecretKey | spring.cloud.nacos.config.secret-key | ||
相对路径 | spring.cloud.nacos.config.context-path | 服务端 API 的相对路径 | |
接入点 | spring.cloud.nacos.config.endpoint | 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址 | |
是否开启监听和自动刷新 | spring.cloud.nacos.config.refresh-enabled | true | |
集群服务名 | spring.cloud.nacos.config.cluster-name |
当项目越来越多时,为了实现项目之间的隔离,我们需要使用到命名空间,在命名空间
菜单进行新增,如下:
新增空间后,在配置管理
和服务管理
中可以看到:
在配置时,通过namespace
参数指定,比如:
spring:
cloud:
nacos:
discovery:
server-addr: 162.14.115.18:8848
namespace: c85cdfe5-95e2-4a8a-b983-8972a2580d55
命名空间与分组的关系:
我们可以根据不同项目建立不用的命名空间,然后根据项目的不同环境(dev、prod)设置成不同的分组,比如:
demo
,将命名空间名称设置为demo
, :
demo
,分组名称为demo-prod
demo
,分组名称为demotest
nacos默认是不需要登录的,这样会导致配置中心对外直接暴露。而启用鉴权之后,需要在使用用户名和密码登录之后,才能正常使用nacos
。我们可以为每个项目建立专属的用户和角色
和命名空间
,将这三者进行绑定,保证在连接nacos
时,通过账户密码
验证,防止业务错用的弱鉴权体系。
第一步:
在nacos
中的application.properties
文件添加鉴权配置,如下:
nacos.core.auth.enabled=true
第二步:
我们在连接nacos时,设置namespace
指定到上面创建的test
,并且根据设置的用户、密码进行连接,如下:
spring:
cloud:
nacos:
discovery: #nacos注册中心
server-addr: 192.168.0.111:8848
namespace: c85cdfe5-95e2-4a8a-b983-8972a2580d55
group: cloud-dev
# 连接nacos的账户、密码
username: test
password: 123456