SpringCloud微服务GateWay网关使用与配置
一、概念
1、什么是GateWay网关
在微服务架构中,Gateway(网关)是一个重要的组件,负责处理外部请求并将它们路由到适当的微服务。以下是Gateway在微服务中的一些主要功能:
- 路由: Gateway负责将来自客户端的请求路由到正确的微服务。这可以基于请求的路径、主机头、HTTP方法等条件进行路由。
- 负载均衡: Gateway可以执行负载均衡,将请求分发到多个相同或不同的微服务实例,以确保各个实例都能够处理相应的负载,提高系统的性能和可用性。
- 安全性: Gateway通常用于处理安全性方面的任务,例如身份验证、授权和加密。它可以拦截请求并验证用户的身份,确保只有经过身份验证的用户才能访问受保护的微服务。
- 监控和日志: Gateway可以收集有关请求和响应的信息,用于监控和日志记录。这些信息可以用于分析性能问题、跟踪请求流程,以及生成有关系统行为的报告。
- 协议转换: Gateway可以执行协议转换,将外部请求从一个协议转换为另一个协议。例如,将HTTP请求转换为WebSocket请求,或者将请求从HTTP/1.1转换为HTTP/2。
- 缓存: Gateway可以实现请求和响应的缓存,以降低对微服务的负载,提高响应速度。这对于处理频繁请求相同资源的情况很有用。
- 限流: 通过在Gateway上实现限流策略,可以控制对微服务的请求流量,防止过多的请求导致系统过载。
- 断路器模式: Gateway可以实现断路器模式,用于在微服务发生故障或不可用时防止请求继续传递,从而提高系统的稳定性。
- API管理: Gateway可以用于集中管理和监控微服务的API。这包括API版本控制、文档生成、请求转换等。
2、gateway网关的工作流程
- 客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。
- 过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(Pre)或之后(Post)执行业务逻辑。
- 在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等;
- 在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。
3、gateway三大核心概念
- Route(路由):路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由。
- Predicate(断言):参考的是Java8的java.util.function.Predicate,开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由。
- 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又是一个,在实际开发当中,根据自己的实际场景可以随便使用断言。
- Path: 配置请求的路径
- Before Route Predicater:Before就是设置的时间之前可以访问,过了时间之后不可以访问
- Between Route Predicate:两个时间的区间是可以访问的,过了时间之后不可以访问
- Cookie Route Predicate:Cookie路由谓词工厂有两个参数,cookie和namea regexp(这是一个 Java 正则表达式)。此谓词匹配具有给定名称且其值与正则表达式匹配的 cookie。
- Header Route Predicater:Header路由谓词工厂有两个参数,the和headera regexp(这是一个 Java 正则表达式)。此谓词与具有给定名称且值与正则表达式匹配的标头匹配。
- Host Route Predicate:路由谓词工厂采用Host一个参数:主机名列表patterns。该模式是一种 Ant 风格的模式,.以分隔符为分隔符。
- Method Route Predicate:设置了之后只有GET请求会路由
- Path Route Predicate:关于path的上面示例当中我们就已经用到了。
- Query Route Predicate:支持传入两个参数,一个是属性名,一个为属性值,属性值可以是正则表达式。
- RemoteAddr Route Predicate:路由谓词工厂采用的RemoteAddr列表(最小大小为 1)sources,它们是 CIDR 表示法(IPv4 或 IPv6)字符串,例如192.168.0.1/16(其中192.168.0.1是 IP 地址和16子网掩码)。
- Weight Route Predicate:Weight路由谓词工厂有两个参数:和group(weight一个 int)。权重是按组计算的。
- 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、常用的路由过滤器
- The AddRequestHeader GatewayFilter Factory:相当于是给匹配到路由的request,添加Header
- The RemoveRequestHeader GatewayFilter Factory:删除request请求头信息
- The SetRequestHeader GatewayFilter Factory:设置request请求头信息
- The RequestRateLimiter GatewayFilter Factory:通过这个Filter就可以利用redis来完成限流
- The AddRequestParameter GatewayFilter Factory:添加request参数
- The RemoveRequestParameter GatewayFilter Factory:删除请求头参数
- The AddResponseHeader GatewayFilter Factory:添加response相应头信息
- The ResponseHeader GatewayFilter Factory:设置response相应头信息
- The RemoveResponseHeader GatewayFilter Factory:删除response相应头信息
- The PrefixPath GatewayFilter Factory:自动添加路径前缀
- The SetPath GatewayFilter Factory:修改访问路径
- 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网关 在微服务架构中,Gateway(网关)是一个重要的组件,负责处理外部请求并将它们路由到适当的微服务。以下是Gateway在微服务中的一些主要功能: 路由: Gateway负责将来自客户端的…...
win7补丁下载
目的 一般来说,安装上windows系统就带着补丁了,但有时,安装的是原始版的操作系统是不带补丁的,一般直接更新就可以了,但有时,电脑不能联网,只能通过安装包进行升级,所以下面介绍如何…...
在Cisco Packet Tracer上配置NAT
目录 前言一、搭建网络拓扑1.1 配置PC机1.2 配置客户路由器1.3 配置ISP路由器 二、配置NAT2.1 在客户路由器中配置NAT2.2 测试是否配置成功 总结 前言 本篇文章是在了解NAT的原理基础上,通过使用Cisco Packet Tracer 网络模拟器实现模拟对NAT的配置,以加…...
Web前端工程师的前景:挑战与机遇并存
Web前端工程师的前景:挑战与机遇并存 随着互联网的飞速发展和数字化转型的深入推进,Web前端工程师的前景日益广阔且充满挑战。作为互联网技术的核心力量之一,前端工程师的角色越来越重要,但同时也面临着技术更新迅速、市场需求多…...
MySQL—多表查询—联合查询
一、引言 之前学习了连接查询。现在学习联合查询。 union:联合、联盟 对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集 涉及到两个关键字:union 和 union all 注意: 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入门学习主线篇(十五)—— DockPanel布局容器 欢迎来到C# WPF入门学习系列的第十五篇。在前几篇文章中,我们探讨了 Canvas、StackPanel 和 WrapPanel 布局容器及其使用方法。本篇博客将介绍另一种强大且常用的布局容器——DockPanel。…...
基于SVPWM矢量控制的无速度传感器电机控制系统simulink建模与仿真
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于SVPWM矢量控制的无速度传感器电机控制系统simulink建模与仿真,包括电机,SVPWM模块,矢量控制器模块等。 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、流程:2、示例 2、缺点 六、CART1、连续数据处理2、离散数据处理3、CART回归原理1、均方误差…...
1奇函数偶函数
文章目录 自变量有理化奇偶性周期性初等函数 自变量 自变量是x,这个还挺奇怪,记住就好 y f ( e x 1 ) yf(e^x1) yf(ex1) 里面 e x e^x ex 只算中间变量,自变量是x 做这些题,想到了以前高中的时候做数学题,不够扎实…...
什么情况下需要配戴助听器
以下几种情况需要考虑配戴助听器: 1、听力无波动3个月以上的感音神经性听力障碍。如:先天性听力障碍、老年性听力障碍、噪声性听力障碍、突聋的稳定期等,均可选配合适的助听器。 2、年龄方面。使用助听器没有严格的年龄限制,从出生数周的婴…...
Java 基础面试300题 (231-260)
Java 基础面试300题 (231-260) 231 String::toUpperCase是什么类型的方法引用? String::toUpperCase是任意方法引用的示例。它指的是String 类的toUpperCase方法,但不是指任何特定对象。 通常在遍历集合或流时使用。例如&#x…...
Hadoop3:MapReduce源码解读之Map阶段的Job任务提交流程(1)
3、Job工作机制源码解读 用之前wordcount案例进行源码阅读,debug断点打在Job任务提交时 提交任务前,建立客户单连接 如下图,可以看出,只有两个客户端提供者,一个是YarnClient,一个是LocalClient。 显然&a…...
Linux环境---在线安装MYSQL数据库
Linux环境—在线安装MYSQL数据库 一、使用步骤 1.安装环境 Mysql 驱动 8.0 需要 jdk1.8 才行。 JDK版本:1.8 参考文档 MYSQL版本:8.0.2 下载链接: https://pan.baidu.com/s/1MwXIilSL6EY3OuS7WtpySA?pwdg263 操作系统:CentOS 1.1 建立存…...
git本地配置及IDEA下Git合并部分文件
目录 1、IDEA 下 Git 合并部分文件 2、分支合并忽略特定文件步骤 3、git本地配置 1、IDEA 下 Git 合并部分文件 1.1Git 下存在两个分支,foo 和 bar 分支,想要把 bar 分支上的部分文件合并到 foo 分支: 首先切换到 foo 分支,点击右下角的 …...
安徽京准 NTP时钟同步服务器具体配置方法是什么?
安徽京准 NTP时钟同步服务器具体配置方法是什么? 安徽京准 NTP时钟同步服务器具体配置方法是什么? 可以使用特权终结点 (PEP) 来更新 Azure Stack Hub 中的时间服务器。 使用可解析为两个或更多个 NTP(网络时间协议)服务器 IP 地…...
微信小程序 画布canvas
属性说明 属性类型默认值必填说明最低版本typestring否指定 canvas 类型,支持 2d (2.9.0) 和 webgl (2.7.0)2.7.0canvas-idstring否canvas 组件的唯一标识符,若指定了 type 则无需再指定该属性1.0.0disable-scrollbooleanfalse否当在 canvas 中移动时且…...
leetcode-04-[24]两两交换链表中的节点[19]删除链表的倒数第N个节点[160]相交链表[142]环形链表II
一、[24]两两交换链表中的节点 重点:暂存节点 class Solution {public ListNode swapPairs(ListNode head) {ListNode dummyHeadnew ListNode(-1);dummyHead.nexthead;ListNode predummyHead;//重点:存节点while(pre.next!null&&pre.next.next…...
深入探讨 Java 18 的主要新特性,分析其设计理念和实际应用
Java 18 作为 Java 的最新版本,引入了一系列的新特性和改进,这些变化不仅提升了语言的性能和安全性,也为开发者提供了更多的工具和选项,简化了开发过程,提高了代码的可读性和维护性。本文将深入探讨 Java 18 的主要新特性,分析其设计理念和实际应用,帮助读者理解这些新特…...
qt4-qt5 升级(2)-GUI-UTF-8-GBK-QTextCode-字符集乱码
MFC与QT的消息机制的区别_qt信号槽机制与mfc的消息映射机制的区别-CSDN博客 1.QT4-QT5差别 kits构建 控件,信号与槽 ui修改好后点击编译会自动生成 ui_XXX.h 聚合的关系,不是拥有的关系。 QWidget 和QWindow有什么差别? 2.VS2019-QT5 构建…...
Qt Designer 生成的 .ui 文件转为 .py 文件并运行
1. 使用使用 PyUIC将 .ui 转 .py (1)打开命令行终端(可以用cmd,或pycharm 下面的 Terminal)。 (2)导航到包含.ui文件的目录。 cd 你的ui文件路径 (3)运行以下命令来…...
Dubbo 3.x源码(20)—Dubbo服务引用源码(3)
基于Dubbo 3.1,详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了调用createProxy方法,根据服务引用参数map创建服务接口代理引用对象的整体流程,我们知道会调用createInvokerForRemote方法创建远程引用Invoker,这是Dubbo …...
开发一个Dapp需要多少?
区块链开发一个Dapp要多少钱? 开发一个去中心化应用(Dapp)的成本取决于多个因素,包括Dapp的复杂性、功能需求、区块链平台以及开发团队的经验水平。以下是一些主要的影响因素: 1. 区块链平台:不同区块链…...
kNN算法-概述
所谓kNN算法就是K-nearest neigbor algorithm。这是似乎是最简单的监督机器学习算法。在训练阶段,kNN算法存储了标签训练样本数据。简单地说,就是调用训练方法时传递给它的标签训练样本会被它存储起来。 kNN算法也叫lazy learning algorithm懒惰学习算法…...
富格林:曝光纠正出金亏损陋习
富格林悉知,虽然现货黄金市场看似变化无常,在操作方向上依旧是有迹可循的,投资者需要了解曝光的专业经验纠正陋习阻止出金亏损。要获得优质的黄金投资出金效果,就需要在明确现货黄金操作技巧的前提下,只有规范遵循已曝…...
怎么用微信小程序实现远程控制空调
怎么用微信小程序实现远程控制空调呢? 本文描述了使用微信小程序调用HTTP接口,实现控制空调,通过不同规格的通断器,来控制不同功率的空调的电源。 可选用产品:可根据实际场景需求,选择对应的规格 序号设备…...
ES5/ES6 的继承除了写法以外还有什么区别?
一、主要区别 ES5 的继承实质上是先创建子类的实例对象, 然后再将父类的方法添加 到 this 上(Parent.apply(this)) . ES6 的继承机制完全不同, 实质上是先创建父类的实例对象 this(所以必 须先调用父类的 super()方法…...
LeetCode 第401场周赛个人题解
100325. 找出 K 秒后拿着球的孩子 原题链接 100325. 找出 K 秒后拿着球的孩子 思路分析 数据很小,暴力或者数学方法都行 数学方法就是对 n - 1做带余除法,看跑了奇数还是偶数趟,余数如何,确定位置 时间复杂度:O(…...
C#面:请解释web.config⽂件中的重要节点
在C#中,web.config文件是一个XML格式的配置文件,用于配置ASP.NET应用程序的各种设置。web.config文件中包含了许多重要的节点,下面是一些常见的重要节点及其作用: <configuration>节点:web.config文件的根节点&…...
园区网互联及网站建设/怎么推广自己的微信号
今天我们来讨论一下止回阀安装位置。那么止回阀的安装位置如何确定呢?泵前安装与泵后安装止回阀有何区别,泵前安装适用于哪些地方?止回阀通常要配合其他阀门一起使用,那么跟其他阀门配合使用时,止回阀要安装在哪里呢&a…...
dynamik wordpress/推广普通话黑板报
1) 如果你同时从同一客户插入很多行,使用多个值表的INSERT语句。这比使用分开INSERT语句快(在一些情况中几倍)。 Insert into test values(1,2),(1,3),(1,4)…2) 如果你从不同客户插入很多行,能通过使用INSERT DELAYED语句得到更高的速度。Delayed的含…...
企业网站建设的报价/新手做外贸怎么入门
接口 通过关键字type和interface,我们可以声明出接口类型。接口类型的类型字面量与结构体类型的看起来有些相似,它们都用花括号包裹一些核心信息。只不过,结构体类型包裹的是它的字段声明,而接口类型包裹的是它的方法定义。 实现…...
邮件网站怎么做的/免费seo推广软件
什么是数据挖掘 数据挖掘就是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中,提取隐含在其中的、人们事先不知道的、但又是潜在有用的信息和知识的过程。 听起来比较抽象,我们举个例子。 傍晚小街路面上沁出微雨后的湿润,和…...
石桥铺网站建设公司/seo的内容怎么优化
什么是 Istio作为服务网格的实现产品,Istio 一经推出就备受瞩目,成为各大厂商和开发者争相追逐的 “香馍馍”。我个人认为 Istio 会成为继 Kubernetes 之后的又一个明星级产品。Istio 的官方网站这样定义自己的:它是一个完全开源的服务网格&a…...
给个做的网站吗/html网页制作app
2019独角兽企业重金招聘Python工程师标准>>> 上篇主要是介绍了HTTP存在的两大安全问题 明文无法验证服务器的真实性从而引出了TLS。本篇就来着重介绍下TLS。 说起TLS可能有些人还比较陌生,但如果说到SSL,那知道的人就更多了。TLS其实就是SSL发…...