Spring Cloud Alibaba 架构-Nacos

概述

Nacos是一个开源的分布式系统服务发现、配置和管理平台,致力于帮助用户发现、配置和管理微服务。它提供了一组简单易用的特性集,帮助用户快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos是构建以“服务”为中心的现代应用架构(例如微服务范式、云原生范式)的服务基础设施。
以下是Nacos的主要功能:
1. 服务注册和发现:当应用需要调用其他服务时,可以通过Nacos进行服务注册和发现,以便于应用之间可以相互通信。
2. 服务配置管理:当应用需要动态配置时,可以使用Nacos进行配置管理,包括修改配置、发布新的配置,并且支持实时生效,不需要重启应用。
3. 服务路由和负载均衡:当应用需要进行负载均衡时,可以使用Nacos进行服务路由和负载均衡。
4. 集群管理:Nacos可以用于管理多个应用节点,包括它们的服务注册和发现、配置管理等,从而实现集群管理。
5. 配置中心:Nacos可以作为一个配置中心,在应用程序之间共享配置,包括关于应用程序的配置、环境变量和其他相关信息。
此外,Nacos还具有动态DNS解析、多语言支持和开放API等特性,可以帮助开发人员轻松地在不同的编程语言中使用Nacos,并与其他系统进行集成。

在应用场景上,Nacos可以作为微服务架构中的注册中心,用于服务的注册与发现,使得微服务之间可以方便地相互调用。同时,它也可以用来管理系统的配置信息,实现动态配置管理。此外,Nacos还可以实现动态的路由管理,根据不同的条件将请求转发到不同的服务实例上,实现负载均衡和灰度发布等功能。并且,它可以实时监测微服务的健康状态,当服务出现故障或不可用时,及时发现并进行告警,保障服务的高可用性。

服务注册与发现

Nacos是一个开源的分布式系统服务发现、配置管理和服务管理平台,它提供了服务注册和发现功能,使得在分布式系统中可以方便地实现服务之间的通信和调用。
服务注册是指服务提供者通过向Nacos注册中心发送注册请求,将自己的服务实例信息(如IP地址、端口号、健康状态等)注册到注册中心上。注册中心将这些信息存储起来,并提供查询接口供其他服务或客户端使用。
服务发现是指服务消费者通过查询Nacos注册中心获取可用的服务实例信息,从而实现服务的调用。在查询过程中,服务消费者可以根据负载均衡策略选择一个服务提供者进行调用。
Nacos支持基于DNS和基于RPC的服务发现。服务提供者使用原生SDK、OpenAPI或一个独立的Agent进行服务注册后,服务消费者可以使用DNS或HTTP&API查找和发现服务。此外,Nacos还提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求,确保服务的稳定性和可用性。
总的来说,Nacos的服务注册和发现功能为微服务架构提供了重要的支撑,帮助开发者实现服务之间的自动发现和通信,提高系统的可伸缩性和可维护性。 在 Spring Cloud 生态中,采用了如下服务注册与发现模型,来实现微服务之间的互相发现与调用。
在这里插入图片描述
如上图所示,通过在微服务系统中引入一个叫做注册中心的组件,来作为协调者。其最简化的过程是,所有的微服务应用在启动过程中会将自身包含服务名称、主机 IP 地址和端口号等信息发送到注册中心中,然后上游的微服务在处理请求过程中,根据服务名称到注册中心中查找对应服务的所有实例 IP 地址和端口号来进行服务调用,整个过程如图中虚线所示。从而让分散的微服务系统之间能像一个整体一样对外提供请求处理能力。

配置管理

Nacos 的配置管理功能提供了集中化、动态化、高可用和可扩展的配置管理能力,使得在微服务架构中可以方便地对配置信息进行统一管理和实时更新。
Nacos 配置管理的特点主要包括:

  1. 集中化的配置管理:Nacos 提供了统一的配置管理平台,可以集中管理各个应用程序的配置信息,包括文本配置、JSON 配置、YAML 配置等。
  2. 动态配置更新:Nacos 支持实时的配置更新,应用程序可以实时获取最新的配置值,无需重启。这使得在运行时修改配置变得非常简单和高效。
  3. 高可用性和可扩展性:Nacos 支持集群部署,具有高可用性和可扩展性,可以应对大规模的应用系统和高并发的配置更新需求。
  4. 配置监听和通知:Nacos 支持配置变更的监听和通知机制,应用程序可以订阅感兴趣的配置项,并在配置发生变化时得到通知。这使得应用程序可以快速地响应配置变更,实现自动化的配置管理。
    在使用 Nacos 进行配置管理时,通常需要在 Nacos 的控制台上添加新的配置文件,并设置相应的配置信息,如 Data ID、Group、配置格式和配置内容等。其中,Data ID 是用于唯一标识一个配置项的标识符,通常采用服务名-开发环境-后缀名的形式。例如,可以使用 userservice-dev.yml 作为 Data ID 表示该配置文件为 YAML 格式,且用于 userservice 服务的开发环境。
    在微服务中引入 Nacos 的配置管理功能时,通常需要在项目中添加 Nacos 的客户端依赖,并配置 Nacos 的地址、当前环境、服务名称等信息。然后,可以通过 Nacos 提供的 API 或 SDK 来读取和更新配置信息。
    总的来说,Nacos 的配置管理功能为微服务架构提供了重要的支撑,使得配置信息可以集中管理、动态更新和自动化管理,提高了系统的可维护性和可扩展性。
    然而,这种方式有很多缺点,比如配置信息不易维护,只要修改配置就得重新构建和部署等。
    在这里插入图片描述

