SpringBoot使用Nacos作为配置中心 例子和总结

SpringBoot使用Nacos作为配置中心 例子和总结

  • 前言
  • 环境
  • 快速开始
  • 代码
    • 依赖pom.xml
    • 启动函数
    • bootstrap.properties配置
    • 执行效果
  • 规则说明
    • 命名空间:
    • dataId:
    • bootstrap.properties
  • 遇坑总结
    • @EnableNacosConfig
    • application.properties
    • 删除坑
    • dataId

前言

学习笔记汇总地址:
https://blog.csdn.net/lwb314/article/details/108277732
我发现我写的博客屁话有点多,不爱看的可以跳过前言。
搭建好Nacos服务器之后,开始学习Nacos的第一个主要功能:配置中心
配置中心的作用就是替代项目的配置文件。这个时候就产生了几个问题:
1.为什么要替换配置文件,我觉得所有技术都是为了解决实际工作中产生的痛点才产生的,那么配置中心解决的痛点是什么呢,我觉得主要就是微服务部署的点多了之后修改配置不方便的问题,这是最根本的问题,如果一个服务的点很多,这个时候需要改其中一个配置项目,那么传统配置文件,只能去服务器上一个一个修改,我现在的所有程序是2个点主备,还没什么感觉,但是我能接受的极限就是2个点,如果出来3个点,我就会觉得一个一个修改特别麻烦,这个时候配置中心就特别有用了,我只需要在配置中心修改就能达到我的目的。
2.有人可能会说我用Docker+K8S这种CI/CD技术也可以解决只修改一次全部生效的效果。我暂时对这2个技术还不熟悉,但是又一点我觉得这2个好像做不了,据我的了解这2个东西是帮助你发版的,但是配置中心可以实时生效,也可以理解成热部署,比如你需要修改一个功能的开关,直接修改配置中心就可以马上生效,而不需要发版才能生效。
3.我本身觉得配置是分几个级别的,有一些配置说实话,我觉得动了会出问题,下边我会做好几个实验,按照我认为的配置级别挨个实验。

环境

开发工具:IDEA,虽然我个人主要还是爱用eclipse,但是IDEA集成的一些插件确实是挺方便的。
JDK:1.8
Nacos:1.3.2
Spring版本:这个重点说一下,我最一开始汇总那个帖子已经说了,我们这里使用的是Spring Cloud Alibaba,但是有人可能会在找依赖的时候出现错误,因为这东西版本好多,我之前对3种技术都写了例子,例子入口:Spring Boot/Cloud+Nacos+Dubbo 整合例子
3个例子,都使用了Spring Boot+Nacos+Dubbo,应该说都跟阿里的微服务沾边了,但是我个人认为还是例子3算是纯粹的Spring Cloud Alibaba,所以我们这次主要学习的就是这个技术。
那么为什么我觉得这个才是最纯粹的呢?看图说话,因为Spring Cloud alibaba在git上就有一个基于Spring 规范的技术实现spring cloud alibaba starters,里边就是阿里技术栈的全部东西了,我接下来的学习就是准备把这下边的技术全部自学一遍,然后写成帖子,当然,主要是看时间和热情度什么时候没有。我最近的热情在于学习Unity3D做游戏,呵呵,感觉当年毕业不应该学Java的。
SpringBoot使用Nacos作为配置中心 例子和总结_第1张图片

快速开始

这就是为什么我写这个例子用IDEA的原因。
第一步,创建项目,这个时候有一个非常方便的方式,IDEA里带了一个Spring Initializr,这个是快速开发Spring Cloud的一个很好用的工具,Spring 官网自带一个就是这个插件默认的那个地址,打开就是下边第2个图这样的,不过这里不能用Spring 原生的那个地址,需要用阿里云的地址,因为阿里云这套技术在Spring 原生的那个地址里是搜不到的,下边会上图。
在这里插入图片描述
SpringBoot使用Nacos作为配置中心 例子和总结_第2张图片

第一个例子里,我们只用nacos config,所以只引入下图里的2个依赖,在左边搜索关键字就可以找到这2个依赖,Spring 官方的Initializr是也可以搜到nacos,但是后续的dubbo就不行了,所以我一直用阿里云的地址:http://start.aliyun.com,我的版本是2.3.0
SpringBoot使用Nacos作为配置中心 例子和总结_第3张图片
配置中心启动完成后,会在你对应的dataId和group里生成一个对应的监听,但是我没找到怎么使用这个监听,如图
SpringBoot使用Nacos作为配置中心 例子和总结_第4张图片

代码

依赖pom.xml

