当前位置: 首页 > news >正文

SpringCloud微服务GateWay网关使用与配置

一、概念

1、什么是GateWay网关

在微服务架构中,Gateway(网关)是一个重要的组件,负责处理外部请求并将它们路由到适当的微服务。以下是Gateway在微服务中的一些主要功能:

  1. 路由: Gateway负责将来自客户端的请求路由到正确的微服务。这可以基于请求的路径、主机头、HTTP方法等条件进行路由。
  2. 负载均衡: Gateway可以执行负载均衡,将请求分发到多个相同或不同的微服务实例,以确保各个实例都能够处理相应的负载,提高系统的性能和可用性。
  3. 安全性: Gateway通常用于处理安全性方面的任务,例如身份验证、授权和加密。它可以拦截请求并验证用户的身份,确保只有经过身份验证的用户才能访问受保护的微服务。
  4. 监控和日志: Gateway可以收集有关请求和响应的信息,用于监控和日志记录。这些信息可以用于分析性能问题、跟踪请求流程,以及生成有关系统行为的报告。
  5. 协议转换: Gateway可以执行协议转换,将外部请求从一个协议转换为另一个协议。例如,将HTTP请求转换为WebSocket请求,或者将请求从HTTP/1.1转换为HTTP/2。
  6. 缓存: Gateway可以实现请求和响应的缓存,以降低对微服务的负载,提高响应速度。这对于处理频繁请求相同资源的情况很有用。
  7. 限流: 通过在Gateway上实现限流策略,可以控制对微服务的请求流量,防止过多的请求导致系统过载。
  8. 断路器模式: Gateway可以实现断路器模式,用于在微服务发生故障或不可用时防止请求继续传递,从而提高系统的稳定性。
  9. API管理: Gateway可以用于集中管理和监控微服务的API。这包括API版本控制、文档生成、请求转换等。

2、gateway网关的工作流程

  1. 客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。
  2. 过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(Pre)或之后(Post)执行业务逻辑。
  3. 在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等;
  4. 在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。

3、gateway三大核心概念

  1. Route(路由):路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由。
  2. Predicate(断言):参考的是Java8的java.util.function.Predicate,开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由。
  3. Filter(过滤):指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。

二、搭建网关微服务

1、导入依赖

    <dependencies><!--gateway--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--服务注册发现consul discovery,网关也要注册进服务注册中心统一管控--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency><!-- 指标监控健康检查的actuator,网关是响应式编程删除掉spring-boot-starter-web dependency--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>

2、配置文件

server:port: 9000
spring:cloud:consul:discovery:service-name: ${spring.application.name}prefer-ip-address: truehost: 127.0.0.1port: 8500gateway:routes:- id: orderuri: http://localhost:80predicates:- Path=/feign/pay/gateway/**

这里将网关微服务添加进了consul配置中心,并且配置了一条到http://localhost:80,请求路径为/feign/pay/gateway/**的路由路径,这里的请求服务器我们是写死的,不便于代码的维护和更改。

3、启动类

@SpringBootApplication
public class Gateway {public static void main(String[] args) {SpringApplication.run(Main9527.class,args);}
}

4、修改路由为通用配置

server:port: 9000
spring:cloud:consul:discovery:service-name: ${spring.application.name}prefer-ip-address: truehost: 127.0.0.1port: 8500gateway:routes:- id: orderuri: lb://cloud-consumer-openfeign-orderpredicates:- Path=/feign/pay/gateway/**

此时我们使用的不再是固定的主机,而是使用微服务名来查找对应的服务,并且使用lb(loadBalancer)实现了网关的负载均衡作用

三、predicate断言

1、断言概念

Spring Cloud Gateway 将路由匹配为 Spring WebFluxHandlerMapping基础架构的一部分。Spring Cloud Gateway 包含许多内置的路由谓词工厂。所有这些谓词都匹配 HTTP 请求的不同属性。您可以将多个路由谓词工厂与逻辑and语句结合起来。(谓词工厂也就是我们所说的断言)

在springcloud-gateway官网可以看到,谓词有十几种

我们运行搭建好的gateway网关微服务,查看控制台可以看到如下信息,正好与官网的分类一一对应

2、参数详情

