在微服务构架中,集群服务间的需要调用时就需要知道各个服务的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. Codeforces Round #479 (Div. 3) E. Cyclic Components (思维,DFS)

    题意:给你\(n\)个顶点和\(m\)条边,问它们有多少个单环(无杂环),例如图中第二个就是一个杂环. 题解:不难发现,如果某几个点能够构成单环,那么每个点一定只能连两条边.所以我们先构建邻接表,然后 ...

  2. 牛客网多校第7场 J Sudoku Subrectangles 【构造】

    题目:戳这里 题意:给一个n*m的矩阵,里面由a~z及A~Z构成,问有多少个子矩阵满足任意一行或一列中都没有相同的字母. 解题思路:左上角和右下角两点可以确定一个矩阵.可以先预处理出来每个点作为一个矩 ...

  3. CodeForces 1047C Enlarge GCD(数论)题解

    题意:n个数的gcd是k,要你删掉最少的数使得删完后的数组的gcd > k 思路:先求出k,然后每个数除以k.然后找出出现次数最多的质因数即可. 代码: #include<cmath> ...

  4. ES-Next @Decorator All In One

    ES-Next @Decorator All In One @装饰器 import { logged } from "./logged.mjs"; class C { @logge ...

  5. css break-inside

    css break-inside The break-inside CSS property sets how page, column, or region breaks should behave ...

  6. VSCode & Node.js & debugger & inspector

    VSCode & Node.js & debugger & inspector F5 ws 元信息 (UUID) ws://127.0.0.1:46912/efa91bda-1 ...

  7. TYLER ADAMS BRADBERRY的私人投资分享

    TYLER ADAMS BRADBERRY是星盟全球投资公司(USA International Covenant 公司编号:20091457685)的创始人.投资委员会发起了15支项目基金,通过多方 ...

  8. USDN稳定币应用区块链旅游业

    比特币是区块链1.0时代的标志性产品,稳定币则是区块链2.0时代的标志性产品.在稳定币鼻祖USDT爆出"超发"新闻后曾引发市场的动荡,之后新兴稳定币如春笋般涌现.据不完全同济,目前 ...

  9. Spring 中的 MetaData 接口

    什么是元数据(MetaData) 先直接贴一个英文解释: Metadata is simply data about data. It means it is a description and co ...

  10. 12_MySQL如何对查询结果进行排序

    本节所涉及的sql语句: -- 排序关键字 SELECT empno,ename,hiredate FROM t_emp ORDER BY hiredate DESC; -- 排序字段相同的情况 SE ...