Spring Cloud Gateway官方文档学习笔记

Spring Cloud Gateway官方文档学习笔记

前言

  • 基础知识:API网关基础知识总结
  • 面试题:Spring Cloud
    Gateway夺命连环10问?

何为网关?

什么是网关?理解成火车站的检票口,统一 检票

网关优点: 统一进行操作,去处理一些问题

1、网关作用

  1. 路由
  2. 负载均衡
  3. 统一鉴权
  4. 统一处理跨域
  5. 统一业务处理(缓存)
  6. 访问控制
  7. 发布控制
  8. 流量染色
  9. 统一接口保护
    1. 限制请求
    2. 信息脱敏
    3. 降级(熔断)
    4. 限流 学习令牌桶算法,学习露桶算法,学习一下 RedislimitHandler
    5. 超时时间
    6. 重试(业务保护)
  10. 统一日志
  11. 统一文档

2、具体作用

路由(请求转发)

起到转发的作用,比如有接口 A 和接口 B, 网关会记录这些信息,根据用户访问的地址和参数,转发请求到对应的接口(服务器 / 集群)

用户 a 调用接口 A

/a => 接口 A
/b => 接口 B

https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories

负载均衡

在路由的基础上可以转发到某一个服务器

/c => 服务A / 集群 A(随机转发到其中的某一个机器)

uri 从固定地址改成 b:xx

统一鉴权

判断用户是否有权限进行操作,无论访问什么接口,我都统一去判断权限,不用重复写

统一处理跨域

网关统一处理跨域,不用在每个项目单独处理

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

统一业务处理

把每个项目中都要做的通用逻辑放到上层(网关),统一处理,比如本项目的次数统计

访问控制

黑白名单,比如限制 DDOS IP – 将已知的恶意 IP 地址添加到黑名单中,从而防止这些 IP 地址对系统发起 DDoS 攻击。

黑白名单是一种常见的网络安全策略,用于限制或允许 特定的 IP 地址或 IP 地址范围 访问网络资源。限制 DDoS(分布式拒绝服务攻击)IP 是黑名单的一个典型用例。

发布控制

灰度发布,比如上线新接口,先给新接口分配 20%流量,老接口80%,再慢慢调整比例

https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-weight-route-predicate-factory

流量染色

区分用户来源

给请求(流量)添加一些标识,一般是设置请求头中,添加新的请求头
https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-addrequestheader-gatewayfilter-factory

全局染色:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#default-filters

接口保护

  1. 限制请求

    https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#requestheadersiz-gatewayfilter-factory

  2. 信息脱敏

    https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-removerequestheader-gatewayfilter-factory

  3. 降级(熔断)进行兜底

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

  4. 限流

    https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-requestratelimiter-gatewayfilter-factory

  5. 超时时间 超时就中断

    https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#http-timeouts-configuration

  6. 重试(业务保护):

    https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-retry-gatewayfilter-factory

统一日志

统一的请求,响应信息记录

统一文档

将下游项目的文档进行聚合,在一个页面统一查看

建议用:https://doc.xiaominfo.com/docs/middleware-sources/aggregation-introduction

网关的分类

  • **全局网关(接入层网关)**作用是负载均衡、请求日志等,不和业务逻辑绑定
  • **业务网关(微服务网关)**会有一些业务逻辑,作用是将请求转发到不同的业务/项目/接口/服务

参考文章:https://blog.csdn.net/qq_21040559/article/details/122961395

实现

  1. Nginx (全局网关),Kong网关(API网关), 编程成本相对较高
  2. Spring Cloud Gateway(取代了Zuul)性能高 可以用java代码来写逻辑 适于学习

网关技术选型:https://zhuanlan.zhihu.com/p/500587132

Spring Cloud Gateway

全部内容基本来自官网

官网:https://spring.io/projects/spring-cloud-gateway

官方文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference//html/

中文文档:https://springdoc.cn/spring-cloud-gateway/#gateway-starter

新建项目

在 IDEA 中新建项目 勾选 Gateway、Lombok

