Spring Boot 中Nacos的用法及流程

1. 注册中心

注册中心的主要功能是管理微服务的服务注册与发现,实现服务之间的动态连接。通过注册中心,服务可以自动发现彼此,无需硬编码服务地址。

  • 主要功能

    • 服务注册:服务在启动时将自己的网络信息(如 IP 和端口)注册到注册中心。
    • 服务发现:当一个服务需要调用另一个服务时,可以向注册中心查询目标服务的地址。
    • 健康检查:注册中心监控服务的健康状态,如果服务出现异常或宕机,会将其从服务列表中移除。
    • 负载均衡支持:注册中心可以返回多实例服务的地址列表,帮助调用方实现负载均衡。
  • 适用场景:适合微服务之间频繁调用、服务实例动态启动或销毁的场景,能有效提升系统的高可用性和弹性。

  • 常见实现:Nacos、Eureka、Consul、ZooKeeper 等。

总结:注册中心的核心作用是管理服务的位置和状态,在服务间建立动态连接,相当于微服务架构中的“电话簿”。


2. 配置中心

配置中心负责管理应用的配置信息,提供统一的配置存储和管理,尤其在分布式系统中,它能高效支持多个服务的配置需求。

  • 主要功能

    • 集中化配置管理:集中存储系统的所有配置文件,便于统一管理和更新。
    • 动态配置更新:支持实时推送配置变更,使应用在不重启的情况下更新配置。
    • 多环境管理:通常支持多环境(如开发、测试、生产)配置管理,避免配置冲突。
    • 配置访问控制:提供配置的权限控制,确保配置信息的安全。
  • 适用场景:适合配置项较多且变动频繁的分布式系统。

  • 常见实现:Nacos、Spring Cloud Config、Apollo 等。

总结:配置中心的核心作用是管理和提供应用配置数据,实现动态、统一的配置管理,是微服务架构中的“配置仓库”。


3. 区别总结

特性 注册中心 配置中心
主要职责 管理服务的注册与发现 管理应用的配置信息
作用 帮助服务动态找到彼此 提供统一、动态的配置管理
典型功能 服务注册、服务发现、健康检查 配置存储、动态更新、多环境管理
适用场景 服务实例动态变化,频繁服务调用 配置项多且变动频繁
常见工具 Nacos、Eureka、Consul、ZooKeeper Nacos、Spring Cloud Config、Apollo

总结:注册中心管理的是服务的位置和可用性,配置中心管理的是服务的配置信息。Nacos 可以同时作为注册中心和配置中心,但两者的功能和应用场景不同。


Nacos 常见功能

  1. 服务注册与发现:Nacos 作为注册中心,支持微服务启动时自动注册自身,让其他服务动态发现和调用,无需硬编码服务地址。
  2. 配置管理:提供集中化的配置管理,支持多环境配置和动态更新,开发者可以在 Nacos 中管理配置并实时推送到应用中。
  3. 服务健康检查:定期检测服务的健康状态,自动移除不可用的实例,确保请求流量只导向健康的服务。
  4. 多租户和多环境支持:支持命名空间和分组功能,实现不同租户或环境的隔离管理。
  5. 可视化管理控制台:提供简单易用的 Web 界面,方便查看和管理服务实例、配置项、监控服务状态,提升运维效率。

配置中心使用流程

1. 引入依赖

在 Spring Boot 项目的 pom.xml 中引入 Nacos 配置中心依赖:

<dependency>
    <groupId>com.alibaba.cloudgroupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
    <version>2.2.5.RELEASEversion>
dependency>

2. 增加配置

为了保证 Nacos 配置优先加载,需将 Nacos 配置相关信息放入 bootstrap.propertiesbootstrap.yml 文件中。

bootstrap.properties 示例
spring.application.name=member
spring.profiles.active=dev
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.config.namespace=train
spring.cloud.nacos.config.group=DEFAULT_GROUP

