首页 > 其他分享 >SpringBoot集成 规则引擎Drools 快速入门

SpringBoot集成 规则引擎Drools 快速入门

时间:2024-10-16 20:47:52浏览次数:3  
标签:Drools 匹配 SpringBoot rule Order 规则 100 order 入门

规则引擎 Drools

一、drools

在这里插入图片描述

1、引入问题

某电商平台的促销活动,活动规则是根据⽤户购买订单的⾦额给⽤户送相应的积分,购买的越多送的积分越多用户购买的金额和对应送多少积分的规则如下:

规则编号订单金额奖励积分
1100元以下不加分
2100元 - 500元加10分
3500元 - 1000元加50分
41000元以上加100分

我们最容易想到的就是使用分支判断(if else)来实现,例如通过如下代码来检查用户信息合法性:

/**
 * 设置订单积分
 */
public void setOrderPoint(Order order){
    if (order.getAmout() <= 100){
        order.setScore(0);
    }else if(order.getAmout() > 100 && order.getAmout() <= 500){
        order.setScore(10);
    }else if(order.getAmout() > 500 && order.getAmout() <= 1000){
        order.setScore(50);
    }else{
        order.setScore(100);
    }
}

这种实现方式存在如下问题:

1、硬编码实现业务规则难以维护

2、硬编码实现业务规则难以应对变化

3、业务规则发生变化需要修改代码,重启服务后才能生效

那么面对上面的业务场景,还有什么好的实现方式吗?

此时我们需要引入规则引擎来帮助我们将规则从代码中分离出去,让开发人员从规则的代码逻辑中解放出来,把规则的维护和设置交由业务人员去管理。

2、规则引擎概述

规则引擎的主要思想是将应用程序中的业务决策部分分离出来,并使用预定义的语义模块编写业务决策(业务规则),由用户或开发者在需要时进行配置、管理。

2.1、规则引擎的优势

1、业务规则与系统代码分离,实现业务规则的集中管理

2、在不重启服务的情况下可随时对业务规则进行扩展和维护

3、可以动态修改业务规则,从而快速响应需求变更

4、规则引擎是相对独立的,只关心业务规则,使得业务分析人员也可以参与编辑、维护系统的业务规则

5、减少了硬编码业务规则的成本和风险

6、使用规则引擎提供的规则编辑工具,使复杂的业务规则实现变得的简单

2.2、规则引擎应用场景

对于一些存在比较复杂的业务规则并且业务规则会频繁变动的系统比较适合使用规则引擎,如下:

1、风险控制系统----风险贷款、风险评估

2、反欺诈项目----银行贷款、征信验证

3、决策平台系统----财务计算

4、促销平台系统----满减、打折、加价购

2.3、Drools介绍

drools是一款由JBoss组织提供的基于Java语言开发的开源规则引擎,可以将复杂且多变的业务规则从硬编码中解放出来,以规则脚本的形式存放在文件或特定的存储介质中(例如存放在数据库中),使得业务规则的变更不需要修改项目代码、重启服务器就可以在线上环境立即生效。

drools官网地址:https://drools.org/

drools源码下载地址:https://github.com/kiegroup/drools

二、Drools入门案例

我们使用上面的问题案例来入门Drools

1、创建springboot项目

drools-demo

在这里插入图片描述