参考官网 get started 中的实例代码

@SpringBootApplication
public class DemogatewayApplication {@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route("path_route", r -> r.path("/get").uri("http://httpbin.org")).route("host_route", r -> r.host("*.myhost.org").uri("http://httpbin.org")).route("rewrite_route", r -> r.host("*.rewrite.org").filters(f -> f.rewritePath("/foo/(?<segment>.*)", "/${segment}")).uri("http://httpbin.org")).route("hystrix_route", r -> r.host("*.hystrix.org").filters(f -> f.hystrix(c -> c.setName("slowcmd"))).uri("http://httpbin.org")).route("hystrix_fallback_route", r -> r.host("*.hystrixfallback.org").filters(f -> f.hystrix(c -> c.setName("slowcmd").setFallbackUri("forward:/hystrixfallback"))).uri("http://httpbin.org")).route("limit_route", r -> r.host("*.limited.org").and().path("/anything/**").filters(f -> f.requestRateLimiter(c -> c.setRateLimiter(redisRateLimiter()))).uri("http://httpbin.org")).build();}
}

编写代码:

@SpringBootApplication
public class XuanapiGatewayApplication {public static void main(String[] args) {SpringApplication.run(XuanapiGatewayApplication.class, args);}// 构建自定义路由@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route("to_baidu", r -> r.path("/baidu") // 定义路由名称为 "to_baidu".uri("http://www.baidu.com/")) // 将匹配的请求转发到 "http://www.baidu.com/".build();}}

在此配置类中,定义了一个名为 "to_baidu" 的路由规则,当请求的路径是 "/baidu" 时,将被路由到 “http://www.baidu.com/”。

1、核心概念

Glossary

官方文档如下

  • Route: The basic building block of the gateway. It is defined by an ID, a destination URI, a collection of predicates, and a collection of filters. A route is matched if the aggregate predicate is true.
  • Predicate: This is a Java 8 Function Predicate. The input type is a Spring Framework ServerWebExchange. This lets you match on anything from the HTTP request, such as headers or parameters.
  • Filter: These are instances of GatewayFilter that have been constructed with a specific factory. Here, you can modify requests and responses before or after sending the downstream request.

解析:

  1. 路由(根据什么条件,转发到哪里)

  2. 谓词 / 断言(一组规则,条件,用来确定如何转发路由)

  3. 过滤器:对请求进行一系列的处理,比如添加请求头,添加请求参数

请求流程
  1. 客户端发起请求
  2. Handler Mapping:根据断言,去将请求转发到对应的路由
  3. Web Handler:处理请求(一层层经过过滤器)
  4. 实际调用服务

image-20230509171132036

2、两种配置方式

  1. 配置式 (方便,规范)能用就用

    • 简化版
    spring:cloud:gateway:routes:- id: after_routeuri: https://example.orgpredicates:- Cookie=mycookie,mycookievalue
    
    • 全称
    spring:cloud:gateway:routes:- id: after_routeuri: https://example.orgpredicates:- name: Cookieargs:name: mycookieregexp: mycookievalue
    
  2. 编程式(灵活,相对麻烦) – 就是自己编写代码定义

3、路由的各种断言

官网地址: https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories

目录

