Gateway

news2025/1/11 19:50:38

Gateway—SpringCloud微服务网关组件

一、Spring Cloud Gateway简介

1.为什么要用Gateway?

在微服务架构中,通常一个系统会被拆分为多个微服务,微服务之间的调用可以用OpenFeign,但面对这么多微服务客户端调用会遇到哪些问题呢?

在这里插入图片描述

  1. 每个服务都需要鉴权、限流、跨域访问、权限验证等操作,如果每个微服务各自为战,会很麻烦。

  2. 对于客户端来说,每个微服务都分配一个域名的话,客户端代码会很难维护,而且连接数也会有瓶颈.

  3. 随着一个项目的微服务的增多,后期对微服务进行重构的话,也会变的非常麻烦,需要客户端配合一起修改。

2、Spring Cloud Gateway 的定义

为了解决上面的问题,微服务引入了 网关 的概念,网关为微服务架构的系统提供简单、有效且统一的API路由管理,作为系统的统一入口,提供内部服务的路由中转,给客户端提供统一的服务,可以实现一些和业务没有耦合的公用逻辑,主要功能包含认证、鉴权、路由转发、安全策略、防刷、流量控制、监控日志等。

Spring Cloud Gateway 是 Spring Cloud 新推出的网关框架,之前是 Netflix Zuul。

简单来说:Gateway相当于医院大厅的挂号台,对病人进行引流。

加入网关后结构图:

在这里插入图片描述

3.Spring Cloud Gateway三大组成部分

Route(路由): 是构建网关的基本模型, 由ID ,URI 一系列的断言和过滤器组成。

Predicate (断言): 可以匹配Http 请求中所有的内容(请求头 参数等等) 请求与断言,相匹配则通过当前断言。

Filter(过滤器): 包括全局和局部过滤器 ,可以在请求被路由钱后对请求进行更改。

二、Spring Cloud Gateway快速入门

前面我们学习过Nacos,可以帮助我们管理我们的服务,学习Spring Cloud Gateway时,我们可以直接将Nacos整合进来。

1.项目项目

复制之前的Sentinel项目,在此基础上添加api-gateway子模块

添加入口类

在这里插入图片描述

2.添加Jar包

<!--gateway网关-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

<!--由于springcloud2020弃用了Ribbon,因此Alibaba在2021版本nacos中删除了Ribbon的jar包,因此无法通过lb路由到指定微服务,会出现503情况。需要引入springcloud loadbalancer包-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>



<!--其它包-->
<!-- 服务注册与发现  jar包 -->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
</dependency>

<!-- nacos配置中心-->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

<!-- 识别bootstrap.yml文件-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-bootstrap</artifactId>
   <version>3.0.2</version>
</dependency>

3.添加配置文件

GATEWAY-dev.yml

在这里插入图片描述

server:
  port: 9000
