【微服务系列笔记】Nacos

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: Nacos 是阿里巴巴开源的项目,用于构建云原生应用的动态服务发现、配置管理和服务管理平台。它支持动态服务发现、服务配置、服务元数据和流量管理,旨在更敏捷和方便地构建、交付和管理微服务平台。可作为注册中心与配置中心。

1. 概述

Nacos 阿里巴巴推出来的开源项目,是更易于构建云原生应用的动态服务发现、配置管理和服务管理平台

Nacos 致力于发现、配置和管理微服务,并提供简单易用的特性集,能够快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 更敏捷和容易地构建、交付和管理微服务平台,构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施

2. 注册中心

同样作为注册中心,相对于微服务来说,使用Nacos和使用Eureka并没有太大区别。主要差异在于:依赖不同以及服务地址不同。

2.1. 入门案例

2.1.1. 服务端配置

在父工程导入依赖

<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  <version>2.2.6.RELEASE</version>
  <type>pom</type>
  <scope>import</scope>
</dependency>

2.1.2. 客户端配置

  1. 导入依赖,注释掉eureka依赖
  2. 修改配置,注释掉eureka地址
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos服务地址
      discovery:
        cluster-name: HZ # 配置集群名称,也就是机房位置
  application:
    name: userService # eureka的服务名称
#eureka:
#  client:
#    service-url:  # eureka的地址信息
#      defaultZone: http://127.0.0.1:10086/eureka
<!-- nacos客户端依赖包 -->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2.1.3. 重新启动

2.1.4. 集群

Nacos服务分级存储模型

  • 一级是服务,例如userservice
  • 二级是集群,例如杭州或上海
  • 三级是实例,例如杭州机房的某台部署了userservice的服务器

NacosRule负载均衡策略

  • 优先选择同集群服务实例列表
  • 本地集群找不到提供者,才去其它集群寻找,并且会报警告
  • 确定了可用实例列表后,再采用随机负载均衡挑选实例

配置负载均衡规则

userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule  # 负载均衡规则

2.1.5. 权重配置

实际部署中会出现这样的场景:

性能好的服务器配置更高的权重

权重设置为0.01-0.02,可放少量用户访问服务器进行测试

权重设置为0,服务器不会被访问,可用于服务器升级场景

2.2. 两者区别

区别:

  1. Nacos对临时实例采用心跳模式(主动心跳上报),对永久实例采取询问模式;Eureka只有心跳模式。
  2. Nacos临时实例不健康会被删除,永久实例永不会被删除。
  3. Nacos对消费者会拉取和主动推送消息,保证服务列表的及时更新;Eureka只会拉取。
  4. Nacos集群默认采用AP模式。当集群存在永久实例则切换为CP模式;Eureka只有AP模式。

3. 配置中心

3.1. 统一配置管理

Nacos除了可以做注册中心,同样可以做配置管理来使用。

当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。

Nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新

3.2. 入门案例

3.2.1. 在nacos添加配置

3.2.2. 本地拉取配置

微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。

但如果尚未读取application.yml,又如何得知nacos地址呢?

因此spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,流程如下:

  1. 添加依赖
<!--nacos配置管理依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  1. 添加bootstrap.yaml
spring:
  application:
    name: userservice # 服务名称
  profiles:
    active: dev #开发环境,这里是dev 
  cloud:
    nacos:
      server-addr: localhost:8848 # Nacos地址
      config:
        file-extension: yaml # 文件后缀名
  1. 读取nacos配置
@Value("${pattern.dateformat}")
    private String dateformat;

3.3. 热更新配置

修改nacos中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新

通常将一些关键参数,或需要运行时调整的参数放到nacos配置中心,其余配置放本地

要实现配置热更新,可以使用两种方式:

3.3.1. 方式一

在@Value注入的变量所在类上添加注解@RefreshScope:

3.3.2. 方式二

使用@ConfigurationProperties注解代替@Value注解。(推荐)

在user-service服务中,添加一个类,读取patterrn.dateformat属性:

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dateformat;
}
===============================================================
    @Autowired
    private PatternProperties patternProperties;
    @GetMapping("now")
    public String now(){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(patternProperties.getDateformat());
        return LocalDateTime.now().format(formatter);
    }

3.4. 多环境共享配置

设计开发环境分为多种,如本地环境,dev开发环境,test测试环境,pre灰度环境(预发布),prod生产环境等。不同配置会被不同环境所读取。同一配置可能被多个环境共享。

3.4.1. 添加一个环境共享配置

3.4.2. 运行两个UserApplication,使用不同的profile

指定userService1运行环境为dev,userService2运行环境为test,

