springboot项目集成Nacos配置中心实现配置化和动态刷新,
优势:配置文件外部化,支持多环境配置管理,修改配置只需重启服务,无需发版。
劣势:系统庞大时,配置文件很多,多人开发,配置格式不统一,维护麻烦;敏感配置不需要暴露给开发人员,降低风险,但开发经常要和运维沟通怎么修改配置,沟通不恰当容易引发生产事故;而且,如果应用部署在多台机器,对运维来说,修改配置也是非常头疼的事情(当然也可以引入NFS系统来解决一部分问题)。

新建springboot项目

pom文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.3.4.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.clown</groupId>
  12. <artifactId>clown</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>clown</name>
  15. <description>Demo project for Spring Boot</description>
  16. <dependencies>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-jdbc</artifactId>
  20. <exclusions>
  21. <exclusion>
  22. <groupId>com.zaxxer</groupId>
  23. <artifactId>HikariCP</artifactId>
  24. </exclusion>
  25. </exclusions>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-starter-oauth2-client</artifactId>
  30. </dependency>
  31. <!--SECURITY-->
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-security</artifactId>
  35. </dependency>
  36. <!-- https://mvnrepository.com/artifact/org.springframework.security.oauth/spring-security-oauth2 -->
  37. <dependency>
  38. <groupId>org.springframework.security.oauth</groupId>
  39. <artifactId>spring-security-oauth2</artifactId>
  40. <version>2.5.0.RELEASE</version>
  41. </dependency>
  42. <dependency>
  43. <groupId>org.springframework.boot</groupId>
  44. <artifactId>spring-boot-starter-web</artifactId>
  45. </dependency>
  46. <dependency>
  47. <groupId>org.springframework.boot</groupId>
  48. <artifactId>spring-boot-devtools</artifactId>
  49. <scope>runtime</scope>
  50. <optional>true</optional>
  51. </dependency>
  52. <dependency>
  53. <groupId>mysql</groupId>
  54. <artifactId>mysql-connector-java</artifactId>
  55. <scope>runtime</scope>
  56. </dependency>
  57. <dependency>
  58. <groupId>org.projectlombok</groupId>
  59. <artifactId>lombok</artifactId>
  60. <optional>true</optional>
  61. </dependency>
  62. <dependency>
  63. <groupId>org.springframework.boot</groupId>
  64. <artifactId>spring-boot-starter-test</artifactId>
  65. </dependency>
  66. <dependency>
  67. <groupId>org.springframework.security</groupId>
  68. <artifactId>spring-security-test</artifactId>
  69. </dependency>
  70. <dependency>
  71. <groupId>com.baomidou</groupId>
  72. <artifactId>mybatis-plus-boot-starter</artifactId>
  73. <version>3.4.0</version>
  74. </dependency>
  75. <!--json工具-->
  76. <dependency>
  77. <groupId>com.alibaba</groupId>
  78. <artifactId>fastjson</artifactId>
  79. <version>1.2.47</version>
  80. </dependency>
  81. <dependency>
  82. <groupId>cn.hutool</groupId>
  83. <artifactId>hutool-all</artifactId>
  84. <version>5.7.9</version>
  85. </dependency>
  86. <!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
  87. <dependency>
  88. <groupId>com.alibaba</groupId>
  89. <artifactId>druid-spring-boot-starter</artifactId>
  90. <version>1.1.10</version>
  91. </dependency>
  92. <dependency>
  93. <groupId>org.apache.poi</groupId>
  94. <artifactId>poi-ooxml</artifactId>
  95. <version>4.1.2</version>
  96. </dependency>
  97. <!-- nacos -->
  98. <dependency>
  99. <groupId>com.alibaba.boot</groupId>
  100. <artifactId>nacos-config-spring-boot-starter</artifactId>
  101. <version>${latest.version}</version>
  102. </dependency>
  103. <dependency>
  104. <groupId>com.alibaba.boot</groupId>
  105. <artifactId>nacos-discovery-spring-boot-starter</artifactId>
  106. <version>${latest.version}</version>
  107. </dependency>
  108. </dependencies>
  109. <properties>
  110. <java.version>1.8</java.version>
  111. <latest.version>0.2.10</latest.version>
  112. </properties>
  113. <build>
  114. <finalName>clown</finalName>
  115. <resources>
  116. <resource>
  117. <directory>src/main/resources</directory>
  118. <includes>
  119. <include>**/*.*</include>
  120. </includes>
  121. <filtering>false</filtering>
  122. </resource>
  123. <resource>
  124. <directory>src/main/java</directory>
  125. <includes>
  126. <include>**/*.*</include>
  127. </includes>
  128. <excludes>
  129. <exclude>**/*.java</exclude>
  130. </excludes>
  131. <filtering>false</filtering>
  132. </resource>
  133. </resources>
  134. <plugins>
  135. <plugin>
  136. <groupId>org.springframework.boot</groupId>
  137. <artifactId>spring-boot-maven-plugin</artifactId>
  138. </plugin>
  139. </plugins>
  140. </build>
  141. </project>

配置文件

  1. server:
  2. port: 8080
  3. spring:
  4. application:
  5. name: clown
  6. datasource:
  7. type: com.alibaba.druid.pool.DruidDataSource
  8. driver-class-name: com.mysql.cj.jdbc.Driver
  9. url: ${clown.datasource.url}
  10. username: ${clown.datasource.username}
  11. password: ${clown.datasource.password}
  12. nacos:
  13. config:
  14. # 主配置服务器地址
  15. server-addr: 127.0.0.1:8848
  16. discovery:
  17. server-addr: 127.0.0.1:8848
  18. # 主配置 data-id
  19. # data-id: clown-dev.yaml
  20. # 主配置 group-id
  21. # group: DEFAULT_GROUP
  22. # 主配置 namespace
  23. # namespace: clown
  24. # 主配置 配置文件类型
  25. # type: yaml
  26. # 主配置 最大重试次数
  27. # max-retry: 10
  28. # 主配置 开启自动刷新
  29. # auto-refresh: true
  30. # 主配置 重试时间
  31. # config-retry-time: 3000
  32. # 主配置 配置监听长轮询超时时间
  33. # config-long-poll-timeout: 46000
  34. # 主配置 开启注册监听器预加载配置服务(除非特殊业务需求,否则不推荐打开该参数)
  35. # enable-remote-sync-config: true
  36. logging:
  37. level:
  38. default: debug

启动器

  1. package com.clown;
  2. import com.alibaba.nacos.api.config.ConfigType;
  3. import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
  4. import org.springframework.boot.SpringApplication;
  5. import org.springframework.boot.autoconfigure.SpringBootApplication;
  6. import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
  7. /**
  8. * @author xq
  9. */
  10. @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,})
  11. @NacosPropertySource(dataId = "clown", type = ConfigType.YAML, autoRefreshed = true)
  12. public class ClownApplication {
  13. public static void main(String[] args) {
  14. SpringApplication.run(ClownApplication.class, args);
  15. }
  16. }

