Java17 --- SpringCloud之Gateway

目录

一、Gateway网关创建

1.1、创建微服务子工程9527及配置和依赖

1.1.1、pom依赖

1.1.2、yml配置

1.1.3、主启动类并测试入驻consul 

二、实现路由映射 

2.1、服务8001新增测试代码 

2.2、修改9527服务yml配置文件 

2.3、远程调用接口加gateway

2.3.1、新增80服务测试代码 

三、路由以微服务名动态获取服务URL 

3.1、修改9527服务yml文件 

四、断言 

4.1、常用断言api的yml配置 

4.1.1、时间范围访问设置

4.1.2、cookie访问

4.1.3、X-Request-Id访问

4.1.4、Host访问

4.1.5、Query访问 

 4.1.6、RemoteAddr访问

 4.1.7、Method访问

4.2、自定义断言 

五、过滤器 

5.1、常用内置过滤器 

5.1.1、请求头添加、修改、删除

5.1.2、请求参数删除和添加 

5.1.3、回应头添加、修改、删除 

 5.1.4、前缀和路径相关

5.2、自定义过滤器 

5.2.1、自定义全局过滤器 

5.2.2、自定义条件过滤器 


一、Gateway网关创建

核心功能:反向代理、鉴权、流量控制、熔断、监控日志

三大核心:路由(route)、断言(predicate)、过滤(filter)

工作流程核心逻辑:路由转发-》断言判断-》执行过滤链

1.1、创建微服务子工程9527及配置和依赖

1.1.1、pom依赖

<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></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

1.1.2、yml配置

server:port: 9527spring:application:name: cloud-gateway #以微服务注册进consul或nacos服务列表内cloud:consul: #配置consul地址host: localhostport: 8500discovery:prefer-ip-address: trueservice-name: ${spring.application.name}

1.1.3、主启动类并测试入驻consul 

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

二、实现路由映射 

2.1、服务8001新增测试代码 

@RestController
public class PayGateWayController {@Resourceprivate PayService payService;@GetMapping(value = "/pay/gateway/get/{id}")public ResultData<Pay> getById(@PathVariable("id") Integer id){Pay pay = payService.getById(id);return ResultData.success(pay);}@GetMapping(value = "/pay/gateway/info")public ResultData<String> getGatewayInfo(){return ResultData.success("gateway info test:"+ IdUtil.simpleUUID());}
}

 

2.2、修改9527服务yml配置文件 

server:port: 9527spring:application:name: cloud-gateway #以微服务注册进consul或nacos服务列表内cloud:consul: #配置consul地址host: localhostport: 8500discovery:prefer-ip-address: trueservice-name: ${spring.application.name}gateway:routes:- id: pay_routh1 #pay_routh1                #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名uri: http://localhost:8001                #匹配后提供服务的路由地址predicates:- Path=/pay/gateway/get/**              # 断言,路径相匹配的进行路由- id: pay_routh2 #pay_routh2                #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名uri: http://localhost:8001                #匹配后提供服务的路由地址predicates:- Path=/pay/gateway/info/**              # 断言,路径相匹配的进行路由

 结果:

2.3、远程调用接口加gateway

/*** GateWay进行网关测试案例01* @param id* @return*/@GetMapping(value = "/pay/gateway/get/{id}")public ResultData getById(@PathVariable("id") Integer id);/*** GateWay进行网关测试案例02* @return*/@GetMapping(value = "/pay/gateway/info")public ResultData<String> getGatewayInfo();

2.3.1、新增80服务测试代码 

@RestController
public class OrderGateWayController {@Resourceprivate PayFeignApi payFeignApi;@GetMapping(value = "/feign/pay/gateway/get/{id}")public ResultData getById(@PathVariable("id") Integer id){return payFeignApi.getById(id);}@GetMapping(value = "/feign/pay/gateway/info")public ResultData<String> getGatewayInfo(){return payFeignApi.getGatewayInfo();}
}

 

三、路由以微服务名动态获取服务URL 

