SpringCloud(11)— 微服务保护(Sentinel)

news2024/12/24 3:55:09

SpringCloud(11)— 微服务保护(Sentinel)

一 认识Sentinel

1.雪崩问题及其解决方案

微服务调用链路中的某个服务出现问题,引起整个链路中所有的微服务都不可用,这就是我们常说的雪崩问题。

在这里插入图片描述

如何解决雪崩问题?

常见的解决方案有如下几种:

  • 超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,防止无休止等待。
  • 舱壁模式:限定每个业务使用的线程数,避免耗尽整个web服务器资源,因此也叫线程隔离。
  • 熔断降级:由断路器统计业务失败的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求
  • 流量控制:限制访问业务的QPS(单位时间内的业务数量),避免服务因流量的突增而故障

2.微服务保护技术对比

sentinel目前是SpringBoot Alibaba的一个组件。

在这里插入图片描述

3.认识Sentinel

Sentinel是阿里巴巴的一款微服务流量控制组件。

官方网址:home | Sentinel (sentinelguard.io)

Github地址:GitHub - alibaba/Sentinel: A powerful flow control component enabling reliability, resilience and monitoring for microservices. (面向云原生微服务的高可用流控防护组件)

Sentinel的特征:

  • 丰富的应用场景
  • 完备的实时监控
  • 广泛的开源生态
  • 完善的SPI扩展点

4.安装和运行Sentinel

Sentinel控制台 的下载地址:Releases · alibaba/Sentinel (github.com)

下载下来之后是一个 jar 包,使用命令运行即可,笔者这里下载的是最新版1.8.6

# 直接运行,默认端口为8080
java -jar sentinel-dashboard-1.8.6.jar

# 指定部分参数运行,通过 -Dserver.port=xxxx 指定运行端口
java -Dserver.port=8080 -jar sentinel-dashboard-1.8.6.jar

# 其余更多配置参数参考官网

运行之后,在浏览器访问即可。默认的用户名和密码均为 sentinel

在这里插入图片描述

常用的参数配置项:

在这里插入图片描述

使用举例:运行时在参数向前面加上“ -D ”,例如 -Dserver.port=xxxx 即可。

5.项目整合Sentinel

1.引入Sentinel 的依赖

<!--引入Sentinel依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2.在配置文件中配置Sentinel相关参数

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080

3.访问微服务的任意端口,触发 sentinel 监控

在这里插入图片描述

二 流量控制

1.限流基本用法

簇点链路:指的是项目内部的调用链路,链路中被监控的每个接口就是一个资源。

默认情况下,sentinel 会监控微服务中的每一个端点(endpoint),因此微服务中的每一个端点就是调用链路中的一个资源

在这里插入图片描述

流控,熔断 等都是 针对簇点链路中的资源 来设置的,可以直接点击资源后边的按钮来设置规则

1.流控设置

点击资源后面的 流控 按钮,便可以对资源进行流控设置

在这里插入图片描述

  • 资源名称:表示要流控的资源
  • 针对来源:表示从什么地方进来的请求需要进行流控,default 表示一切对该资源的请求都要进行流控
  • 阈值类型:QPS表示单位时间内的并发量,后边的 单机阈值 表示所选阈值类型的上限。如果超出则会被拦截并且报错

利用 jmeter 进行测试,会发现超出设定的QPS单机阈值的请求将返回被sentinel拦截的信息

在这里插入图片描述
在这里插入图片描述

2.流控模式

现在来看看流控规则中的额高级设置

在这里插入图片描述

在流控规则界面打开高级选线按钮,可以看到有很多流控模式流控效果供我们选择

其中流控模式中的三种模式代表的含义分别如下:

  • 直接:统计当前资源的请求,出发阈值时对当前资源直接限流,也是默认的模式
  • 关联:统计与当前资源关联的另一个资源,触发阈值时,对当前资源限流
  • 链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流

Sentinel中的流控设置,默认情况下使用的是直接模式

1.关联模式

统计与当前资源关联的另一个资源,触发阈值时,对当前资源限流

使用场景:比如用户支付订单的同时,要查询订单。查询和修改操作会争抢数据库资源,产生竞争。因此当支付订单状态出发阈值时,需要对查询业务限流

在这里插入图片描述

以上示例,当 /user/{id}QPS达到阈值时,将会对 /order/{id} 进行限流,避免影响到 /user/{id}

