05_Nacos-config配置中心介绍

本文介绍如何使用Nacos作为配置中心,实现Spring Cloud应用的外部配置管理。通过具体步骤演示了搭建Nacos环境、创建Maven项目并配置依赖、编写启动类及配置文件等过程。此外还介绍了Nacos权限管理、配置文件优先级设置及动态刷新机制。

Nacos-config配置中心介绍

Nacos提供用于存储配置和其他元数据的 key-value存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用Sping Cloud Alibaba Nacos Config,您可以在nacos server集中管理你Spring Cloud应用的外部属性配置。

在这里插入图片描述

1.维护性 2. 时效性 3.安全性

Nacos-config配置管理界面

界面化操作

在这里插入图片描述

Nacos-config权限管理

启动权限:修改application.properties

nacos.core.auth.enabled=true

Nacos-config Client读取配置

1.启动nacos 环境搭建在这里插入图片描述

1.创建maven项目config-nacos,导入依赖

<dependencies>
    <!--   nacos config 依赖 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
</dependencies>

2.编写启动类

@SpringBootApplication
public class ConfigApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(ConfigApplication.class, args);
        String userName = applicationContext.getEnvironment().getProperty("user.name");
        String userAge = applicationContext.getEnvironment().getProperty("user.age");
        System.err.println("user.name:"+userName+";age: "+userAge);
    }
}

3.配置文件 application.yml

server:
  port: 8050

在运行此 Example之前,必须使用bootstrap.properties(yml)配置文件来配置Nacos Server地址,例如:

配置文件bootstrap.yml

spring:
  application:
    #会自动根据服务名拉取Dataid对应的配置文件,如果不一致,需要手动指定Dataid
    name: com.tian.order
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      username: nacos
      password: nacos
      config:
        namespace: public

4.启动控制台输出

user.name:田小泽;age: 22

一旦更改管理界面的信息,那么就会即刻感知

Nacos-config—其他扩展配置

spring:
  application:
    #会自动根据服务名拉取Dataid对应的配置文件,如果不一致,需要手动指定Dataid
    name: com.tian.order
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      username: nacos
      password: nacos
      config:
        namespace: public  # 默认就是public不用配置省的一直打印信息
        #nacos客户端不配置 默认是properties文件扩展名
        #file-extension: yaml  用这个修改默认配置
        #group: tian #更加细分
        shared-configs:   # 手动指定Dataid
          - data-id: com.tian.common01.properties  #相当于下标0
            refresh: false # 不动态感知 修改配置文件它不知道 一般不改,默认为true
          - data-id: com.tian.common02.properties  #相当于下标1
            refresh: true
        extension-configs[0]:
          data-id: com.tian.common03.properties
          refresh: true

# 配置文件的优先级(优先级大的会覆盖优先级小的,并且会形成互补)
#profile > 默认配置文件 >extension-configs(下标越大优先级越大) > shared-configs(下标越大优先级越大)

Nacos-config—@RefreshScope

@Value注解可以获取到配置中心的值,但是无法动态感知修改后的值,需要利用@RefreshScope注解

@RestController
@RefreshScope
public class TestController{
    @value("${common.age}")
    private String age;
    