3.1、修改9527服务yml文件 

gateway:routes:- id: pay_routh1 #pay_routh1                #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名
#          uri: http://localhost:8001                #匹配后提供服务的路由地址uri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**              # 断言,路径相匹配的进行路由- id: pay_routh2 #pay_routh2                #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名
#          uri: http://localhost:8001                #匹配后提供服务的路由地址uri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/info/**              # 断言,路径相匹配的进行路由

四、断言 

4.1、常用断言api的yml配置 

4.1.1、时间范围访问设置

    gateway:routes:- id: pay_routh1 #pay_routh1                #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名
#          uri: http://localhost:8001                #匹配后提供服务的路由地址uri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**              # 断言,路径相匹配的进行路由
#            - After=2024-05-04T23:53:30.106114600+08:00[Asia/Shanghai] #在此时间之后访问
#            - Before=2024-05-04T23:56:30.106114600+08:00[Asia/Shanghai] #在此时间之前访问
#            - Between=2024-05-04T23:57:30.106114600+08:00[Asia/Shanghai],2024-05-05T00:59:30.106114600+08:00[Asia/Shanghai]

4.1.2、cookie访问

    gateway:routes:- id: pay_routh1 #pay_routh1                #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名
#          uri: http://localhost:8001                #匹配后提供服务的路由地址uri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**              # 断言,路径相匹配的进行路由
#            - After=2024-05-04T23:53:30.106114600+08:00[Asia/Shanghai] #在此时间之后访问
#            - Before=2024-05-04T23:56:30.106114600+08:00[Asia/Shanghai] #在此时间之前访问
#            - Between=2024-05-04T23:57:30.106114600+08:00[Asia/Shanghai],2024-05-05T00:59:30.106114600+08:00[Asia/Shanghai]
#            - Cookie=username,cjc #必须要携带cookie才能访问

 测试1:原生命令访问

测试2:使用postman访问

测试3:使用浏览器访问

 

4.1.3、X-Request-Id访问

    gateway:routes:- id: pay_routh1 #pay_routh1                #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名
#          uri: http://localhost:8001                #匹配后提供服务的路由地址uri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**              # 断言,路径相匹配的进行路由
#            - After=2024-05-04T23:53:30.106114600+08:00[Asia/Shanghai] #在此时间之后访问
#            - Before=2024-05-04T23:56:30.106114600+08:00[Asia/Shanghai] #在此时间之前访问
#            - Between=2024-05-04T23:57:30.106114600+08:00[Asia/Shanghai],2024-05-05T00:59:30.106114600+08:00[Asia/Shanghai]
#            - Cookie=username,cjc #必须要携带cookie才能访问- Header=X-Request-Id, \d+  # 请求头要有X-Request-Id属性并且值为整数

 

4.1.4、Host访问

    gateway:routes:- id: pay_routh1 #pay_routh1                #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名
#          uri: http://localhost:8001                #匹配后提供服务的路由地址uri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**              # 断言,路径相匹配的进行路由
#            - After=2024-05-04T23:53:30.106114600+08:00[Asia/Shanghai] #在此时间之后访问
#            - Before=2024-05-04T23:56:30.106114600+08:00[Asia/Shanghai] #在此时间之前访问
#            - Between=2024-05-04T23:57:30.106114600+08:00[Asia/Shanghai],2024-05-05T00:59:30.106114600+08:00[Asia/Shanghai]
#            - Cookie=username,cjc #必须要携带cookie才能访问
#            - Header=X-Request-Id, \d+  # 请求头要有X-Request-Id属性并且值为整数- Host=**.cjc.com

 

4.1.5、Query访问 

    gateway:routes:- id: pay_routh1 #pay_routh1                #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名