3. 在 Nacos 中创建配置文件

  1. 登录 Nacos 控制台(默认地址为 http://localhost:8848/nacos)。

  2. 配置管理 -> 配置列表 中点击 新增配置

  3. 填写配置项:

    • Data ID:格式为 ${prefix}.${file-extension}(如 member-dev.properties)。

    • Group:设置为 DEFAULT_GROUP,与 bootstrap.properties 中一致。

    • 配置内容:写入具体配置内容,例如:

      app.message=Hello from Nacos
      app.version=1.0.0
      
  4. 点击 发布 完成配置创建。

若使用了 spring.profiles.active 指定环境(如 devprod),在 Nacos 中可以创建 my-service-dev.propertiesmy-service-prod.properties 等配置文件。


4. 加入注解读取配置

在代码中通过 @Value 注解或 @ConfigurationProperties 注解来读取 Nacos 配置的值。

使用 @Value 注入单个配置项
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ConfigController {

    @Value("${app.message:Default Message}")
    private String message;

    @GetMapping("/message")
    public String getMessage() {
        return message;
    }
}
使用 @RefreshScope 实现配置的动态刷新

使用 @RefreshScope 注解,当 Nacos 中的配置更新时,Spring Cloud 会自动刷新配置到应用中。

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope
public class ConfigController {

    @Value("${app.message:Default Message}")
    private String message;

    @GetMapping("/message")
    public String getMessage() {
        return message;
    }
}

配置流程总结

  1. 引入依赖:在 pom.xml 中添加 Nacos 配置中心依赖。
  2. 增加配置:将 Nacos 相关配置放在 bootstrap.properties 中,确保优先加载。
  3. 创建配置:在 Nacos 控制台中新增配置文件,并写入配置内容。
  4. 加入注解:使用 @Value 注解读取配置,使用 @RefreshScope 实现配置动态刷新。

注册中心配置流程

  1. 引入依赖:在项目的 pom.xml 文件中加入 Nacos 注册中心的依赖:

    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    dependency>
    
  2. 增加配置项:在 application.propertiesapplication.yml 中配置 Nacos 注册中心的地址和命名空间。

    spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
    spring.cloud.nacos.discovery.namespace=train
    
  3. 完成后,服务可以在启动时自动注册到 Nacos 注册中心,并支持服务的上线、下线以及健康管理等功能。


配置 Gateway + Nacos 支持应用名路由转发

通过 Spring Cloud Gateway 配合 Nacos,实现按应用名进行路由转发,支持负载均衡。

  1. 基本配置:在 Gateway 服务的配置文件中设置网关端口和路由规则。

    server.port=8000
    spring.cloud.gateway.routes[0].id=member
    spring.cloud.gateway.routes[0].uri=http://127.0.0.1:8081
    spring.cloud.gateway.routes[0].predicates[0]=Path=/member/**
    

    在上面的配置中,网关会将 /member/** 路径的请求转发到 http://127.0.0.1:8081

  2. 改为基于负载均衡的配置:通过 lb:// 协议指定应用名(使用 Nacos 提供的服务发现能力),使网关可以根据服务实例进行负载均衡。

    server.port=8000
    spring.cloud.gateway.routes[0].id=member
    spring.cloud.gateway.routes[0].uri=lb://member
    spring.cloud.gateway.routes[0].predicates[0]=Path=/member/**
    

    其中,lb 表示使用 Spring Cloud 自带的负载均衡策略(默认是轮询)。

  3. 引入 Spring Cloud LoadBalancer 依赖:在 pom.xml 中添加负载均衡依赖:

    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-loadbalancerartifactId>
    dependency>
    

    这样,Gateway 将会根据 Nacos 中的 member 服务实例列表进行负载均衡转发。


配置 Feign + Nacos 支持应用名远程调用

通过 Feign 与 Nacos 集成,实现按应用名的远程服务调用,适用于微服务之间的直接通信。

  1. 将服务注册到 Nacos:确保需要调用的服务(例如 batchmember 服务)都已经注册到 Nacos 注册中心。

  2. 配置远程调用接口:在调用方项目中,使用 Feign 定义远程调用接口。以下示例定义了对 member 服务的调用。

    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    
    @FeignClient(value = "member")
    public interface BusinessFeign {
    
        @GetMapping("/member/hello")
        String hello();
    }
    
    • @FeignClient(value = "member"):指定要调用的服务名(member),Feign 会通过 Nacos 获取该服务的实例地址。
    • @GetMapping("/member/hello"):定义服务的具体调用路径。
  3. 引入 Feign 依赖:在项目的 pom.xml 中添加 Feign 和 Nacos 相关的依赖。

    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-openfeignartifactId>
    dependency>
    
  4. 启用 Feign 客户端:在 Spring Boot 主类上添加 @EnableFeignClients 注解,激活 Feign 客户端。

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    
    @SpringBootApplication
    @EnableFeignClients
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    

这样配置后,batch 服务可以通过 BusinessFeign 接口调用 member 服务的 /member/hello 接口,实现按应用名的动态调用。通过 Nacos 的服务发现能力,Feign 可以在 member 服务的多个实例中进行负载均衡调用。

你可能感兴趣的:(spring,boot,后端,java)