满足一下条件时可以考虑使用关联模式:

  • 两个有竞争关系的资源
  • 一个优先级高,一个优先级低

2.链路模式

统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流

例如有两条请求链路,

  • /test1 -> /common
  • /test2 -> /common

如果只希望统计从 /test1 进入 /common 的请求,则可以这样配置:

在这里插入图片描述

这样一来,当从 /test1 进入 /commonQPS达到阈值时,将对 /test1 进行限流

Sentinel 默认值标记 Controller 中的方法为资源,如果要标记其他方法,需要利用 @SentinelResource 注解

@SentinelResource("data")
public void queryData(){
    System.out.println("查询数据");
}

Sentinel 默认会将Controller 方法做context整合,导致链路模式的流控失效,需要修改项目配置文件,添加配置。

spring:
  cloud:
    sentinel:
      # 关闭context整合
      web-context-unify: false
      transport:
        dashboard: localhost:8080

3.流控效果

流控效果是指请求达到流控阈值时应采取的措施

在这里插入图片描述

Sentinel 提供了三种流控效果:

  • 快速失败:达到阈值后,新的请求会被直接拒绝并抛出FlowException异常,这是默认的处理方式
  • Warm Up:预热模式,对于超出阈值的请求同样是直接拒绝。但是这种阈值会动态变化,从一个较小阈值逐渐增加到最大阈值
  • 排队等待:让所有请求按照先后顺序排队执行,两个请求的间隔不能小于指定时长

1.Warm Up

warm up 也叫预热模式,是应对服务冷启动的一种方案。请求阈值初始值为 threshold / coldFactor,持续指定时长后,逐渐提高到 threshold 值,而 coldFactor的默认值为3。

预热模式主要是防止冷启动时过高并发从而导致故障

2.排队等待

当请求超过QPS值时,快速失败和预热模式都会抛出异常。而排队等待则是让所有请求进入一个队列中,然后按照阈值允许的时间间隔依次执行。后来的请求必须等待前面的请求执行完成,如果请求预期的等待时间超出最大时长,则请求会被拒绝。

4.热点参数限流

之前的限流是统计访问某个资源的所有请求,判断是否超过QPS阈值,而热点参数限流是分别统计参数值相同的请求,判断是否超过QPS阈值。

在这里插入图片描述

例如以下配置:

在这里插入图片描述

热点资源 hot 的参数值为1的限流阈值为4

热点资源 hot 的参数值为2的限流阈值为2

由此可见,热点参数限流是一种更为细腻的限流方式,将限流规则降低到了参数级别上。

三 隔离和降级

限流是对微服务故障的一种预防措施,但是一旦服务已经出现了故障,则我们需要其他手段来防止出现级联失败甚至雪崩的问题。

而要将这些故障控制在一定范围内,避免雪崩,就需要依赖于线程隔离(舱壁模式)熔断降级手段了。

在这里插入图片描述

不管是线程隔离还是熔断降级,都是对客户端(调用者 / 消费者)的保护

1.FeignClient整合Sentinel

SpringCloud中,微服务调用是通过Feign来实现的,因此做客户端保护必须整合FeignSentinel

步骤1:修改消费者微服务的项目配置文件,开启Feign的Sentinel功能

feign:
  sentinel:
    # 开启 Feign 的 Sentinel 功能
    enabled: true

开启以后,Feign请求将会作为一个资源存在于Sentinel中,这样我们就可以对它进行流控等操作了

在这里插入图片描述

步骤2:给FeignClient编写失败后的降级逻辑

  • 方式1:FallbackClass,无法对远程调用的异常做处理
  • 方式2:FallbackFactory,可以对远程调用的异常做处理,一般使用这种

步骤3:编写具体的降级逻辑

feign-api项目中编写 UserClientFallbackFactory

@Slf4j
public class UserClientFallbackFactory implements FallbackFactory<IUserClientFeign> {
    @Override
    public IUserClientFeign create(Throwable throwable) {
        return new IUserClientFeign() {
            @Override
            public User findById(Integer id) {
                log.error("查询异常");
                //未查询到用户时指定返回内容,此处返回空对象
                return new User();
            }
        };
    }
}

将其定义为 bean

@Configuration
public class FeignConfig {
    @Bean
    public UserClientFallbackFactory userClientFallbackFactory(){
        return new UserClientFallbackFactory();
    }
}

