在微服务构架中,集群服务间的需要调用时就需要知道各个服务的IP和提供服务的端口等信息,如果每个部署一个服务就配置一次,那么必然时非常麻烦的,因此我们需要一个能够统一管理的东西来解决这个问题,由此诞生了注册中心。

每个服务启动后都向注册中心发送自己的服务信息,在需要调用其他服务的时候直接从注册中心里面去获取集群的服务信息。spring-cloud中很多使用的是Eureka来作为注册中心,不过在2018年7月的时候Netflix就宣布停止维护Eureka了。

在spring-cloud-alibaba的套装中我们使用Nacos来替换掉Eureka这个组件。 需要注意的是Nacos不仅有注册中心的功能,同时还具备配置中心的功能,支持将配置加密。在公司中若不想自己搭建,可以使用阿里云提供的ACM配置中心服务,功能更丰富,目前是免费提供使用,可以节约搭建配置中心的成本。

相关文档

Nacos注册中心的使用

首先我们需要安装Nacos,安装步骤可以参考Nacos安装和配置 ; 下面是使用方式:

  1. 在项目中添加如下依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

这个依赖用于替换eureka的客户端依赖包 spring-cloud-starter-netflix-eureka-client

  1. 在启动类上添加 @EnableDiscoveryClient注解;其实使用eureka做注册中心时,也建议使用此注解,方便后期更换注册中心不用修改代码。

  2. 在application配置文件中添加nacos的配置

spring:
cloud:
nacos:
discovery:
# nacos的地址
server-addr: 127.0.0.1:8848

成功后即可在nacos控制台中查看。

Nacos配置中心的使用

首先说明下使用配置中心有利的地方;1.保护铭感配置信息,我们项目中大部分配置其实都是固定的,比如数据库、项目端口、路径、第三方API的开发配置等等的配置;但是如果直接这些直接配置在项目中,在代码泄漏的同时这些配置的机密信息也就泄漏了。

2.可以方便的配置一些需要的动态配置,虽然现在的自动化部署很方便了,但是机器多的话还是会花费少时间的。3.集中化管理配置,公共配置的重复利用,避免同样的配置重复写入。4.配置的历史版本管理,方便一键回滚。

  1. 添加配置中心的依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  1. 创建bootstrap.properties配置文件,也可以是bootstrap.yml (不建议使用这种,因为可能会识别不到);在里面添加如下配置(bootstrap.properties示例):
# 配置文件名称前缀,使用的是服务名称
spring.application.name=nacos-config
# 分组
spring.cloud.nacos.config.group=DEFAULT_GROUP
# nacos 配置中心地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 配置文件后缀
spring.cloud.nacos.config.file-extension=yml
# 激活文件,这个配置可以通过启动参数指定 -Dspring.profiles.active=dev来切换环境, 实现打一次包就可以了
spring.profiles.active=dev

原理说明:spring-boot启动的时候其实会加载所有的配置文件,最终合并为一份,最终符合激活文件的会最后加载,依此来覆盖其他配置;spring会以这个bootstrap配置文件的优先;

配置文件命名说明:最终组装的DataID = spring.application.name + '-' + spring.profiles.active + spring.cloud.nacos.config.file-extension

  1. 在nacos控制台上配置相关配置。

将各个组件的配置拆分

将redis、MySQL的等公共基础组件的配置拆分到单个文件中,如在nacos控制台创建一个名为db-config-dev.yml的MySQL的配置; 项目中bootstrap配置的信息如下(bootstrap.properties示例):