2、引入依赖


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-core</artifactId>
            <version>${drools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-compiler</artifactId>
            <version>${drools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-decisiontables</artifactId>
            <version>${drools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-mvel</artifactId>
            <version>${drools.version}</version>
        </dependency>
    </dependencies>

2、添加Drools配置类

import org.kie.api.KieServices;
import org.kie.api.builder.*;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.internal.io.ResourceFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 这个类用于配置Drools规则引擎,使我们的应用能够使用预定义的业务规则。
 * Drools是一个强大的规则引擎,可以帮助我们更灵活地管理业务逻辑。
 */
@Configuration
public class DroolsConfig {

    // 创建一个静态的KieServices实例,它是访问所有Drools服务的主要入口点。
    private static final KieServices kieServices = KieServices.Factory.get();

    // 定义规则文件的位置。这里使用的是一个名为"order.drl"的规则文件,它位于类路径下的"src/main/resources"目录中。
    private static final String RULES_CUSTOMER_RULES_DRL = "rules/order.drl";

    /**
     * 创建并返回一个KieContainer对象,它是规则引擎的核心组件之一。
     * KieContainer负责加载和管理所有的规则、流程等资源。
     *
     * @return 返回配置好的KieContainer对象。
     */
    @Bean
    public KieContainer kieContainer() {
        // 创建一个新的KieFileSystem对象,用来模拟文件系统,方便我们添加规则文件。
        KieFileSystem kieFileSystem = kieServices.newKieFileSystem();

        // 将规则文件加载到KieFileSystem中。这里使用的是类路径资源加载方式。
        kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_CUSTOMER_RULES_DRL));

        // 创建一个KieBuilder对象,用于编译KieFileSystem中的资源(即规则文件)。
        KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);

        // 编译所有资源。如果规则文件中有错误,这一步会抛出异常。
        kieBuilder.buildAll();

        // 获取编译后的模块。KieModule是包含已编译规则和其他资源的包。
        KieModule kieModule = kieBuilder.getKieModule();

        // 使用编译后的模块创建一个KieContainer。KieContainer是运行时环境,可以在其中创建会话并执行规则。
        KieContainer kieContainer = kieServices.newKieContainer(kieModule.getReleaseId());

        // 最后,返回配置好的KieContainer对象,以便其他地方可以使用它。
        return kieContainer;
    }

}

说明:

  • 定义了一个 KieContainerSpring BeanKieContainer用于通过加载应用程序的/resources文件夹下的规则文件来构建规则引擎。
  • 创建KieFileSystem实例并配置规则引擎并从应用程序的资源目录加载规则的 DRL 文件。
  • 使用KieBuilder实例来构建 drools 模块。我们可以使用KieSerive单例实例来创建 KieBuilder 实例。
  • 最后,使用 KieService 创建一个 KieContainer 并将其配置为 spring bean

4、创建实体类Order

public class Order {

    private double amout;
    private double score;

    public double getAmout() {
        return amout;
    }

    public void setAmout(double amout) {
        this.amout = amout;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }
}

5、创建规则文件order.drl

创建规则文件resources/rules/order.drl

// 订单积分规则
package com.order //指定规则文件所属的包名,与Java类的包名类似。
import import com.liao.droolsdemo.pojos.Order

// 规则一:100元以下 不加分
rule "order_rule_1"
    when
        // 当订单金额小于100元时
        $order: Order(amount < 100)
    then
        // 设置积分为0
        $order.setScore(0);
        // 打印日志,表示匹配到了这条规则
        System.out.println("成功匹配到规则一:100元以下 不加分");
end

// 规则二:100元 - 500元 加100分
rule "order_rule_2"
    when
        // 当订单金额在100元(含)到500元(不含)之间时
        $order: Order(amount >= 100 && amount < 500)
    then
        // 设置积分为100
        $order.setScore(100);
        // 打印日志,表示匹配到了这条规则
        System.out.println("成功匹配到规则二:100元 - 500元 加100分");
end

// 规则三:500元 - 1000元 加500分
rule "order_rule_3"
    when
        // 当订单金额在500元(含)到1000元(不含)之间时
        $order: Order(amount >= 500 && amount < 1000)
    then
        // 设置积分为500
        $order.setScore(500);
        // 打印日志,表示匹配到了这条规则
        System.out.println("成功匹配到规则三:500元 - 1000元 加500分");
end

// 规则四:1000元以上 加1000分
rule "order_rule_4"
    when
        // 当订单金额大于或等于1000元时
        $order: Order(amount >= 1000)
    then
        // 设置积分为1000
        $order.setScore(1000);
        // 打印日志,表示匹配到了这条规则
        System.out.println("成功匹配到规则四:1000元以上 加1000分");
end

6、编写测试类

@SpringBootTest
class DroolsDemosApplicationTests {

    @Autowired
    private KieContainer kieContainer;