#          uri: http://localhost:8001                #匹配后提供服务的路由地址uri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**              # 断言,路径相匹配的进行路由
#            - After=2024-05-04T23:53:30.106114600+08:00[Asia/Shanghai] #在此时间之后访问
#            - Before=2024-05-04T23:56:30.106114600+08:00[Asia/Shanghai] #在此时间之前访问
#            - Between=2024-05-04T23:57:30.106114600+08:00[Asia/Shanghai],2024-05-05T00:59:30.106114600+08:00[Asia/Shanghai]
#            - Cookie=username,cjc #必须要携带cookie才能访问
#            - Header=X-Request-Id, \d+  # 请求头要有X-Request-Id属性并且值为整数
#            - Host=**.cjc.com- Query=username, \d+  # 要有参数名username并且值还要是整数才能路由

 

 4.1.6、RemoteAddr访问

    gateway:routes:- id: pay_routh1 #pay_routh1                #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名
#          uri: http://localhost:8001                #匹配后提供服务的路由地址uri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**              # 断言,路径相匹配的进行路由
#            - After=2024-05-04T23:53:30.106114600+08:00[Asia/Shanghai] #在此时间之后访问
#            - Before=2024-05-04T23:56:30.106114600+08:00[Asia/Shanghai] #在此时间之前访问
#            - Between=2024-05-04T23:57:30.106114600+08:00[Asia/Shanghai],2024-05-05T00:59:30.106114600+08:00[Asia/Shanghai]
#            - Cookie=username,cjc #必须要携带cookie才能访问
#            - Header=X-Request-Id, \d+  # 请求头要有X-Request-Id属性并且值为整数
#            - Host=**.cjc.com
#            - Query=username, \d+  # 要有参数名username并且值还要是整数才能路由- RemoteAddr=192.168.200.1/24 # 外部访问我的IP限制,最大跨度不超过32,目前是1~24它们是 CIDR 表示法。

 4.1.7、Method访问

    gateway:routes:- id: pay_routh1 #pay_routh1                #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名
#          uri: http://localhost:8001                #匹配后提供服务的路由地址uri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**              # 断言,路径相匹配的进行路由
#            - After=2024-05-04T23:53:30.106114600+08:00[Asia/Shanghai] #在此时间之后访问
#            - Before=2024-05-04T23:56:30.106114600+08:00[Asia/Shanghai] #在此时间之前访问
#            - Between=2024-05-04T23:57:30.106114600+08:00[Asia/Shanghai],2024-05-05T00:59:30.106114600+08:00[Asia/Shanghai]
#            - Cookie=username,cjc #必须要携带cookie才能访问
#            - Header=X-Request-Id, \d+  # 请求头要有X-Request-Id属性并且值为整数
#            - Host=**.cjc.com
#            - Query=username, \d+  # 要有参数名username并且值还要是整数才能路由- RemoteAddr=192.168.200.1/24 # 外部访问我的IP限制,最大跨度不超过32,目前是1~24它们是 CIDR 表示法。- Method=Put

4.2、自定义断言 

测试代码

@Component
public class MyRoutePredicateFactory extends AbstractRoutePredicateFactory<MyRoutePredicateFactory.Config> {public MyRoutePredicateFactory(){super(MyRoutePredicateFactory.Config.class);}//断言规则@Validatedpublic static class Config{@Getter@Setter@NotEmptyprivate String userType;}//重写支持短格式@Overridepublic List<String> shortcutFieldOrder() {return Collections.singletonList("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");//如果说参数存在,就和config的数据进行比较if (userType.equalsIgnoreCase(config.getUserType())) {return true;} else if (userType == null) {return false;}return false;}};}
}

配置yml文件

    gateway:routes:- id: pay_routh1 #pay_routh1                #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名
