## **Nacos配置中心** ``` wget -O /home/shell/nacos-server-1.3.2.tar.gz https://handson.oss-cn-shanghai.aliyuncs.com/nacos-server-1.3.2.tar.gz tar -xzvf /home/shell/nacos-server-1.3.2.tar.gz -C /home/shell/ sh /home/shell/nacos/bin/startup.sh -m standalone ``` [Java 工程脚手架](https://start.aliyun.com/bootstrap.html) [nacos官网](https://nacos.io/zh-cn/docs/quick-start.html?spm=5176.12026607.tutorial.1.9c7732e2uSd0iK) Data ID 由应用名(nacos-config-sample)+ 文件后缀名(.properties) 组成 ``` spring.cloud.nacos.config.server-addr=127.0.0.1:8848 spring.cloud.nacos.config.username=nacos spring.cloud.nacos.config.password=nacos ``` 1.当你使用域名的方式来访问 Nacos 时, `spring.cloud.nacos.config.server-addr`配置的方式为域名:port。 例如 Nacos 的域名为abc.com.nacos,监听的端口为 80,则 `spring.cloud.nacos.config.server-addr=abc.com.nacos:80`。 注意 80 端口不能省略。 ### 动态刷新: - 必须条件:Bean 的声明类必须标注 `@RefreshScope` - 二选一条件: - 属性(非 static 字段)标注 `@Value` - `@ConfigurationProperties`Bean ### 配置隔离 [Nacos 概念](https://nacos.io/zh-cn/docs/concepts.html?spm=5176.12026607.tutorial.7.9c7732e2uSd0iK) 用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。 在没有明确指定 `${spring.cloud.nacos.config.namespace}`配置的情况下, 默认使用的是 Nacos 上 Public 这个namespae。 在没有明确指定 `${spring.cloud.nacos.config.group}`配置的情况下, 默认使用的是 DEFAULT_GROUP ### 支持自定义扩展的 Data Id 配置 详细的设计可参考 [SCA Nacos Config 共享配置方案设计](https://github.com/spring-cloud-incubator/spring-cloud-alibaba/issues/141?spm=5176.12026607.tutorial.8.9c7732e2uSd0iK)。 ``` spring.application.name=opensource-service-provider spring.cloud.nacos.config.server-addr=127.0.0.1:8848 # config external configuration # 1、Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新 spring.cloud.nacos.config.extension-configs[0].data-id=ext-config-common01.properties # 2、Data Id 不在默认的组,不支持动态刷新 spring.cloud.nacos.config.extension-configs[1].data-id=ext-config-common02.properties spring.cloud.nacos.config.extension-configs[1].group=GLOBALE_GROUP # 3、Data Id 既不在默认的组,也支持动态刷新 spring.cloud.nacos.config.extension-configs[2].data-id=ext-config-common03.properties spring.cloud.nacos.config.extension-configs[2].group=REFRESH_GROUP spring.cloud.nacos.config.extension-configs[2].refresh=true ``` 可以看到: - 通过 `spring.cloud.nacos.config.extension-configs[n].data-id`的配置方式来支持多个 Data Id 的配置。 - 通过 `spring.cloud.nacos.config.extension-configs[n].group`的配置方式自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。 - 通过 `spring.cloud.nacos.config.extension-configs[n].refresh`的配置方式来控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。 > 注:多个 Data Id 同时配置时,他的优先级关系是 `spring.cloud.nacos.config.extension-configs[n].data-id`其中 n 的值越大,优先级越高。 `spring.cloud.nacos.config.extension-configs[n].data-id`的值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。 此时 `spring.cloud.nacos.config.file-extension`的配置对自定义扩展配置的 Data Id 文件扩展名没有影响。 通过自定义扩展的 Data Id 配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件。 为了更加清晰的在多个应用间配置共享的 Data Id ,你可以通过以下的方式来配置: ``` # 配置支持共享的 Data Id spring.cloud.nacos.config.shared-configs[0].data-id=common.yaml # 配置 Data Id 所在分组,缺省默认 DEFAULT_GROUP spring.cloud.nacos.config.shared-configs[0].group=GROUP_APP1 # 配置Data Id 在配置变更时,是否动态刷新,缺省默认 false spring.cloud.nacos.config.shared-configs[0].refresh=true ``` 可以看到: - 通过 `spring.cloud.nacos.config.shared-configs[n].data-id`来支持多个共享 Data Id 的配置。 - 通过 `spring.cloud.nacos.config.shared-configs[n].group`来配置自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。 - 通过 `spring.cloud.nacos.config.shared-configs[n].refresh`来控制该Data Id在配置变更时,是否支持应用中动态刷新,默认false。 ### 配置的优先级 Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。 - A: 通过 `spring.cloud.nacos.config.shared-configs[n].data-id`支持多个共享 Data Id 的配置 - B: 通过 `spring.cloud.nacos.config.extension-configs[n].data-id`的方式支持多个扩展 Data Id 的配置 - C: 通过内部相关规则(应用名、应用名+ Profile )自动生成相关的 Data Id 配置 当三种方式共同使用时,他们的一个优先级关系是:A < B < C ### 完全关闭配置 通过设置 spring.cloud.nacos.config.enabled = false 来完全关闭 Spring Cloud Nacos Config | 配置项 | Key | 默认值 | 说明 | | -------------------------------- | -------------------------------------------- | ------------- | ------------------------------------------------------------ | | 服务端地址 | spring.cloud.nacos.config.server-addr | | Nacos Server 启动监听的ip地址和端口 | | 配置对应的 DataId | spring.cloud.nacos.config.name | | 先取 prefix,再取 name,最后取 spring.application.name | | 配置对应的 DataId | spring.cloud.nacos.config.prefix | | 先取 prefix,再取 name,最后取 spring.application.name | | 配置内容编码 | spring.cloud.nacos.config.encode | | 读取的配置内容对应的编码 | | GROUP | spring.cloud.nacos.config.group | DEFAULT_GROUP | 配置对应的组 | | 文件扩展名 | spring.cloud.nacos.config.fileExtension | properties | 配置项对应的文件扩展名,目前支持 properties 和 yaml(yml) | | 获取配置超时时间 | spring.cloud.nacos.config.timeout | 3000 | 客户端获取配置的超时时间(毫秒) | | 接入点 | spring.cloud.nacos.config.endpoint | | 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址 | | 命名空间 | spring.cloud.nacos.config.namespace | | 常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等 | | AccessKey | spring.cloud.nacos.config.accessKey | | 当要上阿里云时,阿里云上面的一个云账号名 | | SecretKey | spring.cloud.nacos.config.secretKey | | 当要上阿里云时,阿里云上面的一个云账号密码 | | Nacos Server 对应的 context path | spring.cloud.nacos.config.contextPath | | Nacos Server 对外暴露的 context path | | 集群 | spring.cloud.nacos.config.clusterName | | 配置成Nacos集群名称 | | 共享配置 | spring.cloud.nacos.config.sharedDataids | | 共享配置的 DataId, "," 分割 | | 共享配置动态刷新 | spring.cloud.nacos.config.refreshableDataids | | 共享配置中需要动态刷新的 DataId, "," 分割 | | 自定义 Data Id 配置 | spring.cloud.nacos.config.extConfig | | 属性是个集合,内部由 ConfigPOJO 组成。Config有 3 个属性,分别是 dataId, group以及 refresh | Nacos Server 版本,可以从 [release 页面](https://github.com/alibaba/nacos/releases?spm=5176.12026607.tutorial.4.9c7732e2uSd0iK) 下载最新的版本 ### Nacos Config Actuator Endpoint ``` management.endpoints.jmx.exposure.include=* management.endpoints.web.exposure.include=* management.endpoint.health.show-details=always # Actuator Web 访问端口 management.server.port=8081 ``` Endpoint URI 为 `/actuator/nacos-config` > 注:使用 Nacos Config Spring Cloud 1.x 版本的话,其 URI 地址则为 `/nacos-config` 其中,Endpoint 暴露的 json 中包含了三种属性: - NacosConfigProperties: 当前应用 Nacos 的基础配置信息 - RefreshHistory: 配置刷新的历史记录 - Sources: 当前应用配置的数据信息 http://127.0.0.1:8081/actuator/nacos-config ``` { "NacosConfigProperties": { "serverAddr": "127.0.0.1:8848", "username": "", "password": "", "encode": null, "group": "DEFAULT_GROUP", "prefix": null, "fileExtension": "properties", "timeout": 3000, "maxRetry": null, "configLongPollTimeout": null, "configRetryTime": null, "enableRemoteSyncConfig": false, "endpoint": null, "namespace": null, "accessKey": null, "secretKey": null, "contextPath": null, "clusterName": null, "name": null, "sharedConfigs": null, "extensionConfigs": null, "refreshEnabled": true, "sharedDataids": null, "refreshableDataids": null, "extConfig": null, "configServiceProperties": { "secretKey": "", "namespace": "", "username": "", "enableRemoteSyncConfig": "false", "configLongPollTimeout": "", "configRetryTime": "", "encode": "", "serverAddr": "127.0.0.1:8848", "maxRetry": "", "clusterName": "", "password": "", "accessKey": "", "endpoint": "" } }, "RefreshHistory": [ ], "Sources": [ { "lastSynced": "2020-09-14 11:11:37", "dataId": "nacos-config-sample.properties" }, { "lastSynced": "2020-09-14 11:11:37", "dataId": "nacos-config-sample" } ] } ``` ## Nacos注册中心 ### Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html ### Nacos认证信息 spring.cloud.nacos.discovery.username=nacos spring.cloud.nacos.discovery.password=nacos ### Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口 spring.cloud.nacos.discovery.server-addr=127.0.0.1:65000 ### 注册到 nacos 的指定 namespace,默认为 public spring.cloud.nacos.discovery.namespace=public ### Nacos Discovery 更多配置项信息 更多关于 Nacos Discovery Starter 的配置项如下所示: | 配置项 | Key | 默认值 | 说明 | | ------------------- | ------------------------------------------------ | ---------------------------- | ------------------------------------------------------------ | | 服务端地址 | `spring.cloud.nacos.discovery.server-addr` | | Nacos Server 启动监听的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地址 | `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.cluster-name` | `DEFAULT` | Nacos集群名称 | | 接入点 | `spring.cloud.nacos.discovery.endpoint` | | 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址 | | 是否集成Ribbon | `ribbon.nacos.enabled` | `true` | 一般都设置成true即可 | | 是否开启Nacos Watch | `spring.cloud.nacos.discovery.watch.enabled` | | | ### Nacos Discovery Actuator Endpoint Nacos Discovery 内部提供了一个 Endpoint, 对应的 endpoint id 为`nacos-discovery`,其 Actuator Web Endpoint URI 为`/actuator/nacos-discovery` > 注:使用 Nacos Config Spring Cloud 1.x 版本的话,其 URI 地址则为`/nacos-discovery` ) Endpoint 暴露的 json 中包含了两种属性: - subscribe: 显示了当前服务有哪些服务订阅者 - NacosDiscoveryProperties: 当前应用 Nacos 的基础配置信息 由于 Aliyun Java Initializr 所生成的应用工程默认激活 Spring Boot Actuator Endpoints(JMX 和 Web),具体配置存放在`application.properties` 文件中,同时,Actuator Web 端口设置为 8081,内容如下: ``` management.endpoints.jmx.exposure.include=* management.endpoints.web.exposure.include=* management.endpoint.health.show-details=always # Actuator Web 访问端口 management.server.port=62000 ```  因此,应用 nacos-discovery-provider-sample 无需调整,直接访问:http://127.0.0.1:62000/actuator/nacos-discovery,服务响应的内容如下: ```json { "subscribe": [ { "jsonFromServer": "", "name": "nacos-provider", "clusters": "", "cacheMillis": 10000, "hosts": [ { "instanceId": "30.5.124.156#8081#DEFAULT#nacos-provider", "ip": "30.5.124.156", "port": 8081, "weight": 1.0, "healthy": true, "enabled": true, "cluster": { "serviceName": null, "name": null, "healthChecker": { "type": "TCP" }, "defaultPort": 80, "defaultCheckPort": 80, "useIPPort4Check": true, "metadata": { } }, "service": null, "metadata": { } } ], "lastRefTime": 1541755293119, "checksum": "e5a699c9201f5328241c178e804657e11541755293119", "allIPs": false, "key": "nacos-provider", "valid": true } ], "NacosDiscoveryProperties": { "serverAddr": "127.0.0.1:8848", "endpoint": "", "namespace": "", "logName": "", "service": "nacos-provider", "weight": 1.0, "clusterName": "DEFAULT", "metadata": { }, "registerEnabled": true, "ip": "30.5.124.201", "networkInterface": "", "port": 8082, "secure": false, "accessKey": "", "secretKey": "" } } ``` sentinel 大家可以参考 [Spring Cloud Alibaba 文档](https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel#feign-支持) 来进行接入和配置。 大家可以参考 [Sentinel 官方文档](https://github.com/alibaba/Sentinel/wiki)来了解更多的特性和场景。