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

九、Spring Cloud—gateway网关

一、引言

每个微服务都需和前端进行通信,解决每个微服务请求时的鉴权、限流、权限校验、跨域等逻辑,放在一个统一的地方进行使用。

在微服务架构中,网关是一个重要的组件,它作为系统的入口,负责接收所有的客户端请求,并将请求路由到相应的微服务。

网关的作用主要有以下几点:

  1. 统一入口:网关作为系统的唯一入口,可以为客户端提供一个统一的接口,简化了客户端的调用过程。

  2. 路由转发:网关可以根据请求的 URL 和参数等信息,将请求路由到对应的微服务,实现请求的转发。

  3. 负载均衡:网关可以通过负载均衡算法,将请求分发到不同的微服务实例上,提高了系统的性能和可用性。

  4. 安全控制:网关可以对请求进行鉴权、过滤和监控等操作,保障了系统的安全性和稳定性。

  5. 缓存管理:网关可以将一些常用的请求结果进行缓存,减少对后端服务的访问,提高了系统的响应速度。

在这里插入图片描述

二、什么是Spring Cloud Gateway

网关作为流量的入口,常用的功能包括路由转发,权限校验,限流等。

Spring cloud Gateway 是Spring Cloud官方推出的第二代网关框架,定位于取代 Netflix Zuul 1.0来说,Spring Cloud Gateway 提供更优秀的性能,更强大的有功能。使用spring boot 2.0构建。

Spring Cloud Gateway 是由 WebFlux + Nety + Reactor 实现的响应的 API 网关。它不能在传统的 servlet 容器中工作,也不能构建成 war 包。

Spring cloud Gateway 旨在为微服务架构提供种简单且有效的 API路由的管理方式,并基于 Fliter 的方式提供网关的基本功能,例如安全认证、监控、限流等等。

源码:https://github.com/spring-cloud/spring-cloud-gateway
官网文档:https://spring.io/projects/spring-cloud-gateway

特征
Spring Cloud Gateway具有以下特点:

  • 基于 Spring Framework 5、Project Reactor 和 Spring Boot 2.0 构建。
  • 动态路由:能够匹配任何请求属性。
  • 支持路径重写。
  • 集成Spring Cloud 服务发现功能(Nacos、Eruka)。
  • 可继承流控降级功能你(sentinel、Hystrix)。
  • 可以对路由指定已与编写的Predicate(断言)和Filter(过滤器)。

核心概念

  • 路由 (route)。
    路由是网关中最基础的部分,路由信息包括一个ID、一个目的URI、一组断言工厂、一组Filter组成,如果新言为真,则说明请求的URL和配置的路由匹配。
  • 断言(predicdtes)。
    Java8中的断言函数,SpingCloud Gateway中的断言数类型是Spring5.0架中的ServerWebExchange,断言函数允许开发者去定义匹配http request中的任何信息,比如请求头和参数等。
  • 过滤器 (Filter)。
    SpringCloud Gateway中的filter分为Gateway Filter和Global Filter。Filter可以对请求和响应进行处理。

三、Spring Cloud Gateway快速开始

1、添加依赖-gateway和nacos

    <dependencies><!-- spring cloud gateway 依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency></dependencies>

如果父级有spring-boot-start-web,需删除,删除spring-boot-start-web依赖项。

因为spring cloud gateway是基于webflux的,如果非要web支持的话需要导入spring-boot-starter-webflux而不是spring-boot-start-web。

2、resources/application.yml配置文件配置gateway和nacos

server:port: 8814spring:application:name: api-gateway#gateway配置cloud:gateway:#路由规则routes:# 系统模块#id 路由的唯一标识- id: order-service#需要转发的地址 lb:使用 nacos 中本地負載均衡策略# order-service 服務名uri: lb://order-service#断言,用于路由规则的匹配,匹配的路径predicates:- Path=/order-service/** #指定前缀路由# http://localhost:8814/order-service/order/test 路由到# http://localhost:8815/order-service/order/test#过滤器,去除一级路径  order-service#最终变成 http://localhost:8815/order/test 进行请求filters:- StripPrefix=1#- id#配置nacos      nacos:discovery:server-addr: 127.0.0.1:8848username: nacospassword: nacos