    @Test
    public void test(){
        //从Kie容器对象中获取会话对象
        KieSession session = kieContainer.newKieSession();

        //Fact对象,事实对象
        Order order = new Order();
        order.setAmout(10);

        //将Order对象插入到工作内存中
        session.insert(order);

        //激活规则,由Drools框架自动进行规则匹配,如果规则匹配成功,则执行当前规则
        session.fireAllRules();
        //关闭会话
        session.dispose();

        System.out.println("订单金额:" + order.getAmout() +
                ",添加积分:" + order.getScore());
    }

}

成功打印:

成功匹配到规则一:100元以下 不加分
成功匹配到规则二:100元 - 500元 加100分
订单金额:10.0,添加积分:0.0

通过上面的入门案例我们可以发现,使用drools规则引擎主要工作就是编写规则文件,在规则文件中定义跟业务相关的业务规则。规则定义好后就需要调用drools提供的API将数据提供给规则引擎进行规则模式匹配,规则引擎会执行匹配成功的规则并将计算的结果返回给我们。

可能大家会有疑问,就是我们虽然没有在代码中编写规则的判断逻辑,但是我们还是在规则文件中编写了业务规则,这跟在代码中编写规则有什么本质的区别呢?

我们前面其实已经提到,使用规则引擎时业务规则可以做到动态管理。业务人员可以像管理数据一样对业务规则进行管理,比如查询、添加、更新、统计、提交业务规则等。这样就可以做到在不重启服务的情况下调整业务规则。

三、Drools基础语法

1、规则文件构成

在使用Drools时非常重要的一个工作就是编写规则文件,通常规则文件的后缀为.drl。

drl是Drools Rule Language的缩写。在规则文件中编写具体的规则内容。

一套完整的规则文件内容构成如下:

关键字描述
package包名,只限于逻辑上的管理,同一个包名下的查询或者函数可以直接调用
import用于导入类或者静态方法
global全局变量
function自定义函数
query查询
rule end规则体

2、规则体语法结构

规则体是规则文件内容中的重要组成部分,是进行业务规则判断、处理业务结果的部分。

规则体语法结构如下:

rule "ruleName"
    attributes
    when
        LHS 
    then
        RHS
end

rule:关键字,表示规则开始,参数为规则的唯一名称。

attributes:规则属性,是rule与when之间的参数,为可选项。

when:关键字,后面跟规则的条件部分。

LHS(Left Hand Side):是规则的条件部分的通用名称。它由零个或多个条件元素组成。如果LHS为空,则它将被视为始终为true的条件元素。 (左手边)

then:关键字,后面跟规则的结果部分。

RHS(Right Hand Side):是规则的后果或行动部分的通用名称。 (右手边)

end:关键字,表示一个规则结束。

3、注释

在drl形式的规则文件中使用注释和Java类中使用注释一致,分为单行注释和多行注释。

4、Pattern模式匹配

前面我们已经知道了Drools中的匹配器可以将Rule Base中的所有规则与Working Memory中的Fact对象进行模式匹配,那么我们就需要在规则体的LHS部分定义规则并进行模式匹配。LHS部分由一个或者多个条件组成,条件又称为pattern。

pattern的语法结构为:绑定变量名:Object(Field约束)

其中绑定变量名可以省略,通常绑定变量名的命名一般建议以$开始。如果定义了绑定变量名,就可以在规则体的RHS部分使用此绑定变量名来操作相应的Fact对象。Field约束部分是需要返回true或者false的0个或多个表达式。

例如我们的入门案例中:

//规则二:100元 - 500元 加100分
rule "order_rule_2"
    when
        $order:Order(amout >= 100 && amout < 500)
    then
         $order.setScore(100);
         System.out.println("成功匹配到规则二:100元 - 500元 加100分");
end

通过上面的例子我们可以知道,匹配的条件为:

1、工作内存中必须存在Order这种类型的Fact对象-----类型约束

2、Fact对象的amout属性值必须大于等于100------属性约束

3、Fact对象的amout属性值必须小于500------属性约束

以上条件必须同时满足当前规则才有可能被激活。

5、比较操作符

Drools提供的比较操作符,如下表:

