SpringCloud、SpringBoot多环境的配置文件active的顺序问题

引言:目前主流框架Spring cloud,Spring boot,此类项目启动时候非常重要的一点就是加载配置文件,bootstrap.yml的加载顺序优先于application.yml这个是一个共识,在开中,我们经常有dev、sit、uat、pro多环境,为了便捷的切换环境,引用相应的配置文件,项目中可能会有多个配置文件,那么他们都分别怎么加载呢?

一 配置文件

1.1 bootstrapt.yml

server:
  port: 8030
  servlet:
    context-path: /api/csdn-boot

management:
  endpoint:
    health:
      show-details: ALWAYS
  server:
    port: 8031
  endpoints:
    web:
      exposure:
        include: '*'
  health:
    sentinel:
      enabled: false

spring:
  profiles:
    active: dev #设置激活
  application:
    name: csdn-boot
  cloud:  #这一块其实是多余的,激活dev,会去读取bootstrapt-dev.yml覆盖下面的
    nacos:
      config:
        server-addr: nacos.csdn-boot:8848
        group: PO_ROS_PLATFORM
        file-extension: yaml
        shared-configs[0]:
          dataId: po_ros-common.yaml
          group: PO_ROS_PLATFORM
          refresh: true
        enabled: true
        max-retry: 10
        ext-config[0]:
          dataId: tibcorv.properties
          group: PO_ROS_PLATFORM
          refresh: true
      discovery:
        server-addr: nacos.csdn-boot:8848
        group: DEFAULT_GROUP
        metadata: {"service.desc": "csdn-boot业务"}
        enabled: true
        service: csdn-boot
    sentinel:
      #取消Sentinel控制台 懒加载
      #eager: true
      enabled: false
      transport:
        dashboard: sentinel.csdn-boot:8080
        port: 8032
        datasource:
          ds1:
          nacos:
          server-addr: nacos.csdn-boot:8848
          dataId: csdn-boot.json
          groupId: PO_ROS_PLATFORM
          ruleType: flow
          dataType: json  

1.2 application.yml

spring:
  #profiles:
    #active: sit   #没有意义的配置
  zipkin:
    base-url: http://
    enabled: false
    discovery-client-enabled: false
    compression:
      enabled: true
    sender:
      type: web
    service:
      name: ${spring.application.name}
  sleuth:
    sampler:
      probability: 1
  devtools:
    restart:
      enabled: true
  #自动化配置 例外处理
  autoconfigure:
    exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    dynamic:
      primary: dataTest # 默认db
      datasource:
        dw4MesTest:
          url: jdbc:oracle:thin:@IP:1521:实例名
          username: 123456
          password: 123
          driver-class-name: oracle.jdbc.OracleDriver
      druid:
        max-active: 50
        max-wait: 10000
        min-idle: 3
        initial-size: 50
  mvc:
    throw-exception-if-no-handler-found: true
  main:
    allow-bean-definition-overriding: true
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB
  redis: #不配置 默认就是localhost
      host: IP
      port: 6379
      password:
      database: 1

mybatis-plus:
  mapper-locations: classpath:/mapper/*Mapper.xml,classpath:/mapper/*/*Mapper.xml,classpath:/mapper/*/*/*Mapper.xml
  #实体扫描,多个package用逗号或者分号分隔
  type-aliases-package: 
  #打印sql日志
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

feign:
  sentinel:
    enabled: true
  httpclient:
    enabled: true
    # 最大连接数,默认:200
    max-connections: 1000
    # 最大路由,默认:50
    max-connections-per-route: 50
    # 连接超时,默认:2000/毫秒
    connection-timeout: 3000
    # 生存时间,默认:900L
    time-to-live: 900
    time-to-live-unit: seconds
  client:
    config:
      default:
        connectTimeout: 3000
        readTimeout: 40000

po_ros:
  gateway:
    enabled: false
    gatewayUrl: http://kong.
  debug: true
  sername: csdn-boot
  #系统标识,读取maven property
  syscode: '@syscode@'
  # swagger配置
  swagger:
    version: 1.0
    title: twork服务
    #rest响应aop
    base-package: cn.companyName
  rest-aop:
    base-packages: cn.companyName
  permission:
    enabled: false
debug: false

1.3 bootstrapt-dev.yml