spring.application.name=nacos-config-demo
spring.cloud.nacos.server-addr=192.168.56.102:8848
spring.cloud.nacos.config.file-extension=yml
spring.cloud.nacos.config.group=DEFAULT_GROUP
# 附加配置文件
spring.cloud.nacos.config.extension-configs[0].data-id=db-config-${spring.profiles.active}.yml
spring.cloud.nacos.config.extension-configs[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.extension-configs[0].refresh=true

记得在启动参数中添加spring.profiles.active=dev

db-config-dev.yml的MySQL的配置:

spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/demo?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
username: root
password: 123456

这拆分后其他微服务需要相关的基础组件,直接添加即可,无需再在自己的配置文件中单独去写这些配置,若需要特殊配置单独配置即可。

关于动态刷新配置: 需要在类上添加@RefreshScope注解才能实现动态刷新

Nacos原理简析

nacos作为注册中心:其实就是实现了spring-cloud定义的ServerRegistry接口NacosServerRegistry;在系统启动后会去监听spring的启动事件然后自动装配相关配置;进行服务的注册,同时会通过schedule线程池提交定时调度任务,向nacos服务端发送心跳(其实就是定时调用http接口)。

nacos服务端会通过ConcurrentHashMap来记录注册的服务信息,同时服务端会定时去检查这些注册服务的心跳;如果是集群部署会进行数据同步。

由于客户端会定时向nacos服务发送心跳,同时获取注册表信息;为了支持高并发,Nacos采用多级缓存策略来实现注册表的读写,不同于eureka的方式,nacos使用的copyWrite思想,它是先拷贝一份内存中的配置,然后在这份拷贝内存里面进行更新相关操作,之后再将这个复制回去。

nacos作为配置中心:nacos客户端会做一个超时时间为30s的长轮询的http请求,nacos服务端收到请求后会判断配置是否更新过,如果更新过那么就会立即返回结果,否则会一直等待30s左右(在这个等待期间如果发现配置更新了也会立即将更新结果返回给客户端)才会返回结果告知客户端配置没有更新;注意如果配置没有更新那么才会等待30s,否则是直接拿到返回结果的。

高可用性:nacos集群部署时会基于raft算法(就是在leader机器挂了后,follower的机器会选举新的leader,其规则就是这些follower通过投票,得到票数过半的机器成功新的leader)来保证集群的高可用性。

https://blog.vchar.top/java/1615204800.html

关注微信订阅号‘起岸星辰’获取最新资讯

spring-cloud-alibaba之Nacos的更多相关文章

  1. Spring Cloud Alibaba(2)---Nacos概述

    Spring Cloud Alibaba(2)---nacos概述 上一篇博客讲了有关 SpringCloudAlibaba的概述,这篇开始讲SpringCloudAlibaba组件之一---Naco ...

  2. Spring Cloud Alibaba(4)---Nacos(注册中心)

    Nacos(注册中心) 有关Spring Cloud Alibaba之前写过三篇文章. Spring Cloud Alibaba(1)---入门篇 Spring Cloud Alibaba(2)--- ...

  3. Spring Cloud Alibaba(5)---Nacos(配置中心)

    Nacos(配置中心) 有关Spring Cloud Alibaba之前写过四篇文章,这篇也是在上面项目的基础上进行开发. Spring Cloud Alibaba(1)---入门篇 Spring C ...

  4. Spring Cloud Alibaba(6)---Nacos持久化Mysql8.0版本

    Nacos持久化Mysql8.0版本 有关Nacos之前写过三篇文章. Spring Cloud Alibaba(3)---Nacos概述 Spring Cloud Alibaba(4)---Naco ...

  5. Spring Cloud Alibaba(3)---Nacos概述

    Spring Cloud Alibaba(3)---nacos概述 上一篇博客讲了有关 SpringCloudAlibaba的概述,这篇开始讲SpringCloudAlibaba组件之一---Naco ...

  6. Spring Cloud Alibaba 使用nacos 注册中心

    ### 背景 上一文我们讲到了如何去搭建注册中心,这一次我们讲述如何使用nacos作为注册中心 ### spring-cloud-alibaba-basis 创建基础依赖 首先我们创建一个spring ...

  7. Spring Cloud Alibaba 教程 | Nacos(一)

    什么是Nacos Nacos是一个更易于构建云原生应用的动态服务发现.配置管理和服务管理平台. Nacos 致力于帮助您发现.配置和管理微服务.Nacos提供了一组简单易用的特性集,帮助您快速实现动态 ...

  8. Spring Cloud Alibaba 之Nacos

    Nacos 技术讲解 一提到分布式系统就不的不提一下 CAP 原则 什么是CAP CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency).可用性(Availability ...

  9. Spring Cloud Alibaba 整合 Nacos 实现服务配置中心

    在之前的文章 <Nacos 本地单机版部署步骤和使用> 中,大家应该了解了 Nacos 是什么?其中 Nacos 提供了动态配置服务功能 一.Nacos 动态配置服务是什么? 官方是这么说 ...

  10. Spring Cloud Alibaba 之 Nacos

    Nacos 技术讲解 一提到分布式系统就不的不提一下 CAP 原则 什么是CAP CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency).可用性(Availability ...

随机推荐

  1. HDU-6608 Fansblog(威尔逊定理+素数间隔+逆元)

    参考博客:https://blog.csdn.net/birdmanqin/article/details/97750844 题目链接:链接:http://acm.hdu.edu.cn/showpro ...

  2. 主席树 【权值线段树】 && 例题K-th Number POJ - 2104

    一.主席树与权值线段树区别 主席树是由许多权值线段树构成,单独的权值线段树只能解决寻找整个区间第k大/小值问题(什么叫整个区间,比如你对区间[1,8]建立一颗对应权值线段树,那么你不能询问区间[2,5 ...

  3. .net core mvc 获取Web根目录和内容根目录的物理路径

    从ASP.NET Core RC2开始,可以通过注入 IHostingEnvironment 服务对象来取得Web根目录和内容根目录的物理路径,如下所示: using Microsoft.AspNet ...

  4. Ubuntu-16.04下Docker通过阿里云镜像安装(apt-get)

    由于通过官方路径安装docker时总是连接不上,所以从网上找了半天,通过阿里云镜像安装docker,我的Linux是ubuntu-16.04 一.配置源里的阿里云镜像仓库 sudo vim /etc/ ...

  5. CSS字体大小: em与px、pt、百分比之间的对比

      CSS样式最混乱的一个方面是应用程序中文本扩展的font-size属性.在CSS中,你可以用四个不同的单位度量来显示在web浏览器中的文本大小.这四个单位哪一种最适合Web? 这个问题引起了广泛的 ...

  6. MDN All In One

    MDN All In One https://github.com/mdn/ https://wiki.mozilla.org/MDN MDN 要凉了 https://developer.mozill ...

  7. Web API & Element & DOM

    Web API & Element & DOM Element https://developer.mozilla.org/en-US/docs/Web/API/Element HTM ...

  8. DBA 的效率加速器——CloudQuery v1.3.0 上线!

    好久不见! 自 CloudQuery v1.2.1 发布至今,已有月余,在此期间我们收到了很多朋友对 CloudQuery 的反馈和建议,很多朋友表达了对 v1.3.0 的期待,非常感谢. Cloud ...

  9. Mosquitto

    mosquitto可连接远程服务器及本地服务器. mosquitto可在一个节点内建立一个连接用于收发,也可在一个节点内建立多个连接用于收发.建立一个连接用于收发时,会有初始部分帧的延迟.(可能由于内 ...

  10. 微信附近的人,用redis也能实现?(GEO)

    相信微信附近的人的功能大家都应该用过 我可以很随意的通过我自己的定位能看到我附近的人,并且能看到那个人距离我的距离,大家有没有思考过这个是怎么实现的? 作为一个程序猿任何问题应该都有一个思考的过程,而 ...