@FeignClient上指定fallbackFactory

@FeignClient(value = "alibaba-user",fallbackFactory = UserClientFallbackFactory.class)
@RequestMapping("/user")
public interface IUserClientFeign {
    /**
     * 定义请求接口
     * @param id userId
     * @return 返回对象
     */
    @GetMapping("/{id}")
    User findById(@PathVariable("id") Integer id);
}

2.线程隔离

线程隔离有两种实现方式:

  • 线程池隔离
  • 信号量隔离(sentinel默认)

在这里插入图片描述

线程池隔离原理:程序启动时默认创建指定数量的线程池用于被其他微服务使用。当线程池被全部占据时将不再接受访问。业务处理完时线程解除占用。

信号量隔离原理:采用信号量计数器的办法,当计数器达到指定的数量则不再接受访问。即有新业务时信号量+1,业务处理完成时信号量-1。

在这里插入图片描述

在添加限流规则时,可以选择两种阈值类型:

  • QPS:每秒请求数
  • 线程数:是该资源使用的tomcat线程数的最大值,也就是通过限制线程数量,实现舱壁模式

在这里插入图片描述

3.熔断降级

熔断降级是解决雪崩问题的重要手段,其思路是由断路器统计服务调用的异常比例,慢请求比例。如果超出阈值则会熔断该服务。即拦截该服务的一切请求;而当服务恢复时,断路器也会放行该服务的请求。

以下是断路器的工作流程

在这里插入图片描述

断路器熔断策略有三种:慢调用,异常比例,异常数。

1.慢调用

慢调用:业务的响应时间(RT)大于指定时长的请求认定为慢调用请求。在指定时间内请求数量超过设定的最小数量,慢调用比例大于设定的阈值时触发熔断。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S5ydRiOg-1672738910071)(C:\Users\01\AppData\Roaming\Typora\typora-user-images\image-20230103134045979.png)]

以上示例的含义:对于 /order/{id}资源,响应时间大于2000ms时认为时慢调用。统计1000ms内的请求,如果请求量超过5次且慢调用比例超过0.5,则触发熔断,熔断时长为5s,然后进入Half-Open状态,放行一次请求做测试。

2.异常比例或异常数

异常比例或异常数:统计指定时间内的调用,如果调用次数超过指定请求数,并且异常的比例异常数达到设定的阈值,则触发熔断。

异常比例或异常数的熔断规则与调用时长无关,只关心是否抛出异常和抛出异常的比例

在这里插入图片描述

以上示例的含义:对于 /user/{id}资源,统计1000ms内的请求,如果请求量超过5次且异常比例超过0.5,则触发熔断,熔断时长为5s,然后进入Half-Open状态,放行一次请求做测试。

四 授权规则

授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式

  • 白名单:来源(origin)在白名单内的调用者允许访问
  • 黑名单:来源(origin)在黑名单内的调用者不允许访问

在这里插入图片描述

1.请求来源

Sentinel是通过RequestOriginParse这个接口的parseOrigin来获取请求来源的

2.授权实现

在微服务中实现 RequestOriginParser接口,这里与统一网关约定使用origin作为请求头参数名。

@Component
public class HeaderOriginParse implements RequestOriginParser {
    @Override
    public String parseOrigin(HttpServletRequest httpServletRequest) {
        // 1.获取请求头
        String origin=httpServletRequest.getHeader("origin");
        if(StringUtils.isEmpty(origin)){
            origin="blank";
        }
        return origin;
    }
}

在统一网关服务的配置文件中添加origin请求头参数,值为alibaba-gateway

spring:
  cloud:
    gateway:
      default-filters:
        - AddRequestHeader=origin,alibaba-gateway

通过以上设置,可以保证只要是来源于统一网关服务的请求,请求头参数 origin 的值均为alibaba-gateway

最后,在授权规则中填入来源名称,设置白名单即可

在这里插入图片描述

添加了授权规则之后,对于 /order/{id} 的访问就必须通过统一网管来访问。

注意:请求来源参数(origin)的参数名和参数值切勿对外暴露,防止别人伪造请求头

3.自定义异常拦截请求

默认情况下,发生限流,降级,熔断时,都会抛出异常到调用方。如果要实现自定义异常时的返回结果,需要实现BlockExceptionHandler接口。

BlockException包含很多子类,分别对应不同的场景
在这里插入图片描述