执行效果

userService1能读到userService-dev.yaml和userService.yaml的配置

userService2仅能读到userService.yaml的配置

结论

微服务会从nacos读取的配置文件:

[服务名]-[spring.profile.active].yaml,环境配置

[服务名].yaml,默认配置,多环境共享

3.5. 配置优先级

[服务名]-[环境].yaml >[服务名].yaml > 本地配置

体现了配置中心的优先级

目录
相关文章
|
16小时前
|
Linux Docker 容器
【微服务系列笔记】Docker
docker是一种容器技术,它主要是用来解决软件跨环境迁移的问题和同一环境下依赖冲突问题。 Docker可以运行在Mac, Windows, linux等操作系统上,常用于适用于构建和部署分布式应用、微服务架构。
44 0
【微服务系列笔记】Docker
|
16小时前
|
监控 Java 应用服务中间件
【微服务系列笔记】Sentinel入门-微服务保护
Sentinel是一个开源的分布式系统和应用程序的运维监控平台。它提供了实时数据收集、可视化、告警和自动化响应等功能,帮助用户监控和管理复杂的IT环境。本文简单介绍了微服务保护以及常见雪崩问题,解决方案。以及利用sentinel进行入门案例。
29 3
|
16小时前
|
负载均衡 安全 Java
【微服务系列笔记】Gateway
Gateway是Spring Cloud生态系统中的网关服务,作为微服务架构的入口,提供路由、负载均衡、限流、鉴权等功能。借助于过滤器和路由器,Gateway能够动态地管理请求流量,保障系统的安全和性能。
38 7
|
16小时前
|
负载均衡 Java Apache
【微服务系列笔记】Feign
Feign是一个声明式的伪HTTP客户端,它使得HTTP请求变得更简单。使用Feign,只需要创建一个接口并注解。Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果。 OpenFeign 是SpringCloud在Feign的基础上支持了SpringMVC的注解。
38 8
|
16小时前
|
Nacos 微服务
【微服务系列笔记】Eureka
该文档介绍了微服务注册中心的重要性和流行选项,如Eureka、Nacos、Consul和Zookeeper,强调Eureka是唯一支持跨区域调用的AP系统。接着,它提供了一个Eureka入门案例,包括设置Eureka服务器和客户端的步骤,并展示了多实例部署的效果。最后,简要总结了学习Eureka的意义,并提出了几个思考问题,如Eureka的功能、工作原理以及其他服务发现技术。
29 5
|
16小时前
|
负载均衡 算法 应用服务中间件
【微服务系列笔记】负载均衡
本文介绍了负载均衡的概念和重要性,指出随着流量增长,通过垂直扩展和水平扩展来提升系统性能,其中水平扩展引入了负载均衡的需求。负载均衡的目标是将流量分布到多台服务器以提高响应速度和可用性,常见的硬件和软件负载均衡器包括F5、A10、Nginx、HAProxy和LVS等。 文章接着提到了Ribbon,这是一个客户端实现的负载均衡器,用于Spring Cloud中。Ribbon在发起REST请求时进行拦截,根据预设的负载均衡算法(如随机算法)选择服务器,并重构请求URI。文中还介绍了如何通过代码和配置文件两种方式自定义Ribbon的负载均衡策略。
41 3
|
16小时前
|
存储 Java 数据库
【微服务系列笔记】微服务概述
本文对比了单体应用和微服务架构。单体应用中所有功能模块在一个工程中,而微服务则按领域模型拆分为独立服务,每个服务有明确边界,可独立开发、部署和扩展。微服务允许使用不同语言和技术栈,每个服务有自己的数据库。微服务架构的优点包括易于开发维护、技术栈开放和错误隔离,但缺点包括增加运维成本、调用链路复杂、分布式事务处理困难以及学习成本高。实现微服务通常涉及SpringCloud等开发框架和Docker等运行平台。
38 2
|
16小时前
|
Linux Nacos 数据库
【微服务】生产部署nacos集群(三个节点)
【微服务】生产部署nacos集群(三个节点)
26 1
|
16小时前
|
Dubbo Java 应用服务中间件
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
|
16小时前
|
SQL 关系型数据库 数据库
【微服务系列笔记】Seata
Seata是一种开源的分布式事务解决方案,旨在解决分布式事务管理的挑战。它提供了高性能和高可靠性的分布式事务服务,支持XA、TCC、AT等多种事务模式,并提供了全局唯一的事务ID,以确保事务的一致性和隔离性。Seata还提供了分布式事务的协调、事务日志、事务恢复等功能,帮助开发人员简化分布式事务的管理和实现。
48 1