用法示例: 如下示例当中会发现我实际上相当于设置了两个predicates(断言),path也算是一个,After又是一个,在实际开发当中,根据自己的实际场景可以随便使用断言。

  1. Path: 配置请求的路径
  2. Before Route Predicater:Before就是设置的时间之前可以访问,过了时间之后不可以访问
  3. Between Route Predicate:两个时间的区间是可以访问的,过了时间之后不可以访问
  4. Cookie Route Predicate:Cookie路由谓词工厂有两个参数,cookie和namea regexp(这是一个 Java 正则表达式)。此谓词匹配具有给定名称且其值与正则表达式匹配的 cookie。
  5. Header Route Predicater:Header路由谓词工厂有两个参数,the和headera regexp(这是一个 Java 正则表达式)。此谓词与具有给定名称且值与正则表达式匹配的标头匹配。
  6. Host Route Predicate:路由谓词工厂采用Host一个参数:主机名列表patterns。该模式是一种 Ant 风格的模式,.以分隔符为分隔符。
  7. Method Route Predicate:设置了之后只有GET请求会路由
  8. Path Route Predicate:关于path的上面示例当中我们就已经用到了。
  9. Query Route Predicate:支持传入两个参数,一个是属性名,一个为属性值,属性值可以是正则表达式。
  10. RemoteAddr Route Predicate:路由谓词工厂采用的RemoteAddr列表(最小大小为 1)sources,它们是 CIDR 表示法(IPv4 或 IPv6)字符串,例如192.168.0.1/16(其中192.168.0.1是 IP 地址和16子网掩码)。
  11. Weight Route Predicate:Weight路由谓词工厂有两个参数:和group(weight一个 int)。权重是按组计算的。
  12. XForwarded Remote Addr Route Predicate:这可以与反向代理一起使用,例如负载平衡器或 Web 应用程序防火墙,其中仅当请求来自这些反向代理使用的受信任的 IP 地址列表时才允许请求。

3、配置实例

server:port: 9000
spring:application:name: cloud-gatewaycloud:consul:discovery:prefer-ip-address: trueservice-name: ${spring.application.name}host: localhostport: 8500gateway:#配置路由路径映射routes:- id: payuri: lb://cloud-paypredicates:- Path= /pay/gateway/*/**#- My=zxc#- After= 2024-04-03T18:44:12.217681800+08:00[Asia/Shanghai] #设置在时间后访问#- Method=GET #基于请求方式的断言#- RemoteAddr=192.168.100.1/24 #限制ip访问#- Query=username,\d+ 基于请求参数的断言#- Host=192.168.**.** #基于主机的断言,可以使用通配符#- Header=X-request-Id,\d+ #基于请求头的断言#- Cookie=username,zxc #基于请求Cookie的断言#- Before= 2024-04-03T18:46:12.217681800+08:00[Asia/Shanghai] #设置在时间前访问#- Between= 2024-04-03T18:46:12.217681800+08:00[Asia/Shanghai], 2024-04-03T18:49:12.217681800+08:00[Asia/Shanghai] #设置在时间段内前访问

4、自定义断言

需求:自定义用户等级userA\userB\userC,通过断言适配其是否拥有访问权限

1、代码

