【微服务系列笔记】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 > 本地配置

体现了配置中心的优先级

目录
相关文章
|
1月前
|
Dubbo Java 应用服务中间件
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
|
1月前
|
SQL 关系型数据库 数据库
【微服务系列笔记】Seata
Seata是一种开源的分布式事务解决方案,旨在解决分布式事务管理的挑战。它提供了高性能和高可靠性的分布式事务服务,支持XA、TCC、AT等多种事务模式,并提供了全局唯一的事务ID,以确保事务的一致性和隔离性。Seata还提供了分布式事务的协调、事务日志、事务恢复等功能,帮助开发人员简化分布式事务的管理和实现。
52 1
|
1月前
|
负载均衡 安全 Java
【微服务系列笔记】Gateway
Gateway是Spring Cloud生态系统中的网关服务,作为微服务架构的入口,提供路由、负载均衡、限流、鉴权等功能。借助于过滤器和路由器,Gateway能够动态地管理请求流量,保障系统的安全和性能。
45 7
|
5天前
|
Java API Nacos
通过 Python+Nacos实现微服务,细解微服务架构
`shigen`是一名擅长多种编程语言的博主,致力于分享技术成长和认知。他尝试将Python服务构建为微服务架构,模仿Java领域的微服务设计。通过Nacos服务发现和注册,实现了Python Flask应用的微服务化,包括网关、用户中心、鉴权和文档服务。代码示例展示了服务注册、心跳维持、HTTP接口以及网关的代理和认证逻辑。此实现促进了服务安全调用,增强了对数据的保护。通过这种方式,`shigen`揭示了Python+Nacos实现微服务的细节,鼓励读者深入理解微服务工作原理。
17 0
通过 Python+Nacos实现微服务,细解微服务架构
|
19天前
|
负载均衡 Nacos 数据库
【Nacos】配置管理、微服务配置拉取、实现配置热更新、多环境配置
【Nacos】配置管理、微服务配置拉取、实现配置热更新、多环境配置
36 1
|
21天前
|
Dubbo Cloud Native 应用服务中间件
【阿里云云原生专栏】云原生环境下的微服务治理:阿里云 Dubbo 与 Nacos 的深度整合
【5月更文挑战第25天】阿里云Dubbo和Nacos提供微服务治理的强大工具,整合后实现灵活高效的治理。Dubbo是高性能RPC框架,Nacos则负责服务发现和配置管理。整合示例显示,通过Nacos注册中心,服务能便捷注册发现,动态管理配置。简化部署,提升适应性,但也需注意服务稳定性和策略规划。这种整合为云原生环境的微服务架构带来强大支持,未来应用前景广阔。
214 2
|
25天前
|
存储 Java Nacos
谈谈Nacos Stream 作为微服务异步消息框架相关特性
【5月更文挑战第21天】在本篇技术文章中,我们将深入探讨 Nacos Stream 作为微服务异步消息框架的关键特性,包括服务发现与健康监测、动态配置服务的概念、原理以及如何在实际应用中利用这些功能。
36 6
|
1月前
|
Linux Docker 容器
【微服务系列笔记】Docker
docker是一种容器技术,它主要是用来解决软件跨环境迁移的问题和同一环境下依赖冲突问题。 Docker可以运行在Mac, Windows, linux等操作系统上,常用于适用于构建和部署分布式应用、微服务架构。
49 0
【微服务系列笔记】Docker
|
1月前
|
监控 Java 应用服务中间件
【微服务系列笔记】Sentinel入门-微服务保护
Sentinel是一个开源的分布式系统和应用程序的运维监控平台。它提供了实时数据收集、可视化、告警和自动化响应等功能,帮助用户监控和管理复杂的IT环境。本文简单介绍了微服务保护以及常见雪崩问题,解决方案。以及利用sentinel进行入门案例。
48 3
|
1月前
|
负载均衡 Java Apache
【微服务系列笔记】Feign
Feign是一个声明式的伪HTTP客户端,它使得HTTP请求变得更简单。使用Feign,只需要创建一个接口并注解。Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果。 OpenFeign 是SpringCloud在Feign的基础上支持了SpringMVC的注解。
57 8