#          uri: http://localhost:8001                #匹配后提供服务的路由地址uri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**              # 断言,路径相匹配的进行路由
#            - After=2024-05-04T23:53:30.106114600+08:00[Asia/Shanghai] #在此时间之后访问
#            - Before=2024-05-04T23:56:30.106114600+08:00[Asia/Shanghai] #在此时间之前访问
#            - Between=2024-05-04T23:57:30.106114600+08:00[Asia/Shanghai],2024-05-05T00:59:30.106114600+08:00[Asia/Shanghai]
#            - Cookie=username,cjc #必须要携带cookie才能访问
#            - Header=X-Request-Id, \d+  # 请求头要有X-Request-Id属性并且值为整数
#            - Host=**.cjc.com
#            - Query=username, \d+  # 要有参数名username并且值还要是整数才能路由
#            - RemoteAddr=192.168.200.1/24 # 外部访问我的IP限制,最大跨度不超过32,目前是1~24它们是 CIDR 表示法。
#            - Method=Put- My=diamond
#            - name: My  #全面支持
#              args:
#                userType: diamond

 

五、过滤器 

5.1、常用内置过滤器 

5.1.1、请求头添加、修改、删除

修改9527yml配置文件

    gateway:routes:- id: pay_routh1 #pay_routh1                #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名
#          uri: http://localhost:8001                #匹配后提供服务的路由地址uri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/get/**              # 断言,路径相匹配的进行路由
#            - After=2024-05-04T23:53:30.106114600+08:00[Asia/Shanghai] #在此时间之后访问
#            - Before=2024-05-04T23:56:30.106114600+08:00[Asia/Shanghai] #在此时间之前访问
#            - Between=2024-05-04T23:57:30.106114600+08:00[Asia/Shanghai],2024-05-05T00:59:30.106114600+08:00[Asia/Shanghai]
#            - Cookie=username,cjc #必须要携带cookie才能访问
#            - Header=X-Request-Id, \d+  # 请求头要有X-Request-Id属性并且值为整数
#            - Host=**.cjc.com
#            - Query=username, \d+  # 要有参数名username并且值还要是整数才能路由
#            - RemoteAddr=192.168.200.1/24 # 外部访问我的IP限制,最大跨度不超过32,目前是1~24它们是 CIDR 表示法。
#            - Method=Put- My=diamond
#            - name: My  #全面支持
#              args:
#                userType: diamond- id: pay_routh2 #pay_routh2                #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名
#          uri: http://localhost:8001                #匹配后提供服务的路由地址uri: lb://cloud-payment-servicepredicates:- Path=/pay/gateway/info/**              # 断言,路径相匹配的进行路由- id: pay_routh3 #pay_routh3uri: lb://cloud-payment-service                #匹配后提供服务的路由地址predicates:- Path=/pay/gateway/filter/**              # 断言,路径相匹配的进行路由filters:- AddRequestHeader=X-Request-cjc1,cjcValue1  # 请求头kv,若一头含有多参则重写一行设置- AddRequestHeader=X-Request-cjc2,cjcValue2- RemoveRequestHeader=cache-control      # 删除请求头cache-control- SetRequestHeader=x-forwarded-host, yyyy # 将请求头x-forwarded-host对应的值修改为yyyy

8001测试代码

@GetMapping(value = "/pay/gateway/filter")public ResultData<String> getGatewayFilter(HttpServletRequest request){String result = "";Enumeration<String> headers = request.getHeaderNames();while(headers.hasMoreElements()){String headName = headers.nextElement();String headValue = request.getHeader(headName);System.out.println("请求头名: " + headName +"\t\t\t"+"请求头值: " + headValue);if(headName.equalsIgnoreCase("X-Request-cjc1")|| headName.equalsIgnoreCase("X-Request-cjc2")) {result = result+headName + "\t " + headValue +" ";}}return ResultData.success("getGatewayFilter 过滤器 test: "+result+" \t "+ DateUtil.now());}

5.1.2、请求参数删除和添加 

- id: pay_routh3 #pay_routh3uri: lb://cloud-payment-service                #匹配后提供服务的路由地址predicates:- Path=/pay/gateway/filter/**              # 断言,路径相匹配的进行路由filters:- AddRequestHeader=X-Request-cjc1,cjcValue1  # 请求头kv,若一头含有多参则重写一行设置- AddRequestHeader=X-Request-cjc2,cjcValue2- RemoveRequestHeader=cache-control      # 删除请求头cache-control- SetRequestHeader=x-forwarded-host, yyyy # 将请求头x-forwarded-host对应的值修改为yyyy- AddRequestParameter=customerId,9527001 # 新增请求参数Parameter:k ,v- RemoveRequestParameter=customerName   # 删除url请求参数customerName,你传递过来也是null

