Nacos介绍

spring boot nacos namespace 问题 springboot nacos配置_docker

spring boot nacos namespace 问题 springboot nacos配置_运维_02

nacos下载路径(底部):https://github.com/alibaba/nacos/releases =》nacos-server-2.0.1.tar.gz

安装路径:/usr/local/nacos
下载后解压:tar -zxvf nacos-server-2.0.1.tar.gz

到/usr/local/nacos/nacos/conf 目录下修改配置文件application.properties

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://ip:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456

查看启动日志
tail -500f /usr/local/nacos/logs/start.out

启动(单机启动)
sh startup.sh -m standalone

停止
sh shutdown.sh

Nacos 有四大主要功能:

  • 服务发现和服务健康监测
    Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。
    Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。
  • 动态配置服务
    动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
    动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
    配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
    Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。
  • 动态 DNS 服务
    动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。
    Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.
  • 服务及其元数据管理
    Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。



配置说明:普通springboot项目建议第一种和第二种都可以使用,分模块项目建议使用第一种


方法一 -

Nacos端添加配置文件

访问地址添加配置:http://localhost:8848/nacos

spring boot nacos namespace 问题 springboot nacos配置_centos_03

  • system-config.yaml

spring boot nacos namespace 问题 springboot nacos配置_运维_04

data:
  imagePrefix: http://localhost:8686/file/all/avatar/
  oneSize: 200
  totalSize: 50
  • cloud-platform-dev.yaml
spring:
  data:
    mongodb:  #MongoDB相关配置
      uri: ******
  • cloud-platform-pro.yaml
spring:
  data:
    mongodb:  #MongoDB相关配置
      repositories:
        type: auto
      uri: mongodb://luntek:20100514@127.0.0.1:27017/admin  #mongodb://用户名:密码@IP:端口/数据库名称

springboot整合Nacos代码

  • pom依赖
    spring-cloud-starter-config的依赖一定要加否则会导致无法读取配置参数。另外springboot的parent依赖与cloud-config依赖还有冲突,如果spring-boot-starter-parent 的版本在2.3以上,则config需要使用3.0以上的版本,因为2.3之后config没有与之对应的版本。另外如果springboot版本较高还需要添加bootstrap的依赖具体可以查看文章最下方,我的版本及依赖如下
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.3.RELEASE</version>
    </parent>
<!-- 实现对 Nacos 作为配置中心的自动化配置 -->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>nacos-config-spring-boot-starter</artifactId>
            <version>0.2.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
            <version>3.0.0</version>
        </dependency>
        <!--加载bootstrap的配置文件,不加bootstrap-dev.yml文件不会生效-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>3.0.1</version>
        </dependency>

maven仓库版本

spring boot nacos namespace 问题 springboot nacos配置_centos_05

创建bootstrap-dev.yml及bootstrap-pro.yml配置文件

spring boot nacos namespace 问题 springboot nacos配置_运维_06


如果如上图所示yml文件没有变成springboot的图标,可以通过如下图步骤变成带有绿叶的图标

spring boot nacos namespace 问题 springboot nacos配置_运维_07

  • bootstrap-dev.yml
  • 需要注意的是项目application.name属性需要与nacos中配置文件名称的前缀一样,例如应用名称是corecloud,那么nacos中的配置文件名称为corecloud-dev.yaml,并且jar文件启动的时候需要携带激活文件的配置参数
spring:
  application:
    name: corecloud
nacos:
  config:
    # Nacos 服务器地址
    server-addr: IPADDR:8848
    bootstrap:
      # 是否开启 Nacos 配置预加载功能。默认为 false。
      enable: true
      # 是否开启 Nacos 支持日志级别的加载时机。默认为 false。
      log-enable: true
    # 使用的 Nacos 配置集的 dataId,多个使用逗号隔开。
    data-ids: corecloud-dev.yaml,system-config.yaml
    # 使用的 Nacos 配置集的配置格式。默认为 PROPERTIES。
    type: YAML
    # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP。
    group: DEFAULT_GROUP
    # 使用的 Nacos 的命名空间,默认为 null。
    namespace: core_cloud
  • bootstrap-pro.yml
spring:
  application:
    name: cloud-platform
nacos:
  config:
    server-addr: 127.0.0.1:8848 # Nacos 服务器地址
    bootstrap:
      enable: true # 是否开启 Nacos 配置预加载功能。默认为 false。
      log-enable: true # 是否开启 Nacos 支持日志级别的加载时机。默认为 false。
    data-ids: system-config.yaml,cloud-platform-pro.yaml # 使用的 Nacos 配置集的 dataId。
    type: YAML # 使用的 Nacos 配置集的配置格式。默认为 PROPERTIES。
    group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP。
    namespace: # 使用的 Nacos 的命名空间,默认为 null。
  • SystemConfig
package com.luntek.cloudplatform.config;

