# SpringBoot使用Nacos作为配置中心和服务注册中心
# 前提
- 考虑公司后期业务发展,之前的服务部署模式混乱,没有有效的服务管理模式和控管中心,需要完善主流的基础架构,进行中台化(微服务)的实施。考虑一些基础组件如服务注册发现、配置管理等都切换为阿里的技术栈。目前比较热的服务发现组件是Nacos,需要调研SpringBoot服务接入Nacos的可行性,为以新服务使用Dubbo + Nacos的技术栈进行服务开发打下基础。
- 官网地址 (opens new window)

# Nacos简介
# Nacos SpringBoot快速开始
# 实际使用简要概述
- 实际应用过程中出现的问题还是比较多的,但最终的效果与预期期望的基本一致。
- 官方的文档说明比较简单,其实简单的使用确实很简单,但是如果需要灵活使用做到对我们自身现有服务最为友好的应用和配置还是需要花费一些精力的。
- 为以后微服务方向改造,服务多元化,服务模块化,服务专一化,服务网格化做准备。
# 配置应用详细步骤
- 这里以最近我这边开发的两个简易服务组件进行服务改造
# nacos服务部署参考官方文档即可
- 效果图(默认用户名:nacos/密码:nacos)

# 现有Springboot服务改造
- 1.引入依赖
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.7</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
<version>0.2.7</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
- 2.添加配置
- 添加@NacosPropertySource(dataId = "ETLMonitor-pro", autoRefreshed = true)注解
- 添加注册服务方法registerInstance
- 添加服务发现方法getInstance(非必要)
package com.cmcc.sftp;
import com.alibaba.nacos.api.annotation.NacosInjected;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScans;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.PostConstruct;
import java.util.List;
import static org.springframework.web.bind.annotation.RequestMethod.GET;
@SpringBootApplication
@ComponentScans({
@ComponentScan("com.cmcc.sftp.config"),
@ComponentScan("com.cmcc.sftp.utils")
})
@MapperScan("com.cmcc.sftp.mapper")
@NacosPropertySource(dataId = "ETLMonitor-pro", autoRefreshed = true)
@RestController
@Slf4j
public class SftpApplication {
@NacosInjected
private NamingService namingService;
@Value("${server.port}")
private int serverPort;
@Value("${spring.application.name}")
private String applicationName;
public static void main(String[] args) {
SpringApplication.run(SftpApplication.class, args);
}
@PostConstruct
public void registerInstance() throws NacosException {
namingService.registerInstance(applicationName, "127.0.0.1", serverPort);
}
@RequestMapping(value = "/getInstance", method = GET)
@ResponseBody
public List<Instance> getInstance(@RequestParam String serviceName) throws NacosException {
Instance instance = namingService.selectOneHealthyInstance("sftp-service");
RestTemplate template = new RestTemplate();
String url = String.format("http://%s:%d/api/hello", instance.getIp(), instance.getPort());
String result = template.getForObject(url, String.class);
log.info(String.format("请求URL:%s,响应结果:%s", url, result));
return namingService.getAllInstances(serviceName);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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
- 3.项目配置类和配置项改造
- 配置类注解和配置字段注解需要改为nacos提供的注解 例如:@Value替换为@NacosValue
- 下面的例子@ConfigurationProperties替换为@NacosConfigurationProperties(type = ConfigType.YAML, dataId = "ETLMonitor-pro", autoRefreshed = true, prefix = "sftp")
package com.cmcc.sftp.config;
import com.alibaba.nacos.api.config.ConfigType;
import com.alibaba.nacos.api.config.annotation.NacosConfigurationProperties;
import lombok.Data;
import org.springframework.stereotype.Component;
@Data
@Component
@NacosConfigurationProperties(type = ConfigType.YAML, dataId = "ETLMonitor-pro", autoRefreshed = true, prefix = "sftp")
public class SftpConfig {
private String host;
private String port;
private String username;
private String password;
private String modDir;
private String filePath;
private String localDir;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- 4.配置文件修改
- 采用云配置统一配置管理方案 替换本地配置为
# 开启配置预加载功能
nacos.config.bootstrap.enable=true
# 主配置 服务器地址
nacos.config.server-addr=127.0.0.1:8848
# 主配置 data-id
nacos.config.data-id=sftp
# 主配置 group-id
nacos.config.group=DEFAULT_GROUP
# 主配置 配置文件类型
nacos.config.type=yaml
# 主配置 最大重试次数
nacos.config.max-retry=10
# 主配置 开启自动刷新
nacos.config.auto-refresh=true
# 主配置 重试时间
nacos.config.config-retry-time=2333
# 主配置 配置监听长轮询超时时间
nacos.config.config-long-poll-timeout=46000
# 主配置 开启注册监听器预加载配置服务(除非特殊业务需求,否则不推荐打开该参数)
nacos.config.enable-remote-sync-config=true
# 支持日志级别的加载时机
nacos.config.bootstrap.log-enable=true
# 支持配置 data-ids 的设置方式
# nacos.config.data-ids=pro,test
# 支持 nacos 1.2.0 新增的权限控制功能
nacos.config.username=nacos
nacos.config.password=xxxxx
# 允许nacos上的配置优先于本地配置
nacos.config.remote-first=true
# 配置名字空间(参照nacos配置获取)
nacos.config.namespace=88d74fba-4272-46d1-9560-5dc64a2430b6
# 配置服务发现
nacos.discovery.server-addr=127.0.0.1:8848
# 服务端口
server.port=8888
# 服务名称
spring.application.name=sftp-service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
- 5.nacos配置
登录nacos进行创建命名空间配置

点击配置管理->配置列表 选择刚才创建好的名字空间添加配置信息

点击页面右上角添加按钮进入发布配置信息编辑页面录入项目配置信息并发布


- 6.启动服务
启动SpringBoot服务可以看到项目已经从nacos配置中心动态拉取配置。
# 归纳总结
本文针对现有服务采取了本地单节点的方式初步使用了nacos,实际企业级应用中我们可以按照分布式多节点的部署方式应用,保证各个服务的高可用。 nacos的作为配置中心的以用可以使项目后加载的配置达到动态管理,方便管理维护,节省了大量时间成本,同时也有效的防止了项目代码中明文密码泄露,保证了代码仓库的安全性。