Nacos Server

Nacos Docker 部署

# Clone 项目
git clone https://github.com/nacos-group/nacos-docker.git
cd nacos-docker
# 单机模式 Derby
ocker-compose -f example/standalone-derby.yaml up
# 单机模式 MySQL
docker-compose -f example/standalone-mysql-5.7.yaml up
docker-compose -f example/standalone-mysql-8.yaml up
# 集群模式
docker-compose -f example/cluster-hostname.yaml up 

接入Nacos配置中心

操作:

  1. 需要在 pom.xml 文件中引入 group ID 为 com.alibaba.cloud 和 artifact ID 为 spring-cloud-starter-alibaba-nacos-config 的 starter:
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2.在应用的 /src/main/resources/application.yaml 配置文件中配置 Nacos Config 地址并引入服务配置:

spring:
  cloud:
    nacos:
      serverAddr: 127.0.0.1:8848 #如果用的云上托管版本,输入可访问的Nacos Server地址即可
  config:
    import:
      - nacos:nacos-config-example.properties?refreshEnabled=true
  1. 完成上述两步后,应用会从 Nacos Server 中获取相应的配置,并添加在 Spring Environment 的 PropertySources 中。假设我们通过 Nacos 作为配置中心保存应用服务的部分配置,有以下几种方式实现:

    • BeanAutoRefreshConfigExample:通过将配置信息配置为 bean,支持配置变自动刷新;
    • ConfigListenerExample:监听配置信息;
    • DockingInterfaceExample:对接 Nacos 接口,通过接口完成对配置信息增删改查;
    • ValueAnnotationExample:通过 @Value 注解进行配置信息获取。

Nacos 服务注册与发现

操作步骤:

  1. 需要在 pom.xml 文件中引入 group ID 为 com.alibaba.cloud 和 artifact ID 为 spring-cloud-starter-alibaba-nacos-discovery 的 starter:
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. 添加应用配置:在应用的 /src/main/resources/application.properties 配置文件中配置 Nacos Server 地址:
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
  1. 使用 @EnableDiscoveryClient 注解开启服务注册与发现功能:
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }

    @RestController
    class EchoController {
        @GetMapping(value = "/echo/{string}")
        public String echo(@PathVariable String string) {
            return string;
        }
    }
}

服务消费

应用配置:

  1. 添加 @LoadBlanced 注解,使得 RestTemplate 接入 Ribbon:
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    return new RestTemplate();
}
  1. FeignClient 已经默认集成了 Ribbon ,此处演示如何配置一个 FeignClient:
@FeignClient(name = "service-provider")
public interface EchoService {
    @GetMapping(value = "/echo/{str}")
    String echo(@PathVariable("str") String str);
}
  1. 将两者注入到 Controller 中:
@RestController
 public class TestController {

    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private EchoService echoService;

    @GetMapping(value = "/echo-rest/{str}")
    public String rest(@PathVariable String str) {
        return restTemplate.getForObject("http://service-provider/echo/" + str, String.class);
    }
    @GetMapping(value = "/echo-feign/{str}")
    public String feign(@PathVariable String str) {
        return echoService.echo(str);
    }
}
  1. 添加必要的配置:
spring.application.name=service-consumer
server.port=18083
  1. 启动应用
    1. IDE 直接启动
    2. 打包编译后启动

DEMO

当使用 Nacos 作为配置中心和服务发现中心时,通常需要编写一些代码来与 Nacos 交互。以下是一个简单的 Spring Boot 应用程序示例,它展示了如何使用 Nacos 进行服务注册与发现和配置管理。

1. 添加依赖

首先,在 pom.xml 文件中添加 Nacos 的 Spring Cloud 依赖:

<dependencies>  
    <!-- ... 其他依赖 ... -->  
  
    <!-- Nacos 服务发现和配置管理 -->  
    <dependency>  
        <groupId>com.alibaba.cloud</groupId>  
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>  
        <version>Nacos Spring Cloud版本</version>  
    </dependency>  
    <dependency>  
        <groupId>com.alibaba.cloud</groupId>  
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>  
        <version>Nacos Spring Cloud版本</version>  
    </dependency>  
  
    <!-- ... 其他依赖 ... -->  