import com.alibaba.nacos.api.config.ConfigType;
import com.alibaba.nacos.api.config.annotation.NacosConfigurationProperties;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

/**
 * @author Czw
 * @Description 导出、解析Excel表格中文与字段名对应配置参数
 * @Date 2019/5/14 0014 下午 1:17
 */

@Component
@Data
@NacosConfigurationProperties(prefix = "data", autoRefreshed = true,
        type = ConfigType.YAML, dataId = "system-config.yaml")
public class SystemConfig {
    private String imagePrefix;
    //学生上传代码单次限制大小MB
    private Integer oneSize;
    //学生总共代码限制大小,单位MB
    private Integer totalSize;
}
  • 项目启动参数

开发环境- 启动时将active profiles设置成dev候正常启动

正式环境

java -jar project.jar --spring.profiles.active=pro

spring boot nacos namespace 问题 springboot nacos配置_bootstrap_08


spring boot nacos namespace 问题 springboot nacos配置_docker_09


方式二 - **与方式一不同的是通过在启动类上加@NacosPropertySource注解和@EnableNacosConfig注解的方式代替bootstrap.yml的配置,这种方式可以用来解决多模块项目下无法读取bootstrap中nacos相关配置的文件(应该是lz没配置好导致的)**

启动类上添加@NacosPropertySource注解和@EnableNacosConfig注解

//nacos相关配置,这里写的是需要读取的文件
@NacosPropertySources(value = {@NacosPropertySource(dataId = "system-config.yaml"),
        @NacosPropertySource(dataId = "resource-dev.yaml"),
        @NacosPropertySource(dataId = "resource-pro.yaml"),
        @NacosPropertySource(dataId = "resource-test.yaml")})
@EnableNacosConfig(globalProperties = @NacosProperties(serverAddr = "IP地址:8848", namespace = "ic_resource_cloud"))
public class ResourceCloudAppApplication {
    public static void main(String[] args) {
        SpringApplication.run(ResourceCloudAppApplication.class, args);
    }

}

maven依赖

<!-- 实现对 Nacos 作为配置中心的自动化配置 -->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>nacos-config-spring-boot-starter</artifactId>
            <version>0.2.4</version>
        </dependency>

bootstrap-dev.yml配置

spring:
  application:
    name: resource
  profiles:
    active: dev

edit configuration配置,lz配置的多环境故需要写dev

spring boot nacos namespace 问题 springboot nacos配置_运维_10


ResourceCloudAppApplication

package com.luntek.app.config;

import com.alibaba.nacos.api.config.ConfigType;
import com.alibaba.nacos.api.config.annotation.NacosConfigurationProperties;
import lombok.Data;
import org.springframework.stereotype.Component;

/**
 * @author Czw
 * @Description ic资源云相关配置
 * @Date 2019/5/14 0014 下午 1:17
 */

@Component
@Data
@NacosConfigurationProperties(prefix = "data", autoRefreshed = true,
        type = ConfigType.YAML, dataId = "system-config.yaml")
public class SystemConfig {
    private String test;
}

控制器中添加测试接口

@Autowired
    private SystemConfig systemConfig;


    @SysLog(value = "测试nacos动态读取systemconfig中参数")
    @GetMapping("/testNacosconfig")
    public ResponseResult<?> testNacosconfig() {
        log.info("***testNacosconfig***");
        return ResponseResult.success(systemConfig.getTest());
    }
  • 第一次请求数据

spring boot nacos namespace 问题 springboot nacos配置_spring_11

  • 第二次请求数据 修改nacos配置文件中test值(不重启项目)

    能够达到动态加载数据的效果

项目结构图(多模块项目)

spring boot nacos namespace 问题 springboot nacos配置_docker_12


nacos中的配置

spring boot nacos namespace 问题 springboot nacos配置_centos_13


spring boot nacos namespace 问题 springboot nacos配置_运维_14


项目启动日志分析

spring boot nacos namespace 问题 springboot nacos配置_docker_15

**********************20210818更新*****************

项目启动时无法查看到上面图片的日志(代表加载了对应的dataId的配置文件),查看日志可以发现

设置为true的bootstrap.enable属性为空

spring boot nacos namespace 问题 springboot nacos配置_centos_16

于是找到日志所在的配置文件项查看情况,查看到配置文件信息为空

spring boot nacos namespace 问题 springboot nacos配置_运维_17


配置文件无法被加载的原因是因为springboot使用了较高版本2.3.3及以上版本,高版本对springboot加载配置文件方式做了优化,所以无法加载bootstrap文件,如果想加载的话可以添加以下依赖,另外配置文件中不用添加profiles.avtive属性

<!--加载bootstrap的配置文件-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>3.0.1</version>
        </dependency>

spring boot nacos namespace 问题 springboot nacos配置_bootstrap_18