使用初始化工具相关依赖已经能够自动生成了


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>
    <groupId>com.lwbgroupId>
    <artifactId>provider-server-demoartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <name>provider-server-demoname>
    <description>Demo project for Spring Bootdescription>

    <properties>
        <java.version>1.8java.version>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
        <spring-boot.version>2.3.0.RELEASEspring-boot.version>
        <spring-cloud-alibaba.version>2.2.1.RELEASEspring-cloud-alibaba.version>
    properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-actuatorartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintagegroupId>
                    <artifactId>junit-vintage-engineartifactId>
                exclusion>
            exclusions>
        dependency>
    dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-alibaba-dependenciesartifactId>
                <version>${spring-cloud-alibaba.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-dependenciesartifactId>
                <version>${spring-boot.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-compiler-pluginartifactId>
                <version>3.8.1version>
                <configuration>
                    <source>1.8source>
                    <target>1.8target>
                    <encoding>UTF-8encoding>
                configuration>
            plugin>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
                <version>2.3.0.RELEASEversion>
                <configuration>
                    <mainClass>com.lwb.provider.server.demo.ProviderServerDemoApplicationmainClass>
                configuration>
                <executions>
                    <execution>
                        <id>repackageid>
                        <goals>
                            <goal>repackagegoal>
                        goals>
                    execution>
                executions>
            plugin>
        plugins>
    build>

project>

启动函数

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import javax.annotation.PostConstruct;

/**
 * @author xiaojing, Jianwei Mao
 */

@SpringBootApplication
public class ProviderServerDemoApplication {

    @Value("${server.port:1}")
    int port;

    @PostConstruct
    public void init() {
        System.out.println(port);
    }

    public static void main(String[] args) {
        SpringApplication.run(ProviderServerDemoApplication.class, args);
    }


}

bootstrap.properties配置

我的项目也有application.properties,只是里边什么也没写,这里还遇到了一个小坑

spring.application.name=nacos-config-demo
spring.cloud.nacos.config.server-addr=10.10.171.249:8848
spring.cloud.nacos.config.namespace=lwb_public

执行效果

可以看到,我替换的是spring boot web启动的tomcat接口,对应属性是server.port,已经修改成功,使用的是Nacos配置中心下的lwb_public命名空间(不是默认的public),dataId是nacos-config-demo.properties

2020-08-31 14:20:17.407  INFO 130008 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8003 (http)
2020-08-31 14:20:17.414  INFO 130008 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2020-08-31 14:20:17.415  INFO 130008 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.35]
2020-08-31 14:20:17.533  INFO 130008 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2020-08-31 14:20:17.533  INFO 130008 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1125 ms
2020-08-31 14:20:17.614  WARN 130008 --- [           main] o.s.boot.actuate.endpoint.EndpointId     : Endpoint ID 'nacos-config' contains invalid characters, please migrate to a valid format.
8003
2020-08-31 14:20:17.758  INFO 130008 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'

规则说明

命名空间:

注意我的命名空间的ID和名字不一样,名字可以改ID是不能改的,而spring.cloud.nacos.config.namespace=lwb_namespace_test_1属性用的是ID,而不是名字
SpringBoot使用Nacos作为配置中心 例子和总结_第5张图片

dataId:

我这里用了一个最简单的配置,dataId取名nacos-config-demo.properties,可以理解成这个就是你原来的配置文件名字,这样就好理解多了.
nacos的dataId和Spring Config的规则好像是一样的,具体如下:
p r e f i x − {prefix}- prefix{spring.profiles.active}.${file-extension}
prefix默认为 spring.application.name的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置。
spring.profiles.active 即为当前环境对应的profile,但是,不建议使用,原因在后面会说明。
注意,当activeprofile为空时,对应的连接符-也将不存在,dataId 的拼接格式变成 p r e f i x . {prefix}. prefix.{file-extension}
file-extension为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension来配置。
SpringBoot使用Nacos作为配置中心 例子和总结_第6张图片

bootstrap.properties

这里我要说的是,因为我的应用要使用nacos作为配置,所以nacos的地址肯定在应用初始化之前就得拿到,所以必须写在bootstrap配置文件里,而不能写在applicaton里
Spring Cloud 构建于 Spring Boot 之上,在 Spring Boot 中有两种上下文,一种是 bootstrap,另外一种是 application,
application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。
bootstrap 是应用程序的父上下文,也就是说 bootstrap 加载优先于 applicaton。

遇坑总结

@EnableNacosConfig

根据nacos官网和一些帖子里写了必须使用@EnableNacosConfig 这个标签,但是实际代码里看是不需要的.

application.properties

这里我之前习惯性的写了个spring.application.name=lwb_test,如果写了这个属性,那么bootstrap里的spring.application.name就不生效了,我还取了不同的名字,导致启动失败,一直提示找不到lwb_test.properties配置文件,后来删除了application.properties里的应用名才好了。

删除坑

lwb_public,我上边的例子里使用了lwb_public,但是我发现我的命名空间名字和ID一样了,我想测试一下实际用的是名字和ID的时候我就把这个命名空间删除了,结果,程序还是能跑起来,而且这个命名空间里的配置生效了,我也找不到历史版本,这就感觉很坑。我觉得要么不生效,要么生效但是能让我看见,总之感觉这点很坑。

dataId

不知道命名规则之前,我的dataId随便取了一个lwb_test,结果死活就是找不到,后来才查到上边的规则。下图是我改成yml之后的配置,也是可以的不管是选text,yaml,Properties,都可以生效
SpringBoot使用Nacos作为配置中心 例子和总结_第7张图片

你可能感兴趣的:(微服务,spring,boot,nacos,config)