@Component
public class MyRoutePredicateFactory extends AbstractRoutePredicateFactory<MyRoutePredicateFactory.Config>
{public MyRoutePredicateFactory(){super(MyRoutePredicateFactory.Config.class);}//配置文件短促写法@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("userType");}@Validatedpublic static class Config{@Setter@Getter@NotEmptyprivate String userType; //钻、金、银等用户等级}@Overridepublic Predicate<ServerWebExchange> apply(MyRoutePredicateFactory.Config config){return new Predicate<ServerWebExchange>(){@Overridepublic boolean test(ServerWebExchange serverWebExchange){//检查request的参数里面,userType是否为指定的值,符合配置就通过String userType = serverWebExchange.getRequest().getQueryParams().getFirst("userType");if (userType == null) return false;//如果说参数存在,就和config的数据进行比较if(userType.equals(config.getUserType())) {return true;}return false;}};}
}
2、配置
server:port: 9000
spring:cloud:consul:discovery:service-name: ${spring.application.name}prefer-ip-address: truehost: 127.0.0.1port: 8500gateway:routes:- id: pay_gatewayuri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/info/**
#            - name: My #未从写shortcutFieldOrder方法则只能使用全配置
#              args:
#                userType: auser- My=auser #重写shortcutFieldOrder方法则能使用短配置

3、测试

请求对应服务,分别尝试访问时不添加参数和添加参数userType=userA

四、过滤器

过滤器可以在执行方法前和执行方法后进行过滤,所谓的过滤就是可以在请求上加一些操作,例如匹配到路由后可以在请求上添加个请求头,或者参数等等。

Gateway过滤器分为了两种:路由过滤器 和 全局过滤器:

1、路由过滤器:路由过滤器针对于某一个路由进行使用,其中官网给我们提供了30多种类型的路由过滤器。
2、全局过滤器:全局的往往是我们经常会用到的,他和路由过滤器区别就是,他是针对于所有路由进行设置的过滤规则,实际开发当中很少会针对于某一个路由使用Filter,大部分都会采用全局过滤器。

1、常用的路由过滤器

  1. The AddRequestHeader GatewayFilter Factory:相当于是给匹配到路由的request,添加Header
  2. The RemoveRequestHeader GatewayFilter Factory:删除request请求头信息
  3. The SetRequestHeader GatewayFilter Factory:设置request请求头信息
  4. The RequestRateLimiter GatewayFilter Factory:通过这个Filter就可以利用redis来完成限流
  5. The AddRequestParameter GatewayFilter Factory:添加request参数
  6. The RemoveRequestParameter GatewayFilter Factory:删除请求头参数
  7. The AddResponseHeader GatewayFilter Factory:添加response相应头信息
  8. The ResponseHeader GatewayFilter Factory:设置response相应头信息
  9. The RemoveResponseHeader GatewayFilter Factory:删除response相应头信息
  10. The PrefixPath GatewayFilter Factory:自动添加路径前缀
  11. The SetPath GatewayFilter Factory:修改访问路径
  12. The RedirectTo GatewayFilter Factory:重定向到某个页面

在配置时使用Default Filters相当于全局配置

2、filter配置实例

server:port: 9000
spring:application:name: cloud-gatewaycloud:consul:discovery:prefer-ip-address: trueservice-name: ${spring.application.name}host: localhostport: 8500gateway:#配置路由路径映射routes:#gateway过滤器配置- id: cloud-pay02uri: lb://cloud-paypredicates:- Path= /pay/gateway/filter/**#添加请求路径头部#- Path= /abc/pay/gateway/filter/**#修改请求路径#- Path= /abc/abc/{segment}#删除请求路径头部#- Path= /gateway/filter/**filters:#出现错误重定向(302临时重定向)#- RedirectTo=302,http://www.baidu.com/#修改请求路径#- SetPath=/pay/gateway/{segment}#添加请求路径前部#- PrefixPath=/pay#添加请求头信息- AddRequestHeader=X-Request-zxc1,zxc1- AddRequestHeader=X-Request-zxc2,zxc2#删除请求头信息- RemoveRequestHeader=sec-fetch-site,none#修改请求头信息- SetRequestHeader=x-request-zxc1,qh#添加和删除请求参数- AddRequestParameter=id,123- RemoveRequestParameter=name#添加删除修改响应头信息#- AddResponseHeader=name,zxc- SetResponseHeader=Date,2019- RemoveResponseHeader=Transfer-Encoding

3、自定义全局过滤器

需求:使用网关实现接口日志,统计接口调用时间


@Component
@Slf4j
public class MyGlobalFiter implements GlobalFilter, Ordered {public static final String BEGIN_VISIT_TIME = "begin_visit_time"; //开始调用时间@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//先记录访问接口时间exchange.getAttributes().put(BEGIN_VISIT_TIME,System.currentTimeMillis());//返回统计的结果给后台return chain.filter(exchange).then(Mono.fromRunnable(()->{Long beginVisitTime = exchange.getAttribute(BEGIN_VISIT_TIME);if(beginVisitTime != null){log.info("访问接口主机:" + exchange.getRequest().getURI().getHost());log.info("访问接口端口:" + exchange.getRequest().getURI().getPort());log.info("访问接口路径:" + exchange.getRequest().getURI().getPath());log.info("访问接口参数:" + exchange.getRequest().getURI().getRawQuery());log.info("访问接口时长:" + (System.currentTimeMillis() - beginVisitTime) + "毫秒");log.info("===分割线======================================================================");}}));}/*** 数字越小优先级越高* @return*/@Overridepublic int getOrder() {return 0;}
}

全局过滤器不需要配置

4、自定义条件过滤器

需求:请求头携带相关参数才能访问

@Component
@Slf4j
public class MyGatewayFilterFactory extends AbstractGatewayFilterFactory<MyGatewayFilterFactory.Config> {public MyGatewayFilterFactory(){super(MyGatewayFilterFactory.Config.class);}@Overridepublic GatewayFilter apply(MyGatewayFilterFactory.Config config) {return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();log.info("进入了自定义网关过滤器MyGatewayFilterFactory,status: " + config.getStatus());if(request.getQueryParams().containsKey("zxc")){return chain.filter(exchange);}else{exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);return exchange.getResponse().setComplete();}}};}@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("status");}//内部类//设定一个状态值,满足才可以访问public static class Config{@Getter@Setterprivate String status;}
}

