首页 > 编程语言 >通过Java修改consul配置(保留注释、保留缩进)

通过Java修改consul配置(保留注释、保留缩进)

时间:2024-04-18 15:58:58浏览次数:22  
标签:yamlContent Java String Pattern consul 保留 currentYaml regexBuilder append

 

 

 

 

 

  直接上代码了,找了很久也没找到保留注释的三方包,snakeyaml 的缩进一直也有问题,就自己写了个正则方式的

  consul也没有相关接口,只接受整个的

  传key和value,替换相应value值,

  大佬有更好的方法希望能告诉我

<dependency>
    <groupId>com.orbitz.consul</groupId>
    <artifactId>consul-client</artifactId>
    <version>1.5.3</version>
</dependency>

  

 

 

package com.qpaas.migration;

import com.orbitz.consul.Consul;
import com.orbitz.consul.KeyValueClient;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main3 {


    public static void main(String[] args) {
        String consulUrl = "xx";
        String consulKey = "xx";
//        String propertyKey = "server.port";
//        String newValue = "8081";
//        String yamlContent = "server:\n  port: 28082 #xxxx\nspring:\n  mail:\n    host: 3333\n    username: 1111\n    password: 222";
        try {
            // 构建Consul客户端
            Consul consul = Consul.builder().withUrl(consulUrl).build();
            KeyValueClient kvClient = consul.keyValueClient();

            // 读取当前的YAML值
            String currentYaml = kvClient.getValueAsString(consulKey)
                    .orElseThrow(() -> new RuntimeException("无法找到配置项:" + consulKey));


            // 示例1: 修改server.port的值为9091
            String keyToFind1 = "server.port";
            String newValue1 = "9091";
            currentYaml = updateYml(keyToFind1, newValue1, currentYaml);


            String keyToFind2 = "spring.mail.host";
            String newValue2 = "xxxxx";
            currentYaml = updateYml(keyToFind2, newValue2, currentYaml);

            // 输出更新后的YAML内容
            System.out.println(currentYaml);

            // 更新Consul中的值
            kvClient.putValue(consulKey, currentYaml);

            System.out.println("Value updated successfully!");

        } catch (Exception e) {
            System.err.println("An error occurred while updating the value in Consul: " + e.getMessage());
        }
    }



    public static String updateYml(String keyToFind, String newValue, String yamlContent) {
        String pathRegex1 = keyToRegex(keyToFind);

        Pattern pathPattern1 = Pattern.compile(pathRegex1, Pattern.MULTILINE);
        Matcher pathMatcher1 = pathPattern1.matcher(yamlContent);

        String pathRegex2 = buildRegexForKey(keyToFind);
        Pattern pathPattern2 = Pattern.compile(pathRegex2, Pattern.MULTILINE);
        Matcher pathMatcher2 = pathPattern2.matcher(yamlContent);

        if (pathMatcher1.find() && pathMatcher2.find()) {
            String replacement1 = pathMatcher2.group(0);
            String replacement2 = pathMatcher1.group(0) + " " + newValue;

            yamlContent = yamlContent.replaceFirst(replacement1, replacement2);
            System.out.println("The YAML content has been updated. The value of " + keyToFind + " is now: " + newValue);
        } else {
            System.out.println("The key " + keyToFind + " was not found in the YAML content.");
        }
        return yamlContent;
    }

    public static String keyToRegex(String key) {
        String[] parts = key.split("\\.");
        StringBuilder regexBuilder = new StringBuilder();
        for (String part : parts) {
            regexBuilder.append("\\b").append(part).append("\\b\\s*:"); // Match the key and following colon
            if (!part.equals(parts[parts.length - 1])) {
                regexBuilder.append("\\s*\\n\\s*"); // Add newline and indentation for all parts except the last one
            }
        }
        return regexBuilder.toString();
    }
    private static String buildRegexForKey(String key) {
        String[] parts = key.split("\\.");
        StringBuilder regexBuilder = new StringBuilder();

        // 匹配每个部分的键和冒号,考虑到YAML的缩进
        for (String part : parts) {
            if (regexBuilder.length() > 0) {
                // 如果不是第一个部分,添加缩进匹配(两个空格)
                regexBuilder.append("\\n\\s*");
            }
            regexBuilder.append("\\b").append(part).append(":\\s*");
        }
        regexBuilder.append("[^\\s\\n]+"); // 匹配值直到下一个空白字符或换行符

        return regexBuilder.toString();
    }
}


  

 

 

 

 

 