  1. After 在xx时间之后
  2. Before 在xx时间之前
  3. Between 在xx时间之间
  4. 请求类别
  5. 请求头(包含Cookie)
  6. 查询参数
  7. 客户端地址
  8. 权重
After

The After Route Predicate Factory

当前时间在这个时间之后,就会访问当前这个路由

spring:cloud:gateway:routes:- id: after_routeuri: https://example.orgpredicates:- After=2017-01-20T17:42:47.789-07:00[America/Denver]
Before

The Before Route Predicate Factory

当前时间在这个时间之前,就会访问当前这个路由

spring:cloud:gateway:routes:- id: before_routeuri: https://example.orgpredicates:- Before=2017-01-20T17:42:47.789-07:00[America/Denver]
Between

The Between Route Predicate Factory

当前时间在这个时间之间,就会访问当前这个路由

spring:cloud:gateway:routes:- id: between_routeuri: https://example.orgpredicates:- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]
请求头(包含Cookie)

The Cookie Route Predicate Factory

如果你的请求头cookie的是chocolate,它的值是ch.p,就会访问当前这个路由

spring:cloud:gateway:routes:- id: cookie_routeuri: https://example.orgpredicates:- Cookie=chocolate, ch.p

The Header Route Predicate Factory

如果你的请求头包含 X-Request-Id 这样一个请求头,并且,它的值符合正则表达式的规则,就会访问当前这个路由

spring:cloud:gateway:routes:- id: header_routeuri: https://example.orgpredicates:- Header=X-Request-Id, \d+
域名

The Host Route Predicate Factory

如果你的访问的是这个 **.somehost.org,.anotherhost.org域名,就会访问当前这个路由

spring:cloud:gateway:routes:- id: host_routeuri: https://example.orgpredicates:- Host=**.somehost.org,**.anotherhost.org
请求类别

The Method Route Predicate Factory

如果你的请求类别是这个 GETPOST,就会访问当前这个路由

spring:cloud:gateway:routes:- id: method_routeuri: https://example.orgpredicates:- Method=GET,POST
访问的地址

The Path Route Predicate Factory

如果你的访问的地址是以这些 /red/{segment},/blue/{segment} 路径作为前缀,就会访问当前这个路由({segment} 花括号定义占位符)

spring:cloud:gateway:routes:- id: path_routeuri: https://example.orgpredicates:- Path=/red/{segment},/blue/{segment}

参考:https://springdoc.cn/spring-cloud-gateway/#path

查询参数

The Query Route Predicate Factory

根据查询条件,比如 red greet green,就会访问当前这个路由

spring:cloud:gateway:routes:- id: query_routeuri: https://example.orgpredicates:- Query=red, gree.
远程地址

The RemoteAddr Route Predicate Factory

根据远程地址,比如你的用户的 ip地址是 192.168.1.1/24,就会访问当前这个路由

spring:cloud:gateway:routes:- id: remoteaddr_routeuri: https://example.orgpredicates:- RemoteAddr=192.168.1.1/24
权重

The Weight Route Predicate Factory

根据你设置的权重,给你把同一个访问的地址,重定到不同的服务,轻松实现发布控制

spring:cloud:gateway:routes:- id: weight_highuri: https://weighthigh.orgpredicates:- Weight=group1, 8- id: weight_lowuri: https://weightlow.orgpredicates:- Weight=group1, 2
XForwarded 远程地址

The XForwarded Remote Addr Route Predicate Factory

从请求头中如果拿到 XForwarded 这个请求头的地址 192.168.1.1/24 就会访问当前这个路由

spring:cloud:gateway:routes:- id: xforwarded_remoteaddr_routeuri: https://example.orgpredicates:- XForwardedRemoteAddr=192.168.1.1/24

4、过滤器

官网文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories

基本功能:对请求头、请求参数、响应头的增删改查
1.添加请求求头
2.添加请求参数
3.添加响应头
4.降级
5.限流
6.重试

增加请求头(可以用作流量染色)

The AddRequestHeader GatewayFilter Factory

spring:cloud:gateway:routes:- id: add_request_header_routeuri: https://example.orgfilters:- AddRequestHeader=X-Request-red, blue
增加请求参数

The AddRequestParameter GatewayFilter Factory

spring:cloud:gateway:routes:- id: add_request_parameter_routeuri: https://example.orgfilters:- AddRequestParameter=red, blue

这将为所有匹配的请求在下游请求的查询字符串中添加 red=blue

添加响应头

The AddResponseHeader GatewayFilter Factory

spring:cloud:gateway:routes:- id: add_response_header_routeuri: https://example.orgfilters:- AddResponseHeader=X-Response-Red, Blue

这将把 X-Response-Red:Blue header 添加到所有匹配请求的下游响应的 header 中。

如果响应头中有重复的,去重

The DedupeResponseHeader GatewayFilter Factory

spring:cloud:gateway:routes:- id: dedupe_response_header_routeuri: https://example.orgfilters:- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin

保留策略:第一,最后,随机

The DedupeResponseHeader filter also accepts an optional strategy parameter. The accepted values are RETAIN_FIRST (default), RETAIN_LAST, and RETAIN_UNIQUE.

在 Spring Cloud Gateway 的 DedupeResponseHeader 过滤器中,可以使用 strategy 参数来指定响应头的保留策略。该过滤器的作用是去重响应头,确保在多次请求后只保留一个相同的响应头

可接受的 strategy 参数值有三种:

