SpringBoot使⽤Nacos作为配置中⼼例⼦和总结
SpringBoot使⽤Nacos作为配置中⼼例⼦和总结
前⾔
学习笔记汇总地址:
我发现我写的博客屁话有点多,不爱看的可以跳过前⾔。
搭建好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种技术都写了例⼦,例⼦⼊⼝:
3个例⼦,都使⽤了Spring Boot+Nacos+Dubbo,应该说都跟阿⾥的微服务沾边了,但是我个⼈认为还是例⼦3算是纯粹的Spring Cloud Alibaba,所以我们这次主要学习的就是这个技术。
那么为什么我觉得这个才是最纯粹的呢?看图说话,因为Spring Cloud alibaba在git上就有⼀个基于Sp
ring 规范的技术实现spring cloud alibaba starters,⾥边就是阿⾥技术栈的全部东西了,我接下来的学习就是准备把这下边的技术全部⾃学⼀遍,然后写成帖⼦,当然,主要是看时间和热情度什么时候没有。我最近的热情在于学习Unity3D做游戏,呵呵,感觉当年毕业不应该学Java的。
快速开始
这就是为什么我写这个例⼦⽤IDEA的原因。
第⼀步,创建项⽬,这个时候有⼀个⾮常⽅便的⽅式,IDEA⾥带了⼀个Spring Initializr,这个是快速开发Spring Cloud的⼀个很好⽤的⼯具,Spring 官⽹⾃带⼀个就是这个插件默认的那个地址,打开就是下边第2个图这样的,不过这⾥不能⽤Spring 原⽣的那个地址,需要⽤阿⾥云的地址,因为阿⾥云这套技术在Spring 原⽣的那个地址⾥是搜不到的,下边会上图。
第⼀个例⼦⾥,我们只⽤nacos config,所以只引⼊下图⾥的2个依赖,在左边搜索关键字就可以到
这2个依赖,Spring 官⽅的Initializr是也可以搜到nacos,但是后续的dubbo就不⾏了,所以我⼀直⽤阿⾥云的地址:,我的版本是2.3.0
配置中⼼启动完成后,会在你对应的dataId和group⾥⽣成⼀个对应的监听,但是我没到怎么使⽤这个监听,如图
代码
依赖l
使⽤初始化⼯具相关依赖已经能够⾃动⽣成了
1
<?xml version="1.0" encoding="UTF-8"?><project xmlns ="/POM/4.0.0" xsi ="/2001/XMLSchema-instance "        schemaLocation ="/P
OM/4.0.0 /xsd/maven-4.0.0.xsd ">    <modelVersion >4.0.0</modelVersion >    <groupId >com.lwb </groupId >    <artifactId >provider-server-demo </artifactId >    <version >0.0.1-SNAPSHOT </version >    <name >provider-server-demo </name >    <description >Demo project for Spring Boot </description >    <properties >        <java.version >1.8</java.version >        <project.build.sourceEncoding >UTF-8</project.build.sourceEncoding >        &porting.outputEncoding >UTF-8</porting.outputEncoding >        <spring-boot.version >2.3.0.RELEASE </spring-boot.version >        <spring-cloud-alibaba.version >2.2.1.RELEASE </spring-cloud-alibaba.version >    </properties >    <dependencies >        <dependency >            <groupId >org.springframework.boot </groupId >            <artifactId >spring-boot-starter-web </artifactId >        </dependency >        <dependency >            <groupId >com.alibaba.cloud </groupId >            <artifactId >spring-cloud-starter-alibaba-nacos-config </artifactId >        </dependency >        <dependency >            <groupId >org.springframework.boot </groupId >            <artifactId >spring-boot-starter-actuator </artifactId >        </dependency >        <dependency >            <groupId >org.springframework.boot </groupId >            <artifactId >spring-boot-starter-test </artifactId >            <scope >test </scope >            <exclusions >                <exclusion >                    <groupId >org.junit.vintage </groupId >                    <artifactId >junit-vintage-engine </artifactId >                </exclusion >            </exclusions >        </dependency >    </d
ependencies >    <dependencyManagement >        <dependencies >            <dependency >                <groupId >com.alibaba.cloud </groupId >                <artifactId >spring-cloud-alibaba-dependencies </artifactId >                <version >${spring-cloud-alibaba.version}</version >                <type >pom </type >                <scope >import </scope >            </dependency >            <dependency >                <groupId >org.springframework.boot </groupId >                <artifactId >spring-boot-dependencies </artifactId >                <version >${spring-boot.version}</version >                <type >pom </type >                <scope >import </scope >            </dependency >        </dependencies >    </dependencyManagement >    <build >        <plugins >            <plugin >
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
properties文件用什么打开
22
23
24
4八进制转二进制25
26
27
28
input disabled29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
启动函数            <plugin >                <groupId >org.apache.maven.plugins </groupId >                <artifactId >maven-compiler-plugin </artifactId >                <version >3.8.1</version >                <configuration >                    <source >1.8</source >                    <target >1.8</target >                    <encoding >UTF-8</encoding >                </configuration >            </plugin >            <plugin >                <groupId >org.springframework.boot </groupId >                <artifactId >spring-boot-maven-plugin </artifactId >                <version >2.3.0.RELEASE </version >                <configuration >                    <mainClass >com.lwb.provider.server.demo.ProviderServerDemoApplication </mainClass >                </configuration >                <executions >                    <execution >                        <id >repackage </id >                        <goals >                            <goal >repackage </goal >                        </goals >   
                </execution >                </executions >            </plugin >        </plugins >    </build ></project >
66
67
68
69
70
71
72
73
74
75
76
77
78
79
c语言中英文字母大小写转换函数80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
bootstrap.properties 配置
我的项⽬也有application.properties,只是⾥边什么也没写,这⾥还遇到了⼀个⼩坑
执⾏效果
可以看到,我替换的是spring boot web启动的tomcat接⼝,对应属性是server.port,已经修改成功,使⽤的是Nacos配置中⼼下的lwb_public命名空间(不是默认的public),dataId是nacos-config-demo.properties
规则说明
命名空间:
注意我的命名空间的ID和名字不⼀样,名字可以改ID是不能改的,⽽spring.fig.namespace=lwb_namespace_test_1
属性⽤的是ID,⽽不是名字
dataId: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 );    }}
1
2
python命名规则
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27spring .application .name =nacos -config -demo spring .cloud .nacos .config .server -addr =10.10.171.249:8848spring .cloud .nacos .config .namespace =lwb_public
1
2
3
42020-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.02020-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 2020-08-31 14:20:17.614  WARN 130008 --- [          main ] o .s .boot .actuate .endpoint .EndpointId    : Endpoint ID 'nacos-config' contains invalid characters 80032020-08-31 14:20:17.758  INFO 130008 --- [          main ] o .s .s .concurrent .ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor 1
2
3
4
5
6
7
8
我这⾥⽤了⼀个最简单的配置,dataId取名nacos-config-demo.properties,可以理解成这个就是你原来的配置⽂件名字,这样就好理解多了.
nacos的dataId和Spring Config的规则好像是⼀样的,具体如下:
递归算法不一定包括什么部分{spring.profiles.active}.${file-extension}
prefix默认为 spring.application.name的值,也可以通过配置项spring.fig.prefix来配置。
spring.profiles.active 即为当前环境对应的profile,但是,不建议使⽤,原因在后⾯会说明。
注意,当activeprofile为空时,对应的连接符-也将不存在,dataId 的拼接格式变成 {file-extension}
file-extension为配置内容的数据格式,可以通过配置项 spring.fig.file-extension来配置。
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,都可以⽣效prefix −prefix .

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。