前言
环境部署参考: 《Docker部署Nacos-2.0.3单机环境》 《Docker部署Nacos-2.0.3集群环境》 《Linux部署Nacos-2.0.3单机环境》 《Linux部署Nacos-2.0.3集群环境》
1、概览
Nacos 致力于微服务的发现、配置和管理,快速实现动态服务发现、服务配置、服务元数据及流量管理。
使用 Nacos 简化服务发现、配置管理、服务治理及管理的解决方案,让微服务的发现、管理、共享、组合更加容易。
Nacos 的关键特性包括:
- 服务发现和服务健康监测: Nacos 支持基于 DNS 和基于 RPC 的服务发现,Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。具有agent 上报模式和服务端主动检测2种健康检查模式。
- 动态配置服务: 动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
- 动态 DNS 服务: 动态DNS服务更容易地实现以 DNS 协议为基础的服务发现,支持权重路由,更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。
- 服务及其元数据管理: 通过Nacos可视化平台可以管理所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA等内容。
2、服务注册发现
服务发现是微服务架构体系中最关键的组件之一。如果尝试着用手动的方式来给每一个客户端来配置所有服务提供者的服务列表是一件非常困难的事,而且也不利于服务的动态扩缩容。Nacos Discovery Starter 可以帮助您将服务自动注册到 Nacos 服务端并且能够动态感知和刷新某个服务实例的服务列表。除此之外,Nacos Discovery Starter 也将服务实例自身的一些元数据信息-例如 host,port,健康检查URL等信息注册到 Nacos。
2.1 开启注册中心
1、 在pom依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</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:
server-addr: 127.0.0.1:8848
group: xxxx
namespace: xxx.xxx.xxx.xxx
4、成功注册
5、服务间调用 通过UserService 调用WageService user-service代码:
@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();
}
}
@RestController
public class UserController {
@Resource(name = "remoteRestTemplate")
@LoadBalanced
private RestTemplate remoteRestTemplate;
@Resource
private DiscoveryClient discoveryClient;
@GetMapping("wage")
public Wage userWage() {
System.out.println("调用Wage-Service服务");
ServiceInstance serviceInstance = discoveryClient.getInstances("wage-service").get(0);
String url = serviceInstance.getHost() + ":" + serviceInstance.getPort();
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 "成功";
}
}
2.2 更多配置项
配置项 | 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 | |
3、服务配置中心
当微服务配置文件过多以后,不好维护,配置文件无法实时更新。我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一个正在运行的项目来说是非常不友好的,我们就需要配置中心来解决这些问题。
注意:启用配置中心后,需要配置文件写到bootstrap文件中。
配置中心的思路是:
- 首先把项目中各种配置全部都放到一个集中的地方进行统一管理,并提供一套标准的接口。
- 当各个服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。
- 当配置中心中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动
态更新。 命名空间(Namespace) 不同的项目可以分为不同的命名空间。 配置分组(Group) 根据项目的不同环境可以一个分组。 配置集(Data ID) 服务不同环境的不同配置,就是一个配置集。
3.1 开启配置中心
配置到nacos配置中心的配置文件,只能是`bootstrap.yml或者bootstrap.properties
优先级:bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml
pom
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
我们将原有的application.yml文件内容迁移到配置上,步骤如下:
1、原有application.yml:
server:
port: 8083
servlet:
context-path: /user
spring:
application:
name: user-service
cloud:
nacos:
discovery:
server-addr: 162.14.115.18:8848
group: cloud-dev
sys:
test: 123456
2、建立bootstrap.yaml
spring:
application:
name: user-service
cloud:
nacos:
config:
server-addr: 111.229.160.175:8848
file-extension: yaml
group: cloud-dev
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:
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);
}
}
3.2 动态刷新配置
通过nacos配置中心将配置的远程存放,但是此时如果修改了配置,程序是无法读取到的,我们需要重启服务,或者开启配置的动态刷新功能。
开启配置刷新,需要在修改配置参数的类加上注解@RefreshScope ,然后再修改naocs 中配置文件以后,请求接口时即可获取到最新的配置信息。
配置动态刷新接口:
@RestController
@RefreshScope
public class NewConfigController {
@Value("${sys.test}")
private String testStr;
@GetMapping("/updateConifg")
public String updateConifg() {
System.out.println("修改自定义参数后的内容:" + testStr);
return testStr;
}
}
3.3 配置共享
当配置越来越多的时候,我们就发现有很多配置是重复的,这时候就可以将公共配置文件提取出来,然后实现共享。
3.3.1 同服务不同环境共享
只需要提取一个以 spring.application.name 命名的配置文件,然后将其所有环境的公共配置放在里面即可;项目在启动后会自动加载该文件,不需要进行指定操作。
比如: spring.application.name: user-sevice 则配置微服务的公共配置文件名称即为user-sevice.yaml ,而不同的环境配置则放到对应的环境文件user-sevice-dev(prod...).yaml 中
3.3.2、不同微服务直接共享配置
1、在nacos中建立公共配置文件:all-service.yaml (名称前缀任意),内容为:
sys:
all: this is all-service
2、修改bootstrap.yaml文件,加入以下配置shared-configs :
spring:
cloud:
nacos:
config:
server-addr: 162.14.115.18
file-extension: yaml
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);
}
}
3.4 更多配置项
配置项 | 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 | | |
4、命名空间
当项目越来越多时,为了实现项目之间的隔离,我们需要使用到命名空间,在命名空间 菜单进行新增,如下: 新增空间后,在配置管理 和服务管理 中可以看到: 在配置时,通过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
5、用户管理与连接鉴权
5.1 用户管理
nacos默认是不需要登录的,这样会导致配置中心对外直接暴露。而启用鉴权之后,需要在使用用户名和密码登录之后,才能正常使用nacos 。我们可以为每个项目建立专属的用户和角色 和命名空间 ,将这三者进行绑定,保证在连接nacos 时,通过账户密码 验证,防止业务错用的弱鉴权体系。
创建用户:
创建角色: 角色与命名空间绑定:
5.2 连接鉴权
第一步: 在nacos 中的application.properties 文件添加鉴权配置,如下:
nacos.core.auth.enabled=true
第二步: 我们在连接nacos时,设置namespace 指定到上面创建的test ,并且根据设置的用户、密码进行连接,如下:
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.0.111:8848
namespace: c85cdfe5-95e2-4a8a-b983-8972a2580d55
group: cloud-dev
username: test
password: 123456
如果登录鉴权失败:
|