5.1.3、回应头添加、修改、删除 

- id: pay_routh3 #pay_routh3uri: lb://cloud-payment-service                #匹配后提供服务的路由地址predicates:- Path=/pay/gateway/filter/**              # 断言,路径相匹配的进行路由filters:- AddRequestHeader=X-Request-cjc1,cjcValue1  # 请求头kv,若一头含有多参则重写一行设置- AddRequestHeader=X-Request-cjc2,cjcValue2- RemoveRequestHeader=cache-control      # 删除请求头cache-control- SetRequestHeader=x-forwarded-host, yyyy # 将请求头x-forwarded-host对应的值修改为yyyy- AddRequestParameter=customerId,9527001 # 新增请求参数Parameter:k ,v- RemoveRequestParameter=customerName   # 删除url请求参数customerName,你传递过来也是null- AddResponseHeader=X-Response-cjc, BlueResponse # 新增请求参数X-Response-cjc并设值为BlueResponse- SetResponseHeader=Date,2099-11-11 # 设置回应头Date值为2099-11-11- RemoveResponseHeader=Content-Type # 将默认自带Content-Type回应属性删除

 5.1.4、前缀和路径相关

- id: pay_routh3 #pay_routh3uri: lb://cloud-payment-service                #匹配后提供服务的路由地址predicates:- Path=/pay/gateway/filter/**              # 断言,路径相匹配的进行路由
#            - Path=/gateway/filter/**              # 断言,为配合PrefixPath测试过滤,暂时注释掉/pay
#            - Path=/XYZ/abc/{segment}           # 断言,为配合SetPath测试,{segment}的内容最后被SetPath取代filters:- RedirectTo=302, http://www.baidu.com/ # 访问http://localhost:9527/pay/gateway/filter跳转到http://www.baidu.com/
#             - SetPath=/pay/gateway/{segment}  # {segment}表示占位符,你写abc也行但要上下一致
#            - PrefixPath=/pay # http://localhost:9527/pay/gateway/filter PrefixPath + Path

5.2、自定义过滤器 

5.2.1、自定义全局过滤器 

9527服务测试接口耗时代码

@Component
@Slf4j
public class MyGlobalFilter implements GlobalFilter, Ordered {private 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 bvtime = exchange.getAttribute(BEGIN_VISIT_TIME);if (bvtime != null){log.info("访问接口主机: " + exchange.getRequest().getURI().getHost());log.info("访问接口端口: " + exchange.getRequest().getURI().getPort());log.info("访问接口URL: " + exchange.getRequest().getURI().getPath());log.info("访问接口URL参数: " + exchange.getRequest().getURI().getRawQuery());log.info("访问接口时长: " + (System.currentTimeMillis() - bvtime) + "ms");log.info("我是美丽分割线: ###################################################");System.out.println();}}));}//数字越小,优先级越高@Overridepublic int getOrder() {return 0;}
}

5.2.2、自定义条件过滤器 

9527服务测试代码

@Component
public class MyGatewayFilterFactory extends AbstractGatewayFilterFactory<MyGatewayFilterFactory.Config> {public MyGatewayFilterFactory() {super(MyGatewayFilterFactory.Config.class);}@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("status");}@Overridepublic GatewayFilter apply(MyGatewayFilterFactory.Config config) {return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();if (request.getQueryParams().containsKey("cjc")){return chain.filter(exchange);}else {exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);return exchange.getResponse().setComplete();}}};}public static class Config{@Getter@Setterprivate String status;//设置一个状态标志}
}
      - id: pay_routh3 #pay_routh3uri: lb://cloud-payment-service                #匹配后提供服务的路由地址predicates:- Path=/pay/gateway/filter/**              # 断言,路径相匹配的进行路由
