最早一批接触使用 spring cloud 的同学都晓得官方出品的 eureka。当年被寄予厚望,不过很可惜在 2018 年的时候 Netflix 团队放弃了 eureka 的维护,并且今年(2022 年)初 Netflix 又放弃了 Ribbon 的维护,这也就导致 openfeign 的某些功能也受到了影响(spring-cloud-loadbalancer 为其替代)。目前市面上存在比较多的注册中心就三个,zookeeper,eureka,nacos;zookeeper 用的范围最广,稳定性也是经过长时间考验,但给 springcloud 当注册中心说实话我没见过,也可可能是我孤陋寡闻;eureka 存在的应该会比nacos多,毕竟是 spring cloud 官方指定初代注册中心,虽说在 18 年停止维护,但是当年用的人很多啊,项目也都沉淀下来了。一般情况下,当一个比较流行的组件停止维护后还能活跃至少 3-5 年,5年后就要考虑替换了;像我们这边,老项目用的就是 eureka,去年的新项目换成了 nacos,至于老项目为啥不换,懂的都懂......
推荐查阅官网文档:Nacos 官方网站
里面有一个可以用来吹牛皮的图:
对于程序员来说,我们能用到的就是右上角的红框圈出来的两个:服务发现+配置管理。
GitHub 项目地址:Nacos
历史稳定版本地址:Nacos稳定版本
可以从上述获取源码自己打包,也可以直接获取打包好的工程。
下面只说单机启动,如果集群部署请参考官方文档。
1.切换到 /nacos/bin 目录下
2.linux 启动
# ubuntu 使用 bash 启动
sh startup.sh -m standalone
3.windows 启动
startup.cmd -m standalone
备注:如果不喜欢加启动参数启动,可以打开脚本,把 MODE 参数值赋予 standalone,这样 windows 下双击启动脚本即可。
启动后可以在 http://ip:8848/nacos/index.html 界面打开Nacos(默认账号:nacos/nacos)
使用 nacos 之前必须要确定 Spring Cloud Alibaba、Spring Cloud、Spring Boot 之间的关系,三者关系必须协调,否则无法使用,一定切记。详细版本关系参见:版本关系
核心相关依赖:
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
版本关系:
org.springframework.boot
spring-boot-starter-parent
2.4.2
org.springframework.cloud
spring-cloud-dependencies
2020.0.1
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
2021.1
pom
import
配置:
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
主程序需要添加 @EnableDiscoveryClient 注解(其实当前版本不添加也行,添加主要是为了方便维护)
按照上述启动两个服务 nacos-client,nacos-client-1,启动后可以在nacos看到两个服务,如下:
在nacos-client 配置一个接口:
@RestController
@RequestMapping("/test")
public class TestController {
@GetMapping(value = "/check")
public String test(@RequestParam(value = "name", defaultValue = "来自 nacos-client...", required = false) String name) {
return name;
}
}
nacos-client-1 配置另一个接口来调用上述接口:
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
RestTemplate restTemplate;
@GetMapping(value = "/check")
public String test() {
String servicePreName = "http://nacos-client";
ResponseEntity result = restTemplate.getForEntity(servicePreName + "/test/check", String.class);
log.info("result:{}", result);
return result.getBody();
}
}
nacos-client-1 直接调用 /test/check 会报 【java.net.UnknownHostException: nacos-client 】错;这跟负载均衡有关,需要在 nacos-client-1 引入一个依赖并对 RestTemplate 增加负载均衡注解,如下:
org.springframework.cloud
spring-cloud-starter-loadbalancer
@Configuration
public class RestConfig {
@Bean
@LoadBalanced
public RestTemplate normal() {
return new RestTemplate();
}
}
备注:远程调用建议使用 openfeign,有消费降级,效果会好一些。
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
原来的 application.yml、application-xx.yml 都替换成 bootstrap.yml、bootstrap-xx.yml,springcloud 的配置仍然参照上节配置。
如果直接启动就会发现报错【java.lang.IllegalArgumentException: Param 'serviceName' is illegal, serviceName is blank】,报错原因是2.4以后工程默认不会读取 bootstrap 文件,所以这里还要再引入一个依赖:
org.springframework.cloud
spring-cloud-starter-bootstrap
配置文件添加下述配置,Controller 层使用 @Value 注解获取该值
注意:使用 @Value 注解获取配置值时需要在类上加 @RefreshScope 注解,【@ConfigurationProperties 这种配置方式不需要加】
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
refresh-enabled: true # 该版本默认为 true,可不添加
# file-extension: yaml # 该配置添加 yaml 配置文件支持,添加后就只支持 yaml 后缀的配置
author:
name: 清泉影月
@RestController
@RefreshScope
@RequestMapping("/test")
public class TestController {
@Value("${author.name}")
private String authorName;
@GetMapping(value = "/getValue")
public String getValue() {
return authorName;
}
}
配置文件默认Data Id如下:
dataID={prefix}-{spring.profiles.active}.{spring.cloud.nacos.config.file-extension}
prefix
默认为 spring.application.name
的值,也可以通过配置项 spring.cloud.nacos.config.prefix
来配置。prefix
默认为 spring.application.name
的值,也可以通过配置项 spring.cloud.nacos.config.prefix
来配置。spring.profiles.active
即为当前环境对应的 profile,当 spring.profiles.active
为空时,对应的连接符 -
也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
file-exetension
为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension
来配置。目前只支持 properties
和 yaml
类型。Nacos 界面添加配置:
默认情况下该配置只支持 properties 格式,点击发布后可从接口获取新值:
1. springboot 2.4.x 的版本跟之前相比变动较大,相对应的 springcloud,和springcloud alibaba 做的改变也较大,推荐可以使用低版本或者等版本稳定后使用更高版本。
2. 有问题参考官方文档:Nacos 中文手册
3. GitHub 地址:Nacos github 地址