server:
  port: 8030
  servlet:
    context-path: /api/csdn-boot

management:
  endpoint:
    health:
      show-details: ALWAYS
  server:
    port: 8031
  endpoints:
    web:
      exposure:
        include: '*'
  health:
    redis:
      enabled: false
    sentinel:
      enabled: false

spring:
  #profiles:
    #active: dev  没有意义的配置,如果上面的配置和bootstrapt.yml一直也可以不要,引入的意义一般是nacos地址不同。
  application:
    name: csdn-boot
  cloud:
    nacos:
      config:
        server-addr: nacos.csdn-boot:8848
        group: PO_ROS_PLATFORM
        file-extension: yaml
        shared-configs[0]:
          dataId: po_ros-common.yaml
          group: PO_ROS_PLATFORM
          refresh: true
        enabled: false
        max-retry: 10
      discovery:
        server-addr: nacos.csdn-boot:8848
        group: DEFAULT_GROUP
        metadata: { "service.desc": "csdn-boot业务" }
        enabled: false
        service: csdn-boot
    sentinel:
      #取消Sentinel控制台 懒加载
      #eager: true
      enabled: false
      transport:
        dashboard: sentinel.csdn-boot:8080
        port: 8032
        datasource:
          ds1:
          nacos:
          server-addr: nacos.csdn-boot:8848
          dataId: csdn-boot.json
          groupId: PO_ROS_PLATFORM
          ruleType: flow
          dataType: json

1.4 application-dev.yml

spring:
  #profiles:
    #active: local  #没有意义的配置
  zipkin:
    base-url: http://
    enabled: false
    discovery-client-enabled: false
    compression:
      enabled: true
    sender:
      type: web
    service:
      name: ${spring.application.name}
  sleuth:
    sampler:
      probability: 1
  #自动化配置  例外处理
  autoconfigure:
    exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    dynamic:
      primary: databaseb #默认db
      datasource:
        dw4testdb:
          url: jdbc:oracle:thin:@IP:1521:实例  #dev
          username: 123
          password: 123456
          driver-class-name: oracle.jdbc.OracleDriver
      druid:
        max-active: 50
        max-wait: 10000
        min-idle: 3
        initial-size: 50
  mvc:
    throw-exception-if-no-handler-found: true
  main:
    allow-bean-definition-overriding: true
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB
  #redis 配置
  redis:
    #    host: 127.0.0.1
    host: 10.XX.X.XX
    port: 6379
    password:
    database: 1

mybatis-plus:
  mapper-locations: classpath:/mapper/*Mapper.xml,classpath:/mapper/*/*Mapper.xml,classpath:/mapper/*/*/*Mapper.xml
  #实体扫描,多个package用逗号或者分号分隔
  type-aliases-package: cn.company.package.modules.*.entity
  # 打印sql日志
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

feign:
  sentinel:
    enabled: true
  httpclient:
    enabled: true
    # 最大连接数,默认:200
    max-connections: 1000
    # 最大路由,默认:50
    max-connections-per-route: 50
    # 连接超时,默认:2000/毫秒
    connection-timeout: 3000
    # 生存时间,默认:900L
    time-to-live: 900
    time-to-live-unit: seconds
  client:
    config:
      default:
        connectTimeout: 3000
        readTimeout: 40000

po_ros:
  gateway:
    enabled: false
    gatewayUrl: http://kong.
  debug: true
  sername: csdn-test
  #系统标识,读取maven property
  syscode: '@syscode@'
  # swagger配置
  swagger:
    version: 1.0
    title: twork服务
    #rest响应aop
    base-package: cn.company
  rest-aop:
    base-packages: cn.companyname
  permission:
    enabled: false
debug: false

1.5 POM文件配置

<profiles>
        <profile>
            <!-- 生产环境 -->
            <id>prod</id>
            <properties>
                <profiles.active>prod</profiles.active>
            </properties>
        </profile>
        <profile>
            <!-- 本地开发环境 -->
            <id>dev</id>
            <properties>
                <profiles.active>dev</profiles.active>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <!-- 测试环境 -->
            <id>sit</id>
            <properties>
                <profiles.active>sit</profiles.active>
            </properties>
        </profile>
    </profiles>

1.6 文件结构

二 实践与结论