spring:
  application:
    name: GATEWAY
  cloud:
    loadbalander:  #注意这里要排除ribbon
      ribbon:
        enable: false
    gateway:
      routes:
        - id: search_route
          uri: lb://SEARCH
          predicates:
            - Path=/search-service/**
          filters:
            - StripPrefix=1

注解: http://localhost:9000/search-service/goods http://localhost:8083/goods

routes: 路由/路由数组   当请求满足指定的条件后转发到哪个微服务上

id:    当前路由唯一的标识符 ,有默认值,也可以自定义

uri: 请求最终要被转到的地址 ,lb为load balance,表示负载均衡,比如lb://SEARCH表示请求最终会转发到SEARCH服务,注意 lb://后面的<clientName>一定不要使用下划线,即不要使用比如:my_service这种形式,否则LoadBanancer不会起作用。

predicates:断言,也就是条件判断,- Path=/search-service/表示当客户端访问 http://localhost:9000/search-service/goods时会路由到http://localhost:8083/search-service/goods(我这里的SEARCH路径地址为http://localhost:8083),这个无法访问,需要filters过滤下

filters: 过滤器,在请求传递过程中,对请求做一下处理,比如添加请求头,去掉部分路径等。- StripPrefix=1表示转发之前去掉第一层路由,也就是转发到http://localhost:8083/goods

4.添加bootstrap.yml文件

在这里插入图片描述

spring:
  cloud:
    nacos:
      discovery:
        server-addr: http://localhost:8848
      config:
        server-addr: http://localhost:8848
        namespace: dev
        group: DEFAULT_GROUP
        username: nacos
        password: nacos
        prefix: GATEWAY
        file-extension: yml
        shared-configs:
         - common.yml
  config:
    activate:
      on-profile: dev

5.启动

在这里插入图片描述

6.测试:

在这里插入图片描述

7.也可以直接拿nacos服务名为断言

修改GATEWAY-dev.yml配置信息为:

server:
  port: 9000
spring:
  application:
    name: GATEWAY
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    loadbalander:
      ribbon:
        enable: false
    gateway:
      discovery:
        locator:
          enabled: true

spring.cloud.gateway.discovery.locator.enabled=true,表示会拿nacos服务名为断言,也会将服务名进行过滤,从而路由到该服务的请求。所以访问:http://localhost:9000/SEARCH/goods 会路由到http://localhost:8083/goods

在这里插入图片描述

三、 断言

断言就是在进入网关请求之前所做的操作,也就是先执行的程序,和生活中坐车一样,首先必须进行安检,然后查票,验证票最终才可以坐车。

在这里的理解就是:当满足某种条件后才会被转发,如果是多个,那就是都满足的情况下被转发。

1.内置断言

Spring Cloud Gateway可以匹配各种路由,而其内部就包括许多内置的路由断言工厂。所有这些断言都匹配HTTP请求的不同属性。您可以将多个路由断言工厂与逻辑和语句组合在一起使用。

1.1、基于Path路径: Path Route Predicate

Path是最常见的断言请求,匹配指定路径下的请求,可以是具体的请求,也可使用/**表示匹配所有子级请求,配置如下。

spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: lb://SEARCH
          predicates:
            - Path=/search-service/**

配置中匹配了以/search-service开头的请求,如果是其他URL的请求进入系统,会出现错误。

1.2、基于DateTime类型:DateTimePredicate(匹配请求时间)

After Route Predicate(匹配时间后的请求)
After Route Predicate可以匹配ZonedDateTime类型的时间,表示:匹配在指定日期时间之后发生的请求,配置如下:

spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: lb://SEARCH
          predicates:
            - Path=/search-service/**
            - After=2022-07-8T14:00:00+08:00[Asia/Shanghai]

配置中匹配了2022-07-8 14:00:00后的请求,如果是在指定时间之前进入系统的请求,会出现错误。

Before Route Predicate(匹配时间前的请求)
Before Route Predicate可以匹配ZonedDateTime类型的时间,表示:匹配在指定日期时间之前发生的请求,配置如下:

spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: lb://SEARCH
          predicates:
            - Path=/search-service/**
            - Before=2022-07-8T14:00:00+08:00[Asia/Shanghai]

配置中匹配了2022-07-8 14:00:00之前的请求,如果是在指定时间之后进入系统的请求,会出现错误。

Between Route Predicate(匹配时间之间的请求)
Between Route Predicate可以匹配ZonedDateTime类型的时间,由两个ZonedDateTime参数组成,第一个参数为开始时间,第二参数为结束时间,表示:匹配在指定的开始时间与结束时间之内发生的请求,配置如下:

spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: lb://SEARCH
          predicates:
            - Path=/search-service/**
            - Between=2022-07-8T14:00:00+08:00[Asia/Shanghai],2022-07-28T14:00:00+08:00[Asia/Shanghai]

配置中匹配2022-07-8 14:00:00到2022-07-28 14:00:00之内时间段的请求,如果是在指定时间段外的进入系统的请求,会出现错误。

1.3、基于Cookie:Cookie Route Predicate

CookieRoutePredicate由两个参数组成,第一个参数为cookie的Key,第二参数为cookie的Value,表示:匹配指定名称且其值与正则表达式匹配的cookie的请求,配置如下:

spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: lb://SEARCH
          predicates:
            - Path=/search-service/**
            - Cookie=cookieName, \d+

配置中匹配了cookie的Key为cookieName,值为满足\d+的正则表达式请求,如果满足cookieName不满足\d+的请求,会出现错误。

1.4、基于Header:Header Route Predicate

HeaderRoutePredicate由两个参数组成,第一个参数为Header名称,第二参数为Header的Value值,表示:匹配指定名称且其值与正则表达式匹配的Header的请求,配置如下:

spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: lb://SEARCH
          predicates:
            - Path=/search-service/**
            - Header=X-Request-Id, \d+

配置中匹配了Header的名称为X-Request-Id,值为满足\d+的正则表达式请求,如果满足headerName不满足\d+的请求,会出现错误。

1.5、基于Host:Host Route Predicate

HostRoutePredicate参数为请求的Host地址,多个参数使用逗号分割,设置的Host地址可以使用**表示通配符,配置如下:

spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: lb://SEARCH
          predicates:
            - Host=**.test1.com,**.test2.com

配置中匹配的Host,可以匹配以test1.com或者test2.com结尾的Host地址,其他Host地址访问会出现错误。

1.6、基于请求方法:Method Route Predicate

MethodRoutePredicate由一个或多个HTTP Method组成,比如:POST、PUT、GET、DELETE,配置如下:

spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: lb://SEARCH
          predicates:
            - Path=/search-service/**          
            - Method=GET,POST

配置中匹配了HTTP Method的类型为GET和POST,如果是其他类型的HTTP Method,会出现错误。

1.7、Query Route Predicate

QueryRoutePredicate由两个参数组成,第一个参数为参数名称,第二参数为参数的值(满足正则即可),表示:匹配指定名称且其值与正则表达式匹配的带参的请求,配置如下:

spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: lb://SEARCH
          predicates:
            - Path=/search-service/**          
            - Query=name,\d+

配置中匹配了参数名称叫做name,值满足\d+的请求,如果不满足\d+,会出现错误。

1.8、基于远程地址:RemoteAddr Route Predicate

RemoteAddrRoutePredicate的参数由CIDR 表示法(IPv4 或 IPv6)字符串组成,配置如下:

spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: lb://SEARCH
          predicates:
            - Path=/search-service/**          
            - RemoteAddr=192.168.1.1/24

配置中可以匹配IP为192.168.1.1–192.168.1.254的值,如果不满足192.168.1.1/24的IP规则,会出现错误。

1.9、基于路由权重:Weight Route Predicate

WeightAddrRoutePredicate由group和weight(权重数值)组成,表示将相同的请求根据权重跳转到不同的uri地址,要求group的名称必须一致,配置如下:

spring:
  cloud:
    gateway:
      locator:
        enabled: true
      routes:
        -id: weight_route1
         uri: lb://SEARCH
         predicates:
          - Path=/weight/**
          - Weight= group3, 1          
        -id: weight_route2
         uri: lb://USERS
         predicates: 
          - Path=/weight/** 
          - Weight= group3, 9 
 

如上配置了两个对于 / weight/** 路径转发的路由定义,这两个路由是同一个权重分组,且 weight_ route1 权重为 1, weight_ route2 权重为9。 对于10个访问/ weight/** 路径的请求来说,将会有9个路由到 weight_ route2,1个路由到 weight_ route1。

2.自定义断言

假设我们需要对访问的用户年龄做限制,只允许18-60岁之间的人来访问。我们可以自己定义断言来实现

2.1 新建一个路由断言工厂MyAgeRoutePredicateFactory

package com.test.apigateway.Predicate;

import com.alibaba.cloud.commons.lang.StringUtils;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.server.ServerWebExchange;

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;


@Component

// 自定义路由断言工厂

public class MyAgeRoutePredicateFactory extends AbstractRoutePredicateFactory<MyAgeRoutePredicateFactory.Config> {


    public MyAgeRoutePredicateFactory() {
        super(MyAgeRoutePredicateFactory.Config.class);
    }

    // 将配置文件中的值按返回集合的顺序,赋值给配置类
    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList(new String[]{"minAge", "maxAge"});
    }

    @Override
    public Predicate<ServerWebExchange> apply(Consumer<Config> consumer) {
        return super.apply(consumer);
    }

    @Override
    public Predicate<ServerWebExchange> apply(Config config) {
        // 创建网关断言对象
        return new Predicate<ServerWebExchange>() {
            // 检查
            @Override
            public boolean test(ServerWebExchange serverWebExchange) {
                // 获取请求参数age,判断是否满足[18, 60)
                MultiValueMap<String, String> queryParams = serverWebExchange.getRequest().getQueryParams();
                String age = queryParams.getFirst("age");
                if (!StringUtils.isEmpty(age) && age.matches("[0-9]+")) {
                    int iAge = Integer.parseInt(age);
                    if (iAge >= config.minAge && iAge < config.maxAge) {
                        return true;
                    }
                }
                return false;
            }
        };
    }

    // 配置类,属性用于接收配置文件中的值
    @Validated
    public static class Config {
        private int minAge;
        private int maxAge;

        public int getMinAge() {
            return minAge;
        }

        public void setMinAge(int minAge) {
            this.minAge = minAge;
        }

        public int getMaxAge() {
            return maxAge;
        }

        public void setMaxAge(int maxAge) {
            this.maxAge = maxAge;
        }
    }
}

要求:

类必须要加上RoutePredicateFactory作为结尾

类必须继承AbstractRoutePredicateFactory

必须声明静态内部类。

2.2 添加Gateway配置信息

    gateway:
      routes:
        - id: myage
          uri: lb://SEARCH
          predicates:
            - Path=/search-service/**
            - MyAge=18,60
          filters:
            - StripPrefix=1

MyAge即是我们新建断言工厂的前缀名,自动识别的。

2.3 测试

在这里插入图片描述

在这里插入图片描述

四、过滤器

GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理。

1.过滤器生命周期

PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。

POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。

2.局部过滤器

2.1 局部过滤器有哪些?

是指作用在某一个路由上,SpringCloud Gateway内置了很多路由过滤器,他们都是由GatewayFilter的工厂类产生。

在这里插入图片描述

2.2 局部过滤器怎么使用

比如AddRequestParameter GatewayFilter

该过滤器可以给请求添加参数。

比如我在SEARCH服务有一个带有page参数的接口,我想请求网关路由转发的时候给加上一个page=1的参数。

接口如下:

在这里插入图片描述

添加配置信息:

在这里插入图片描述

测试

在这里插入图片描述

再比如前面用过的- StripPrefix=1,表示把请求网关的路径前缀的第一级去掉。

内置过滤器很多,我们这里举一个例子看一下使用方式,其它的可以看帮助手册

https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/

3.全局过滤器

全局过滤器在系统初始化时就作用于所有的路由,不需要单独去配置。全局过滤器的接口定义类是GlobalFilter,Gateway本身也有很多内置的过滤器。

在这里插入图片描述

比如LoadBalancerClientFilter

该过滤器会解析到以lb://开头的uri,比如这样的配置:

    gateway:
      routes:
        - id: abc
          uri: lb://SEARCH
          predicates:
            - Path=/search-service/**
          filters:
            - StripPrefix=1
            - AddRequestParameter=page,1

它会使用Spring Cloud的LoadBalancerClient 来将 SEARCH服务解析成实际的host和port,重新组装请求的url。

它是作用于全局,而且并不需要配置。

五、Gateway实现日志记录

启用Reactor Netty访问日志:-Dreactor.netty.http.server.accessLogEnabled=true

在这里插入图片描述

测试:

在这里插入图片描述

六、Gateway整合Sentinel实现流控

1.Gateway如何整合Sentinel

1.1.添加jar包

<!-- 导入sentinel-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

<!-- 导入sentinel整合Gateway-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>

1.2.添加配置信息

  sentinel:
      transport:
        port: 8888
        dashboard: http://localhost:8080

1.3.测试

启动Sentinel,重启网关微服务,运行一次服务中的接口,再次刷新Sentinel,会出现以下内容,表示整合成功

在这里插入图片描述

2.网关限流

从1.6.0版本开始,Sentinel提供了SpringCloud Gateway的适配模块,可以提供两种资源维度的限流:

route维度:即在配置文件中配置的路由条目,资源名为对应的routeId,这种属于粗粒度的限流,一般是对某个微服务进行限流。

自定义API维度:用户可以利用Sentinel提供的API来自定义一些API分组,这种属于细粒度的限流,针对某一类的uri进行匹配限流,可以跨多个微服务。

2.1 路由维度

在这里插入图片描述

在这里插入图片描述

这里的Burst size是指:应对突发请求时额外允许的请求数目。

还可以设置针对断言的请求属性:

在这里插入图片描述

2.2 API分组维度

添加API分组:

在这里插入图片描述

在这里插入图片描述

对当前分组限流:

在这里插入图片描述

测试:

属于API分组的路由被限流

在这里插入图片描述

不在分组内的不受影响

在这里插入图片描述

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

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

相关文章

Hudi(3):Hudi之基本概念

目录 0. 相关文章链接 1. 时间轴&#xff08;TimeLine&#xff09; 1.1. Instant action&#xff1a;在表上执行的操作类型 1.2. Instant time 1.3. State 1.4. 两个时间概念 2. 文件布局&#xff08;File Layout&#xff09; 2.1. Hudi表的文件结构 2.2. Hudi存储的两…

Cocos 引擎生态部负责人李阳:己之所欲,可施于人,希望通过生态促进国内引擎技术发展

前言 “小小的身体&#xff0c;大大的能量&#xff0c;这个应该是我对大表姐最直接的感觉&#xff0c;在她娇小的身躯里蕴含了无限的精力和潜力&#xff0c;很像漫威里的神奇女侠&#xff0c;作为一个具备冒险精神的非典型程序员&#xff0c;大表姐热爱的体育活动都是很具挑战…

大数据系列——什么是ClickHouse?ClickHouse有什么用途?

目录 一、什么是ClickHouse 二、ClickHouse有什么用途 三、ClickHouse的不足 四、适用场景 五、ClickHouse特点 六、ClickHouse VS MySQL 七、类SQL 语句 八、核心概念 一、什么是ClickHouse clickHouse是俄罗斯的 Yandex 公司于 2016 年开源的列式存储数据库&#x…

win11系统用户名称为中文导致文件夹出现繁体字文件夹、系统路径配置错误修改教程(博主亲测,基于win11,系统文件保留)

写在前面&#xff1a;很多人在拿到新电脑激活那会&#xff0c;命名就是简单的中文&#xff0c;但是中文命名电脑系统名称&#xff0c;会导致系统用户文件夹自动命名为中文&#xff0c;在后期使用中会导致c盘系统用户文件夹下面出现不知名繁体字文件夹&#xff0c;甚至有的朋友会…

终难逃一阳

阳了&#xff0c;抗原试剂显示我阳了。每天都带口罩的我还是未能逃过此劫。真是覆巢之下&#xff0c;焉有完卵。 ​ 1.背景 12月初国家逐步放开防疫&#xff0c;随之而来的就是奥秘克戎肆虐全国。身边同事和朋友一个接着一个倒下&#xff0c;朋友圈里更是哀嚎一片。好在专家…

《CSAPP》笔记——链接、异常控制流、虚拟内存

文章目录传送门链接基础链接器的意义编译器驱动程序静态链接ELF目标文件格式可重定位目标文件符号和符号表链接过程符号解析解析规则静态链接库带有静态链接库的解析过程重定位重定位条目重定位节重定位符号引用重定位相对引用重定位绝对引用加载可执行目标文件动态链接共享库库…

Kafka 消费者组开发

Kafka consumer - 消费者组 上一篇文章学习到kafka消费者、消费者组之间处理消息的差异&#xff0c;总结起来就是&#xff1a; 同一个消费组的不同消费实例 共同消费topiic的消息, 一个消息只会消费一次&#xff1b; 也叫做集群消费同一个消息被不同的消费组同时消费&#xf…

机器学习基石1(ML基本概念和VC dimension)

文章目录一、什么是机器学习?二、什么时候可以使用机器学习?三、感知机perceptron四、机器学习的输入形式五、机器真的可以学习吗&#xff1f;六、vc dimension一、什么是机器学习? 其实第一个问题和第二个问题是穿插到一块儿回答的&#xff0c;首先机器学习要解决的是常规的…

RedisTemplate操作redis

目录 Redis Repositories方式 a、启用 Repository 功能 b、注解需要缓存的实体 c、创建一个 Repository 接口 d、测试类中测试 Redis Repositories方式 Spring Data Redis 从 1.7 开始提供 Redis Repositories &#xff0c;可以无缝的转换并存储 domain objects&#xff0…

TOPSIS法(熵权法)(模型+MATLAB代码)

TOPSIS可翻译为逼近理想解排序法&#xff0c;国内简称为优劣解距离法 TOPSIS法是一种常用的综合评价方法&#xff0c;其能充分利用原始数据的信息&#xff0c;其结果能精确地反映各评价方案之间的距离 一、模型介绍 极大型指标&#xff08;效益型指标&#xff09; &#xff…

OR-Tools工具介绍以及实战(从入门到超神Python版)

目录前言0、安装一、什么是优化问题&#xff1f;1-1、优化问题介绍1-2、举例1-2-1、导入所需要的库1-2-2、声明求解器1-2-3、创建变量1-2-4、定义约束条件1-2-5、定义目标函数1-2-6、调用求解器&#xff0c;并且显示结果。二、python有关于各种优化问题示例2-1、简单的线性编程…

AlexNet 深度学习奠基作之一(1)

2012年发表 imagenet 一百二十万的图片 1000个种类 cv 对于刷榜 是非常在意的 AlexNet 有六千万的参数&#xff0c;和65000的神经元 为了减少过拟合 我们使用了dropout 很work 很有效 而且 这篇文章没有conclusion 只有 讨论 当他发现 从5个层里面去掉一个 performence会降…

ubuntu设置core文件

长久不写代码&#xff0c;突然发现ubuntu当前运行目录下没有生成core文件&#xff0c;记录如下&#xff0c;避免下次重找。 1、首先开启core文件权限&#xff1a; ulimit -c 如果结果为0&#xff0c; 则表示没有开启&#xff0c;需要开启&#xff0c;如下&#xff1a; 通过u…

【Linux】Linux系统SSH客户端断开后保持进程继续运行配置方法;Python等脚本在终端后台运行的方法

0. 概述 在Linux系统中&#xff0c;通常我们在执行一些运行时间比较长的任务时&#xff0c;必须等待执行完毕才能断开SSH连接或关闭客户端软件&#xff0c;否则可能会导致执行中断。本文介绍几种保障程序在用户退出登录后持续运行的方法。 一、方法 1. 使用nohup执行 nohup…

网络编程 事件选择模型

目录 1.概念分析 2.事件选择代码逻辑 1.WSACreateEvent函数 2.WSACloseEvent函数 3.WSAEventSelect函数 4.WSAWaitForMultipleEvents()函数 5.WSAEnumNetworkEvents函数 事件分类 3.##模型代码样例 1.概念分析 本质上是操作系统处理用户行为&#xff0c;详细如下 事件选…

目标检测之YOLOv5算法分析

YOLOv5共有5个版本的网络模型及其权重文件&#xff0c;即&#xff08;n,s,m,l,x&#xff09;。 &#xff08;下图来自github上yolov5官方开源项目的性能截图&#xff09; 其中n,s,m,l,x网络模型结构如出一辙&#xff0c;差异在参数上。另外的n6,s6,m6,l6,x6模型是对于更大分辨…

人生黄金十年,你有考虑来社科院与杜兰大学金融管理硕士项目汲取能量吗

在人生长河中&#xff0c;你觉得黄金的十年是哪个阶段呢&#xff1f;在一篇文章中看到人生最宝贵的十年&#xff0c;就是30岁到40岁这十年&#xff0c;一切都未确定&#xff0c;一切都还有机会&#xff0c;这个年龄段&#xff0c;寸阴寸金&#xff0c;流金年华&#xff0c;应该…

FFmpeg学习笔记--视频传输的基本概念

目录 1--容器&#xff08;container&#xff09;和文件&#xff08;file&#xff09; 2--媒体流&#xff08;stream&#xff09; 3--数据帧&#xff08;frame&#xff09;和数据包&#xff08;packet&#xff09;&#xff1a; 4--编解码器&#xff08;Codec&#xff09; 5…

7万人随访发现,每周高强度运动15分钟,死亡风险降低24%

*仅供医学专业人士阅读参考我们已经知道&#xff0c;无论是日常规律运动&#xff0c;还是周末集中一两天运动&#xff0c;只要每周能完成至少75-150分钟的高强度有氧运动&#xff0c;都可以降低全因死亡率和特定原因死亡率[1]。每周300-600分钟中强度运动或150-300分钟高强度运…

RocketMQ原理篇

文章目录broker与NameServerMessageQueue与Topic的关系生产者、消费者写入读取 消息CommitLog生产者消费者组broker与NameServer 基于 Dledger 实现 RocketMQ 高可用自动切换 broker 会每隔 30 秒向 NameServer 发送一个的心跳 &#xff0c;NameServer 收到一个心跳 会更新对…