以下是微服务调用时被Sentinel拦截的简单示例:

@Component
public class SentinelBlockHandler implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {
        String msg = "未知异常";
        if (e instanceof FlowException) {
            msg = "请求被限流";
        } else if (e instanceof DegradeException) {
            msg = "请求被降级";
        } else if (e instanceof ParamFlowException) {
            msg = "热点参数被限流";
        }else if (e instanceof AuthorityException) {
            msg = "授权规则异常";
        }

        httpServletResponse.setContentType("application/json;charset=utf-8");
        httpServletResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        httpServletResponse.getWriter().println("{\n" +
                "    \"status\": 429,\n" +
                "    \"msg\":\""+msg+"\"\n" +
                "}");
    }
}

以下是返回示例:

返回的Json格式自定义,此处只做演示,不深究

{
    "status": 429,
    "msg": "授权规则异常"
}

五 规则持久化

在配置了Sentinel的各种规则后,重启服务会导致规则丢失。

这是因为Sentinel将规则保存在内存中,重启微服务规则自然会丢失。

1.规则管理模式

Sentinel的控制台规则管理有三种模式:

  • 原始模式:Sentinel的默认模式,将规则保存在内存,重启服务则丢失
  • pull模式:保存在本地或数据库,定时去读取
  • push模式:保存在Nacos,监听变更实时更新

1.Pull模式

Pull模式:控制台将配置的规则推送至Sentinel客户端,而客户端会将配置规则保存在本地文件或数据库中。以后会定时去本地文件或数据库中查询,更新本地规则。

在这里插入图片描述

缺点:存在时效性问题,容易导致数据不一致

2.Push模式

Push模式:控制台将配置规则推送到远程配置中心,例如NacosSentinel客户端监听Nacos,获取配置变更的推送消息,完成本地配置更新。

在这里插入图片描述

2.实现push模式

1.引入依赖

在微服务中引入 sentinel-datasource-nacos,监听 Nacos 的依赖。

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

2.配置Nacos地址

在微服务的配置信息中配置Nacos地址以及监听的配置信息

spring:
  cloud:
    sentinel:
      datasource:
        #流控
        flow:
          nacos:
            server-addr: localhost:8848
            data-id: orderserver-flow-rules #最终的配置文件名称
            group-id: SENTINEL_GROUP # 组ID
            rule-type: flow # 还可以是其他,具体请查看 RuleType 的实例,需要配置多个时复制多份即可
        #降级
        degrade:
          nacos:
            server-addr: localhost:8848
            data-id: orderserver-degrade-rules #最终的配置文件名称
            group-id: SENTINEL_GROUP # 组ID
            rule-type: degrade

3.修改sentinel源码

Sentinel-Dashboard默认不支持nacos持久化,需要修改源码

Github上下载sentinel的源码,使用 IDE工具打开

在这里插入图片描述

1.在sentinel-dashboard源码的pom文件中,nacos的依赖默认的scope是test,只能在测试时使用,这里要去除:

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

2.在sentinel-dashboard的test包下,已经编写了对nacos的支持,我们需要将其拷贝到main下。

在这里插入图片描述

3.修改 nacos 的地址,修改测试代码中的 NacosConfig类,让其读取application.properties中的值

@Configuration
@ConfigurationProperties(prefix = "nacos")
public class NacosConfig {

    /**
     * nacos地址
     */
    private String addr;
    
    @Bean
    public ConfigService nacosConfigService() throws Exception {
        return ConfigFactory.createConfigService(addr);
    }
    
    public void setAddr(String addr){
        this.addr=addr;
    }
    public String getAddr(){
        return this.addr;
    }

    @Bean
    public Converter<List<FlowRuleEntity>, String> flowRuleEntityEncoder() {
        return JSON::toJSONString;
    }

    @Bean
    public Converter<String, List<FlowRuleEntity>> flowRuleEntityDecoder() {
        return s -> JSON.parseArray(s, FlowRuleEntity.class);
    }
}

4.在sentinel-dashboardapplication.properties中添加nacos地址配置:

nacos.addr=localhost:8848

5.需要修改 com.alibaba.csp.sentinel.dashboard.controller.v2 包下的 FlowControllerV2 类,让添加的Nacos数据源生效

在这里插入图片描述

@Autowired
@Qualifier("flowRuleNacosProvider")
private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
@Autowired
@Qualifier("flowRuleNacosPublisher")
private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;