注册Nacos

  1. package com.clown.common.config;
  2. import com.alibaba.nacos.api.annotation.NacosInjected;
  3. import com.alibaba.nacos.api.exception.NacosException;
  4. import com.alibaba.nacos.api.naming.NamingService;
  5. import org.springframework.beans.factory.annotation.Value;
  6. import org.springframework.context.annotation.Configuration;
  7. import javax.annotation.PostConstruct;
  8. /**
  9. * 公共配置
  10. *
  11. * @author xq
  12. * @date 2022年05月09日 11:42
  13. */
  14. @Configuration
  15. public class NacosConfig {
  16. @Value("${server.port}")
  17. private int serverPort;
  18. @Value("${spring.application.name}")
  19. private String applicationName;
  20. @NacosInjected
  21. private NamingService namingService;
  22. @PostConstruct
  23. public void registerInstance() throws NacosException {
  24. namingService.registerInstance(applicationName, "127.0.0.1", serverPort);
  25. }
  26. }

启动项目

日志信息:
image.png
说明连接到了配置中心,配置加载成功

验证

测试接口

  1. package com.clown.system.controller;
  2. import javax.servlet.http.HttpServletResponse;
  3. import com.alibaba.nacos.api.config.annotation.NacosValue;
  4. import com.clown.common.config.TestNameConfig;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.PostMapping;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. import java.io.File;
  10. import java.util.ArrayList;
  11. import java.util.List;
  12. /**
  13. * @author clown
  14. */
  15. @RestController
  16. @RequestMapping("/test")
  17. public class TestController {
  18. @NacosValue(value = "${clown.test.name}", autoRefreshed = true)
  19. private String name;
  20. @GetMapping("/getName")
  21. public String getName() {
  22. return name;
  23. }
  24. }

访问接口

image.png
没有问题,配置成功加载

通过Nacos控制台修改配置(项目不用重启,保持运行就可以):

image.png

修改完成后,点击发布》确认发布

再次访问接口

image.png
内容改变,Nacos配置中心的基本使用完成!