也可以简写为:

server:port: 8814spring:application:name: api-gateway#gateway配置cloud:gateway:discovery:locator:#启动自动识别nacos服务。即服务名为第一路径enabled: true#配置nacosnacos:discovery:server-addr: 127.0.0.1:8848username: nacospassword: nacos

请求接口测试:
http://localhost:8814/order-service/order/test
和http://localhost:8815/order/test为一个接口。

四、路由断言工厂(Route Predicate Factories)配置

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

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

SpringCloud Gateway包括许多内置的断言工厂,所有这些断言都与HTTP请求的不同属性匹配。具体如下:

1. 基于Datetime类型的断言工厂
此类型的断言根据时间做判断,主要有三个:

AfterRoutePredicateFactory: 接收一个日期参数,判断请求日期是否晚于指定日期。
BeforeRoutePredicateFactory: 接收一个日期参数,判断请求日期是否早于指定日期。
BetweenRoutePredicateFactory: 接收两个日期参数,判断请求日期是否在指定时间段内。
ZonedDateTime.now(); 可以输出当前日期格式。

- After=2023-05-30T00:24:56.119+08:00[Asia/Shanghai]
- After=2017-01-20T17:42:47.789-07:00[America/Denver]
- Before=2017-01-20T17:42:47.789-07:00[America/Denver]
- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]

2. 基于远程地址的断言工厂
RemoteAddrRoutePredicateFactory: 接收一个P地址段,判断请求主机地址是否在地址段中。

- RemoteAddr=192.168,1.1/24

3. 基于Cookie的断言工厂
CookieRoutePredicateFactory: 接收两个参数,ookie 名字和一个正则表达式。判断请求cookie是否具有给定名称且值与正则表达式匹配。

 -Cookie=chocolate,ch.

4. 基于Header的断言工厂
HeaderRoutePredicateFactory: 接收两个参数,标题名称和正则表达式。判断请求Header是否具有给定名称且值与正则表达式匹配.

-Header=X-Request-Id,\d+

5. 基于Host的断言工厂
HostRoutePredicateFactory: 接收一个参数,主机名模式。判断请求的Host是否满足匹配规则。

- Host=**.somehost.org,**.anotherhost.org

6. 基于路由-常用

routes:- id: method_routeuri: https://example.orgpredicates:- Method=GET,POST- Path=/red/{segment},/blue/{segment}- Query=green #指定参数- RemoteAddr=192.168.1.1/24  #指定Ip

7. 基于权重

spring:cloud:gateway:routes:- id: weight_highuri: https://weighthigh.orgpredicates:- Weight=group1, 8 #分组,80%的权重- id: weight_lowuri: https://weightlow.orgpredicates:- Weight=group1, 2

8. 自定义路由断言工厂
自定义路由断言工厂需要继承 AbstractRoutePredicateFactory类,重写 apply 方法的逻辑。在apply方法可以通过exchange.getRequest()拿到serverHttpRequest对象,从而可以获取到请求的参数、请求方式、请求头等信息。
步骤:

  1. 必须spring组件 bean
  2. 类必须加上RoutePredicateFactory 作为结尾
  3. 必须继承 AbstractRoutePredicateFactory
  4. 必须声明静态内部类声明属性来接收配置文件中对应的断言的信息
  5. 需要结合shortcutFieldOrder进行绑定
  6. 通过apply进行逻辑判断 true就是匹配成 false匹配失败

可以借鉴 QueryRoutePredicateFactory 源码实现自定义的路由断言工厂。
1、代码CheckAuthRoutePredicateFactory

