springCloudAlibaba之分布式网关组件---gateway
gateway-网关
- 网关
- spring cloud gateway
- gateway初体验
- gateway整合nacos
- 简写方式
- 内置路由断言工厂
- 内置断言工厂
- 自定义路由断言工厂
- 自定义路由工厂
- 内置/自定义过滤器
- 典型内置过滤器
- 自定义过滤器
- 全局过滤器
- 自定义全局过滤器
- 请求日志记录&跨域处理
- Gateway跨域配置(CORS Configration)
- gateway整合sentinel流控降级
- 设置dashboard流控规则进行测试
- gateway整合sentinel流控降级详细配置
- 还可以根据api分组对不同的api接口进行流控
- 自定义流控异常
网关
在微服务架构中一个系统会被拆分成多个微服务。那么作为客户端(前端)要如何去调用这么多的微服务?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去用。
这样的架构,会存在诸多的问题:
每个业务都会需要鉴权、限流、权限校验、跨域等逻辑,如果每个业务都各自为站。自己造轮子实现一遍,完全没必要,完全可以抽离出来,放到一个统一的地方去做。
上面的问题可以借助网关来解决。

网关:所谓API网关,就是指系统的同一入口,它封装了应用程序的内部结构,为客户端提供统一服务,一些与业务功能本身无关的公共逻辑可以在这里实现,诸如认证、鉴权、监控、路由转发等待
添加上API网关之后,系统变成三层结构,系统的架构图如下:

加入网关之后的架构图

spring cloud gateway
- 功能特征
- 基于spring5.0和springboot2.0进行构建
- 动态路由:可以匹配任何请求属性
- 支持路径重写
- 集成服务发现(nacos、ereka)
- 可集成流控降级功能(sentinel、hystrix)
- 可以对路由指定易于编写的断言和过滤器
- 路由
路由是网关中最基础的部分,路由信息包括一个ID、一个目的URL、一组断言工厂、一组filter组成。如果断言为真,则说明请求的RUL和配置的路由匹配;- 断言
Java8中的断言函数,gateway中的断言函数类型是spring5.0框架中的servletWebExchange,断言函数允许开发者去定义匹配http request中的任何信息,比如请求头和参数等。- 过滤器
gateway中的filter分为Gateway Filter和Global Filter,filter可以对请求和响应处理
- 工作原理
spring cloud gateway的工作原理和zuul的差不多,最大的区别就是gateway的filter只有pre和post两种。
gateway初体验
添加依赖
<!--添加springcloud gateway依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>
- 配置文件
server:port: 8090
# gateway配置
spring:application:name: api-gatewaycloud:#gateway配置gateway:#路由规则routes:- id: order_router #路由的唯一标识,路由到orderuri: http://localhost:8081 #需要转发的地址#断言规则 用于路由规则的匹配predicates:- Path=/order-server/**# http://localhost:8090/order-server/order/buyProduct 路由到↓# http://localhost:8081/order-server/order/buyProductfilters:- StripPrefix=1 #内置过滤器,转发之前去掉第一层路径# http://localhost:8081/order-server/order/buyProduct 去掉后 ↓# http://localhost:8081/order/buyProduct
gateway整合nacos
你这个是springcloud gateway吧,我跟你说一下为什么这么写配置,是这样的,lb代表了负载均衡,有这个标志后,gateway就知道需要进行负载均衡,转发到lb://后面跟的服务名对应的某台服务器上,至于如何实现负载均衡,是通过负载均衡组件来的,比如ribbon或者springcloud-loadbalancer组件拿到服务列表,从而进行服务的转发。所以lb://,其实跟服务注册中心没有关系,就算不是nacos,用其它的,比如eureka,也是这么写lb://。
server:port: 8090
# gateway配置
spring:application:name: api-gatewaycloud:#nacos配置nacos:discovery:server-addr: 192.168.184.15:8848username: nacospassword: nacos#gateway配置gateway:#路由规则routes:- id: order_router #路由的唯一标识,路由到orderuri: lb://order-service #需要转发的地址 lb:使用nacos中的本地负载均衡策略#断言规则 用于路由规则的匹配predicates:- Path=/order-server/**# http://localhost:8090/order-server/order/buyProduct 路由到↓# http://localhost:8081/order-server/order/buyProductfilters:- StripPrefix=1 #内置过滤器,转发之前去掉第一层路径# http://localhost:8081/order-server/order/buyProduct 去掉后 ↓# http://localhost:8081/order/buyProduct
简写方式
当服务注册到nacos后,断言规则可以用服务名来进行匹配,此时配置可以进行简化(约定服务名和断言规则都从nacos获取)
server:port: 8090
# gateway配置
spring:application:name: api-gatewaycloud:#nacos配置nacos:discovery:server-addr: 192.168.184.15:8848username: nacospassword: nacos#gateway配置gateway:discovery:locator:enabled: true #是否启动自动识别nacos服务(约定大于配置)
- 测试
此时访问:http://localhost:8090/order-service/order/buyProduct

