首页 > 其他分享 >spring-cloud 配置管理

spring-cloud 配置管理

时间:2023-10-24 10:45:34浏览次数:27  
标签:String spring 配置 配置管理 private db cloud name

作用:

  1. 实现配置热更新
  2. 实现网关配置热部署

配置模板

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://${db.gulimall.host:192.168.229.128}:${db.gulimall.port:3306}/{$db.gulimall.database:my_db}
    username: ${db.gulimall.user:root}
    password: ${db.gulimall.password:dzjdzj}

${导入时需要额外在配置文件声明的内容:没有声明的话,填值的默认内容}

通常共享的配置为shared-开头

实现从nacos导入配置

使用springcloud与springboot的启动流程有所不同,所以cloud统一结合了一下

不一定非要bootstrap,使用application.properties也可以,关键在于这个流程中进行的顺序(只要别配置nacos到yml文件即可)

导入依赖

<!-- nacos配置管理依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2021.0.5.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>3.0.3</version>
        </dependency>

配置模板

spring:
  application:
    name: hhhh
  profiles:
    active: dev #为什么这个和application name也要放这里?下面有填坑
  cloud:
    nacos:
      config:
        shared-configs:
          - dataId: shared-jdbc.yaml
        file-extension: yaml
        server-addr: 192.168.229.128:8848

关于dataId,其实可以配置的不止dataId,共有以下三个

private String dataId;
        private String group;
        private boolean refresh;

配置热更新

之前配置的那些mybatis,mysql都不支持热更新

这是相当合理的行为:

  1. springboot会生成不少组件,如果这些支持热更新,那么需要他们把对应bean的属性更改,但是他们并没有这样
  2. 通常这些东西实现热更新是高风险行为,如果真该热更新,应该停服重启

真正该热更新的是我们业务中的需要热更新的业务

如:购物车的存储上限

需要配置一个配置类

@Data
@Component
@ConfigurationProperties(prefix="db.gulimall")
public class CartProperties{
    private int maxSize;//最好与配置文件同名,大概通过get/set设置,这是规范
}

填坑为什么还要application name 和 profile active

因为在连上nacos后,启动项目会自动找application name-active.yaml和application name.yaml来读取配置

所以nacos配置某服务特有配置文件时

要按照对应的规格application name-profile active.yaml

动态路由

正常情况下,路由不需要实现热更新,如果要实现,由于是springcloud的实现,所以我们需要额外处理业务

注意点

  1. nacos关于网关的配置只支持JSON形式
[
    {
    	"id":"item",
        "predicates":[{
            "name":"Path",
            "args":{"genkey 0":"/items/**","genkey 1":"search/**"}
        }],
        "filters":[],
        "uri":"lb;//item-service"
	},
]
  1. 使用cloud route更新的RouteDefinitionWriter写入以及删除机制(注入RouteDefinitionWriter)
    1. 他插入的模式不太一样,需要用到Mono,Mono类似一个容器,然后just是发射的功能/意思,subscribe是订阅
  2. 在更新时,要先删除旧有的routeDifinition
  3. 需要使用到NacosConfigManager组件来定义监听器
  4. ctrl+shift+U:转为大写
  5. 还要@PostConstruct在组件注入后再调用该方法生成监听器

模板:

@Component
@RequiredArgsConstructor
public class RouteConfigLoader {
    private final NacosConfigManager configManager;
    private final static String DATA_ID="gateway.json";
    private final static String GROUP="DEFAULT";
    private final RouteDefinitionWriter writer;
    private Set<String> oldIds=new HashSet<>();
    @PostConstruct
    public void routeInit() throws NacosException {
        String configInfo = configManager.getConfigService().getConfigAndSignListener(DATA_ID, GROUP, 5000, new Listener() {

            @Override
            public Executor getExecutor() {
                return Executors.newSingleThreadExecutor();
            }

            @Override
            public void receiveConfigInfo(String configInfo) {
                updateRoutes(configInfo);
            }
        });
        updateRoutes(configInfo);
    }