package com.tc.gateway.config;import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.cloud.gateway.handler.predicate.GatewayPredicate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.server.ServerWebExchange;import javax.validation.constraints.NotEmpty;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;@Component
public class CheckAuthRoutePredicateFactory extends AbstractRoutePredicateFactory<CheckAuthRoutePredicateFactory.Config> {public CheckAuthRoutePredicateFactory() {super(CheckAuthRoutePredicateFactory.Config.class);}@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("name");}@Overridepublic Predicate<ServerWebExchange> apply(CheckAuthRoutePredicateFactory.Config config) {return new GatewayPredicate() {@Overridepublic boolean test(ServerWebExchange exchange) {//简单案例,判断配置文件中CheckAuth是否等于tcif(config.getName().equals("tc")){return true;}return false;}};}//用于接收断言中的配置信息@Validatedpublic static class Config {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}}
}

2、配置文件。- CheckAuth=tc为自定义的断言信息

server:port: 8814spring:application:name: api-gateway#gateway配置cloud:gateway:#路由规则routes:# 系统模块#id 路由的唯一标识- id: order-service#需要转发的地址 lb:使用 nacos 中本地負載均衡策略# order-service 服務名uri: lb://order-service#断言,用于路由规则的匹配,匹配的路径predicates:- Path=/order-service/** #指定前缀路由# http://localhost:8814/order-service/order/test 路由到# http://localhost:8815/order-service/order/test
#            - After=2023-05-30T00:24:56.119+08:00[Asia/Shanghai] #在该时间之前能够访问,之后直接404
#            - Header=X-Request-Id,\d+ #需在请求头加入key为X-Request-Id,value为数字
#            - Method=GET,POST #请求方式,支持get和post
#            - Query=name #接口需加入参数?name  案例:http://localhost:8815/order-service/order/test?name
#            - Query=name,tc|test #限定值只能是tc或者test  案例:http://localhost:8815/order-service/order/test?name=tc- CheckAuth=tc#过滤器,去除一级路径  order-service#最终变成 http://localhost:8815/order/test 进行请求filters:- StripPrefix=1#- id#配置nacosnacos:discovery:server-addr: 127.0.0.1:8848username: nacospassword: nacos

五、过滤器

gateway 内置了许多的过滤工厂,可以通过过滤工厂进行一些业务逻辑的处理,比如剔除响应头,添加去除参数等。

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

1、局部过滤器
1.1 内置过滤器
内置的过滤器工厂可以在官网进行查看,使用例如:

spring:application:name: api-gatewaycloud:gateway:routes:- id: order-serviceuri: lb://order-servicefilters:#设置过滤器工厂,给请求头添加默认参数- AddRequestHeader=X-Request-red, blue# 添加路径前缀- PrefixPath=/mypath

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

1.2 自定义过滤器工厂
和自定义路由断言工厂类似的结构。

package com.tc.gateway.config;import com.alibaba.cloud.commons.lang.StringUtils;
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.http.server.reactive.ServerHttpRequest;import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;import static org.springframework.cloud.gateway.support.GatewayToStringStyler.filterToStringCreator;
import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR;
import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.addOriginalRequestUrl;/*** @Description: 自定义过滤器工厂* @Date: 2023/5/31 22:47*/
@Component
public class CheckAuthGatewayFilterFactory extends AbstractGatewayFilterFactory<CheckAuthGatewayFilterFactory.Config> {public CheckAuthGatewayFilterFactory() {super(CheckAuthGatewayFilterFactory.Config.class);}@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("name");}@Overridepublic GatewayFilter apply(CheckAuthGatewayFilterFactory.Config config) {return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//自己的逻辑处理。简单案例,获取请求中name参数,//如果value=设置的值成功,否则失败String name = exchange.getRequest().getQueryParams().getFirst("name");if(StringUtils.isNotEmpty(name)){if(config.getName().equals(name)){//正常请求return chain.filter(exchange);}else{//返回404exchange.getResponse().setStatusCode(HttpStatus.NOT_EXTENDED);//结束return exchange.getResponse().setComplete();}}return chain.filter(exchange);}};}public static class Config {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}}}

配置文件:

spring:application:name: api-gatewaycloud:gateway:routes:- id: order-serviceuri: lb://order-servicepredicates:- Path=/order-service/** filters:- StripPrefix=1#自定义的过滤器- CheckAuth=tc

2.、全局过滤器