内置路由断言工厂
作用:当请求gateway的时候,使用断言对请求进行匹配,如果匹配成功就进行路由转发,如果匹配失败就返回404
内置断言工厂


- 基于Datetime类型的断言工厂
此类型的断言根据时间做判断,主要有三个: - AfterRoutePredicateFactory:接收一个日期参数,判断请求日期是否晚于指定日期
- BeforeRoutePredicateFactory:接收一个日期参数,判断请求日期是否早于指定日期
- BetweenRoutePredicateFactory:接收一个日期参数,判断请求日是否在指定时间段内
类型:zoneDateTime.now():System.out.println(ZonedDateTime.now());
-After=2024-12-31T23:59:59.789+08:00[Asia/Shanghai]
#第一版
server:port: 8090
# gateway配置
spring:application:name: api-gatewaycloud:#gateway配置gateway:#路由规则routes:- id: order_router #路由的唯一标识,路由到orderuri: http://localhost:8081 #需要转发的地址#断言规则 用于路由规则的匹配predicates:- Path=/order/**- After=2024-12-31T23:59:59.789+08:00[Asia/Shanghai]
- 基于请求头Headder的断言工厂
- HeaderRoutePredicateFactory:接收两个参数,标题名称和正则表达式,判断请求Header是否具有给定名称且值与正则表达式匹配。
- Header=X-Request-Id,\d+
#第一版
server:port: 8090
# gateway配置
spring:application:name: api-gatewaycloud:#nacos配置nacos:discovery:server-addr: 192.168.184.15:8848username: nacospassword: nacos#gateway配置gateway:#路由规则routes:- id: order_router #路由的唯一标识,路由到orderuri: http://localhost:8081 #需要转发的地址#断言规则 用于路由规则的匹配predicates:- Path=/order/**- After=2023-12-31T23:59:59.789+08:00[Asia/Shanghai]- Header=X-Request-Id,\d+
测试


- 基于Method请求方法的断言工厂
- MethodRoutePredicateFactory:接收一个参数,判断请求类型是否跟指定的类型匹配
- Method=GET
#第一版
server:port: 8090
# gateway配置
spring:application:name: api-gatewaycloud:#nacos配置nacos:discovery:server-addr: 192.168.184.15:8848username: nacospassword: nacos#gateway配置gateway:#路由规则routes:- id: order_router #路由的唯一标识,路由到orderuri: http://localhost:8081 #需要转发的地址#断言规则 用于路由规则的匹配predicates:- Path=/order/**- After=2023-12-31T23:59:59.789+08:00[Asia/Shanghai]- Header=X-Request-Id,\d+- Method=GET
- 基于Query请求参数的断言工厂
- QueryRoutePredicateFactory:接收两个参数,请求param和正则表达式,判断请求参数是否具有给定名称且值与正则表达式匹配。
- Query=id,\d+
#第一版
server:port: 8090
# gateway配置
spring:application:name: api-gatewaycloud:#nacos配置nacos:discovery:server-addr: 192.168.184.15:8848username: nacospassword: nacos#gateway配置gateway:#路由规则routes:- id: order_router #路由的唯一标识,路由到orderuri: http://localhost:8081 #需要转发的地址#断言规则 用于路由规则的匹配predicates:- Path=/order/**- After=2023-12-31T23:59:59.789+08:00[Asia/Shanghai]- Header=X-Request-Id,\d+- Method=GET- Query=id,\d+
测试