    @GetMapping("/common")
    public String hello(){
        return age;
    }
    
}
<think>我们之前在前端项目中集成了Nacos,但是出现了错误:'index.js:12 Uncaught TypeError: Class extends value undefined is not a constructor or null' 这个错误通常发生在类继承时,父类未定义或不是构造函数。在Nacos SDK的使用中,可能是由于以下原因: 1. SDK的引入方式不正确,可能是由于版本问题或打包问题。 2. 在浏览器环境中使用了Node.js的模块,而Nacos的Node.js SDK主要是为服务端设计的,不能直接在浏览器中运行。 因此,我们需要调整方案:使用Nacos的JS客户端(适用于浏览器)或者通过后端代理获取配置。 考虑到ABP VNext Pro的前端是Vue3(基于Vite)项目,我们有两种方案: 方案一:使用Nacos官方提供的JS客户端(浏览器适用) 官方提供了nacos-js适配浏览器环境,但注意文档和兼容性。 方案二:通过前端项目配置代理,将Nacos的配置请求转发到后端,由后端服务去Nacos获取配置,然后前端调用后端API获取配置。 此方案更安全,且避免前端直接连接Nacos(避免暴露Nacos地址和认证信息)。 鉴于ABP VNext Pro框架通常有后端服务,且安全考虑,推荐方案二。但用户要求前端直接使用nacos,所以这里先给出方案一的修改方法(如果一定要前端直连Nacos)。 但是,根据错误信息,很可能是由于在浏览器中直接使用Node.js模块导致的。因此,我们尝试更换为浏览器可用的Nacos客户端。 步骤调整: 1. 安装适用于浏览器的Nacos客户端(nacos-js): ```bash npm install nacos-js ``` 2. 修改main.ts中的Nacos初始化代码: ```typescript import { NacosConfigClient } from 'nacos-js'; // 注意这里改为nacos-js const initNacosConfig = async () => { // 创建客户端 const configClient = new NacosConfigClient({ serverAddr: '127.0.0.1:8848', // 服务器地址 namespace: 'public', // 命名空间 }); // 获取配置 try { const content = await configClient.getConfig('abp-vnext-pro-frontend', 'DEFAULT_GROUP'); const config = JSON.parse(content); // 合并到环境变量 window.__env_config = { ...window.__env_config, ...config, }; } catch (err) { console.error('加载Nacos配置失败', err); // 回退到本地配置 } }; ``` 3. 注意:nacos-js在浏览器中使用时,可能会有跨域问题。需要在Nacos服务端配置CORS(或者通过代理解决)。 如果仍然遇到问题,我们可以考虑使用方案二(通过后端代理),步骤如下: 步骤二(推荐方案): 1. 在后端(ABP项目)中创建一个控制器,用于获取Nacos配置(注意安全,只允许前端获取必要的配置,并且需要认证)。 2. 前端在启动时调用这个后端API获取配置。 这里我们给出方案二的具体实现(更安全、更符合ABP框架结构): 步骤: 1. 后端创建配置接口(示例为C#): 在ABP后端项目中创建`NacosConfigController`: ```csharp using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Nacos.AspNetCore.V2; namespace MyProject.Web.Controllers; [AllowAnonymous] // 根据实际情况设置权限 [Route("api/nacos-config")] public class NacosConfigController : MyProjectController { private readonly INacosConfigService _configService; public NacosConfigController(INacosConfigService configService) { _configService = configService; } [HttpGet] public async Task<IActionResult> GetConfig(string dataId, string group = "DEFAULT_GROUP") { // 这里可以加入权限验证,确保前端只能获取特定配置 var config = await _configService.GetConfigAsync(dataId, group); return Ok(config); } } ``` 2. 前端修改:调用后端接口获取配置 修改`main.ts`中的`initNacosConfig`函数: ```typescript const initNacosConfig = async () => { try { // 使用axios调用后端接口 const response = await axios.get('/api/nacos-config', { params: { dataId: 'abp-vnext-pro-frontend', group: 'DEFAULT_GROUP' } }); const config = response.data; window.__env_config = { ...window.__env_config, ...config, }; } catch (error) { console.error('获取配置失败', error); // 回退处理 } }; ``` 3. 注意:如果前端和后端分离部署,需要配置代理或CORS。 由于错误是直接在前端使用Node.js SDK引起的,所以更换为浏览器专用SDK(方案一)或改用后端代理(方案二)应该可以解决。 如果选择方案一(使用nacos-js)仍然出现类似错误,可能是由于打包工具(Vite)对某些模块的处理问题。可以检查以下几点: - 确保使用的是`nacos-js`而不是`nacos-nodejs-sdk` - 检查`node_modules`中是否正确安装了`nacos-js` - 查看浏览器控制台具体的错误栈,定位到具体是哪一行代码 如果问题仍然存在,建议采用方案二(后端代理),因为: 1. 避免浏览器直接连接Nacos(安全考虑) 2. 避免跨域问题 3. 后端可以缓存配置,减少Nacos压力 请根据实际情况选择方案。 </think>针对 ABP VNext Pro vben2.8 前端集成 Nacos 时出现的 `index.js:12 Uncaught TypeError: Class extends value undefined is not a constructor or null` 错误,以下是完整的解决方案: ### 错误原因分析 该错误通常是由于以下原因导致: 1. **SDK 兼容性问题**:浏览器环境无法直接使用 Node.js SDK 2. **依赖引用错误**:使用了错误的 Nacos 客户端包 3. **构建配置缺失**:缺少必要的 polyfill 配置 4. **版本冲突**:Nacos SDK 与其他依赖存在版本冲突 --- ### 解决方案 #### 1. 替换为浏览器兼容的 SDK ```bash # 移除 Node.js 版本的 SDK npm uninstall nacos-nodejs-sdk # 安装浏览器兼容版本 npm install nacos-js@1.0.2 ``` #### 2. 修改 Nacos 初始化代码 (`/src/main.ts`) ```typescript import { createApp } from 'vue'; import App from './App.vue'; // 替换为浏览器兼容的导入方式 import Nacos from 'nacos-js'; const initNacosConfig = async () => { try { // 创建浏览器兼容的配置客户端 const configClient = new Nacos({ serverAddr: '127.0.0.1:8848', namespace: 'public' }); // 异步获取配置 const configContent = await configClient.getConfig( 'abp-vnext-pro-frontend', 'DEFAULT_GROUP' ); // 添加类型检查防止解析错误 if (typeof configContent === 'string') { const globalConfig = JSON.parse(configContent); window.__env_config = Object.assign( window.__env_config || {}, globalConfig ); } } catch (error) { console.error('[Nacos] 配置加载失败', error); // 降级到本地配置 window.__env_config = window.__env_config || {}; } }; // 确保在应用初始化前加载配置 async function bootstrap() { await initNacosConfig(); // ...其他初始化代码 } ``` #### 3. 添加必要的 polyfill (`/vite.config.ts`) ```typescript import { defineConfig } from 'vite'; import polyfills from '@esbuild-plugins/node-modules-polyfill'; export default defineConfig({ plugins: [ polyfills({ // 解决 Node.js 模块在浏览器的兼容问题 globals: { process: true, buffer: true } }) ], resolve: { alias: { // 强制指向浏览器兼容版本 'nacos-nodejs-sdk': 'nacos-js' } } }); ``` #### 4. 添加全局类型声明 (`/src/types/global.d.ts`) ```typescript declare global { interface Window { __env_config: Record<string, any>; } } ``` #### 5. 关键错误处理增强 在 `/src/utils/env.ts` 中添加安全保护: ```typescript export const env = { ...(import.meta.env || {}), ...((window && window.__env_config) || {}), } as Record<string, string>; ``` --- ### 配置验证步骤 1. **检查 Nacos 控制台配置**: ```json { "VITE_PORT": 3100, "VITE_GLOB_API_URL": "/api" } ``` 2. **浏览器控制台验证**: ```javascript console.log('当前环境变量:', window.__env_config); // 预期输出: {VITE_PORT: 3100, VITE_GLOB_API_URL: "/api"} ``` 3. **依赖版本验证**: ```json // package.json "dependencies": { "nacos-js": "^1.0.2", "@esbuild-plugins/node-modules-polyfill": "^0.1.4" } ``` --- ### 常见问题排查表 | 现象 | 可能原因 | 解决方案 | |------|----------|----------| | 白屏无错误 | 配置加载阻塞渲染 | 在 `router.beforeEach` 添加配置等待逻辑 | | 部分配置未生效 | 变量名大小写不匹配 | 检查 Nacos 配置的键名是否全大写 | | 热更新失效 | 监听未正确配置 | 使用 `configClient.subscribe()` 添加监听回调 | | 生产环境报错 | 缺少 HTTPS 配置 | 设置 `serverAddr: 'https://nacos.yourdomain.com:8848'` | --- ### 相关问题 1. 如何在前端项目中安全存储 Nacos 的认证凭据?[^1] 2. 当 Nacos 配置变更时,如何实现前端页面的自动刷新? 3. 在多环境部署中,如何动态切换 Nacos 的命名空间? 4. ABP VNext Pro 后端服务如何与前端共享 Nacos 配置项? 5. 如何实现 Nacos 配置加载失败时的优雅降级方案?[^2] [^1]: ABP 安全框架文档: [凭据管理最佳实践](https://docs.abp.io/en/abp/latest/Security) [^2]: Nacos 官方故障处理指南: [客户端错误代码表](https://nacos.io/zh-cn/docs/error-code.html)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值