符号说明
<小于
>大于
>=大于等于
<=小于等于
==等于
!=不等于
contains检查一个Fact对象的某个属性值是否包含一个指定的对象值
not contains检查一个Fact对象的某个属性值是否不包含一个指定的对象值
memberOf判断一个Fact对象的某个属性是否在一个或多个集合中
not memberOf判断一个Fact对象的某个属性是否不在一个或多个集合中
matches判断一个Fact对象的属性是否与提供的标准的Java正则表达式进行匹配
not matches判断一个Fact对象的属性是否不与提供的标准的Java正则表达式进行匹配

前6个比较操作符和Java中的完全相同。

6、Drools内置方法

规则文件的RHS部分的主要作用是通过插入,删除或修改工作内存中的Fact数据,来达到控制规则引擎执行的目的。Drools提供了一些方法可以用来操作工作内存中的数据,**操作完成后规则引擎会重新进行相关规则的匹配,**原来没有匹配成功的规则在我们修改数据完成后有可能就会匹配成功了。

6.1、update方法

update方法的作用是更新工作内存中的数据,并让相关的规则重新匹配。 (要避免死循环)

参数:

//Fact对象,事实对象
Order order = new Order();
order.setAmout(30);

规则:

//规则一:100元以下 不加分
rule "order_rule_1"
    when
        $order:Order(amout < 100)
    then
        $order.setAmout(150);
	    update($order) //update方法用于更新Fact对象,会导致相关规则重新匹配
        System.out.println("成功匹配到规则一:100元以下 不加分");
end

//规则二:100元 - 500元 加100分
rule "order_rule_2"
    when
        $order:Order(amout >= 100 && amout < 500)
    then
         $order.setScore(100);
         System.out.println("成功匹配到规则二:100元 - 500元 加100分");
end

结果是匹配完规则一,就继续匹配规则二。

注意:在更新数据时需要注意防止发生死循!!!

6.2、insert方法

insert方法的作用是向工作内存中插入数据,并让相关的规则重新匹配。

//规则一:100元以下 不加分
rule "order_rule_1"
    when
        $order:Order(amout < 100)
    then
        Order order = new Order();
        order.setAmout(130);
        insert(order);      //insert方法的作用是向工作内存中插入Fact对象,会导致相关规则重新匹配
        System.out.println("成功匹配到规则一:100元以下 不加分");
end

//规则二:100元 - 500元 加100分
rule "order_rule_2"
    when
        $order:Order(amout >= 100 && amout < 500)
    then
         $order.setScore(100);
         System.out.println("成功匹配到规则二:100元 - 500元 加100分");
end

结果是匹配完规则一,就继续匹配规则二。

6.3、retract方法

retract方法的作用是删除工作内存中的数据,并让相关的规则重新匹配。

//规则一:100元以下 不加分
rule "order_rule_1"
    when
        $order:Order(amout < 100)
    then
        retract($order)      //retract方法的作用是删除工作内存中的Fact对象,会导致相关规则重新匹配
        System.out.println("成功匹配到规则一:100元以下 不加分");
end

7、规则属性 attributes

前面我们已经知道了规则体的构成如下:

rule "ruleName"
    attributes
    when
        LHS
    then
        RHS
end

Drools中提供的属性如下表(部分属性):

属性名说明
salience指定规则执行优先级
dialect指定规则使用的语言类型,取值为java和mvel
enabled指定规则是否启用
date-effective指定规则生效时间
date-expires指定规则失效时间
activation-group激活分组,具有相同分组名称的规则只能有一个规则触发
agenda-group议程分组,只有获取焦点的组中的规则才有可能触发
timer定时器,指定规则触发的时间
auto-focus自动获取焦点,一般结合agenda-group一起使用
no-loop防止死循环

重点说一下我们项目需要使用的属性

7.1、salience属性

salience属性用于指定规则的执行优先级,取值类型为Integer数值越大越优先执行。每个规则都有一个默认的执行顺序,如果不设置salience属性,规则体的执行顺序为由上到下。

package com.order

rule "rule_1"
    salience 9
    when
        eval(true)
    then
        System.out.println("规则rule_1触发");
end