6.修改前端页面,添加一个支持nacos的菜单,

修改src/main/webapp/resources/app/scripts/directives/sidebar/目录下的sidebar.html文件,放开以下代码:

<li ui-sref-active="active" ng-if="entry.appType==0">
  <a ui-sref="dashboard.flow({app: entry.app})">
    <i class="glyphicon glyphicon-filter"></i>&nbsp;&nbsp;流控规则 V1</a>
</li>

7.去掉测试单元,重新打包项目,然后运行

在这里插入图片描述

java -jar sentinel-dashboard-1.8.6.jar

3.添加规则

在 开放出来的模块中添加流控规则,将会被同步到 Nacos,从而实现持久化
在这里插入图片描述

更多内容,参考Setinel官网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/136355.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt之实现自定义控件的两种方式——插件法

文章目录前言一、需求二、实现1、新建项目2、自定义控件类3、编译插件4、拖拽使用&#xff08;1&#xff09;在designer.exe中直接拖拽&#xff08;2&#xff09;在Qt Creator的设计师中直接拖拽5、在项目中正常使用前言 可以通过Qt设计师拖拽原生控件进行界面开发&#xff0c;…

【Linux】操作系统及进程概念

大家好我是沐曦希&#x1f495; 文章目录一、冯诺依曼体系结构二、操作系统OS三、系统调用和库函数概念四、进程1.概念2.描述进程-PCB3.查看进程4.查看系统调用5.查看进程调用6. 通过系统调用创建进程-fork初识一、冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我…

外贸业务员该如何拓客?

最近几个月&#xff0c;做外贸的朋友都来吐槽&#xff0c;外贸干不下去了。一个B2B店铺和Google推广要花很多钱&#xff0c;竞争太激烈了。投入和产出极不成比例&#xff0c;就问我能不能解决。我也是行业出身。我问他们有没有听说过以下五种实惠高效的营销方式。然后我就想告诉…

JWT的组成以及工作原理

什么是 JWT? JWT &#xff08;JSON Web Token&#xff09; 是目前最流行的跨域认证解决方案&#xff0c;是一种基于 Token 的认证授权机制。 从 JWT 的全称可以看出&#xff0c;JWT 本身也是 Token&#xff0c;一种规范化之后的 JSON 结构的 Token。 JWT 自身包含了身份验证…

SpringBoot项目中基本常用依赖分享(个人向)

目录 &#xff08;1&#xff09;spring-boot-starter-web &#xff08;2&#xff09;mysql-connector-java &#xff08;3&#xff09;mybatis-spring-boot-starter &#xff08;4&#xff09;mapper-spring-boot-starter &#xff08;5&#xff09;mybatis-plus-boot-st…

数组string

数组 目录&#xff1a;数组一维数组一维数组的定义和初始化一维数组数据元素的访问练习1 找小猪练习2 算平均值比较两个数组是否相等一维数组冒泡法排序一维数组操作一维数组查找元素**普通查找**&#xff1a;二分查找&#xff1a;二分查找 最小下标最大下标查找元素个数一维数…

如何优化 MySQL

为什么要对 SQL 进行优化 有时候数据库会出现性能低、执行时间太长、等待时间太长、SQL 语句欠佳&#xff08;连接查询&#xff09;、索引失效等问题&#xff0c;这些问题会严重拖慢一个系统的速度&#xff0c;因此需要对 SQL 进行优化。 SQL 的编写过程和解析过程并非是一致…

Qt样式表语法

样式规则每个样式规则由选择器和声明组成。选择器&#xff1a;指定受该规则影响的部件。声明&#xff1a;指定这个部件上要设置的熟悉如&#xff1a;QPushButton{color:red} QPushButton是选择器&#xff1b;{color:red}是声明&#xff1b;color是属性&#xff1b;red是值。选择…

使用prometheus监控ES

下载elasticsearch_exporter wget 下载二进制包并解压、运行&#xff1a; wget https://github.com/prometheus-community/elasticsearch_exporter/releases/download/v1.3.0/elasticsearch_exporter-1.3.0.linux-amd64.tar.gz tar -xvf elasticsearch_exporter-1.3.0.linux-a…

ARM6818开发板画任意矩形,圆形,三角形,五角星,6818开发板画太极,画五星红旗(含码源与思路)