  1. RETAIN_FIRST:默认值。表示保留第一个出现的响应头,后续相同的响应头会被忽略,只保留第一个。

  2. RETAIN_LAST:表示保留最后一个出现的响应头,之前的相同响应头会被忽略,只保留最后一个。

  3. RETAIN_UNIQUE:表示保留所有不重复的响应头,不论其出现的顺序。

通过设置不同的保留策略,可以控制响应头的去重方式,以满足具体的需求。默认情况下,使用 RETAIN_FIRST 策略,保留第一个出现的响应头。

降级

Spring Cloud CircuitBreaker GatewayFilter Factory

需要引入 spring-cloud-starter-circuitbreaker-reactor-resilience4j

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
</dependency>
spring:cloud:gateway:routes:- id: circuitbreaker_routeuri: lb://backing-service:8088predicates:- Path=/consumingServiceEndpointfilters:- name: CircuitBreakerargs:name: myCircuitBreakerfallbackUri: forward:/inCaseOfFailureUseThis- RewritePath=/consumingServiceEndpoint, /backingServiceEndpoint

这个路由规则定义了一个对 “/consumingServiceEndpoint” 路径的请求转发到名为 “backing-service” 的服务的 8088 端口。同时,还使用了熔断器来保护后端服务,当后端服务发生故障时,会使用 “/inCaseOfFailureUseThis” 作为回退 URI,以保证系统的稳定性和可用性。

降级处理器,写一下降级规则

The FallbackHeaders GatewayFilter Factory

spring:cloud:gateway:routes:- id: ingredientsuri: lb://ingredientspredicates:- Path=//ingredients/**filters:- name: CircuitBreakerargs:name: fetchIngredientsfallbackUri: forward:/fallback- id: ingredients-fallbackuri: http://localhost:9994predicates:- Path=/fallbackfilters:- name: FallbackHeadersargs:executionExceptionTypeHeaderName: Test-Header
  1. id: ingredients: 这个路由规则的唯一标识符为 “ingredients”。

  2. uri: lb://ingredients: 当请求匹配到该路由规则时,它会被转发到名为 “ingredients” 的服务。“lb://” 是 Spring Cloud Gateway 中定义的 LoadBalancer URI Scheme,表示通过负载均衡方式选择后端服务。

  3. predicates: 这里使用 Path 断言器,表示请求的路径必须以 “/ingredients/” 开头时,才会匹配到这个路由规则。

  4. filters: 这里定义了一个过滤器。

  5. CircuitBreaker: 这是 Spring Cloud Gateway 的熔断器过滤器,它用于实现熔断机制。在这个配置中,指定了一个名为 “fetchIngredients” 的熔断器,当后端服务发生故障时,将会使用 “/fallback” 作为备用的回退 URI。
    id: ingredients-fallback: 这个路由规则的唯一标识符为 “ingredients-fallback”。

  6. uri: http://localhost:9994: 当请求匹配到该路由规则时,它会被转发到 “http://localhost:9994”,即本地的另一个服务。

  7. predicates: 这里使用 Path 断言器,表示请求的路径必须为 “/fallback” 时,才会匹配到这个路由规则。

  8. filters: 这里定义了一个过滤器。