自定义路由断言工厂
自定义路由断言工厂需要继承AbstractRoutePredicateFactory类,重写apply方法的逻辑。在apply方法中可以通过exchange.getRequest()拿到serverletRequest对象,从而可以获取到请求的参数、请求方式、请求头等信息。
1、必须是bean组件
2、由于约定大于配置:类名必须加上RoutePredicateFactory作为结尾
3、必须继承AbstractRoutePredicateFactory类
4、必须声明一个静态内部类,声明属性来接收配置文件中对应的信息
5、需要结合shortcutFieldOrder来进行绑定
6、通过apply进行逻辑判断,true就是匹配成功,false匹配失败
自定义路由工厂
-checkAuth=zzq,如果配置文件中checkAuth=zzq,则匹配通过,否则匹配失败
- 配置文件
#第一版
server:port: 8090
# gateway配置
spring:application:name: api-gatewaycloud:#nacos配置nacos:discovery:server-addr: 192.168.184.15:8848username: nacospassword: nacos#gateway配置gateway:#路由规则routes:- id: order_router #路由的唯一标识,路由到orderuri: http://localhost:8081 #需要转发的地址#断言规则 用于路由规则的匹配predicates:- Path=/order/**- After=2023-12-31T23:59:59.789+08:00[Asia/Shanghai]- Header=X-Request-Id,\d+- Method=GET- Query=id,\d+- CheckAuth=zzq
- 自定义代码
@Component
public class CheckAuthRoutePredicateFactory extends AbstractRoutePredicateFactory<CheckAuthRoutePredicateFactory.Config> {public CheckAuthRoutePredicateFactory() {super(CheckAuthRoutePredicateFactory.Config.class);}/*** 绑定配置信息* @return*/@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("name");}public Predicate<ServerWebExchange> apply(Config config) {return new GatewayPredicate() {@Overridepublic boolean test(ServerWebExchange exchange) {if (config.getName().equals("zzq")){return true;}return false;}};}/*** 用于接收配置文件中 断言的信息*/@Validated@Datapublic static class Config {private String name;}
}
- 测试

- 修改配置后
#第一版
server:port: 8090
# gateway配置
spring:application:name: api-gatewaycloud:#nacos配置nacos:discovery:server-addr: 192.168.184.15:8848username: nacospassword: nacos#gateway配置gateway:#路由规则routes:- id: order_router #路由的唯一标识,路由到orderuri: http://localhost:8081 #需要转发的地址#断言规则 用于路由规则的匹配predicates:- Path=/order/**- After=2023-12-31T23:59:59.789+08:00[Asia/Shanghai]- Header=X-Request-Id,\d+- Method=GET- Query=id,\d+- CheckAuth=qwee
- 测试

内置/自定义过滤器
gateway内置了很多的过滤器工厂,我们通过一些过滤器工厂可以进行一些业务逻辑处理器,添加去除参数等。
典型内置过滤器
- 添加请求头
- AddRequestHeader=X-Request-color,red #添加请求头
#第一版
server:port: 8090
# gateway配置
spring:application:name: api-gatewaycloud:#nacos配置nacos:discovery:server-addr: 192.168.184.15:8848username: nacospassword: nacos#gateway配置gateway:#路由规则routes:- id: order_router #路由的唯一标识,路由到orderuri: http://localhost:8081 #需要转发的地址#断言规则 用于路由规则的匹配predicates:- Path=/order/**- After=2023-12-31T23:59:59.789+08:00[Asia/Shanghai]- Header=X-Request-Id,\d+- Method=GET- Query=id,\d+- CheckAuth=zzqfilters:- AddRequestHeader=X-Request-color,red #添加请求头
- 为匹配的路由添加统一前缀