本文利用6818开发板完成LCD屏上绘制任意的矩形&#xff0c;圆形&#xff0c;三角形或五角星形图案&#xff0c;还有绘制太极&#xff0c;五星红旗的方案。 目录 映射 绘制矩形 代码思路 代码实现 实践出真知 绘制圆形 代码思路 代码实现 绘制三角形 代码思路 代码实现…

【回答问题】ChatGPT上线了!用给写出可执行的实体链接模型

如何实现一个实体链接模型/代码 在实现实体链接模型之前&#xff0c;您需要确定所要链接的实体类型&#xff08;例如人名、地名、组织机构等&#xff09;。然后&#xff0c;您需要准备一份包含大量实体及其相应识别码的实体百科数据集。接着&#xff0c;您可以使用深度学习模型…

乾元通多卡聚合通信系统在应急通信领域的解决方案

后疫情时代&#xff0c;日益增多的大型集会类事件给现有通信系统带来极大的压力。目前&#xff0c;我国已经认识到应急通信系统的重要性&#xff0c;因此我国各个部门已经配置了不少应急通信系统和设备&#xff0c;并且积累了相当的使用经验。 在不同情况下&#xff0c;对应急…

基础数据结构——数组

目录 一、前言 二、一维数组 1、定义和初始化 2、一维变长数组 3、一维正向遍历 4、一维反向遍历 5、一维数组区间操作、一维数组从 a[1] 开始&#xff0c;读入一维数组 6、一维数组例题1 7、一维数组例题2 三、二维数组 1、二维数组初始化 2、三维数组初始化 3…

HTTP_day02

掘金地址 结合 小林 coding 当键入网址后&#xff0c;到网页显示&#xff0c;其间发生了什么 DNS 服务器 专门保存了 Web 服务器域名与 IP 的对应关系 域名用“.”分隔成多个单词&#xff0c;级别从左到右逐级升高&#xff0c;最右边的被称为“顶级域名” DNS 服务器是一个分…

聊聊Spring中最常用的11个扩展点

前言 我们一说到spring&#xff0c;可能第一个想到的是 IOC&#xff08;控制反转&#xff09; 和 AOP&#xff08;面向切面编程&#xff09;。 没错&#xff0c;它们是spring的基石&#xff0c;得益于它们的优秀设计&#xff0c;使得spring能够从众多优秀框架中脱颖而出。 除…

第三十六讲:神州无线AP胖AP模式配置与管理

胖AP(Fat AP)配置一个开放式WLAN非常方便&#xff0c;需要完成的操作包括有线和无线两部分的配置。有线部分即ethernet接口的配置&#xff0c;保证AP能够接入Internet,无线部分的配置包括关联WLAN与VLAN&#xff0c;广播SSID,启用VAP&#xff0c;若无其他DHCP服务器的话&#x…

业务状态实时监控预警,「告警配置」来帮您

腾讯云数据连接器iPaaS团队服务了各行各业的数百家客户后&#xff0c;发现许多企业有大量的自建应用/SaaS应用&#xff0c;却缺乏一套可靠灵活的告警系统。当相关的IT系统/资源调配出现故障后&#xff0c;往往是影响到业务系统被用户投诉后&#xff0c;技术人员才发现故障并展开…

【超详细】LightGBM介绍与应用

目录 1. LightGBM简介 2. LightGBM详细介绍 2.1 单边梯度抽样算法 2.2 直方图算法 2.3 互斥特征捆绑算法 2.4 基于最大深度的 Leaf-wise 的垂直生长算法&#xff08;带深度限制的 Leaf-wise 算法&#xff09; 2.5 类别特征最优分割 &#xff08;直接支持类别特征&#xf…

【自学Python】Windows安装Python

Windows安装Python Python下载 Python下载地址 https://www.python.org/Python下载 打开上面的链接&#xff0c;打开 Python 的下载页面&#xff0c;如下图所示&#xff1a; 我们把鼠标放到 Downloads 上&#xff0c;然后点击 Windows&#xff0c;此时界面如下图所示&#…

Docker简介

Docker官网链接&#xff1a; http://docker.p2hp.com/问题&#xff1a;我们开发的嵌入式项目基本是基于虚拟机下的ubuntu的&#xff0c;如果每一个项目要求的系统版本、库版本、交叉编译工具链等不一样&#xff0c;我们就需要为每一个项目安装一个对应的ubuntu&#xff0c;这既…