0. 引言
前几期我们讲解了微服务的基本概念,并且详解了网关组件,还没看过前几期的可以先去学习前几期内容:
springcloud:什么是分布式微服务,如何学习微服务(一)
springcloud:微服务涉及哪些技术、有哪些核心组件(二)
springcloud:网关组件gateway详解(三)
而要想将网关组件完整使用起来,还需要一个注册中心来配合网关。那么本期我们就来学习一下注册中心组件nacos
1. nacos简介
nacos是阿里巴巴开源的动态服务发现、配置和服务管理组件。nacos的核心功能主要有:
- 服务注册:服务提供方向nacos注册服务
- 服务发现:服务消费方从nacos获取到服务提供方的调用信息
- 配置管理:作为配置中心,统一管理配置文件。使得配置文件可以动态修改而无需重启服务
1.1 nacos服务注册原理
1、每个服务提供者都会引入nacos-client的依赖,并且需要配置nacos的服务地址,当服务提供者启动的时候,nacos-client就会将服务提供者注册到nacos服务上去
2、之后服务提供者会定期(默认5s一次)向nacos发送心跳包请求(包含信息:服务名,ip,端口,权重,集群名等),告诉nacos服务“我还活着”,nacos收到这个心跳包之后就会在服务列表中找到这个服务,并将状态设置为健康,返回心跳间隔信息给到nacos-client。当超过一定时间(默认15s)没有收到服务提供者的心跳包后,就会更新其状态为不健康。如果30s没有收到服务提供者的心跳包,就会将其从服务列表中剔除。所以可以看到nacos认为服务不健康后并不会马上将其剔除。
3、服务调用者(如网关)会定期(默认10s一次)向nacos获取服务列表,并且会缓存到本地,然后调用时就是从本地的服务列表调用的
2. nacos使用
2.1 nacos-server安装
nacos依赖java环境运行,因此安装nacos-server的前提是需要先安装jdk.
通过压缩包安装
(如下安装方法,可在nacos官方文档中找到)
1、下载压缩包,nacos压缩包可以在github上下载,目前推荐下载的稳定版本是2.0.4
nacos github下载
2、解压
unzip nacos-server-2.0.4.zip
# 或者
tar -xvf nacos-server-2.0.4.tar.gz
3、启动服务,在nacos的bin路径下执行
# Linux/Unix/Mac 单机模式启动
sh startup.sh -m standalone
# 如果是ubuntu系统,或者运行脚本提示`[[`符号找不到
bash startup.sh -m standalone
# window
startup.cmd -m standalone
4、端口开通,如果是非本地安装,那么需要开通8848端口,nacos2.x版本后还需要开通9848端口
# 查询指定端口是否开放
firewall-cmd --query-port=8848/tcp
#查询所有已开放的端口
netstat -anp
# 开启端口
firewall-cmd --add-port=8848/tcp --permanent
firewall-cmd --add-port=9848/tcp --permanent
# 开启后重新加载
firewall-cmd --reload
通过docker安装(推荐)
docker run --env MODE=standalone --name nacos-local -d -p 8848:8848 -p 9848:9848 -p 9849:9849 nacos/nacos-server
m1 for docker安装
docker run --env MODE=standalone --name nacos2.0.3 -d -p 8848:8848 -p 9848:9848 -p 9849:9849 zhusaidong/nacos-server-m1:2.0.3
校验是否安装成功
1、访问http://ip:8848/nacos,ip为你安装nacos的服务器ip
2、输入账号密码,都是nacos
3、登陆成功后会默认进入配置列表页面,我这里因为添加过配置文件所以不是空的。
服务列表页面还要在服务管理模块中打开
2.2 nacos-client配置
1、在服务提供方中引入nacos-client依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2、启动类中添加@EnableDiscoveryClient注解
3、修改配置文件
# 应用名称
spring:
application:
name: cloud-zuul-nacos
cloud:
nacos:
discovery:
username: nacos
password: nacos
server-addr: localhost:8848
namespace: public
3. nacos配置中心
3.1 配置中心简介
我们项目中的配置文件是在项目启动时加载的,这就导致当我们修改了配置文件后,需要重新启动服务才能让修改项生效。
虽然说配置文件一般不会频繁修改,但是基于微服务架构下,我们的配置文件增多,也不可能就因为修改一个配置项而每次都去重启服务,而且也需要有一个地方来统一管理这些配置文件。
其次我们的环境分为开发环境、测试环境、生产环境,不同的环境需要不同的配置,所以需要有完善的环境、集群配置管理。
因此我们把配置文件的配置项放到一个服务上,由这个服务来维护,当在这个服务上修改了配置文件后,这个服务会将修改项推送给对应的微服务,让微服务在不用重启就能够重新加载这些配置项。从而实现配置的动态管理。这个统一管理配置文件的服务我们就称为配置中心。
3.2 配置中心使用
1、服务提供方中添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2、添加配置文件:bootstrap.properties
#指定开发环境
spring.profiles.active=dev
#服务器地址
spring.cloud.nacos.config.server-addr=localhost:8848
#默认为public命名空间,可以省略不写
spring.cloud.nacos.config.namespace=public
#指定配置群组 --如果是Public命名空间 则可以省略群组配置
spring.cloud.nacos.config.group=DEFAULT_GROUP
#文件名 如果没有配置则默认为服务名,即spring.appliction.name
spring.cloud.nacos.config.prefix=product-server
#指定文件后缀,默认properties
spring.cloud.nacos.config.file-extension=yaml
3、在nacos中添加对应配置文件,注意Data ID与上述配置的服务名保持一致,并且开发环境下的配置文件将-dev添加在文件名后。注意Data ID中也要添加文件名后缀,Data ID命名规范如下:
${prefix}-${spring.profile-active}.${file-extension}
4、代码中的配置文件就可以直接引用上述添加到nacos中的配置项了,通过${}
来引用,这样后续我们需要调整配置时,只需要到nacos中修改即可
spring:
application:
name: product-server
# mysql
datasource:
url: ${blade.datasource.product.bladex.url}
username: ${blade.datasource.product.bladex.username}
password: ${blade.datasource.product.bladex.password}
driver-class-name: com.mysql.cj.jdbc.Driver
3.3 开发、测试、生产环境如何隔离配置
因为开发、测试、生产环境的配置值不同,因此需要单独隔离区别这些环境的配置文件。
这里推荐使用命名空间namespace来区别环境,我们可以创建不同的命名空间,将开发、测试、生产的配置文件分别放到不同的命名空间中,以此来加载不同环境下的配置文件
需要注意的是,在测试、生产配置文件中指定namespace时,填写的不是命名空间名称,而是命名空间ID
#指定开发环境
spring.profiles.active=TEST
#服务器地址
spring.cloud.nacos.config.server-addr=192.168.x.x:8848
# 填写的是命名名称ID
spring.cloud.nacos.config.namespace=1de53660-450c-4cf7-8396-771e7f9aea3f
我们本期针对nacos的讲解就到这里了,下一期我们就通过实操来进一步理解gateway和nacos了
下期预告
springcloud:保姆式教程-从零搭建微服务
关注公众号,了解更多新鲜内容
参考博文
https://www.jianshu.com/p/3750b7be331f