2026/2/7 7:22:23
网站建设
项目流程
网站开发文档总结,宁波本地网站排行,购物网站建设开发费用分析,网站推广的方法有1. Nacos 作为服务注册中心 (Service Registry)
1.1 核心原理
Nacos 作为注册中心#xff0c;主要维护一张“服务列表”。
服务注册 (Registration): 服务提供者#xff08;Provider#xff09;启动时#xff0c;会通过 REST API 发送请求向 Nacos Server 注册自己的信息主要维护一张“服务列表”。服务注册 (Registration):服务提供者Provider启动时会通过 REST API 发送请求向 Nacos Server 注册自己的信息IP、端口、服务名。心跳机制 (Heartbeat):提供者会定时默认 5 秒发送心跳包。如果 Nacos 超过 15 秒没收到心跳会将实例设为不健康超过 30 秒则剔除。服务发现 (Discovery):服务消费者Consumer从 Nacos 拉取服务列表并缓存在本地。CAP 理论:Nacos 支持AP(可用性优先默认) 和CP(一致性优先) 模式的切换。1.注册 发送心跳2.订阅 拉取列表3.推送变更4.远程调用(RPC/REST)服务提供者 ProviderNacos Server服务消费者 Consumer1.2 Java 代码实战 (Spring Boot 3.0)第一步引入依赖 (pom.xml)在使用 Spring Boot 3.x 时需配合 Spring Cloud Alibaba 2022.0.0.0 或更高版本。dependenciesdependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependency/dependencies第二步配置文件 (application.yml)server:port:8081spring:application:name:nacos-provider-demo# 服务名称非常重要cloud:nacos:discovery:server-addr:127.0.0.1:8848# Nacos Server 地址第三步启动类与测试Spring Boot 3.x 中EnableDiscoveryClient注解由自动化配置处理通常不再需要显式添加但写上也无妨。EnableDiscoveryClientSpringBootApplicationpublicclassProviderApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ProviderApplication.class,args);}}启动后在 Nacos 控制台的“服务管理 - 服务列表”中即可看到nacos-provider-demo。2. Nacos 作为配置中心 (Config Center)2.1 核心原理在微服务架构中几十个服务的配置文件如果都散落在 Jar 包里修改配置需要重启非常麻烦。Nacos 提供了集中式管理和动态刷新。Data ID:Nacos 组织配置的核心通常格式为${spring.application.name}-${spring.profiles.active}.${file-extension}(例如services-order-dev.yaml)。长轮询 (Long Polling):客户端不单纯是拉取配置。客户端会发起一个长连接请求Nacos 收到请求后若配置无变化会 hold 住请求默认 30秒一旦配置发生变化立即返回最新配置。这保证了配置更新的实时性。动态刷新:结合 Spring 的RefreshScope可以在不重启应用的情况下更新内存中的变量。2.2 Java 代码实战 (Spring Boot 3.0 重点)第一步引入依赖在之前的pom.xml基础上添加dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactId/dependency第二步配置文件 (application.yml)直接在application.yml中使用import语法。spring:profiles:active:devapplication:name:service-ordercloud:nacos:server-addr:127.0.0.1:8848config:import-check:enabled:falsenamespace:${spring.profiles.active:dev}#指定命名空间server:port:8080---spring:config:import:-nacos:common.properties?grouporder# nacos:{DataId}?group{Group}activate:on-profile:dev---spring:config:import:-nacos:common.properties?grouporderactivate:on-profile:prod第三步在 Nacos 控制台添加配置登录 Nacos 控制台。进入“配置管理 - 配置列表”。点击“”号新增配置新建命名空间Group: 填 orderData ID:common.properties(必须与上面 import 的逻辑匹配)配置格式: Properties配置内容:# 订单超时时间 order.timeout5000发布。第四步Java 代码读取与动态刷新为了演示不重启更新配置我们需要使用RefreshScope。packagecom.example.demo.controller;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.cloud.context.config.annotation.RefreshScope;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;RestControllerRefreshScope// 关键注解当 Nacos 配置变更时动态刷新此类中的 Value 属性publicclassConfigController{Value(${user.name})privateStringuserName;Value(${user.age})privateIntegeruserAge;GetMapping(/config/info)publicStringgetConfigInfo(){returnUser: userName, Age: userAge;}}3. 配置优先级在 Spring Boot 3 Nacos 中配置的加载是有严格顺序的。原则是“越具体优先级越高”。假设服务名是service-order环境是dev。以下是配置生效的优先级从高到低上面的覆盖下面的优先级配置文件 (Data ID)说明NO.1 (最高)service-order-dev.yaml精确匹配既指定了服务名又指定了环境 profile。这是主配置。NO.2service-order.yaml服务默认只指定了服务名没指定环境。通常放该服务所有环境通用的配置。NO.3common.properties(import)扩展/共享配置通过spring.config.import引入的外部配置。NO.4 (最低)本地application.yml项目 Jar 包里的本地配置。这两个是 Nacos 配置中心进阶使用的两个重要场景。ConfigurationProperties属于Spring Boot 原生方式。用于将一组配置批量绑定到 Java Bean 中。在 Spring Cloud 环境下它自带“自动刷新”光环比Value更强大、更优雅。NacosConfigManager监听属于Nacos SDK 底层方式。当你不仅仅想更新变量还想在配置变化时触发一段业务逻辑比如清理本地缓存、调整线程池大小、打印日志就需要用到它。下面我基于Spring Boot 3.0为你详细介绍原理和代码。4. ConfigurationProperties 批量绑定与自动刷新4.1 原理批量绑定Spring Boot 通过扫描prefix前缀将配置文件Nacos 里的 YAML/Properties中的值自动映射到 Bean 的属性上。自动刷新这与Value不同。使用Value必须加RefreshScope才能动态刷新。使用ConfigurationProperties的 BeanSpring Cloud 有一个专门的ConfigurationPropertiesRebinder监听器。当 Nacos 配置发生变化发出RefreshEvent时这个监听器会自动销毁旧 Bean重新绑定生成新 Bean。4.2 Java 代码实战场景我们在 Nacos 的service-order-dev.yaml中配置了一组订单的超时规则。Nacos 配置内容order:rules:connect-timeout:2000read-timeout:5000auto-confirm-days:7Java 代码 (OrderProperties.java)packagecom.example.order.config;importlombok.Data;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.stereotype.Component;Data// 必须要有 Setter 方法Spring 才能注入值Component// 注册为 Spring BeanConfigurationProperties(prefixorder.rules)// 指定前缀publicclassOrderProperties{/** * 连接超时时间 * 对应 YAML 中的 order.rules.connect-timeout */privateIntegerconnectTimeout;/** * 读取超时时间 */privateIntegerreadTimeout;/** * 自动确认收货天数 */privateIntegerautoConfirmDays;}测试控制器RestControllerpublicclassTestController{AutowiredprivateOrderPropertiesorderProperties;GetMapping(/props)publicOrderPropertiesgetProps(){// 直接返回对象当 Nacos 修改配置后再次访问这里值会自动变returnorderProperties;}}实操验证启动服务访问/props看到connectTimeout是 2000。在 Nacos 控制台修改为 9999发布。不用重启再次访问/props你会发现值已经变成了 9999。5. NacosConfigManager 监听配置变化5.1 原理有时候配置变了我们不只是想改变变量的值我们想执行代码。例如useLocalCache开关从true变成了false我不仅要更新变量我还需要立即清空内存里的 Map。这时候仅仅通过注入属性是不够的。NacosConfigManager是 Spring Cloud Alibaba 对 Nacos 原生 SDK (ConfigService) 的封装。通过它我们可以注册一个监听器 (Listener)当 Nacos 服务端推送配置变更时客户端的回调方法receiveConfigInfo会被触发。5.2 Java 代码实战场景监听common.properties文件的变化一旦变化打印日志并执行自定义逻辑。packagecom.example.order.listener;importcom.alibaba.cloud.nacos.NacosConfigManager;importcom.alibaba.nacos.api.config.listener.Listener;importcom.alibaba.nacos.api.exception.NacosException;importjakarta.annotation.PostConstruct;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;importjava.util.concurrent.Executor;Slf4jComponentpublicclassCustomConfigListener{AutowiredprivateNacosConfigManagernacosConfigManager;// 假设我们要监听的 DataId 和 GroupprivatefinalStringdataIdcommon.properties;privatefinalStringgrouporder;PostConstructpublicvoidinit()throwsNacosException{// 获取原生的 ConfigServicenacosConfigManager.getConfigService().addListener(dataId,group,newListener(){OverridepublicExecutorgetExecutor(){// 返回 null 表示使用 Nacos 内部的主线程来执行回调// 如果逻辑很复杂建议自定义线程池returnnull;}OverridepublicvoidreceiveConfigInfo(StringconfigInfo){// configInfo 就是变化后最新的配置内容字符串形式log.info(【监听到配置变化】DataID: {}, Group: {},dataId,group);log.info(新配置内容: \n{},configInfo);// TODO: 在这里执行你的业务逻辑// 比如refreshLocalCache();// 比如updateThreadPoolSize();}});}}5.3 进阶监听特定的值 (结合 JSON/YAML 解析)receiveConfigInfo返回的是整个文件的字符串。如果你只想监听timeout这一项的变化你需要自己解析字符串。// 伪代码示例publicvoidreceiveConfigInfo(StringconfigInfo){PropertiespropsnewProperties();props.load(newStringReader(configInfo));// 解析配置StringnewTimeoutprops.getProperty(timeout);if(!newTimeout.equals(currentTimeout)){log.info(检测到 timeout 发生改变执行更新逻辑...);currentTimeoutnewTimeout;}}