什么是 Nacos?
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
下载安装Nacos
- Nacos下载地址 github下载地址特别慢,可以使用gitee下载或者docker安装
- 下载nacos-server-$version.zip
- 下载后解压文件进入到Nacos的bin目录下
unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
cd nacos/bin
启动服务器
- Linux/Unix/Mac
- 启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
- 如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:
bash startup.sh -m standalone
- Windows启动命令:
cmd startup.cmd
- 或者双击startup.cmd运行文件。
访问
- 账号: nacos
- 密码: nacos
http://ip地址:8848/nacos
关闭服务
- Linux/Unix/Mac
sh shutdown.sh
- Windows
cmd shutdown.cmd
- 或者双击shutdown.cmd运行文件。
集成SpringCloud,替换Eureka,Config
注意:版本 0.2.x.RELEASE 对应的是 Spring Boot 2.x 版本,版本 0.1.x.RELEASE 对应的是 Spring Boot 1.x 版本。starter使用有错,暂时不用
<!-- Nacos 组件依赖 -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
<version>0.2.3</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.3</version>
</dependency>
nacos.discovery.server-addr=10.114.10.37:8848
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
nacos:
config:
server-addr: 127.0.0.1:8848
discovery:
server-addr: 127.0.0.1:8848
- 添加依赖,使用Nacos的注册中心服务
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
之前eureka客户端的pom坐标:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 添加依赖,使用Nacos的配置中心
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
- 创建模块的配置文件bootstrap.properties文件
# 端口号
server.port=6001
# 服务名
spring.application.name=article
# nacos地址
spring.cloud.nacos.server-addr=localhost:8848
# nacos上创建的article.yml配置文件,名字于服务名相同
spring.cloud.nacos.config.extension-configs[0].data-id=article.yml
# 属于哪个组
spring.cloud.nacos.config.extension-configs[0].group=dev
# 修改配置文件且发布后不用重启服务
spring.cloud.nacos.config.extension-configs[0].refresh=true
我在application.properties中使用以下内容替换eureka信息:
server.port=9108
spring.cloud.nacos.server-addr=10.114.10.37:8848
spring.cloud.nacos.discovery.ip=10.114.10.37
eureka的信息:
#eureka.client.register-with-eureka=true
#eureka.client.fetch-registry=true
#eureka.client.serviceUrl.defaultZone=http://10.114.10.37:9100/eureka/
#eureka.instance.hostname=10.114.10.37
#eureka.instance.instance-id=10.114.10.37:${server.port}
#eureka.instance.status-page-url=http://10.114.10.37:${server.port}/swagger-ui.html#/
主启动类上使用注解:@EnableDiscoveryClient
因为新版本做了相应的改造,所以这个注解可以不加
bootstrap.yml中配置
#同时存在bootstrap.yml和application.properties,会先加载bootstrap.yml
#所以配置中心的地址要写在bootstrap.yml中
server:
port: 9096
#eureka:
# client:
# serviceUrl:
# defaultZone: http://10.114.10.37:9100/eureka/
# instance:
# hostname: 10.114.10.37
spring:
application:
name: applicationname
cloud:
config:
profile: dev
discovery :
enabled : true
serviceId : config-server
nacos:
server-addr: 10.114.10.37:8848
discovery:
ip: 10.114.10.37
- 通过账号密码登录到Nacos控制台
- 创建配置文件,名字要于服务的name名相同
- 配置文件article.yml
- 成功创建配置文件并发布后,启动服务,在控制台就可以看到了
- 配置文件就在Nacos管理了,每次修改文件后也不需要重启服务。
-
这里扩展一下,Spring Cloud 提供了一个服务接口
DiscoveryClient
,里面有两个方法比较实用,一个是查询指定服务的所有实例信息的getInstances接口,另一个是查询该注册中心有多少个服务getServices()接口,直接写到自己的测试代码里就可以查看该注册中心上面的信息了。代码如下:@Autowired private DiscoveryClient discoveryClient; @GetMapping("getInstances") public List<ServiceInstance> getInstances(){ //查询指定服务的所有实例信息 //无论使用什么做注册中心都可以使用consul、eureka、zookeeper return discoveryClient.getInstances("user-center"); } @GetMapping("getServices") public List<String> getServices(){ //查询该注册中心有多少个服务 return discoveryClient.getServices(); }