</dependencies>

2. 配置文件

在 bootstrap.properties 或 bootstrap.yml 文件中配置 Nacos 的地址和命名空间(可选):

spring:  
  application:  
    name: nacos-demo  
  cloud:  
    nacos:  
      discovery:  
        server-addr: 127.0.0.1:8848 # Nacos 服务地址  
      config:  
        server-addr: 127.0.0.1:8848 # Nacos 配置地址,通常与服务发现地址相同  
        file-extension: yaml # 配置文件格式  
        namespace: your-namespace-id # 命名空间ID,可选

3. 启动类

在 Spring Boot 应用程序的启动类上添加 @EnableDiscoveryClient 注解来启用服务发现:

import org.springframework.boot.SpringApplication;  
import org.springframework.boot.autoconfigure.SpringBootApplication;  
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;  
  
@SpringBootApplication  
@EnableDiscoveryClient  
public class NacosDemoApplication {  
  
    public static void main(String[] args) {  
        SpringApplication.run(NacosDemoApplication.class, args);  
    }  
}

4. 读取配置

可以使用 @Value 注解或 @ConfigurationProperties 注解来读取 Nacos 上的配置。
例如,在 Nacos 上配置了一个 example.property 的配置项,可以在 Spring Boot 应用中这样读取:

import org.springframework.beans.factory.annotation.Value;  
import org.springframework.stereotype.Component;  
@Component  
public class ExampleConfig {  
  
    @Value("${example.property}")  
    private String exampleProperty;  
  
    // ... getter 和 setter ...  
}

5. 服务调用

可以使用 Spring Cloud 提供的服务发现客户端来调用其他服务。例如,使用 LoadBalancerClient 或 @LoadBalanced 注解与 Ribbon 结合使用。

6. 数据源等其他配置

如果应用需要连接数据库或其他外部服务,并且这些配置信息也存储在 Nacos 上,需要在 Nacos 上配置相应的数据源或其他配置,并在 Spring Boot 应用中通过配置文件或注解的方式引用它们。
以上是一个简单的 Nacos 示例代码 demo,展示了如何使用 Nacos 进行服务注册与发现和配置管理。在实际项目中,可能还需要考虑安全性、容错性、性能优化等方面的问题。

应用注意事项

在使用Nacos时,需要注意以下事项以确保其稳定运行和安全性:

  1. 高可用性:
  • Nacos支持集群部署,为了确保高可用性和容错性,在生产环境中建议至少部署3个节点。
  • 定期备份Nacos的数据以防止数据丢失。Nacos提供了数据备份和恢复的工具,应定期进行数据备份以应对意外情况。
  1. 安全配置:
  • 在使用Nacos时,需要关注安全配置,包括访问控制、认证和授权等安全机制的配置,以保障系统的安全性。
  • 确保Nacos的访问地址(特别是配置和服务发现地址)不被未经授权的第三方访问。
  1. 环境隔离:
  • 建议使用命名空间(Namespace)进行环境隔离,如开发环境和正式环境。这样可以避免不同环境之间的配置和服务干扰。
  1. 配置修改:
  • 修改Nacos的配置时,需要谨慎操作,避免误修改导致服务不可用。
  • 在修改重要配置前,建议进行备份,以便在出现问题时可以快速恢复。
  1. 服务注册与发现:
  • 注册到Nacos的服务需要确保服务的正确性和可用性,避免注册无效或错误的服务。
  • 使用服务发现时,需要确保服务的调用方和提供方都正确配置了服务名、版本号等信息。
  1. 版本控制:
  • Nacos支持配置和服务的版本控制,可以通过DataId和Group等字段进行区分。在修改配置或发布新版本的服务时,需要注意版本号的变化,以避免因版本冲突导致的问题。
  1. 集群部署:
  • 在进行集群部署时,需要确保各个节点之间的网络连通性和时钟同步。
  • 集群中的节点数量应满足高可用性的要求,并定期进行节点健康检查,以确保集群的稳定运行。
  1. 日志和监控:
  • 开启Nacos的日志和监控功能,以便及时发现和解决问题。
  • 定期检查Nacos的日志和监控数据,确保系统的正常运行和性能优化。
  1. 兼容性和升级:
  • 在使用Nacos时,需要关注其与其他组件(如Spring Cloud、Dubbo等)的兼容性。
  • 在升级Nacos时,需要仔细阅读升级指南和注意事项,并进行充分的测试,以避免因升级导致的问题。
  1. 命名空间(Namespace)和分组(Group)的使用:
  • 同名的命名空间只能创建一个,避免命名冲突。
  • 微服务间如果需要通信,需要确保它们注册在同一个命名空间下。
  • Group+DataId组合是唯一的,避免在同一分组下出现多个相同DataId的配置。
  • 不同的分组之间是隔离的,服务注册到不同的分组时,无法使用OpenFeign指定服务名进行负载通信。
  • 14
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值