- PrefixPath=/shanghaiserver #添加前缀 对应微服务需要配置context-path
- order.yml配置context-path
server:port: 8081servlet:context-path: /shanghaiserver
- gateway为了适配添加前缀
#第一版
server:port: 8090
# gateway配置
spring:application:name: api-gatewaycloud:#nacos配置nacos:discovery:server-addr: 192.168.184.15:8848username: nacospassword: nacos#gateway配置gateway:#路由规则routes:- id: order_router #路由的唯一标识,路由到orderuri: http://localhost:8081 #需要转发的地址#断言规则 用于路由规则的匹配predicates:- Path=/order/**- After=2023-12-31T23:59:59.789+08:00[Asia/Shanghai]- Header=X-Request-Id,\d+- Method=GET- Query=id,\d+- CheckAuth=zzqfilters:- AddRequestHeader=X-Request-color,red #添加请求头- PrefixPath=/shanghaiserver #添加前缀 对应微服务需要配置context-path
自定义过滤器
继承AbstractGatewayFilterFactory且自定义类的名称必须以GatewayFilterFactory结尾,且必须交给spring进行管理
- 自定义过滤器
package com.springcloudalibaba.gateway.config;import com.alibaba.nacos.api.utils.StringUtils;
import lombok.Data;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import java.util.Arrays;
import java.util.List;/*** @author : zhouzhiqiang* @date : 2024/6/19 12:51* @description :*/
@Component
public class CheckParamGatewayFilterFactory extends AbstractGatewayFilterFactory<CheckParamGatewayFilterFactory.Config> {public CheckParamGatewayFilterFactory() {super(CheckParamGatewayFilterFactory.Config.class);}@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("name");}@Overridepublic GatewayFilter apply(Config config) {return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String name = exchange.getRequest().getQueryParams().getFirst("name");if (!StringUtils.isBlank(name)) {//如果相等请求被放过if (config.getName().equals(name)) {return chain.filter(exchange);} else {//如果不相等返回404exchange.getResponse().setStatusCode(HttpStatus.NOT_FOUND);return exchange.getResponse().setComplete();}}return chain.filter(exchange);}};}/*** 用于接收配置文件中 过滤器的信息*/@Validated@Datapublic static class Config {private String name;}
}
- 配置自定义的过滤器工厂
#第一版
server:port: 8090
# gateway配置
spring:application:name: api-gatewaycloud:#nacos配置nacos:discovery:server-addr: 192.168.184.15:8848username: nacospassword: nacos#gateway配置gateway:#路由规则routes:- id: order_router #路由的唯一标识,路由到orderuri: http://localhost:8081 #需要转发的地址#断言规则 用于路由规则的匹配predicates:- Path=/order/**- After=2023-12-31T23:59:59.789+08:00[Asia/Shanghai]- Header=X-Request-Id,\d+- Method=GET- Query=id,\d+- CheckAuth=zzqfilters:- AddRequestHeader=X-Request-color,red #添加请求头- PrefixPath=/shanghaiserver #添加前缀 对应微服务需要配置context-path- CheckParam=zzq
- 测试
- 成功

- 失败

全局过滤器
对比局部过滤器,全局过滤器会对所有的路由请求进行过滤
局部:局部针对某个路由,需要在路由中进行配置
全局:针对所有路由,一旦定义了就会投入使用
自定义全局过滤器
@Component
public class LogFilter implements GlobalFilter {Logger log = LoggerFactory.getLogger(this.getClass());@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("请求地址:{}", exchange.getRequest().getPath().value());return chain.filter(exchange);}
}
此时gateway会拦截所有的请求并打印出请求地址
请求日志记录&跨域处理
要启用Reactor Netty访问日志,请设置-Dreactor.netty.http.server.accessLogEnabled=true
它必须是Java系统属性,而不是Spring Boot属性

