Spring Cloud Gateway夺命连环10问?
这篇文章介绍下微服务中的一个重要角色:网关,对于网关如何选择,由于阿里系暂时未出网关,当然是选择了Spring cloud Gateway,毕竟是亲儿子。
文章目录如下:
为什么需要网关?
传统的单体架构中只有一个服务开放给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,那么作为客户端如何去调用这些微服务呢?如果没有网关的存在,只能在本地记录每个微服务的调用地址。
无网关的微服务架构往往存在以下问题:
- 客户端多次请求不同的微服务,增加客户端代码或配置编写的复杂性。
- 认证复杂,每个服务都需要独立认证。
- 存在跨域请求,在一定场景下处理相对复杂。
网关的基本功能?
网关是所有微服务的门户,路由转发仅仅是最基本的功能,除此之外还有其他的一些功能,比如:认证、鉴权、熔断、限流、日志监控等等.........
以上这些应用场景会在后续的文章详细介绍,不是今天的重点。
为什么选择Spring cloud Gateway?
在1.x版本中都是采用的Zuul网关;但在2.x版本中,zuul的升级一直跳票,Spring Cloud最后自己研发了一个网关替代Zuul,那就是Spring Cloud Gateway。
肯定选择亲儿子Spring Cloud Gateway,它的很多思想都是借鉴zuul,所谓青出于蓝而胜于蓝,功能和性能肯定是优于zuul,不然Spring Cloud 为嘛要发布它?
重要的一点原因:
Spring Cloud Gateway 基于Spring Boot 2.x、Spring WebFlux和[Project Reactor构建。
对于Spring Boot 的整合方便兼容性以及性能方面不必担心。
Spring Cloud Gateway几个必知的术语?
- 路由(route):gateway的基本构建模块。它由ID、目标URI、断言集合和过滤器集合组成。如果聚合断言结果为真,则匹配到该路由。
- 断言(Predicate ):参照Java8的新特性Predicate,允许开发人员匹配HTTP请求中的任何内容,比如头或参数。
- 过滤器(filter):可以在返回请求之前或之后修改请求和响应的内容。
网关如何搭建?
为什么要放这张图?
一定要按照上图中的版本进行适配,否则会出现意想不到的BUG,陈某遇到过,都是泪............
新建cloud-gateway9023,添加如下依赖:
<!--gateway-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
注意:一定要去掉spring-boot-starter-web依赖,否则启动报错
好了,项目搭建完成,其实就添加这么一个依赖,关于详细的配置下文介绍。
什么是Predict(断言)?
Predicate来自于java8的接口。Predicate接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将Predicate组合成其他复杂的逻辑(比如:与,或,非)。
可以用于接口请求参数校验、判断新老数据是否有变化需要进行更新操作。
Spring Cloud Gateway内置了许多Predict,这些Predict的源码在
org.springframework.cloud.gateway.handler.predicate包中,有兴趣可以阅读一下。内置的一些断言如下图:
以上11种断言陈某这里就不再介绍如何配置了,官方文档写的很清楚。
官方文档:
https://docs.spring.io/spring-cloud-gateway/docs/2.2.9.RELEASE/reference/html/
下面就以最后一种权重断言为例介绍一下如何配置。配置如下:
spring:cloud:gateway:## 路由routes:## id只要唯一即可,名称任意- id: gateway-provider_1uri: http://localhost:9024## 配置断言predicates:## Path Route Predicate Factory断言,满足/gateway/provider/**这个请求路径的都会被路由到http://localhost:9024这个uri中- Path=/gateway/provider/**## Weight Route Predicate Factory,同一分组按照权重进行分配流量,这里分配了80%## 第一个group1是分组名,第二个参数是权重- Weight=group1, 8## id必须唯一- id: gateway-provider_2## 路由转发的uriuri: http://localhost:9025## 配置断言predicates:## Path Route Predicate Factory断言,满足/gateway/provider/**这个请求路径的都会被路由到http://localhost:9024这个uri中- Path=/gateway/provider/**## Weight Route Predicate Factory,同一分组按照权重进行分配流量,这里分配了20%## 第一个group1是分组名,第二个参数是权重- Weight=group1, 2
routes下就是配置的路由策略,各个组件如下:
- id:路由的唯一id,名称任意
- uri:路由转发的uri
- predicates:断言配置,可以配置多个
Spring Cloud Gateway中的断言命名都是有规范的,格式:xxxRoutePredicateFactory。
比如权重的断言:
WeightRoutePredicateFactory,那么配置时直接取前面的Weight。
默认的路由转发如果路由到了两个,则是的按照配置先后顺序转发,上面都配置了路径:Path=/gateway/provider/**,如果没有配置权重,则肯定是转发到http://localhost:9024。
但是既然配置配置了权重并且相同的分组,则按照权重比例进行分配流量。
什么是过滤器?
过滤器这个概念很熟悉,在Spring mvc 就接触过,Gateway的过滤器的作用以及生命周期都是类似的。
Gateway的生命周期:
- PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择 请求的微服务、记录调试信息等。
- POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
Gateway 的Filter从作用范围可分为两种:
- GatewayFilter:应用到单个路由或者一个分组的路由上(需要在配置文件中配置)。
- GlobalFilter:应用到所有的路由上(无需配置,全局生效)
GatewayFilter(局部过滤器)
Spring Cloud Gateway中内置了许多的局部过滤器,如下图:
局部过滤器需要在指定路由配置才能生效,默认是不生效的。
以
AddResponseHeaderGatewayFilterFactory这个过滤器为例,为原始响应添加Header,配置如下:
spring:cloud:gateway:## 路由routes:## id只要唯一即可,名称任意- id: gateway-provider_1uri: http://localhost:9024## 配置断言predicates:## Path Route Predicate Factory断言,满足/gateway/provider/**这个请求路径的都会被路由到http://localhost:9024这个uri中- Path=/gateway/provider/**## 配置过滤器(局部)filters:- AddResponseHeader=X-Response-Foo, Bar
浏览器请求,发现响应头中已经有了X-Response-Foo=Bar这个键值对,如下图:
注意:过滤器的名称只需要写前缀,过滤器命名必须是xxxGatewayFilterFactory(包括自定义)。
更多过滤器的配置可以看官方文档:
https://docs.spring.io/spring-cloud-gateway/docs/2.2.9.RELEASE/reference/html/#gatewayfilter-factories
虽说内置的过滤器能够解决很多场景,但是难免还是有些特殊需求需要定制一个过滤器,下面就来介绍一下如何自定义局部过滤器。
场景:模拟一个授权验证的过程,如果请求头或者请求参数中携带token则放行,否则直接拦截返回401,代码如下:
/*** 名称必须是xxxGatewayFilterFactory形式* todo:模拟授权的验证,具体逻辑根据业务完善*/
@Component
@Slf4j
public class AuthorizeGatewayFilterFactory extends AbstractGatewayFilterFactory<AuthorizeGatewayFilterFactory.Config> {private static final String AUTHORIZE_TOKEN = "token";//构造函数,加载Configpublic AuthorizeGatewayFilterFactory() {//固定写法super(AuthorizeGatewayFilterFactory.Config.class);log.info("Loaded GatewayFilterFactory [Authorize]");}//读取配置文件中的参数 赋值到 配置类中@Overridepublic List<String> shortcutFieldOrder() {//Config.enabledreturn Arrays.asList("enabled");}@Overridepublic GatewayFilter apply(AuthorizeGatewayFilterFactory.Config config) {return (exchange, chain) -> {//判断是否开启授权验证if (!config.isEnabled()) {return chain.filter(exchange);}ServerHttpRequest request = exchange.getRequest();HttpHeaders headers = request.getHeaders();//从请求头中获取tokenString token = headers.getFirst(AUTHORIZE_TOKEN);if (token == null) {//从请求头参数中获取tokentoken = request.getQueryParams().getFirst(AUTHORIZE_TOKEN);}ServerHttpResponse response = exchange.getResponse();//如果token为空,直接返回401,未授权if (StringUtils.isEmpty(token)) {response.setStatusCode(HttpStatus.UNAUTHORIZED);//处理完成,直接拦截,不再进行下去return response.setComplete();}/*** todo chain.filter(exchange) 之前的都是过滤器的前置处理** chain.filter().then(* 过滤器的后置处理...........* )*///授权正常,继续下一个过滤器链的调用return chain.filter(exchange);};}@Data@AllArgsConstructor@NoArgsConstructorpublic static class Config {// 控制是否开启认证private boolean enabled;}
}
局部过滤器需要在路由中配置才能生效,配置如下:
spring:cloud:gateway:## 路由routes:## id只要唯一即可,名称任意- id: gateway-provider_1uri: http://localhost:9024## 配置断言predicates:## Path Route Predicate Factory断言,满足/gateway/provider/**这个请求路径的都会被路由到http://localhost:9024这个uri中- Path=/gateway/provider/**## 配置过滤器(局部)filters:- AddResponseHeader=X-Response-Foo, Bar## AuthorizeGatewayFilterFactory自定义过滤器配置,值为true需要验证授权,false不需要- Authorize=true
此时直接访问:
http://localhost:9023/gateway/provider/port,不携带token,返回如下图:
请求参数带上token:
http://localhost:9023/gateway/provider/port?token=abcdcdecd-ddcdeicd12,成功返回,如下图:
上述的
AuthorizeGatewayFilterFactory只是涉及到了过滤器的前置处理,后置处理是在chain.filter().then()中的then()方法中完成的,具体可以看下项目源码中的TimeGatewayFilterFactory,代码就不再贴出来了,如下图:
GlobalFilter(全局过滤器)
全局过滤器应用到全部路由上,无需开发者配置,Spring Cloud Gateway也内置了一些全局过滤器,如下图:
GlobalFilter的功能其实和GatewayFilter是相同的,只是GlobalFilter的作用域是所有的路由配置,而不是绑定在指定的路由配置上。多个GlobalFilter可以通过@Order或者getOrder()方法指定每个GlobalFilter的执行顺序,order值越小,GlobalFilter执行的优先级越高。
注意,由于过滤器有pre和post两种类型,pre类型过滤器如果order值越小,那么它就应该在pre过滤器链的顶层,post类型过滤器如果order值越小,那么它就应该在pre过滤器链的底层。示意图如下:
当然除了内置的全局过滤器,实际工作中还需要定制过滤器,下面来介绍一下如何自定义。
场景:模拟Nginx的Access Log 功能,记录每次请求的相关信息。代码如下:
/*** 实现GlobalFilter*/
@Slf4j
@Component
@Order(value = Integer.MIN_VALUE)
public class AccessLogGlobalFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//filter的前置处理ServerHttpRequest request = exchange.getRequest();String path = request.getPath().pathWithinApplication().value();InetSocketAddress remoteAddress = request.getRemoteAddress();return chain//继续调用filter.filter(exchange)//filter的后置处理.then(Mono.fromRunnable(() -> {ServerHttpResponse response = exchange.getResponse();HttpStatus statusCode = response.getStatusCode();log.info("请求路径:{},远程IP地址:{},响应码:{}", path, remoteAddress, statusCode);}));}
}
好了,全局过滤器不必在路由上配置,注入到IOC容器中即可全局生效。
此时发出一个请求,控制台打印信息如下:
请求路径:/gateway/provider/port,远程IP地址:/0:0:0:0:0:0:0:1:64114,响应码:200 OK
如何集成注册中心?
上述demo中并没有集成注册中心,每次路由配置都是指定固定的服务uri,如下图:
这样做有什么坏处呢?
- 服务的IP的地址一旦修改了,路由配置中的uri必须修改
- 服务集群中无法实现负载均衡
此时就需要集成的注册中心,使得网关能够从注册中心自动获取uri(负载均衡)。
这里的注册中心当然选择Nacos,又不熟悉的小伙伴请看陈某《Spring Cloud 进阶》专栏的第一篇文章:五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强?
pom文件中新增Nacos依赖,如下:
<!--nacos注册中心--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
启动类上开启注册中心功能,如下图:
配置文件中指定nacos注册中心的地址:
spring:application:## 指定服务名称,在nacos中的名字name: cloud-gatewaycloud:nacos:discovery:# nacos的服务地址,nacos-server中IP地址:端口号server-addr: 127.0.0.1:8848
路由配置中唯一不同的就是路由的uri,格式:lb://service-name,这是固定写法:
- lb:固定格式,指的是从nacos中按照名称获取微服务,并遵循负载均衡策略
- service-name:nacos注册中心的服务名称,这里并不是IP地址形式的
集成Nacos注册中心完整的配置demo如下:
spring:application:## 指定服务名称,在nacos中的名字name: cloud-gatewaycloud:nacos:discovery:# nacos的服务地址,nacos-server中IP地址:端口号server-addr: 127.0.0.1:8848gateway:## 路由routes:## id只要唯一即可,名称任意- id: gateway-provider_1## 使用了lb形式,从注册中心负载均衡的获取uriuri: lb://gateway-provider## 配置断言predicates:## Path Route Predicate Factory断言,满足/gateway/provider/**这个请求路径的都会被路由到http://localhost:9024这个uri中- Path=/gateway/provider/**## 配置过滤器(局部)filters:- AddResponseHeader=X-Response-Foo, Bar
为什么指定了lb就可以开启负载均衡,前面说过全局过滤器LoadBalancerClientFilter就是负责路由寻址和负载均衡的,可以看到如下源码:
如何实现动态路由?
上述例子都是将网关的一系列配置写到项目的配置文件中,一旦路由发生改变必须要重新项目,这样维护成本很高。
其实我们可以将网关的配置存放到配置中心中,这样由配置中心统一管理,一旦路由发生改变,只需要在配置中心修改,这样便能达到一处修改,多出生效的目的。
这里当然要使用Nacos作为配置中心了,添加依赖如下:
<!-- nacos配置中心的依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>
在bootstrap.yml文件中指定Nacos作为配置中心的一些相关配置:
spring:application:## 指定服务名称,在nacos中的名字name: cloud-gatewaycloud:nacos:## todo 此处作为演示,仅仅配置了后缀,其他分组,命名空间根据需要自己配置config:server-addr: 127.0.0.1:8848## 指定文件后缀未yamlfile-extension: yaml
在nacos中的public命名空间中创建dataId为cloud-gateway.yaml的配置(未指定环境),配置内容如下:
到这里已经配置完成了。至于效果自己动动小手试试吧...............
如何自定义全局异常处理?
通过前面的测试可以看到一个现象:一旦路由的微服务下线或者失联了,Spring Cloud Gateway直接返回了一个错误页面,如下图:
显然这种异常信息不友好,前后端分离架构中必须定制返回的异常信息。
传统的Spring Boot 服务中都是使用@ControllerAdvice 来包装全局异常处理的,但是由于服务下线,请求并没有到达。
因此必须在网关中也要定制一层全局异常处理,这样才能更加友好的和客户端交互。
Spring Cloud Gateway提供了多种全局处理的方式,今天陈某只介绍其中一种方式,实现还算比较优雅。
直接创建一个类
GlobalErrorExceptionHandler,实现ErrorWebExceptionHandler,重写其中的handle方法,代码如下:
/*** 用于网关的全局异常处理* @Order(-1):优先级一定要比ResponseStatusExceptionHandler低*/
@Slf4j
@Order(-1)
@Component
@RequiredArgsConstructor
public class GlobalErrorExceptionHandler implements ErrorWebExceptionHandler {private final ObjectMapper objectMapper;@SuppressWarnings({"rawtypes", "unchecked", "NullableProblems"})@Overridepublic Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {ServerHttpResponse response = exchange.getResponse();if (response.isCommitted()) {return Mono.error(ex);}// JOSN格式返回response.getHeaders().setContentType(MediaType.APPLICATION_JSON);if (ex instanceof ResponseStatusException) {response.setStatusCode(((ResponseStatusException) ex).getStatus());}return response.writeWith(Mono.fromSupplier(() -> {DataBufferFactory bufferFactory = response.bufferFactory();try {//todo 返回响应结果,根据业务需求,自己定制CommonResponse resultMsg = new CommonResponse("500",ex.getMessage(),null);return bufferFactory.wrap(objectMapper.writeValueAsBytes(resultMsg));}catch (JsonProcessingException e) {log.error("Error writing response", ex);return bufferFactory.wrap(new byte[0]);}}));}
}
好了,全局异常处理已经定制完成了,在测试一下,此时正常返回JSON数据了,如下图:
JSON的样式根据架构需要自己定制。
总结
Spring Cloud Gateway今天就分享到这里,主要介绍了以下几个知识点:
- 为什么需要网关?网关的基本功能
- 如何从零搭建一个微服务网关
- Predict(断言)的概念
- 过滤器的概念、Spring Cloud Gateway内置的过滤器以及如何自定义
- 如何集成Nacos注册中心并且实现负载均衡
- 如何集成Nacos实现动态路由,达到一处修改,多出生效的作用
- 全局异常的处理
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 防火墙测试之IP/MAC地址绑定
测试内容:测试防火墙是否能将IP地址和物理地址进行绑定,以防止IP地址欺骗。 测试步骤 ①添加IP/MAC地址绑定规则; ②添加允许内网主机A访问外网服务器、不允许内网主机B访问外网服务器的访问控制规则; ③主机A访问外网服务器&am…...
2024/4/20 3:36:25 - 搞懂浅拷贝和深拷贝
首先,JavaScript数据类型分为基本数据类型和引用数据类型 基本数据类型:String, Number, Boolean, Null, Undefined,Symbol 特点:直接存储在栈(stack)中的数据 引用数据类型:Array,function,…...
2024/4/7 0:30:34 - 【23考研】计算机择校信息库-山西高校计算机相关专业22专业目录分类汇总(按专业课分类汇总)
太原理工大学 信息与计算机学院 081200计算机科学与技术 ①101 思想政治理论 ②201 英语(一) ③301 数学(一) ④833数据结构和计算机组成原理 085401新一代电子信息技术 ①101 思想政治理论 ②201 英语(二࿰…...
2024/4/15 5:56:40 - 407.接雨水二
给你一个 m x n 的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。 示例 1: 输入: heightMap [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]] 输出: 4 解释: 下雨后,雨水将会被上…...
2024/4/15 5:57:00 - 自然语言处理入门
一 如何获取资源? 1.ACL学会网站 ACL学会网站建立了称作ACL Anthology的页面(URL:ACL Anthology),支持NLP(自然语言处理)/CL(计算机语言学)领域绝大部分国际学术会议论文…...
2024/4/15 5:56:40 - 【转】linux防火墙查看状态firewall、iptable
一、iptables防火墙 1、基本操作 # 查看防火墙状态 service iptables status # 停止防火墙 service iptables stop # 启动防火墙 service iptables start # 重启防火墙 service iptables restart # 永久关闭防火墙 chkconfig iptables off # 永久关闭后重…...
2024/4/20 0:33:43 - 理解Java并发编程:ReentrantLock和ReentrantReadWriteLock
文章目录Lock锁Lock锁的方法locklockInterruptiblytryLocktryLock(long time, TimeUnit unit)unlocknewConditionLock锁的优势Lock锁的使用案例ReentrantLockReentrantReadWriteLockLock与Synchronized的比较Lock锁的原理Lock锁 Lock是自JDK1.5起在Java并发包(JUC)中提供的锁。…...
2024/4/19 0:06:20 - 第二天(数据类型转换、运算符及其优先级、位运算)
第二天 文章目录 第二天1. 基本数据类型转换1.1 自动转换1.2 强制转换1.3 隐藏的强制转换1.4 预编译2. 运算符2.1 “+”的多种用法2.3 &&和&区别,||和|的区别2.4 原码,反码,补码2.5 位运算符2.6 三目运算符1. 基本数据类型转换 Java中7中数值类型之间可以相互转…...
2024/4/15 5:56:45 - 发现一个windows11的bug
话不多说,直接上图 自从上次听从了系统的推送,手贱更新了windows11,最近爆出了各种各样的bug,最近忙着做实验具体的也没注意记录,但是晚上突然又发现了下面这个 希望 Microsoft 赶快解决吧 毕竟我也没那能力 哈哈哈哈哈...
2024/4/15 5:56:50 - 嵌入式系统(四):RISC-V处理器3
RISC-V 汇编语言 函数调用规范 调用过程分为六个阶段: 将参数存储到函数能够访问到的位置跳转到函数开始位置(使用RV32I的jal指令)获取函数需要的局部存储资源,按需保存寄存器执行函数中的指令将返回值存储到调用者能够访问到的…...
2024/4/7 0:30:26 - 一个类实现列表 同时也是迭代器
一个类实现列表 同时也是迭代器(练习) class MyList:def __init__(self):self.container []# 定义一个变量 从0开始 用来获取列表数据self.current_index 0def add(self, item):self.container.append(item)def __iter__(self):return selfdef __next…...
2024/4/20 11:45:10 - C++类的继承和多态
目录一 继承访问权限测试1 代码实现2 小结二 友元类继承测试1 代码实现2 小结三 多态性综合运用1 代码实现1 main.cpp2.CShape.h3.CShape.cpp2 运行结果3 小结一 继承访问权限测试 1 代码实现 #ifndef CSHAPE_H #define CSHAPE_H class A { public:int _a; protected:int _b;…...
2024/4/18 9:40:54 - [笔记]粒子特效6:shape属性
shape属性 使用版本2018.3.9 ●Shape:形状,在这里选择发射器的形状 ●Angle:发射的角度大小 ●Radius:发射器的大小 每种形状的属性都有差别,这里可以自己调试来了解...
2024/4/18 2:43:08 - 模仿两个人在使用eclipse svn开发
模仿两个人在使用eclipse svn开发 马克- to-win:马克 java社区:防盗版实名手机尾号: 73203 马克-to-win:现在我们模仿两个人在使用eclipse svn开发 1)先是工程师wanzi修改HelloWorld.java【1)添加一行且删除…...
2024/4/20 8:38:39 - BUUCTF - web - Easy Calc
文章目录Easy Calc知识点构造payloadEasy Calc 拿到一个计算器,看不出端倪,查看源码 有一段注释说这题有WAF,那思路应该就清晰了,绕WAF JS里面写道有Calc.php文件,可以查看一下 可以看到绕过了很多符号和字母 知…...
2024/4/15 5:57:31 - 拼多多1面:Spring MVC的主要组件有哪些?
前言 SpringMVC已经成为目前最主流的MVC框架之一,并且随着Spring3.0的发布,全面超越Struts2,成为最优秀的MVC框架。它通过一套注解,让简单的Java类成为处理请求的控制器(web层---Servlet),而无…...
2024/4/15 5:57:21 - 3、两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
答案:肯定不对的 hashcode()方法返回是一个整数,而equals(Object obj)方法用来判断两个对象是否相同; 在Java中任何一个对象都具备equals(Object obj)和hashcode()这两个方法,因为他们是在Object类中定义的。 如果equals(Objec…...
2024/4/20 3:30:09 - mysql8.0后一些语句变化(一)
1.grant授权 grant select,insert,delete,update on test_db.* to tom%; 2.查看隔离级别 select transaction_isolation;...
2024/4/15 12:11:42 - 树莓派系统镜像备份及压缩至最小的方法
前言:玩树莓派瞎折腾难免有一天弄坏了系统,搞坏了文件,如果不想让过去的大把配置和努力付之一炬的话,备份系统就是不二选择,本文将介绍一种树莓派系统镜像备份及压缩至最小的方法,如有错误还请指出…...
2024/4/15 5:57:31 - python正则表达式
import reprmr_\w string MR_SHOP string1"我mr_shop" print(re.match(p,string,re.I)) print(re.match(p,string1,re.I)) #不分大小写匹配 string2MR_SHOP mr_shop mre.match(p,string2,re.I) print(m.start()) print(m.end()) print(m.span()) print(m.string) p…...
2024/4/19 16:39:05
最新文章
- 90天精通Psim仿真--经典实战教程--第10天 Simcode DSP28335 LED控制
PSIM (Power Simulation) 是一款电力电子和电机控制仿真软件,而DSP28335是德州仪器(TI)的一款数字信号处理器(DSP)。如果你想要在PSIM的SimCoder环境中为DSP28335生成LED闪烁的代码,遵循以下步骤: 打开PSIM并创建模型: 首先,在PSIM中创建一个电路模型,该模型应包括DS…...
2024/4/20 13:02:28 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 金融数据_Scikit-Learn决策树(DecisionTreeClassifier)实例
金融数据_Scikit-Learn决策树(DecisionTreeClassifier)实例 逻辑回归: 逻辑回归常被用于二分类问题, 比如涨跌预测。你可以将涨跌标记为类别, 然后使用逻辑回归进行训练。 决策树和随机森林: 决策树和随机森林是用于分类问题的强大模型。它们能够处理非线性关系, 并且对于特征…...
2024/4/12 16:31:48 - Kafka架构概述
Kafka的体系结构 Kafka是由Apache软件基金会管理的一个开源的分布式数据流处理平台。Kafka具有支持消息的发布/订阅模式、高吞吐量与低延迟、持久化、支持水平扩展、高可用性等特点。可以将Kafka应用于大数据实时处理、高性能数据管道、流分析、数据集成和关键任务应用等场景。…...
2024/4/18 3:51:49 - 文心一言 vs GPT-4 —— 全面横向比较
对于文心一言和 GPT-4 这两者之间的全面横向比较,我们可以从多个方面来看待它们的区别和优劣势。 文心一言 文心一言是一款基于深度学习的中文文本生成模型,专注于生成优美的古风诗句和语录。以下是它的一些特点: 专注于古风诗句和语录: 文…...
2024/4/18 2:25:21 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/19 14:24:02 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/19 18:20:22 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/19 11:57:31 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/19 11:57:31 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/19 11:57:52 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/19 11:57:53 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/19 11:58:14 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/19 11:58:20 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/20 7:40:48 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/19 11:58:39 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/19 11:58:51 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/20 3:12:02 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/19 11:59:15 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/19 11:59:23 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/19 11:59:44 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/19 11:59:48 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/19 12:00:06 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/19 16:57:22 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/19 12:00:25 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/19 12:00:40 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57