配置文件:

server:port: 9000
spring:cloud:consul:discovery:service-name: ${spring.application.name}prefer-ip-address: truehost: 127.0.0.1port: 8500gateway:routes:- id: orderuri: lb://cloud-consumer-openfeign-orderpredicates:- Path=/feign/pay/gateway/**filters:- My=zxc

测试:

请求对应的接口,分别尝试携带key为zxc的参数,值随意,和不携带参数的请求是否可以正常访问

相关文章:

SpringCloud微服务GateWay网关使用与配置

一、概念 1、什么是GateWay网关 在微服务架构中&#xff0c;Gateway&#xff08;网关&#xff09;是一个重要的组件&#xff0c;负责处理外部请求并将它们路由到适当的微服务。以下是Gateway在微服务中的一些主要功能&#xff1a; 路由&#xff1a; Gateway负责将来自客户端的…...

win7补丁下载

目的 一般来说&#xff0c;安装上windows系统就带着补丁了&#xff0c;但有时&#xff0c;安装的是原始版的操作系统是不带补丁的&#xff0c;一般直接更新就可以了&#xff0c;但有时&#xff0c;电脑不能联网&#xff0c;只能通过安装包进行升级&#xff0c;所以下面介绍如何…...

在Cisco Packet Tracer上配置NAT

目录 前言一、搭建网络拓扑1.1 配置PC机1.2 配置客户路由器1.3 配置ISP路由器 二、配置NAT2.1 在客户路由器中配置NAT2.2 测试是否配置成功 总结 前言 本篇文章是在了解NAT的原理基础上&#xff0c;通过使用Cisco Packet Tracer 网络模拟器实现模拟对NAT的配置&#xff0c;以加…...

Web前端工程师的前景:挑战与机遇并存

Web前端工程师的前景&#xff1a;挑战与机遇并存 随着互联网的飞速发展和数字化转型的深入推进&#xff0c;Web前端工程师的前景日益广阔且充满挑战。作为互联网技术的核心力量之一&#xff0c;前端工程师的角色越来越重要&#xff0c;但同时也面临着技术更新迅速、市场需求多…...

MySQL—多表查询—联合查询

一、引言 之前学习了连接查询。现在学习联合查询。 union&#xff1a;联合、联盟 对于union查询&#xff0c;就是把多次查询的结果合并起来&#xff0c;形成一个新的查询结果集 涉及到两个关键字&#xff1a;union 和 union all 注意&#xff1a; union 会把上面两个SQL查询…...

2024 Jiangsu Collegiate Programming Contest E. Divide 题解 主席树

Divide 题目描述 Given an integer sequence a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1​,a2​,…,an​ of length n n n. For an interval a l , … , a r a_l,\ldots,a_r al​,…,ar​ in this sequence, a Reduce operation divides the maximum value of the inter…...

C# WPF入门学习主线篇(十五)—— DockPanel布局容器

C# WPF入门学习主线篇&#xff08;十五&#xff09;—— DockPanel布局容器 欢迎来到C# WPF入门学习系列的第十五篇。在前几篇文章中&#xff0c;我们探讨了 Canvas、StackPanel 和 WrapPanel 布局容器及其使用方法。本篇博客将介绍另一种强大且常用的布局容器——DockPanel。…...

基于SVPWM矢量控制的无速度传感器电机控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于SVPWM矢量控制的无速度传感器电机控制系统simulink建模与仿真&#xff0c;包括电机&#xff0c;SVPWM模块&#xff0c;矢量控制器模块等。 2.系统仿真结果 3.核心程序与模…...

Linux操作系统:Zookeeper在虚拟环境下的安装与部署

将 Zookeeper 安装到指定目录 // 将zookeeper解压到安装目录 $ tar –zxvf zookeeper-3.4.10.tar.gz –C /usr/local $ mv /usr/local/zookeeper-3.4.10.tar.gz /usr/local/zookeeper 设置 zookeeper 配置文件 // 创建 data 数据目录 $ mkdir /usr/local/zookeeper/data // …...

决策树Decision Tree

目录 一、介绍发展优点缺点基本原理 二、熵1、熵2、条件熵3、信息增益4、信息增益率 三、基尼系数四、ID3算法1、建树过程2、优点3、缺点 五、C4.51、二分法处理连续变量1、流程&#xff1a;2、示例 2、缺点 六、CART1、连续数据处理2、离散数据处理3、CART回归原理1、均方误差…...

1奇函数偶函数