  9. FallbackHeaders: 这是一个自定义的过滤器,用于在请求发生回退时设置响应头信息。在这个配置中,指定了响应头中的 “Test-Header” 字段为 “executionExceptionTypeHeaderName”,用于标识回退的原因类型。

API 网关中的降级和熔断功能主要体现在以下几个方面:

  1. 降级处理:当后端服务出现异常或不可用时,API 网关可以根据事先定义的降级策略,临时关闭或限制某些功能或服务,以保证核心功能的正常运行。例如,当某个微服务不可用时,可以返回预先设定的默认值或错误信息,而不是将错误暴露给用户。
  2. 熔断机制:在后端服务出现持续性故障或高错误率时,API 网关可以自动触发熔断机制,暂时关闭对该服务的请求转发,并快速返回预先设定的错误响应。这样可以避免请求大量失败导致雪崩效应,保护其他服务和系统的正常运行。
  3. 限流控制:API 网关可以根据后端服务的处理能力和负载情况,对请求进行限流控制,防止后端服务被过多请求压垮。通过限流,可以保证服务的稳定性和可用性,防止系统过载。
  4. 服务降级:当后端服务出现异常或高负载时,API 网关可以通过服务降级,临时关闭或替换某些不重要或资源消耗较大的服务,以保障核心功能的稳定运行。
  5. 异常处理:API 网关可以对后端服务返回的异常进行统一处理,将错误信息转换成统一的格式,并返回给客户端。这样可以提供更好的用户体验,并帮助开发团队及时发现和解决问题。
映射

The MapRequestHeader GatewayFilter Factory

如果你的 请求头 里面有 Blue,会把 Blue 的值给 X-Request-Red,相当于做了映射

spring:cloud:gateway:routes:- id: map_request_header_routeuri: https://example.orgfilters:- MapRequestHeader=Blue, X-Request-Red
前缀处理器

The PrefixPath GatewayFilter Factory

spring:cloud:gateway:routes:- id: prefixpath_routeuri: https://example.orgfilters:- PrefixPath=/mypath

这会将 /mypath 作为所有匹配请求的路径的前缀。因此,对 /hello 的请求将发送到 /mypath/hello

固定 Host

The PreserveHostHeader GatewayFilter Factoryatewayfilter-factory

请求头转发的时候,有时候 host值 会变,这个可以保证不变

spring:cloud:gateway:routes:- id: preserve_host_routeuri: https://example.orgfilters:# 用于保留请求中的Host头信息。- PreserveHostHeader
限流

The RequestRateLimiter GatewayFilter Factory

image-20230131175738299

一般会使用 redis+令牌桶算法

spring:cloud:gateway:routes:- id: requestratelimiter_routeuri: https://example.orgfilters:- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 10redis-rate-limiter.burstCapacity: 20redis-rate-limiter.requestedTokens: 1
限制请求头大小

RequestHeaderSize GatewayFilter Factory

请求保护

spring:cloud:gateway:routes:- id: requestheadersize_routeuri: https://example.orgfilters:- RequestHeaderSize=1000B
移除请求头(脱敏)

The RemoveRequestHeader Gateway Filter Factory

spring:cloud:gateway:routes:- id: removerequestheader_routeuri: https://example.orgfilters:- RemoveRequestHeader=X-Request-Foo

This removes the X-Request-Foo header before it is sent downstream.

这将在发送到下游之前删除 X-Request-Foo 标头。

改写特殊的请求参数

The RewritePath GatewayFilter Factory

spring:cloud:gateway:routes:- id: rewritepath_routeuri: https://example.orgpredicates:- Path=/red/**filters:- RewritePath=/red/?(?<segment>.*), /$\{segment}

这个配置中定义了一个路由规则,它会将所有以 “/red/” 开头的请求转发到 “https://example.org”,并将 “/red/” 后面的路径作为子路径添加到目标 URI 上,实现了路径重写的功能。例如,对于请求 “/red/test”,将被转发到 “https://example.org/test”。

重试接口

The Retry GatewayFilter Factory

自动帮你重试接口,降级重试

spring:cloud:gateway:routes:# 定义一个名为"retry_test"的路由规则- id: retry_test# 转发到"http://localhost:8080/flakey"的目标URLuri: http://localhost:8080/flakeypredicates:# 当请求的Host为任意子域名.retry.com时,匹配该路由规则- Host=*.retry.comfilters:# 定义一个重试过滤器- name: Retryargs:# 当请求失败时,最多重试3次(包括初始请求)retries: 3# 定义需要重试的HTTP状态码,这里设置为BAD_GATEWAYstatuses: BAD_GATEWAY# 定义需要重试的HTTP请求方法,这里设置为GET和POSTmethods: GET,POST# 定义重试的时间间隔策略backoff:# 第一次重试的时间间隔为10毫秒firstBackoff: 10ms# 最大重试时间间隔为50毫秒maxBackoff: 50ms# 重试时间间隔的增长因子,每次重试的时间间隔将是上一次的倍数factor: 2# 这里设置为false,表示每次重试的时间间隔都是根据初始值来计算的,而不是上一次重试的值basedOnPreviousValue: false

这个配置中定义了一个路由规则,它会将所有 Host 为任意 子域名.retry.com 的请求转发到 “http://localhost:8080/flakey”,并在请求失败时进行最多 3 次的重试,重试的时间间隔为 10ms、20ms 和 40ms,最大不超过 50ms,仅对 GET 和 POST 方法的请求进行重试,并且仅在返回的 HTTP 状态码为 BAD_GATEWAY 时进行重试。

目的