  • 局部过滤器针对某个路由进行过滤,需要在路由中配置。
  • 全局过滤器针对所有路由进行过滤,一旦定义就会投入使用。

授权,权限认证会使用全局过滤器。
在这里插入图片描述
自定义全局过滤器

/*** @Description: 全局过滤器* @Date: 2023/5/31 23:20*/
@Component
public class LogFilter implements GlobalFilter {Logger log = LoggerFactory.getLogger(LogFilter.class);@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("获取请求的地址"+exchange.getRequest().getPath().value());return chain.filter(exchange);}
}

测试:

2023-05-31 23:24:04.043  INFO 11244 --- [ctor-http-nio-2] com.tc.gateway.config.LogFilter          : 获取请求的地址/order/test
2023-05-31 23:24:04.968  INFO 11244 --- [erListUpdater-0] c.netflix.config.ChainedDynamicProperty  : Flipping property: order-service.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647

六、日志记录

使用Reactor Netty访问日志
要启用Reactor Netty访问日志,需设置
-Dreactor.netty.http.server.accessLogEnabled=true。
可以在IDEA VM options配置-Dreactor.netty.http.server.accessLogEnabled=true即可。
第二行就是Netty访问日志。

2023-06-01 22:41:27.576  INFO 13052 --- [ctor-http-nio-2] com.tc.gateway.config.LogFilter          : 获取请求的地址/order/test
2023-06-01 22:41:27.757  INFO 13052 --- [ctor-http-nio-2] reactor.netty.http.server.AccessLog      : 0:0:0:0:0:0:0:1 - - [01/Jun/2023:22:41:26 +0800] "GET /order-service/order/test HTTP/1.1" 200 17 8814 972 ms
2023-06-01 22:41:28.494  INFO 13052 --- [erListUpdater-0] c.netflix.config.ChainedDynamicProperty  : Flipping property: order-service.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647

也可以配置到单独的访问日志文件,使用logBack.xml配置。

<appender name="accessLog” class="ch.qos.logback.core.FileAppender"><file>access_log.log</file><encoder><pattern>%msg%n</pattern></encoder>
</appender><appender name="async class="ch,qos.logback.classic.AsyncAppender"><appender-ref ref="accessLog”/>
</appender><logger name="reactor.netty.http,server.AccessLog" level="INFO” additivity="false">
<appender-ref ref="async"/>
</logger>

七、gateway跨域配置(CORS)

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

yml配置方式:

spring:cloud:gateway:globalcors:cors-configurations:'[/**]': #允许跨域访问的资源allowedOrigins: "https://docs.spring.io" #跨域允许来源allowedMethods:- GET- POST

八、gateway整合sentinel

可以针对不同的路由、接口、或者接口的特征分组限流。

https://github.com/alibaba/Sentinel/wiki/%E7%BD%91%E5%85%B3%E9%99%90%E6%B5%81

1、添加依赖

<!-- sentinel整合gateway的依赖-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency><!-- sentinel的依赖-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2、添加sentinel配置信息

#配置sentinel
spring:cloud:sentinel:transport:dashboard: 127.0.0.1:8858

启动生成网关的一个路由资源:

该路由资源和配置文件中一致:cloud:gateway:#路由规则routes:# 系统模块#id 路由的唯一标识- id: order-service

在这里插入图片描述
通过这个资源即可进行流控。

流控配置界面如下:可以自由灵活配置。
在这里插入图片描述
其中API分组流控,即把接口分层不同的Api组,根据组进行流控,分组之后,点击API分组,可以进行选择分好的组。
设置分组界面如下:
在这里插入图片描述

相关文章:

九、Spring Cloud—gateway网关

一、引言 每个微服务都需和前端进行通信&#xff0c;解决每个微服务请求时的鉴权、限流、权限校验、跨域等逻辑&#xff0c;放在一个统一的地方进行使用。 在微服务架构中&#xff0c;网关是一个重要的组件&#xff0c;它作为系统的入口&#xff0c;负责接收所有的客户端请求…...

ARM微架构与程序编写

目录 1.流水线 2.指令流水线 3. 多核处理器​编辑 4. 工程搭建 4.1为Keil软件配置编译工具链 5.程序编写 5.1 数据处理指令 5.2 带标志位的加法ADC ADDS 5.3 跳转指令B\BL 5.4 单寄存器内存访问 5.5 批量寄存器内存访问 5.6 栈的应用->叶子函数的调用过程 5.…...

Windows下利用Anaconda创建多个CUDA环境

参考 https://blog.csdn.net/qq_42395917/article/details/126237388 https://blog.csdn.net/qq_42406643/article/details/109545766 (待学习补充) https://blog.csdn.net/qq_43919533/article/details/125694437 (待学习补充) 安装cudatoolkit和cudnn # 前提是我已经安装了…...

C SS复习笔记

1.img标签 img的src属性是图片显示不出来时显示的文字 ing的title属性是光标放到图片上&#xff0c;提示的文字 2.a标签 a标签的target属性表示打开窗口的方式&#xff0c;默认的值是_self表示当前窗口的打开页面&#xff0c;_blank表示新窗口打开页面。 a标签的href链接分…...

LeetCode 225 用队列实现栈

题目&#xff1a; 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回…...

Java对象的共享

要编写正确的并发程序&#xff0c;关键问题在于&#xff1a;在访问共享的可变状态时需要进行正确的管理。第2章介绍了如何通过同步来避免多个线程在同一时刻访问相同的数据&#xff0c;而本章将介绍如何共享和发布对象&#xff0c;从而使它们能够安全地由多个线程同时访问。这两…...

漏洞概述-0day漏洞利用原理(0)

0day专题对作者来说是一个很大的挑战,但无论有多难,作者会坚持进行大量的对新旧技术(精通二进制、汇编语言、操作系统底层的知识)实践并尽可能做到完善,最终利用技术发扬正能量。 bug 与漏洞 随着现代软件工业的发展,软件规模不断扩大,软件内部的逻辑也变得异常复杂。为…...

交换机的4种网络结构方式:级联方式、堆叠方式、端口聚合方式、分层方式

交换机是计算机网络中重要的网络设备之一&#xff0c;用于实现局域网&#xff08;LAN&#xff09;内部的数据转发和通信。交换机可以采用不同的网络结构方式来满足不同的网络需求和拓扑结构。本文将详细介绍交换机的四种网络结构方式&#xff1a;级联方式、堆叠方式、端口聚合方…...

firewall-cmd防火墙策略

--permanent 永久生效&#xff0c;重启后规则不消失 不执行 firewall-cmd --reload 命令配置不生效 添加单个IP为白名单 firewall-cmd --permanent --zonepublic -add-rich-rulerule family"ipv4" source address"IP" accept 删除白名单 firewall-cmd --…...

解决SQLException: Incorrect string value异常

java开发中会遇到如下异常&#xff1a; org.apache.ibatis.exceptions.PersistenceException: ### Error updating database. Cause: java.sql.SQLException: Incorrect string value: \xF0\x9F\x95\xB32:... for column baseInfo at row 1 ### The error may involve com.f…...

桂院校园导航 导入 与 配置教程

将 静态项目/云开发项目 文件夹下最新版本的 文件夹下的 项目 的整个文件夹 复制到项目路径下&#xff08;比如 D:\WeChatProjects&#xff09;&#xff0c;强烈建议不要直接扔在桌面上 云开发项目 需开通 云开发 功能&#xff08;首月免费&#xff0c;次月19.9&#xff09;&am…...

Linux上安装jdk Tomcat mysql redis

1.安装JDk 1.1这里使用xshell中xfxp进行文件的上传&#xff0c;将jdk二进制包上传到Linux服务器上 下载地址&#xff1a;Java Downloads | Oracle 或者这里有下载好的安装包&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1ZSJxBDzDaTwCH2IG-d2Gig 提取码&#xff1a;…...

Postman中加url环境变量和token全局变量

环境变量引用 语法&#xff1a;{{变量名}} 环境变量分类 1. 全局变量&#xff1a;全局有效&#xff0c;在Postman中的任何集合中都可以使用该变量&#xff0c;作用域最大。 2. 环境变量&#xff1a;要申明环境变量&#xff0c;先要创建环境&#xff0c;然后在该环境中创建变…...

多线程事务回滚方法

多线程事务回滚方法 介绍案例演示线程池配置异常类实体类控制层业务层mapper工具类验证 解决方案使用sqlSession控制手动提交事务SqlSessionTemplate注入容器中改造业务层验证成功操作示例业务层改造 介绍 1.最近有一个大数据量插入的操作入库的业务场景&#xff0c;需要先做一…...

java单元测试( Hamcrest 断言)

java单元测试( Hamcrest 断言) 单元测试特征: 1 范围狭窄 2 限于单一类或方法 3 体积小 为什么要编写单元测试&#xff1f; 为了防止错误&#xff08;很明显&#xff01;&#xff09; 而且还可以提高开发人员的生产力&#xff0c;因为单元测试&#xff1a; (1) 帮助实施——在…...

讨论和总结 树模型 的三种序列化 方式的区别(模型存储大小、序列化所用内存、序列化速度)...

一、前言 本文总结常用树模型&#xff1a; rf&#xff0c;xgboost&#xff0c;catboost和lightgbm等模型的保存和加载&#xff08;序列化和反序列化&#xff09;的多种方式&#xff0c;并对多种方式从运行内存的使用和存储大小做对比 二、模型 2.1 安装环境 pip install xgboos…...

Halcon中的一些3D算子

一、记录一些Halcon里的关于3D的算子 1.read_object_model_3d 从文件读取一个3d模型 如下图&#xff0c;读的一个ply文件出来是个3d点云模型 2.visualize_object_model_3d 交互式展示3d模型 即上个算子读出来后&#xff0c;通过这个算子可以把3d模型显示出来旋转、平移&am…...

Android:Selector + Layer-lists 实现 AppCompatCheckBox

最近做项目涉及到一些UI相关的东东&#xff0c;虽然比较简单&#xff0c;但是也很有趣&#xff0c;写两篇简短的博客记录一下。 一."Selector 两张图片"实现 AppCompatCheckBox AppCompatCheckBox 是 androidx的一个widget&#xff1a;androidx.appcompat.widget.…...

TreeMap类型添加数据

package com.test.Test11;import java.util.*;public class Test02 {public static void main(String[] args) {/** 增加&#xff1a;put(K key,V value)* 删除&#xff1a;clear() remove(Object key)* 修改&#xff1a;* 查看&#xff1a;entrySet() get(Object key) keySet(…...

iOS 16 UI 设计系统免费在线使用方法

1、iOS 16 UI 设计系统中有什么&#xff1f; iOS 16 UI 设计系统通常包含以下组件和元素&#xff1a; 1. 按钮&#xff1a;包括操作按钮、图标按钮、导航按钮、滚动按钮、切换按钮、单选按钮、复选框按钮、呼叫按钮等各种类型的按钮。 2. 窗口和 UI 控件&#xff1a;包括标签…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

一些实用的chrome扩展0x01

简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序&#xff0c;无论是测试应用程序、搜寻漏洞还是收集情报&#xff0c;它们都能提升工作流程。 FoxyProxy 代理管理工具&#xff0c;此扩展简化了使用代理&#xff08;如 Burp…...

解析“道作为序位生成器”的核心原理

解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制&#xff0c;重点解析"道作为序位生成器"的核心原理与实现框架&#xff1a; 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...

高分辨率图像合成归一化流扩展

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 摘要 我们提出了STARFlow&#xff0c;一种基于归一化流的可扩展生成模型&#xff0c;它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流&#xff08;TARFlow&am…...

Linux基础开发工具——vim工具

文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...