package com.qpaas.migration; import com.orbitz.consul.Consul; import com.orbitz.consul.KeyValueClient; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main3 { public static void main(String[] args) { String consulUrl = "xx"; String consulKey = "xx"; // String propertyKey = "server.port"; // String newValue = "8081"; // String yamlContent = "server:\n port: 28082 #xxxx\nspring:\n mail:\n host: 3333\n username: 1111\n password: 222"; try { // 构建Consul客户端 Consul consul = Consul.builder().withUrl(consulUrl).build(); KeyValueClient kvClient = consul.keyValueClient(); // 读取当前的YAML值 String currentYaml = kvClient.getValueAsString(consulKey) .orElseThrow(() -> new RuntimeException("无法找到配置项:" + consulKey)); // 示例1: 修改server.port的值为9091 String keyToFind1 = "server.port"; String newValue1 = "9091"; currentYaml = updateYml(keyToFind1, newValue1, currentYaml); String keyToFind2 = "spring.mail.host"; String newValue2 = "xxxxx"; currentYaml = updateYml(keyToFind2, newValue2, currentYaml); // 输出更新后的YAML内容 System.out.println(currentYaml); // 更新Consul中的值 kvClient.putValue(consulKey, currentYaml); System.out.println("Value updated successfully!"); } catch (Exception e) { System.err.println("An error occurred while updating the value in Consul: " + e.getMessage()); } } public static String updateYml(String keyToFind, String newValue, String yamlContent) { String pathRegex1 = keyToRegex(keyToFind); Pattern pathPattern1 = Pattern.compile(pathRegex1, Pattern.MULTILINE); Matcher pathMatcher1 = pathPattern1.matcher(yamlContent); String pathRegex2 = buildRegexForKey(keyToFind); Pattern pathPattern2 = Pattern.compile(pathRegex2, Pattern.MULTILINE); Matcher pathMatcher2 = pathPattern2.matcher(yamlContent); if (pathMatcher1.find() && pathMatcher2.find()) { String replacement1 = pathMatcher2.group(0); String replacement2 = pathMatcher1.group(0) + " " + newValue; yamlContent = yamlContent.replaceFirst(replacement1, replacement2); System.out.println("The YAML content has been updated. The value of " + keyToFind + " is now: " + newValue); } else { System.out.println("The key " + keyToFind + " was not found in the YAML content."); } return yamlContent; } public static String keyToRegex(String key) { String[] parts = key.split("\\."); StringBuilder regexBuilder = new StringBuilder(); for (String part : parts) { regexBuilder.append("\\b").append(part).append("\\b\\s*:"); // Match the key and following colon if (!part.equals(parts[parts.length - 1])) { regexBuilder.append("\\s*\\n\\s*"); // Add newline and indentation for all parts except the last one } } return regexBuilder.toString(); } private static String buildRegexForKey(String key) { String[] parts = key.split("\\."); StringBuilder regexBuilder = new StringBuilder(); // 匹配每个部分的键和冒号,考虑到YAML的缩进 for (String part : parts) { if (regexBuilder.length() > 0) { // 如果不是第一个部分,添加缩进匹配(两个空格) regexBuilder.append("\\n\\s*"); } regexBuilder.append("\\b").append(part).append(":\\s*"); } regexBuilder.append("[^\\s\\n]+"); // 匹配值直到下一个空白字符或换行符 return regexBuilder.toString(); } }

标签:yamlContent,Java,String,Pattern,consul,保留,currentYaml,regexBuilder,append
From: https://www.cnblogs.com/weixin-tt/p/18143660

相关文章

  • JAVA基础-流程控制、字符串
    一、java基础1、java主类结构packagecom.study.again001;包名publicclasshelloword{类名staticStrings1="1";静态成员变量publicstaticvoidmain(String[]args){main方法Strings2="2";局部变量System.out.println(s1......
  • java静态代理模式
    通过模拟租房来展现静态代理模式租房接口//租房publicinterfaceRent{publicvoidrent();}被代理的真实角色房东//房东publicclassHostimplementsRent{@Overridepublicvoidrent(){System.out.println("房东要出租房租");}}......
  • 如何在HTML中使用JavaScript:从基础到高级的全面指南!
    JavaScript是一种轻量级的编程语言,通常用于网页开发,以增强用户界面的交互性和动态性。然而在HTML中,有多种方法可以嵌入和使用JavaScript代码。本文就带大家深入了解如何在HTML中使用JavaScript。一、使用script标签要在HTML中使用JavaScript,我们需要使用<script>标签。这个标......
  • 34-Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别
    需求:在开发过程中,经常会遇到的一个问题是,需要判断某个字符串是不是对象的某个成员属性名,然后根据判断结果去操作这个成员属性参考教程:Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别_javadeclaredfields-CSDN博客 可以通过以下方法:getFields(): 获......
  • java 打的jar 变小
    第1步:将第三方Jar单独存放,使用下面的命令,把依赖的包放到D:\temp\lib:mvndependency:copy-dependencies-DoutputDirectory=E:\temp\lib-DincludeScope=runtime注意:在idea里面配置一定要取消 mvn,不然会报错,idea会自动加上mvn   第2步:单独打包我们自己写的代码,修改......
  • java桥接模式案例
    桥接模式(BridgePattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立变化。在桥接模式中,抽象类和它的实现类之间使用组合/聚合关系,而不是继承关系。这样,客户端代码可以针对抽象编程,而实现细节则可以在运行时动态地指定。场景:假设我们要设计一个图形绘制系统......
  • java play框架get Start
    背景:一个老板找到我,他有一个项目是用play框架写的,我从来没有听说java还有一个play框架。回来以后我去网上查了一下,play框架是一个轻量级的全栈开发框架,完全背离了传统servlet的风格。play框架在国内使用并不多,使用简单易上手,开发大型项目也能胜任,这样的项目原来设计者设计完......
  • java使用Workbook workbook = new XSSFWorkbook(inputStream);导出数据频繁GC
    由于xlsx底层使用xml存储,占用内存会比较大,官方也意识到这个问题,在3.8版本之后,提供了SXSSFWorkbook来优化写性能原来代码Workbookworkbook= newXSSFWorkbook(inputStream);优化后代码Workbookworkbook= newSXSSFWorkbook(newXSSFWorkbook(inputStream));此处有坑,请往......
  • java代码审计跨站脚本(XSS)--反射型
    一、基础:跨站脚本(Xss)一、原理:恶意攻击者往web页面里插入恶意js代码,而在服务端没有对数据进行严格的过滤。当用户浏览页面时,js代码必须在该html页面中(hrml必须要存在这个而已艾玛),从而达到攻击用户的目的。(攻击者构造的的js代码会被当作正常的HTML、JS代码被解析,执行Js脚本实现攻......
  • 当 mysql-connector-java-5 遇上 MySQL8,终究还是错付了 → 门当户对真的很重要!
    开心一刻今天,老婆给我发消息老婆:老公,儿子从隔壁邻居家回来了老婆:是先打还是先洗?我:先洗吧,万一打错人了呢老婆:先洗脸吧,没错就边打边洗起因在我们的固有认知中, mysql-connector-java-5.x.x 连接的是 MySQL5 ,而 mysql-connector-java-8.x.x 连......