文章目录 自变量有理化奇偶性周期性初等函数 自变量 自变量是x&#xff0c;这个还挺奇怪&#xff0c;记住就好 y f ( e x 1 ) yf(e^x1) yf(ex1) 里面 e x e^x ex 只算中间变量&#xff0c;自变量是x 做这些题&#xff0c;想到了以前高中的时候做数学题&#xff0c;不够扎实…...

什么情况下需要配戴助听器

以下几种情况需要考虑配戴助听器&#xff1a; 1、听力无波动3个月以上的感音神经性听力障碍。如:先天性听力障碍、老年性听力障碍、噪声性听力障碍、突聋的稳定期等&#xff0c;均可选配合适的助听器。 2、年龄方面。使用助听器没有严格的年龄限制&#xff0c;从出生数周的婴…...

Java 基础面试300题 (231-260)

Java 基础面试300题 &#xff08;231-260&#xff09; 231 String::toUpperCase是什么类型的方法引用&#xff1f; String::toUpperCase是任意方法引用的示例。它指的是String 类的toUpperCase方法&#xff0c;但不是指任何特定对象。 通常在遍历集合或流时使用。例如&#x…...

Hadoop3:MapReduce源码解读之Map阶段的Job任务提交流程(1)

3、Job工作机制源码解读 用之前wordcount案例进行源码阅读&#xff0c;debug断点打在Job任务提交时 提交任务前&#xff0c;建立客户单连接 如下图&#xff0c;可以看出&#xff0c;只有两个客户端提供者&#xff0c;一个是YarnClient&#xff0c;一个是LocalClient。 显然&a…...

Linux环境---在线安装MYSQL数据库

Linux环境—在线安装MYSQL数据库 一、使用步骤 1.安装环境 Mysql 驱动 8.0 需要 jdk1.8 才行。 JDK版本&#xff1a;1.8 参考文档 MYSQL版本&#xff1a;8.0.2 下载链接: https://pan.baidu.com/s/1MwXIilSL6EY3OuS7WtpySA?pwdg263 操作系统&#xff1a;CentOS 1.1 建立存…...

git本地配置及IDEA下Git合并部分文件

目录 1、IDEA 下 Git 合并部分文件 2、分支合并忽略特定文件步骤 3、git本地配置 1、IDEA 下 Git 合并部分文件 1.1Git 下存在两个分支&#xff0c;foo 和 bar 分支&#xff0c;想要把 bar 分支上的部分文件合并到 foo 分支: 首先切换到 foo 分支&#xff0c;点击右下角的 …...

安徽京准 NTP时钟同步服务器具体配置方法是什么?

安徽京准 NTP时钟同步服务器具体配置方法是什么&#xff1f; 安徽京准 NTP时钟同步服务器具体配置方法是什么&#xff1f; 可以使用特权终结点 (PEP) 来更新 Azure Stack Hub 中的时间服务器。 使用可解析为两个或更多个 NTP&#xff08;网络时间协议&#xff09;服务器 IP 地…...

微信小程序 画布canvas

属性说明 属性类型默认值必填说明最低版本typestring否指定 canvas 类型&#xff0c;支持 2d (2.9.0) 和 webgl (2.7.0)2.7.0canvas-idstring否canvas 组件的唯一标识符&#xff0c;若指定了 type 则无需再指定该属性1.0.0disable-scrollbooleanfalse否当在 canvas 中移动时且…...

leetcode-04-[24]两两交换链表中的节点[19]删除链表的倒数第N个节点[160]相交链表[142]环形链表II

一、[24]两两交换链表中的节点 重点&#xff1a;暂存节点 class Solution {public ListNode swapPairs(ListNode head) {ListNode dummyHeadnew ListNode(-1);dummyHead.nexthead;ListNode predummyHead;//重点&#xff1a;存节点while(pre.next!null&&pre.next.next…...

深入探讨 Java 18 的主要新特性,分析其设计理念和实际应用

Java 18 作为 Java 的最新版本,引入了一系列的新特性和改进,这些变化不仅提升了语言的性能和安全性,也为开发者提供了更多的工具和选项,简化了开发过程,提高了代码的可读性和维护性。本文将深入探讨 Java 18 的主要新特性,分析其设计理念和实际应用,帮助读者理解这些新特…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...

32单片机——基本定时器

STM32F103有众多的定时器&#xff0c;其中包括2个基本定时器&#xff08;TIM6和TIM7&#xff09;、4个通用定时器&#xff08;TIM2~TIM5&#xff09;、2个高级控制定时器&#xff08;TIM1和TIM8&#xff09;&#xff0c;这些定时器彼此完全独立&#xff0c;不共享任何资源 1、定…...