#            - Path=/gateway/filter/**              # 断言,为配合PrefixPath测试过滤,暂时注释掉/pay
#            - Path=/XYZ/abc/{segment}           # 断言,为配合SetPath测试,{segment}的内容最后被SetPath取代filters:- My=cjc

 

 

 

 

 

 

 

 

 

 

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

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

相关文章

DEV--C++小游戏(吃星星(0.2))

目录 吃星星&#xff08;0.2&#xff09; 简介 分部代码 头文件&#xff08;增&#xff09; 命名空间变量&#xff08;增&#xff09; 副函数&#xff08;新&#xff0c;增&#xff09; 清屏函数 打印地图函数&#xff08;增&#xff09; 移动函数 选择颜色&#xff…

用HAL库改写江科大的stm32入门例子_9-2 利用中断进行串口通讯

电路和 《用HAL库改写江科大的stm32入门例子_9-1》一致。 我们在whlie循环当中&#xff0c;不断查询端口&#xff0c;获取数据&#xff0c;存放到一个数组当中,同时回显给电脑上。这种方法耗费cpu,还是用中断进行串口通讯更合理。 基本操作看到一遍写得比较清晰的博客&#x…

python-oracledb 已率先支持 Oracle 23ai

python-oracledb 介绍 python-oracledb (以下简称 oracledb) 是 Python cx_Oracle 驱动程序的新名称&#xff0c;如果你仍在使用 cx_Oracle&#xff0c;建议升级到最新版本的 oracledb。 oracledb 驱动程序是一个开源模块&#xff0c;使 Python 程序能够访问 Oracle 数据库。默…

离线安装dokcer离线获取docker镜像

文章目录 离线安装docker1、下载docker 安装包2、上传docker安装包到服务器3、解压docker-xxx.tgz4、解压的docker文件夹全部移动至/usr/bin目录5、将docker注册为系统服务6、重启生效6.1、重新加载配置文件6.2、启动Docker服务6.3、查看启动状态6.4、 设置docker为开机自启6.5…

PyQt5的基本安装与使用

文章目录 1. 简介2.安装2.1.QtDisigner配置2.2 PyUIC配置2.3. PyRCC配置 3. 一个简单的PyQt5使用示例 1. 简介 PyQt5是一个用于创建交互式界面的Python库&#xff0c;它是基于Qt框架的Python绑定。Qt是一个跨平台的C框架&#xff0c;用于开发图形用户界面&#xff08;GUI&…

scala速通(精简版)

1.变量和常量 var name [:VariableType] value // variable val name [:ConstantType] value // constant1.声明变量时&#xff0c;类型可以省略 2.类型定义后就不能修改言 3.变量声明必须有初始值 4.变量&#xff0c;常量分别用var&#xff0c;val声明修饰 2.标识符命名…

NLP从入门到精通——信息抽取概述

信息抽取 1.概述 随着互联网和社交媒体的飞速发展&#xff0c;我们每天都会接触到大量的非结构化数据&#xff0c;如文本、图片和音频等。这些数据包含了丰富的信息&#xff0c;但也提出了一个重要问题&#xff1a;如何从这些海量数据中提取有用的信息和知识&#xff1f;这就…

识货小程序逆向

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872&#xff0c;x30184483x…

仓库管理系统需求调研要点

仓库管理系统需求调研 一、仓库的作用 仓库分类 原材料仓库&#xff1a;用于存放生产所需的原材料和零部件&#xff0c;需要保持原材料的质量和数量稳定。半成品仓库&#xff1a;存放生产过程中的半成品和在制品&#xff0c;需要保持良好的生产流程和及时出库。成品仓库&#x…

05-08 周三 FastBuild FastAPI 引入并发支持和全局捕获异常

