> 文档中心 > Nacos(五)SpringCloud整合Nacos2.x使用,实现配置中心与注册中心

Nacos(五)SpringCloud整合Nacos2.x使用,实现配置中心与注册中心

目录

  • 前言
  • 1、概览
  • 2、服务注册发现
    • 2.1 开启注册中心
    • 2.2 更多配置项
  • 3、服务配置中心
    • 3.1 开启配置中心
    • 3.2 动态刷新配置
    • 3.3 配置共享
      • 3.3.1 同服务不同环境共享
      • 3.3.2、不同微服务直接共享配置
    • 3.4 更多配置项
  • 4、命名空间
  • 5、用户管理与连接鉴权
    • 5.1 用户管理
    • 5.2 连接鉴权

前言

环境部署参考:
《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// 开启注册中心@EnableDiscoveryClientpublic 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

4、成功注册
在这里插入图片描述

5、服务间调用
通过UserService调用WageService
user-service代码:

// 1、在启动类中,加入RestTemplate 的配置@SpringBootApplication@EnableDiscoveryClientpublic class DemoWageServiceApplication {    public static void main(String[] args) { SpringApplication.run(DemoWageServiceApplication.class, args);    }   @Bean(name="remoteRestTemplate")    public RestTemplate restTemplateRemote() { return new RestTemplate();   }}// 2、UserController代码编写@RestControllerpublic 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代码:

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

引入spring-cloud-starter-alibaba-nacos-config后,一定要使用bootstrap.yml或者bootstrap.properties作为配置文件

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: /userspring:  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: yamlgroup: 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 来配置。目前只支持 propertiesyaml 类型。

3、在nacos中添加配置文件

点击配置列表,点击右边+号,新建配置:
在这里插入图片描述
在新建配置过程中,要注意下面的细节:
1)Data ID不能随便写,要跟配置文件中的对应,对应关系如图所示。
2)配置文件格式要跟服务的配置文件的格式对应。
3)配置内容为本地服务的配置内容(比如:application.yaml内容)

配置中心内容:

server:  port: 8083  servlet:    context-path: /userspring:  cloud:    nacos:      discovery: #nacos注册中心 server-addr: 162.14.115.18 group: cloud-dev# 自定义配置参数sys:  test: 123456

在这里插入图片描述

4、验证:
我们在user-service服务中,写一个接口,用于获取配置中心的参数,如果成功打印则表示配置成功,代码如下:

@RestControllerpublic 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 {    // 需要修改的配置key    @Value("${sys.test}")    private String testStr; // 第一步:先到nacos配置中心将sys.test参数的值修改为123321(或者任意值)    // 第二步:请求该接口加载最新的配置信息到本地,如果返回成功则表示修改成功    @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: #如果是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、验证:

@RestControllerpublic 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时,通过账户密码验证,防止业务错用的弱鉴权体系。

创建用户:
Nacos(五)SpringCloud整合Nacos2.x使用,实现配置中心与注册中心

创建角色:
Nacos(五)SpringCloud整合Nacos2.x使用,实现配置中心与注册中心
角色与命名空间绑定:
Nacos(五)SpringCloud整合Nacos2.x使用,实现配置中心与注册中心

5.2 连接鉴权

第一步:
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

如果登录鉴权失败:
Nacos(五)SpringCloud整合Nacos2.x使用,实现配置中心与注册中心