    private void updateRoutes(String configInfo) {
        List<RouteDefinition> routeDefinitions = JSONUtil.toList(configInfo, RouteDefinition.class);
        //删除旧有的routes
        for (String oldId : oldIds) {
            writer.delete(Mono.just(oldId)).subscribe();//删除
        }
        //新增目前的routes
        oldIds.clear();
        for (RouteDefinition routeDefinition : routeDefinitions) {
            writer.save(Mono.just(routeDefinition)).subscribe();//添加进去
            oldIds.add(routeDefinition.getId());
        }
    }
}

标签:String,spring,配置,配置管理,private,db,cloud,name
From: https://www.cnblogs.com/seamount3/p/17784197.html

相关文章

  • Gradle构建SpringBoot单模块项目
    Gradle构建SpringBoot单模块项目方式Ⅰ:未基于:GradleWrapper方式Ⅱ:(推荐使用)GradleWrapper【可以不安装Gradle、统一Gradle的版本】——包括Maven也是一样的可以用Wrapper的方式版本:JDK8+SpringBoot2.7.15+Gradle8.x本篇主要讲实现。Gradle与Maven的区别自己去看Ⅰ、普......
  • Spring MVC入口Servlet详解(HttpServletBean,FrameworkServlet,DispatcherServlet )
    SpringMVC中DispatcherServlet前端控制器是web服务器的入口,那么它是怎么样进行初始化的,是怎么样进行工作?继承关系1.HttpServletBean主要做一些初始化的工作,将web.xml中配置的参数设置到Servlet中。比如servlet标签的子标签init-param标签中配置的参数。2.FrameworkServlet将Serv......
  • 如何使用Java Spring Boot 创建一个微服务项目 一?
    如何使用JavaSpringBoot创建一个微服务项目一?微服务现在更流行。它们可以用任何语言编写。在这篇文章中,让我们看看SpringBoot微服务。在本文中,我们看到一个基础项目currency-exchange-sample-service,它具有业务逻辑,并且可以在另一个项目 currency-conversion-sample-service ......
  • 如何使用Java Spring Boot 创建一个微服务项目 二?
    如何使用JavaSpringBoot创建一个微服务项目二?上一篇我们已经链接了如何使用JavaSpringBoot创建一个微服务项目一?这一篇我们接着实现第二部分微服务2:货币兑换样本服务这也是一个maven项目pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apac......
  • 8、SpringMVC之RESTful案例
    阅读本文前,需要先阅读SpringMVC之RESTful概述8.1、前期工作8.1.1、创建实体类Employeepackageorg.rain.pojo;importjava.io.Serializable;/***@authorliaojy*@date2023/10/19-21:31*/publicclassEmployeeimplementsSerializable{privateInte......
  • spring-cloud-starter-alibaba-nacos-discovery 配置信息
    spring-cloud-starter-alibaba-nacos-discovery1.spring-config-metadata.json{"groups":[{"name":"management.endpoint.nacosdiscovery","type":"com.alibaba.cloud.nacos.endpoint.NacosDiscovery......
  • Spring MVC
    一、SpringMVC子父容器问题因为SpringMVC属于Spring的子框架,所以SpringMVC中可以使用Spring框架的全部内容。Spring官方为SpringMVC专门定义了一个容器,这个容器里面放SpringMVC中全部Bean,且这个容器属于Spring容器的子容器。有这样的一个规定:SpringMVC子容器可以调用Spr......
  • SpringBoot上传图片到指定目录并回显
    一、概述案例:1.利用SpringBoot写一个后台2.接收前端传递过来的图片并保存到服务器。3.前端可以通过url访问上传过的图片步骤:1.写一个FileController专门用来接收前端提交的图片文件,并把图片保存到服务器的指定位置2.配置W......
  • SpringBoot-自动配置原理
    导入start就会导入autoconfigure包autoconfigure包下面的META-INF/spring/org.springframe.boot.autoconfigure.AutoConfigation.imports文件存放了所有的xxxAutoConfigation自动配置类@EnableAutoConfigation注解,会把上面文件中的所有的自动配置类都导入进来,按需要加载。xxxA......
  • Spring Data JPA : 查-分页排序
    1.分页查询 pageNumber是从0开始,pageNumber=0,pageSize=3就是获取前3条参考创建分页Pageable变量创建Pageable对象,再查询importjava.util.List;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.domain.Page;import......