时间版本修改人描述2024年5月8日20:41:03V0.1宋全恒新建文档 简介 由于FastBuild之前花费了大概5天的时间优化&#xff0c;但最近重新部署&#xff0c;又发现了一些问题&#xff0c;就很痛苦&#xff0c;五一之后&#xff0c;自己又花了三天的时间系统的进行了优化。 上一波优…

【R语言】生存分析模型

生存分析模型是用于研究时间至某个事件发生的概率的统计模型。这个事件可以是死亡、疾病复发、治疗失败等。生存分析模型旨在解决在研究时间相关数据时的挑战&#xff0c;例如右侧截尾&#xff08;右侧截尾表示未观察到的事件发生&#xff0c;例如研究结束时还未发生事件&#…

2024年第七届人工智能和模式识别国际会议(AIPR 2024)即将召开!

2024年第七届人工智能和模式识别国际会议&#xff08;AIPR 2024)将于2024年9月20-22日在福建厦门市的华侨大学举行。探索AI边界&#xff0c;解锁识别新境界&#xff01;AIPR 2024旨在促进模式识别与机器学习, 计算机视觉与机器人视觉, 图像、语音、信号和视频处理等领域尖端成果…

torch.distributed.launch使用中的问题

error:unrecognized argument: --local-rank0 link AttributeError: module numpy has no attribute int solu AttributeError: ‘MMDistributedDataParallel’ object has no attribute ‘_use_replicated_tensor_module’ solu 还是torch版本问题

星辰考古:TiDB v1.0 再回首

“ 1.0 版本只是个开始&#xff0c;是新的起点&#xff0c;愿我们一路相扶&#xff0c;不负远途。 前言 TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库。 近日&#xff0c;TiDB v8.0.0 DMR 发布&#xff0c;详细发版说明戳这里&#xff1a; https://docs.pingca…

linux container_of宏

1 结构体 假如我们有一个结构体Student&#xff0c;其定义如下&#xff1a; typedef struct student {int id;char name[30];int math; }Student; 通过Student stu定义stu变量后&#xff0c;我们可以通过stu.id或stu.name来获取stu的成员。但如果想反过来&#xff0c;通过st…

Java | Spring框架 | @Autowired与@Resource

在Spring框架中&#xff0c;依赖注入是一种核心概念&#xff0c;它允许开发者将对象的创建和对象之间的依赖关系的管理交给框架来处理。这样做的目的是为了提高代码的模块化和可测试性。 Spring提供了多种方式来实现依赖注入&#xff0c;其中最常用的方式是通过注解。在本文中…

uniapp + vue3 设置 axios proxy 代理,并重写路径

uniapp vue2 设置代理如下&#xff1a; 已生成的项目架构里面找到manifest.json文件&#xff0c;通过源码视图的方式打开文件&#xff0c;在文件中添加一下代码即可完成代理&#xff1a; "h5": {"devServer": {"disableHostCheck": true, //禁…

模板显式特化与隐式特化

当使用一个模板时&#xff0c;称为实例化模板。模板实例是编译器通过将模板参数应用于模板定义而创建的具体函数或类。模板实例又称为特化。因此&#xff0c;rational<int>是模板rational<>的一个特化。因此&#xff0c;特化是针对特定一组模板参数实现模板的过程。…

linux部署java1.8(jdk1.8)

两种方式&#xff1a; 方式一 1.输入查找命令&#xff1a; yum -y list java*2.输入安装命令&#xff1a; yum install -y java-1.8.0-openjdk.x86_643.测试是否已经安装&#xff1a; java -version方式二&#xff1a; 点击链接进入官网&#xff1a;https://www.oracle.com/…

Python 全栈体系【四阶】(四十一)

第五章 深度学习 九、图像分割 1. 基本介绍 1.1 什么是图像分割 图像分割&#xff08;Segmentation&#xff09;是图像处理和机器视觉一个重要分支&#xff0c;其目标是精确理解图像场景与内容。图像分割是在像素级别上的分类&#xff0c;属于同一类的像素都要被归为一类&a…