在微服务构架中,集群服务间的需要调用时就需要知道各个服务的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. linux搭建网站

    CentOS 1.安装 yum -y install nginx *或者安装指定版本,版本网址:http://nginx.org/packages/centos/7/x86_64/RPMS/ rpm ...

  2. 涂颜色的RPG问题

    长度为n的方格,刷3种颜色的颜料,相邻的方格颜料颜色不能相同,且首尾方格颜色不能相同.每个方格必须涂色.计算一共有多少种涂色方式. 解题思路:(1)f(1)=3,f(2)=6,f(3)=6 (2)如果 ...

  3. BZOJ3211 花神游历各国(分块 区间开根号)

    题意:给n个数,可以进行两种操作:给区间[l,r]每个数开方向下取整:算区间[l,r]的和. 思路:我们可以知道,一个数一直开方下去,就会变成0或者1,然后就不会变了.那么当一个区间只剩0或1时,就不 ...

  4. μC/OS-III---I笔记1---概述

    在裸板上跑一些程序对于一些电子设计是足够的,所谓裸板上的程序就是传统的前后台系统,而我的理解它应该是一种"过程类"的程序,一个大循环(作为后台)做一些处理,中断程序(作为前台)来处 ...

  5. OAuth 2.0 All In One

    OAuth 2.0 All In One 授权类型 授权代码 隐式 密码凭证 客户端凭证 授权码 授权码授予类型要求用户向提供者进行身份验证-然后将授权码发送回客户端应用程序,提取并与提供者交换以获取 ...

  6. calendar merge date

    calendar merge date componentDidMount () { const { monthDays, // monthDates, } = this.props; const d ...

  7. vscode Paste Image插件使用

    Paste Image 在编写md需要插入图片,这个插件可以将粘贴板的图片保存到本地资源 假如我在/readme.md中编写文档,我需要将粘贴板的图片放在/images/下面,配置两个关键配置即可: ...

  8. WebRTC 系列之音频会话管理

    WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音对话或视频对话的 API.W3C 和 IETF 在2021年1月26日共同宣布 WebRTC 1. ...

  9. (转)linux下的系统调用函数到内核函数的追踪

    转载网址:http://blog.csdn.net/maochengtao/article/details/23598433 使用的 glibc : glibc-2.17使用的 linux kerne ...

  10. 敏捷史话(七):从程序员、作家到摇滚乐手——Andy Hunt的多面人生

    与其说 Andy Hunt 是敏捷宣言的创始人,不如说他是一名专业作家来得更为合适.他的<实用程序员><程序员修炼之道:从小工到专家><编程 Ruby:实用程序员指南&g ...