- 配置文件
#第一版
server:port: 8090
# gateway配置
spring:application:name: api-gatewaycloud:#nacos配置nacos:discovery:server-addr: 192.168.184.15:8848username: nacospassword: nacos#gateway配置gateway:#路由规则routes:- id: order_router #路由的唯一标识,路由到orderuri: http://localhost:8081 #需要转发的地址#断言规则 用于路由规则的匹配predicates:- Path=/order/**- After=2023-12-31T23:59:59.789+08:00[Asia/Shanghai]- Header=X-Request-Id,\d+- Method=GET- Query=id,\d+- CheckAuth=zzqfilters:- AddRequestHeader=X-Request-color,red #添加请求头- PrefixPath=/shanghaiserver #添加前缀 对应微服务需要配置context-path- CheckParam=zzq
logging:file:name: D:/logs/service.logmax-size: 500MB
- 测试
此时日志会被记录到:D:\logs\service.log

Gateway跨域配置(CORS Configration)
- 配置文件
#第一版
server:port: 8090
# gateway配置
spring:application:name: api-gatewaycloud:#nacos配置nacos:discovery:server-addr: 192.168.184.15:8848username: nacospassword: nacos#gateway配置gateway:#路由规则routes:- id: order_router #路由的唯一标识,路由到orderuri: http://localhost:8081 #需要转发的地址#断言规则 用于路由规则的匹配predicates:- Path=/order/**- After=2023-12-31T23:59:59.789+08:00[Asia/Shanghai]- Header=X-Request-Id,\d+- Method=GET- Query=id,\d+- CheckAuth=zzqfilters:- AddRequestHeader=X-Request-color,red #添加请求头- PrefixPath=/shanghaiserver #添加前缀 对应微服务需要配置context-path- CheckParam=zzqglobalcors:cors-configurations:'[/**]': #允许跨域访问的资源allowedOrigins: "*" #跨域允许的来源allowedMethods:- GET- POST
logging:file:name: D:/logs/service.logmax-size: 500MB
- 在springboot中还可以通过配置类的方式进行配置
@Configuration
public class CorsFilter {@Beanpublic CorsWebFilter corsWebFilter(){CorsConfiguration config = new CorsConfiguration();config.addAllowedOrigin("*"); //允许的来源config.addAllowedHeader("*"); //允许的请求头config.addAllowedMethod("*"); //允许的请求方法UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());source.registerCorsConfiguration("/**",config);return new CorsWebFilter(source);}
}
gateway整合sentinel流控降级
网关作为内部系统外的一层屏障,对内起到一定的保护作用,限流就是其中之一。网关层的限流可以简单地针对不同路由进行限流,也可针对业务的接口进行限流,或者根据接口的特征分组限流。
- 添加依赖
<!--gateway整合sentinel进行限流--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId></dependency>
- 添加配置
#第一版
server:port: 8090
# gateway配置
spring:application:name: api-gatewaycloud:#nacos配置nacos:discovery:server-addr: 192.168.184.15:8848username: nacospassword: nacos#gateway配置gateway:#路由规则routes:- id: order_router #路由的唯一标识,路由到orderuri: http://localhost:8081 #需要转发的地址#断言规则 用于路由规则的匹配predicates:- Path=/order/**- After=2023-12-31T23:59:59.789+08:00[Asia/Shanghai]- Method=GETfilters:- PrefixPath=/shanghaiserver #添加前缀 对应微服务需要配置context-path# 整合sentinelsentinel:transport:dashboard: 192.168.184.15:8080
logging:file:name: D:/logs/service.logmax-size: 500MB
- 测试代码
@RestController
@RequestMapping("/order")
public class OrderController {@Autowiredprivate IStockService stockService;@RequestMapping("/buyProduct")public String buyProduct(@RequestHeader("X-Request-color") String color){System.out.println("开始下单");System.out.println(color);//开始扣减库存stockService.detectStock();return "下单并扣除库存成功";}/*** QPS流控规则测试* @return*/@RequestMapping("/flow")public String flow(){return "正常访问";}/*** 并发线程数流控规则测试* @return*/@RequestMapping("/flowThread")public String flowThread(){try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {throw new RuntimeException(e);}return "正常访问";}}
- 启动dashboard
请求接口进行测试:

设置dashboard流控规则进行测试
- QPS测试
- dashboard配置

- 测试结果

gateway整合sentinel流控降级详细配置
通过请求属性就和之前配置的断言一样

- 案例测试–比如URL参数设置为name=zzq

- 测试
此时限流

- 案例测试–比如把Header设置为X-Request-Id=zzq

- 测试结果
此时限流

还可以根据api分组对不同的api接口进行流控
- 添加api分组

- 配置api流控

- 测试

自定义流控异常
@Configuration
public class GateWayExceptionConfig {@PostConstructpublic void sentinelResponse(){BlockRequestHandler requestHandler = new BlockRequestHandler() {@Overridepublic Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {//自定义异常Map<String,String> exMap=new HashMap<>();exMap.put("code", HttpStatus.TOO_MANY_REQUESTS.toString());exMap.put("msg","限流了");return ServerResponse.status(HttpStatus.OK).contentType(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(exMap));}};GatewayCallbackManager.setBlockHandler(requestHandler);}
}
- 测试

相关文章:
springCloudAlibaba之分布式网关组件---gateway
gateway-网关 网关spring cloud gatewaygateway初体验gateway整合nacos简写方式 内置路由断言工厂内置断言工厂 自定义路由断言工厂自定义路由工厂 内置/自定义过滤器典型内置过滤器自定义过滤器 全局过滤器自定义全局过滤器 请求日志记录&跨域处理Gateway跨域配置…...
Springboot项目jar加密
部署的程序进行加密,防止第三方非法拷贝走项目进行二次开发或部署。我们知道java代码编译后生成的以.class结尾的字节码文件或者.jar/.war结尾的可执行文件都是可以反编译生成.java文件的,虽然反编译后生成的.java文件和原本的.java文件有些微差别&#…...
【React】高阶组件
概述 高阶组件并非一个组件,而是增强组件功能的一个函数。 高阶组件的作用是对多个组件公共逻辑进行横向抽离。 高阶组件 – React (reactjs.org) 示例 ChildCom1.jsx import React from react;function ChildCom1(props) {return (<div>这是子组件1<d…...
全面理解-Flutter(万字长文,深度解析)
1、Web 性能差,跟原生 App 存在肉眼可见的差距; 2、React Native 跟 Web 相比,支持的能力非常有限,特定长场景问题,需要三端团队一个一个处理; 3、Web 浏览器的安卓碎片化严重(感谢 X5&#x…...
RabbitMQ实战宝典:从新手到专家的全面探索
前言 在当今分布式系统架构中,消息队列已成为不可或缺的一部分,而RabbitMQ作为其中的佼佼者,凭借其强大的功能和灵活性,广泛应用于各种规模的应用场景中。本文将带你从基础概念出发,深入探讨RabbitMQ的核心特性&#…...
6月21日(周五)AH股总结:沪指失守3000点,恒生科技指数跌近2%,多只沪深300ETF午后量能显著放大
内容提要 沪指全天围绕3000点关口来回拉锯,收盘跌破3000点。白酒及光刻机概念集体走低,中芯国际港股跌超2%。CRO医药概念及水利股逆势走强。 A股低开低走 沪指全天围绕3000点关口来回拉锯,收盘跌破3000点,跌0.24%。深成指跌0.04…...
双非本,3年时间从外包到阿里P6(Android岗),看我是怎么逆袭成功的?
而在小公司,因为我也在小公司呆过,所以我有最直接的感受。整个部门技术人员没几个,我又大学刚毕业,带我的人,问啥啥不会,只有一个大佬,跳槽来的,是我们技术总监,有问题谁…...
前端面试题(基础篇七)
一、谈谈你对webpack的看法 webpack是一个模块打包工具,我们可以使用webpack管理我们的模块依赖,编译输出模块所需的静态文件。它可以很好的管理、打包web开发中所需的html、css、JavaScript以及其他各种静态文件(使用的图片、字体图标等&am…...
ARM架构简明教程
目录 一、ARM架构 1、RISC指令集 2、ARM架构数据类型的约定 2.1 ARM-v7架构数据类型的约定 2.2 ARM-v8架构数据类型的约定 3、CPU内部寄存器 4、特殊寄存器 4.1 SP寄存器 4.2 LR寄存器 4.3 PC寄存器 二、汇编 1、汇编指令(常用) 2、C函数的…...
DWG转PDF字体研究记录
1.前言 最近需要对PDF中的符合业务规则的文字进行提取,发现有些文字不是文字信息形式存储,而是polyline形式表达,意味着仅仅有形体上的表达,丢失了原本的文字信息。 经过沟通得知,这些PDF是AutoCAD软件导出的…...
Java中如何处理日期和时间?
Java中如何处理日期和时间? 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何在Java中处理日期和时间,这是开发中非常常…...
Kubernetes之Pod详解
如何更好的使用好Pod?本文尝试从Pod组成、Namespace共享、控制器实现原理及Pod设计原则4个方面对Pod的使用进行详细阐述,希望对您 一、 Kubernetes Pod介绍 在 Kubernetes 中,Pod 是最小的可部署单元,包含一个或多个容器。Pod 提…...
长亭谛听教程部署和详细教程
PPT 图片先挂着 挺概念的 谛听的能力 hw的时候可能会问你用过的安全产品能力能加分挺重要 溯源反制 反制很重要感觉很厉害 取证分析 诱捕牵制 其实就是蜜罐 有模板直接爬取某些网页模板进行伪装 部署要求 挺低的 对linux内核版本有要求 需要root 还有系统配置也要修改 …...
修复漏洞Windows 2012 Server R2(CVE-2016-2183)、(CVE-2015-2808)、(CVE-2013-2566)
修复漏洞 漏洞风险等级评定标准主机风险等级评定标准漏洞概括利用注册表修复漏洞查看修复后的漏洞漏洞风险等级评定标准 危险程度危险值区域危险程度说明高7 <=漏洞风险值<= 10攻击者可以远程执行任意命令或者代码,或对系统进行远程拒绝服务攻击。中4 <=漏洞风险值&l…...
Linux的基本指令第二篇
1.cat - 查看文件 语法:cat [选项] [文件] 功能: 查看目标文件的内容 -b 对非空输出行编号 -n对输出的所有行编号 -s不输出多行空行 现有一个文件test.c cat -n test.c cat -b test.c cat -s test.c 创建一个新文件 加入源文件的内容 || …...
php百度云账户余额查询API示例
1、官方文档地址:账户余额查询 请求结构 POST /v{version}/finance/cash/balance HTTP/1.1 Host: billing.baidubce.com ContentType: application/json; charsetutf-8 Content-Length: <Content_Length> Authorization: authorization string 响应参数 …...
自动化开发任务:在PHP框架中实现自定义命令
在现代Web开发中,自动化是提高开发效率和减少重复工作的关键。PHP框架,如Laravel、Symfony等,提供了强大的自定义命令功能,允许开发者创建自己的artisan命令来执行各种自动化任务。本文将详细介绍如何在PHP框架中实现自定义命令&a…...
如何在Java中实现数据加密与解密?
如何在Java中实现数据加密与解密? 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何在Java中实现数据加密与解密,这是保…...
Nginx日志管理之日志分析
Nginx 通常被置于服务器访问的入口,其访问日志可以全局记录用户访问的来源、响应时间,以及用户行为热点等数据,通过对访问日志的分析,可以清晰地了解用户来源、用户行为习惯及自身服务器性能等情况。借助 ELK 的高性能处理能力&am…...
利用 Microsoft ChatGPT 和 OPC UA 改变工业格局
在本文中,我们将探讨开放性在工业物联网中的作用,以及Microsoft为创建基于OPC UA的开放平台所做的努力。我们将讨论 Microsoft 开放战略的四大支柱,以及标准化信息模型以实现互操作性的重要性。此外,我们将深入探讨传统接口和数据…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...