  • 重试的目的是为了在网络不稳定或服务不可用的情况下,尝试重新发送请求,以增加请求成功的机会。
  • 通过重试,可以在一定程度上提高请求的成功率,减少因为临时性的网络问题或服务故障而导致的请求失败。
默认过滤器

Default Filters

  • 可以用作全局染色
spring:cloud:gateway:default-filters:    # 设置默认的过滤器- AddResponseHeader=X-Response-Default-Red, Default-Blue   # 添加响应头的过滤器,给响应头添加 X-Response-Default-Red 和 Default-Blue 两个字段- PrefixPath=/httpbin   # 前缀路径过滤器,给请求路径添加前缀 /httpbin

全局染色:在这里,它添加了一个名为 X-Response-Default-Red 的响应头,并设置其值为 Default-Blue

5、其他配置

1、全局过滤器

Global Filters

自定义过滤器

@Bean
public GlobalFilter customFilter() {return new CustomGlobalFilter();
}public class CustomGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("custom global filter");return chain.filter(exchange);}@Overridepublic int getOrder() {return -1;}
}
2、Http timeouts configuration

Global timeouts

配置 http 超时

spring:cloud:gateway:httpclient:connect-timeout: 1000response-timeout: 5s
3、CORS Configuration

跨域配置

spring:cloud:gateway:globalcors:    # 全局CORS跨域配置cors-configurations:   # 定义跨域配置'[/**]':   # 匹配所有路径allowedOrigins: "https://docs.spring.io"   # 允许的来源(域名),这里只允许来自 https://docs.spring.io 的请求allowedMethods:   # 允许的HTTP

对于所有 GET 请求的路径,允许来自 docs.spring.io 的请求的 CORS(跨源资源共享)请求。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个简化版的IPD产品开发各阶段的流程

IPD好不好&#xff1f;当然好&#xff01;IPD适不适合我们行业&#xff1f;当然适合&#xff0c;可以说&#xff0c;任何一个行业都可以借鉴IPD的理念和实践提高产品开发的效率&#xff0c;提升客户满意度。IPD复不复杂&#xff1f;当然复杂&#xff01; 关于IPD的框架和体系&…

GrayLog日志平台的基本使用-docker容器日志接入

1、/etc/docker/daemon.json中加入如下配置并重启服务 [rootlocalhost src]# cat /etc/docker/daemon.json { "registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"], "log-driver": "gelf", "log-opts":…

【ubuntu 22.04】安装vscode并配置正常访问应用商店