将bootstrapt-dev.yml的context-path修改为api2/csdn-boot,启动项目发现访问地址为api2/csdn-boot。但是这可能是pom起作用,直接读取了bootstrapt-dev.yml,也可能是读取了bootstrapt.yml来激活的dev配置。

接着我们把bootstrapt.yml删除掉active的标签配置,启动项目显示访问地址为api/csdn-boot,同时报错连接不上application.yml中配置的redis地址。

结论:没有active的配置,并不会读取dev,pom中的配置并不能直接激活dev配置。

bootstrapt.yml--->bootstrapt-dev.yml--->application-dev.yml

完结!!!

<think>好的,用户问的是关于Python安装包时出现的警告信息“Defaulting to user installation because normal site-packages is not writeable”是否可以忽略以及其原因和解决方法。我需要先理解这个警告的含义,然后分析可能的原因,再给出相应的解决方案。 首先,这个警告一般在使用pip安装库时出现,提示用户没有全局site-packages目录的写入权限,所以pip转而在用户目录下安装。用户可能没有管理员权限,或者安装路径的权限设置不正确。这种情况下,pip会自动切换到用户目录,避免权限问题,但可能会导致库安装在用户目录而不是系统目录,可能会影响其他用户或全局环境的使用。 接下来需要确认这个警告是否可以忽略。根据引用中的信息,如果用户只是在自己的环境中使用这些库,并且不需要全局安装,那么这个警告是可以忽略的。但如果有多个用户或项目需要共享库,或者需要将库安装在特定位置,就需要解决权限问题。 然后分析原因。根据引用[2]和[3],主要原因是没有权限写入系统级的site-packages目录。解决方法包括修改目录权限或者使用虚拟环境。用户可能需要以管理员权限运行命令,或者调整文件夹的安全设置,如引用[3]提到的修改Anaconda文件夹权限,或者修改pip的安装路径到有权限的目录。 还要考虑用户是否使用虚拟环境。如果用户是在虚拟环境中安装,应该不会有这个问题,因为虚拟环境有自己的site-packages目录,用户通常有权限写入。所以建议用户使用venv或conda环境来避免权限问题。 最后,总结解决方案:可以忽略警告的情况,需要解决的权限调整方法,以及推荐使用虚拟环境。同时,生成相关问题时要涵盖权限问题、虚拟环境的使用、pip配置调整等。</think>### 警告信息 "Defaulting to user installation..." 的解析 #### 1. **警告是否可以忽略?** - **可以忽略的情况**: 若您仅需在当前用户环境下使用安装的库(如个人开发或测试),该警告无需处理。此时包会安装到用户目录(如 `~/.local/lib/pythonX.X/site-packages/`),不影响系统全局环境[^2][^3]。 - **不可忽略的情况**: 若需全局安装库(如供多用户使用),或遇到路径冲突(如其他工具无法找到用户目录下的包),则需要解决权限问题。 #### 2. **原因分析** - **权限不足**: Python的系统级包安装目录(如 `/usr/lib/pythonX.X/site-packages/` 或 Windows的 `C:\PythonXX\Lib\site-packages`)对当前用户不可写[^1]。 - **环境配置**: 可能因Anaconda等工具安装时未正确配置文件夹权限,或系统策略限制了非管理员用户对系统目录的修改。 #### 3. **解决方案** - **方法1:修改目录权限** - **Windows**:右键点击Python或Anaconda安装目录 → 属性 → 安全选项卡 → 编辑用户权限 → 勾选“完全控制”。 - **Linux/macOS**:使用 `sudo chmod -R 777 /path/to/site-packages` 临时开放权限(需谨慎)。 - **方法2:使用虚拟环境** 通过 `python -m venv myenv` 创建独立环境,避免系统目录权限问题。 - **方法3:调整pip安装路径** 修改 `site.py` 中的 `USER_BASE` 和 `USER_SITE` 路径至有写入权限的目录(参考引用的步骤)。 - **方法4:以管理员身份运行** Windows下右键点击命令行工具 → “以管理员身份运行”,再执行安装命令。 --- ### 示例操作(以Anaconda为例) ```bash # 检查当前pip安装路径 python -m site # 修改site.py中的路径后验证 USER_BASE: '/home/user/custom_path' # 设置为可写目录 USER_SITE: '/home/user/custom_path/lib/pythonX.X/site-packages' ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值