700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > springcloud:注册中心 配置中心组件nacos详解(四)

springcloud:注册中心 配置中心组件nacos详解(四)

时间:2020-07-20 16:03:08

相关推荐

springcloud:注册中心 配置中心组件nacos详解(四)

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# windowstartup.cmd -m standalone

4、端口开通,如果是非本地安装,那么需要开通8848端口,nacos2.x版本后还需要开通9848端口

# 查询指定端口是否开放firewall-cmd --query-port=8848/tcp#查询所有已开放的端口netstat -anp# 开启端口firewall-cmd --add-port=8848/tcp --permanentfirewall-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

其中9848端口用于gRPC通信方式时客户端请求服务端,9849端口用于gRPC通信方式时nacos服务端间信息同步,docker安装时需要做对外开放

校验是否安装成功

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><version>2.2.2.RELEASE</version></dependency>

2、启动类中添加@EnableDiscoveryClient注解

3、修改配置文件

# 应用名称spring:application:name: cloud-nacoscloud:nacos:discovery:username: nacospassword: nacosserver-addr: localhost:8848# 命名空间ID,默认为public命名空间,省略不写,命名空间ID在nacos-命名空间页面可以看到namespace:

3. nacos配置中心

3.1 配置中心简介

我们项目中的配置文件是在项目启动时加载的,这就导致当我们修改了配置文件后,需要重新启动服务才能让修改项生效。

虽然说配置文件一般不会频繁修改,但是基于微服务架构下,我们的配置文件增多,也不可能就因为修改一个配置项而每次都去重启服务,而且也需要有一个地方来统一管理这些配置文件。

其次我们的环境分为开发环境、测试环境、生产环境,不同的环境需要不同的配置,所以需要有完善的环境、集群配置管理。

因此我们把配置文件的配置项放到一个服务上,由这个服务来维护,当在这个服务上修改了配置文件后,这个服务会将修改项推送给对应的微服务,让微服务在不用重启就能够重新加载这些配置项。从而实现配置的动态管理。这个统一管理配置文件的服务我们就称为配置中心。

3.2 配置中心使用

1、服务提供方中添加依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2.2.2.RELEASE</version></dependency>

2、添加配置文件:bootstrap.properties

#指定开发环境spring.profiles.active=dev#服务器地址spring.cloud.nacos.config.server-addr=localhost:8848# 命名空间ID,默认为public命名空间,省略不写,命名空间ID在nacos-命名空间页面可以看到spring.cloud.nacos.config.namespace=#指定配置群组 --如果是Public命名空间 则可以省略群组配置spring.cloud.nacos.config.group=DEFAULT_GROUP#文件名 如果没有配置则默认为服务名,即spring.appliction.namespring.cloud.nacos.config.prefix=product-server#指定文件后缀,默认propertiesspring.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# mysqldatasource: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 开发、测试、生产环境如何隔离配置

因为开发、测试、生产环境的配置值不同,因此需要单独隔离区别这些环境的配置文件。

ip隔离

一般我们各个环境会在不同的服务器上部署nacos,以ip来进行环境隔离,甚至对于大型项目生产环境中会部署nacos集群。

namespace隔离

但是如果我们想要在一台nacos server上实现环境隔离的话,这里推荐使用命名空间namespace来区别环境,我们可以创建不同的命名空间,将开发、测试、生产的配置文件分别放到不同的命名空间中,以此来加载不同环境下的配置文件

需要注意的是,在测试、生产配置文件中指定namespace时,填写的不是命名空间名称,而是命名空间ID

#指定开发环境spring.profiles.active=TEST#服务器地址spring.cloud.nacos.config.server-addr=192.168.x.x:8848# 填写的是命名名称IDspring.cloud.nacos.config.namespace=1de53660-450c-4cf7-8396-771e7f9aea3f

更多关于nacos config的介绍可以查看官方文档

3.4 共享配置文件

一些配置项可能我们在每个服务中都需要使用到,比如redis的配置,如果在每个配置文件中都添加的话无疑有些冗余。

这时我们就可以引入共享配置文件,也就是说这个配置文件是可以被所有服务所读取到的。其配置也很简单

spring.cloud.nacos.config.shared-configs[0].data-id=common.yamlspring.cloud.nacos.config.shared-configs[0].group=DEFAULT_GROUP# 是否动态刷新,默认为falsespring.cloud.nacos.config.shared-configs[0].refresh=truespring.cloud.nacos.config.shared-configs[1].data-id=common2.yamlspring.cloud.nacos.config.shared-configs[1].group=DEFAULT_GROUP# 是否动态刷新,默认为falsespring.cloud.nacos.config.shared-configs[1].refresh=true

然后我们再在nacos中创建共享配置文件common.yaml、common2.yaml,在里面填写我们的公共配置项即可

3.5 动态刷新配置文件

在上述配置的普通配置文件,我们发现,当我们在nacos中修改了配置文件时,正在运行的项目中并没有更新,这是因为我们还没有配置动态刷新

而所谓动态刷新,也就相当于在客户端创建长轮询的定时任务,并且定时获取更新的配置。

而要开启动态刷新也很简单,只需要在引用配置的类上添加@RefreshScope注解

比如我们在Controller中通过@Value注解调用了一个配置,那么就需要在Controller类上添加@RefreshScope

1、代码如图所示:

2、我们在nacos中,书写上配置

3、访问我们的测试接口localhost:9091/get,数据获取正常

4、我们将nacos配置文件中的配置修改

5、再访问localhost:9091/get,发现配置项已经同步更新,中间并没有重启服务

6、当然我们还有通过配置类来获取配置的情况,这种同样在配置类上添加@RefreshScope即可。

但需要注意,如果我们是在controller中引用这个配置类,而controller中已经添加了@RefreshScope时,配置类中就无需添加了。但如果你会在多个controller中引用,那还是建议在配置类中也加上。

@Component@ConfigurationProperties(prefix = "wu.product")@Data@RefreshScopepublic class WuProperties {private String name;private BigDecimal price;private Integer type;@Overridepublic String toString() {return "WuProperties{" +"name='" + name + '\'' +", price=" + price +", type=" + type +'}';}}

7、同样,我们书写一个测试接口,测试一下

8、调用测试

9、修改nacos配置文件,再次调用

动态刷新完成

总结

我们本期针对nacos的讲解就到这里了,下一期我们就通过实操来进一步理解gateway和nacos了

下期预告

springcloud:保姆式教程-从零搭建微服务

关注公众号,了解更多新鲜内容

参考博文

/p/3750b7be331f

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。