注意&#xff1a;要去vscode官网下载deb安装包&#xff0c;在软件商店下载的版本不支持输入中文 在ubuntu下用火狐浏览器无法访问vscode官网&#xff0c;此时可以手动进行DNS解析&#xff0c;打开DNS在线查询工具&#xff0c;解析以下主机地址&#xff08;复制最后一个IP地址&a…

二维码智慧门牌管理系统升级:强化用户管理合规性

文章目录 前言一、功能优化和多层级管理二、强大的合规性与权限配置三、提升管理效率与系统安全性 前言 随着科技迅速发展&#xff0c;二维码智慧门牌管理系统已经成为各组织机构首选的入口&#xff0c;提高了信息管理效率并确保了数据安全。然而&#xff0c;用户需求变化和法…

基于SpringBoot的校园疫情防控管理系统 JAVA简易版

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生2.2 老师2.3 学校管理部门 三、系统展示四、核心代码4.1 新增健康情况上报4.2 查询健康咨询4.3 新增离返校申请4.4 查询防疫物资4.5 查询防控宣传数据 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBoot…

【JAVA面试题】什么是对象锁,什么是类锁?

&#x1f34e; 个人博客 &#xff1a;个 人 主 页 &#x1f3c6;个人专栏&#xff1a;多线程JAVA ⛳️ 功 不 唐 捐 &#xff0c;玉 汝 于 成 目录 前言 回答 对象锁&#xff08;Object Lock&#xff09;&#xff1a; 类锁&#xff08;Class Lock&#xff09;&#xff1…

.NET中的Swagger使用

目录 前言 一、Swagger是什么&#xff1f; 二、如何Swagger文档说明的信息 1.在AddSwaggerGen方法中写入文档信息 2.运行效果 二、文档UI界面标题、路由设置 1.在中间件UseSwaggerUI方法中配置 三、文档UI界面添加接口注释 1.在 .csproj中配置 2.在AddSwaggerGen方法中配置Incl…

Deployment Controller详解(下)

上一篇在《Deployment Controller详解&#xff08;上&#xff09;》中介绍了Deployment Controller 的创建、更新和回滚。了解了这三个功能&#xff0c;基本上也就懂得了大厂PaaS平台中服务的灰度升级、失败回滚等操作是如何实现的了。 接下来本文会介绍Deployment Controller…

Error in `arrange()`: ! Can‘t transform a data frame with `NA` or `““` names.

问题&#xff1a;给Taxonomy排序&#xff0c;并筛选OTU表中存在的 根据提示运行&#xff1a;rlang::last_error()&#xff0c;显示&#xff1a; Backtrace:▆1. ├─dplyr::arrange(taxonomy, phylum, class, order, family, full)2. ├─dplyr:::arrange.data.frame(taxonom…

Linux 磁盘空间占满故障解决方法

故障排查&#xff1a; 使用命令查看磁盘使用量 # 使用人类可读的格式(预设值是不加这个选项的...) df -h # --inodes 列出 inode 资讯&#xff0c;不列出已使用 block df -i # 查看当前目录下各个文件及目录占用空间大小 du -sh / 情况一&#xff1a;一般磁盘空间满了&a…

《微信小程序开发从入门到实战》学习六十

6.2 账号信息API 6.2.3 小程序账号信息API 使用wx.getAccountInfoSync接口可以获取小程序账号信息&#xff0c;该接口自基础库2.2.2版本开始支持。代码如下&#xff1a; const accountInfo wx.getAccountInfoSync() console.log(accountInfo.miniProgram.appId) // 小程序…

部署tomcat单机多实例,keepalived+mysql的互为主从高可用,mysql+keepalived高可用

部署tomcat单机多实例 在Tomcat中部署单机多实例是一种常见的做法&#xff0c;它允许您在同一台服务器上运行多个独立的Tomcat实例&#xff0c;每个实例都有自己的配置、日志和应用程序。 安装jdk环境 首先配置java环境 [roottomcat ~]# tar xf jdk-8u211-linux-x64.tar.gz…