rule "rule_2"
    salience 10
    when
        eval(true)
    then
        System.out.println("规则rule_2触发");
end

rule "rule_3"
    salience 8
    when
        eval(true)
    then
        System.out.println("规则rule_3触发");
end

规则文件执行的顺序是按照我们设置的salience值由大到小顺序执行的。

建议在编写规则时使用salience属性明确指定执行优先级。

7.2、no-loop属性

no-loop属性用于防止死循环,当规则通过update之类的函数修改了Fact对象时,可能使当前规则再次被激活从而导致死循环。取值类型为Boolean,默认值为false,测试步骤如下:

编写规则文件/resources/rules/activationgroup.drl

//订单积分规则
package com.order
import com.liao.droolsdemo.pojos.Order

//规则一:100元以下 不加分
rule "order_rule_1"
    no-loop true         //防止陷入死循环
    when
        $order:Order(amout < 100)
    then
        $order.setScore(0);
        update($order)
        System.out.println("成功匹配到规则一:100元以下 不加分");
end

设置no-loop的值为true不会发生死循环。

四、高级语法

1、global全局变量

global关键字用于在规则文件中定义全局变量,它可以让应用程序的对象在规则文件中能够被访问。可以用来为规则文件提供数据或服务。

语法结构为:global 对象类型 对象名称

在使用global定义的全局变量时有两点需要注意:

1、如果对象类型为包装类型时,在一个规则中改变了global的值,那么只针对当前规则有效,对其他规则中的global不会有影响。可以理解为它是当前规则代码中的global副本,规则内部修改不会影响全局的使用。

2、如果对象类型为集合类型或JavaBean时,在一个规则中改变了global的值,对java代码和所有规则都有效。

订单Order:

package com.liao.droolsdemo.pojos;

public class Order {

    private double amout;

    public double getAmout() {
        return amout;
    }

    public void setAmout(double amout) {
        this.amout = amout;
    }

}

积分Integral:

package com.liao.droolsdemo.pojos;

public class Integral {

    private double score;

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }
}

规则文件:

//订单积分规则
package com.order
import com.liao.droolsdemo.pojos.Order

//设置global全局变量
global com.liao.droolsdemo.pojos.Integral integral;

//规则一:100元以下 不加分
rule "order_rule_1"
    no-loop true         //防止陷入死循环
    when
        $order:Order(amout < 100)
    then
        integral.setScore(10);//设置integral全局变量Score的值
        update($order)
        System.out.println("成功匹配到规则一:100元以下 不加分");
end

测试:

@Test
public void test1(){
    //从Kie容器对象中获取会话对象
    KieSession session = kieContainer.newKieSession();

    //Fact对象,事实对象
    Order order = new Order();
    order.setAmout(30);

    //全局变量
    Integral integral = new Integral();
    session.setGlobal("integral", integral);

    //将Order对象插入到工作内存中
    session.insert(order);

    //激活规则,由Drools框架自动进行规则匹配,如果规则匹配成功,则执行当前规则
    session.fireAllRules();
    //关闭会话
    session.dispose();

    System.out.println("订单金额:" + order.getAmout());
    System.out.println("添加积分:" + integral.getScore());
}

成功打印 :

成功匹配到规则一:100元以下 不加分
订单金额:30.0
添加积分:10.0

ate($order)
System.out.println(“成功匹配到规则一:100元以下 不加分”);
end


测试:

```java
@Test
public void test1(){
    //从Kie容器对象中获取会话对象
    KieSession session = kieContainer.newKieSession();

    //Fact对象,事实对象
    Order order = new Order();
    order.setAmout(30);

    //全局变量
    Integral integral = new Integral();
    session.setGlobal("integral", integral);

    //将Order对象插入到工作内存中
    session.insert(order);

    //激活规则,由Drools框架自动进行规则匹配,如果规则匹配成功,则执行当前规则
    session.fireAllRules();
    //关闭会话
    session.dispose();

    System.out.println("订单金额:" + order.getAmout());
    System.out.println("添加积分:" + integral.getScore());
}

成功打印 :

成功匹配到规则一:100元以下 不加分
订单金额:30.0
添加积分:10.0

标签:Drools,匹配,SpringBoot,rule,Order,规则,100,order,入门
From: https://blog.csdn.net/2301_81717523/article/details/142899456

相关文章

  • 前端入门学习之css盒子原则
    文章目录前端入门学习之css盒子原则引入块级元素:块级元素的特点占据整行设置高度和宽度包含其他元素盒子原则:margin:例子:boder:padding:前端入门学习之css盒子原则引入块级元素:当一个html标签元素展示方式为block,也就是它的display属性为block,那么我们可以想......
  • 从入门到精通——差分数组
    差分数组差分数组通常是指一个数组,其中每个元素是原数组中对应元素与前一个元素的差。这种数组在处理序列数据时非常有用,尤其是在需要计算连续项之间的变化或者进行数据压缩时。定理解释:差分数组的一个核心定理是,给定一个差分数组,可以唯一地重建原始数组。这意味着,如果......
  • 基于Java+Springboot+Vue开发的健身房管理系统
    项目简介该项目是基于Java+Springboot+Vue开发的健身房管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的健身房管理系统项目,大学生可以在实践中学习和提升......
  • 黑客 如何攻破一个网站?长文图解全流程,零基础入门到精通,收藏这篇就够了
    一篇科普文,很适合小白,长文请静下心看。通过本文你将了解黑客常用的入手思路和技术手法,适合热爱网络信息安全的新手朋友了解学习。本文将从最开始的信息收集开始讲述黑客是如何一步步的攻破你的网站和服务器的。阅读本文你会学到以下内容:1.渗透测试前的简单信息收集。2.s......
  • 【CTF-SHOW】Web入门 Web27-身份证日期爆破 【关于bp intruder使用--详记录】
    1.点进去是一个登录系统,有录取名单和学籍信息发现通过姓名和身份证号可以进行录取查询,推测录取查询可能得到学生对应学号和密码,但是身份证号中的出生日期部分未知,所以可以进行爆破2.打开bp抓包这里注意抓的是学院录取查询系统发送POST类型进行查询的包,第一遍抓不到很正......
  • springboot+vue基于SpringBoot的音乐演出购票系统【开题+程序+论文】
    系统程序文件列表开题报告内容研究背景在当今数字化时代,音乐演出已经成为人们休闲娱乐的重要组成部分,它不仅丰富了人们的精神生活,还促进了音乐文化的交流与传播。然而,传统的购票方式,如现场购票或通过电话订票,已难以满足日益增长的观众需求。观众在购票过程中常常面临信息不......
  • Vue详细入门(语法【二】)
    今天的学习目标!!!el挂载点data数据对象Vue实例生命周期1.beforeCreate2.created3.beforeMount4.mounted5.beforeUpdate6.updated7.beforeDestroy8.destroyed  在前面Vue详细入门(语法【一】)当中我们学习了什么是Vue,Vue是怎么使用的嘞,Vue有哪些指令,它的核心语......
  • rust学习一、入门之搭建简单开发环境
    最近希望学习一些新的,选择了rust.本篇介绍怎么搭建一个非常简单的windows开发环境,以及如何使用cargo命令1、搭建开发环境(windows11)a.登录官网https://www.rust-lang.org/tools一看就明白,此处略。b.安装rustup一看就明白,此处略。c.安装cargoscriptcargoinstallcargo......
  • 基于微信小程序的校园帮管理系统互帮互助系统springboot框架
    本课题围绕基于Java+SpringBoot的校园帮管理系统展开。在校园生活中,学生们常常面临各种学习和生活上的需求,校园帮管理系统应运而生。该系统利用Java的可靠性和SpringBoot的高效开发特性,为校园内的互助服务提供全面的管理平台。它涵盖了任务发布、任务承接、进度跟......
  • etcd入门到实战
    概述:本文将介绍etcd特性、使用场景、基本原理以及Linux环境下的实战操作入门什么是etcd?etcd是一个分布式键值存储数据库关键字解析:键值存储:存储协议是key—value的形式,类似于redis分布式:具有分布式特性、每个etcd实例作为集群中的一个节点,通过分布式锁,leader选举保......