【微服务】Gateway
文章目录
- 1.基本介绍
- 官方文档:https://springdoc.cn/spring-cloud-gateway/#gateway-starter
- 1.引出网关
- 2.使用网关服务架构图
- 3.Gateway网络拓扑图(背下来)
- 4.Gateway特性
- 5.Gateway核心组件
- 1.基本介绍
- 2.断言
- 3.过滤
- 6.Gateway工作机制
- 2.搭建Gateway微服务
- 1.引入Gateway架构
- 2.环境搭建
- 1.参考member-service-consumer-81 创建 e-commerce-gateway-20000 子模块
- 2.检查父子的pom.xml
- 1.父pom.xml
- 2.子pom.xml
- 3.pom.xml引入依赖
- 4.application.yml 配置gateway(这里的eureka还没有用到只是先配置一下)
- 5.编写启动类
- 6.依次启动9001,20000,10001模块进行测试
- 1.9001报错连接不上9002
- 2.20000Gateway正常启动
- 3.10001报错,连接9002被拒绝
- 4.输入http://eureka9001.com:9001/查看注册中心状态,成功注册20000, 10001!
- 5.postman测试
- 7.修改application.yml增加Gateway路由,访问到/member/save
- 8.postman测试
- 3.配置类注入Gateway(了解)
- 1.com/sun/springcloud/config/GatewayRoutesConfig.java
- 2.postman测试
- 4.动态路由
- 1.需求分析
- 2.动态路由配置
- 3.启动服务
- 4.postman测试
- 1.第一次
- 2.第二次,可以看出负载均衡算法默认是轮询
- 5.配置负载均衡算法
- 1.com/sun/springcloud/config/RibbonRule.java 配置类直接注入负载均衡算法的对象即可
- 2.重启服务进行测试
- 1.查看注册中心
- 2.postman向gateway发送几次请求
- 1.第一次
- 2.第二次,可以发现两次一样,不再是轮询算法
- 3.恢复轮询算法,注销掉刚才的配置类
- 6.Gateway 细节说明
- 1.关于predicates: - Path=/member/save中的`/`
- 2.关于uri: lb://member-service-provider服务发现的内容
- 3.Gateway执行流程
- 1.断言
- 2.服务发现
- 3.路径拼接
- 4.远程调用
- 6.Predicate(断言)
- 1.基本介绍
- 2.After Route Predicate 某个时间之后发送请求
- 1.需求分析
- 2.代码获取Gateway格式的时间
- 3.Gateway格式的时间
- 4.或者直接从官网获取这个Gateway格式的时间
- 5.应用实例
- 6.启动服务发送请求
- 3.Before Route Predicate 某个时间之前发送请求
- 1.需求分析
- 2.应用实例
- 3.postman发送请求
- 4.Between Route Predicate 两个时间之间发送请求
- 1.需求分析
- 2.应用实例
- 3.postman发送请求
- 5.Cookie Route Predicate 携带某个Cookie的请求
- 1.需求分析
- 2.应用实例
- 3.postman发送请求并设置cookie
- 1.携带cookie
- 2.不携带cookie
- 6.Header Route Predicate 携带某个Header属性的请求
- 1.需求分析
- 2.应用实例
- 3.postman请求Header携带参数
- 7.Host Route Predicate 指定主机发送的请求
- 1.需求分析
- 2.应用实例
- 3.postman请求修改host
- 8.Method Route Predicate 指定请求方式的请求
- 1.应用实例
- 2.postman测试
- 9.Path Route Predicate 指定路径的请求
- 应用实例
- 10.Query Route Predicate 参数满足指定条件的请求
- 1.需求分析
- 2.应用实例
- 3.postman测试
- 11.RemoteAddr Route Predicate 指定范围的ip客户端发送的请求
- 1.需求分析
- 2.应用实例
- 3.postman测试
- 12.weight Route Predicate 根据权重进行断言
- 7.过滤器
- 1.基本介绍
- 1.功能
- 2.工作流程
- 2.自定义过滤器
- 1.需求分析
- 2.代码实现 com/sun/springcloud/filter/CustomerGateWayFilter.java
- 3.postman测试
1.基本介绍
官方文档:https://springdoc.cn/spring-cloud-gateway/#gateway-starter
1.引出网关

2.使用网关服务架构图

3.Gateway网络拓扑图(背下来)

4.Gateway特性

5.Gateway核心组件
1.基本介绍

2.断言

3.过滤

6.Gateway工作机制

2.搭建Gateway微服务
1.引入Gateway架构

2.环境搭建
1.参考member-service-consumer-81 创建 e-commerce-gateway-20000 子模块
2.检查父子的pom.xml
1.父pom.xml

2.子pom.xml

3.pom.xml引入依赖
<dependencies><!--gateway不需要web-starter!--><!--<!– springboot web starter 用来监听端口–>--><!--<dependency>--><!-- <groupId>org.springframework.boot</groupId>--><!-- <artifactId>spring-boot-starter-web</artifactId>--><!-- <!– 如果在子工程/模块指定了 version,则以指定为准 –>--><!--</dependency>--><!--<dependency>--><!-- <groupId>org.springframework.boot</groupId>--><!-- <artifactId>spring-boot-starter-actuator</artifactId>--><!--</dependency>--><!-- 引入 cloud gateway --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- 引入eureka的客户端场景启动器 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId><!-- 使用版本仲裁 --></dependency><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- test --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- 公共模块的jar包 --><dependency><groupId>org.example</groupId><artifactId>e_commerce_center-common-api</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>
4.application.yml 配置gateway(这里的eureka还没有用到只是先配置一下)
server:port: 20000
spring:application:name: e-commerce-gatewaycloud:gateway:routes: # 配置路由, List<RouteDefinition> routes,是集合类型- id: member_route01 # 路由id,唯一即可uri: http://localhost:10001 # 断言匹配成功后将这个与/member/get/**拼接predicates:- Path=/member/get/** # 断言匹配成功后的完整路径是http://localhost:10001/member/get/**
# 配置eureka,作为客户端,有服务注册和服务发现功能
eureka:instance:hostname: e-commerce-serviceclient:register-with-eureka: true # 将自己注册到eureka服务fetch-registry: true # 发现服务功能,如果是集群,必须要能发现服务才能配合ribben进行负载均衡service-url:defaultZone: http://eureka9001.com:9001/eureka/
5.编写启动类
package com.sun.springcloud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;/*** @author 孙显圣* @version 1.0*/
@SpringBootApplication
@EnableEurekaClient
public class GateWayApplication20000 {public static void main(String[] args) {SpringApplication.run(GateWayApplication20000.class, args);}
}
6.依次启动9001,20000,10001模块进行测试
1.9001报错连接不上9002
- 9002是eureka的一个server,与这个9001互相注册
- 而9002并没有开启,所以连接不上是正常的

2.20000Gateway正常启动

3.10001报错,连接9002被拒绝
- 10001是微服务集群中的一个服务,它注册到了9001和9002的server
- 9002没开,所以连接被拒绝,没问题

4.输入http://eureka9001.com:9001/查看注册中心状态,成功注册20000, 10001!

5.postman测试
路径匹配的情况

路径不匹配的情况,Gateway直接返回404

7.修改application.yml增加Gateway路由,访问到/member/save
server:port: 20000
spring:application:name: e-commerce-gatewaycloud:gateway:routes: # 配置路由, List<RouteDefinition> routes,是集合类型- id: member_route01 # 路由id,唯一即可uri: http://localhost:10001 # 断言匹配成功后将这个与/member/get/**拼接predicates:- Path=/member/get/** # 断言匹配成功后的完整路径是http://localhost:10001/member/get/**- id: member_route02 # 路由id,唯一即可uri: http://localhost:10001 # 断言匹配成功后将这个与/member/save拼接predicates:- Path=/member/save # 断言匹配成功后的完整路径是http://localhost:10001//member/save# 配置eureka,作为客户端,有服务注册和服务发现功能
eureka:instance:hostname: e-commerce-serviceclient:register-with-eureka: true # 将自己注册到eureka服务fetch-registry: true # 发现服务功能,如果是集群,必须要能发现服务才能配合ribben进行负载均衡service-url:defaultZone: http://eureka9001.com:9001/eureka/
8.postman测试

3.配置类注入Gateway(了解)
1.com/sun/springcloud/config/GatewayRoutesConfig.java
package com.sun.springcloud.config;import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Description:** @Author sun* @Create 2024/3/26 11:36* @Version 1.0*/
@Configuration
public class GatewayRoutesConfig {@Beanpublic RouteLocator routeLocator(RouteLocatorBuilder routeLocatorBuilder) {RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();// 这里使用了Lambda表达式,理解为规定写法即可return routes.route("member_route04",r -> r.path("/member/get/**").uri("http://localhost:10001")).build();}
}
2.postman测试

4.动态路由
1.需求分析

2.动态路由配置
server:port: 20000
spring:application:name: e-commerce-gatewaycloud:gateway:routes: # 配置路由, List<RouteDefinition> routes,是集合类型- id: member_route01 # 路由id,唯一即可uri: lb://member-service-provider # 断言匹配成功后将这个与/member/get/**拼接,这里的lb是负载均衡的协议,服务名需要小写predicates:- Path=/member/get/** # 断言匹配成功后的完整路径是http://localhost:10001/member/get/**- id: member_route02 # 路由id,唯一即可uri: lb://member-service-provider # 断言匹配成功后将这个与/member/save拼接,,这里的lb是负载均衡的协议,,服务名需要小写predicates:- Path=/member/save # 断言匹配成功后的完整路径是http://localhost:10001//member/savediscovery:locator:enabled: true # 启用服务发现,不配置可能也不影响# 配置eureka,作为客户端,有服务注册和服务发现功能
eureka:
# instance:
# hostname: e-commerce-serviceclient:register-with-eureka: true # 将自己注册到eureka服务fetch-registry: true # 发现服务功能,如果是集群,必须要能发现服务才能配合ribben进行负载均衡service-url:defaultZone: http://eureka9001.com:9001/eureka/
3.启动服务

4.postman测试
1.第一次

2.第二次,可以看出负载均衡算法默认是轮询

5.配置负载均衡算法
1.com/sun/springcloud/config/RibbonRule.java 配置类直接注入负载均衡算法的对象即可
package com.sun.springcloud.config;import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Description: 配置自己的负载均衡算法,这里使用的随机算法** @Author sun* @Create 2024/3/26 14:31* @Version 1.0*/
@Configuration
public class RibbonRule {@Beanpublic IRule myRibbonRule() {return new RandomRule();}
}
2.重启服务进行测试
1.查看注册中心

2.postman向gateway发送几次请求
1.第一次

2.第二次,可以发现两次一样,不再是轮询算法

3.恢复轮询算法,注销掉刚才的配置类

6.Gateway 细节说明
1.关于predicates: - Path=/member/save中的/
这里的/指的是http://ip + 端口/上下文路径/
2.关于uri: lb://member-service-provider服务发现的内容
这里通过注册中心发现的是微服务集群中对应服务的http://ip+端口/上下文路径(如果配置了的话)
3.Gateway执行流程
1.断言
对请求url进行断言
2.服务发现
如果通过断言,则从注册中心进行服务发现,并通过负载均衡算法得到指定服务的http://ip+端口/上下文路径(如果配置了的话)
3.路径拼接
将得到的http://ip+端口/上下文路径(如果配置了的话)与进行断言的路径拼接
4.远程调用
通过拼接后的路径完成远程调用
6.Predicate(断言)
1.基本介绍

2.After Route Predicate 某个时间之后发送请求
1.需求分析

2.代码获取Gateway格式的时间
package com.sun.springcloud;
import java.time.ZonedDateTime;/*** Description:** @Author sun* @Create 2024/3/26 15:10* @Version 1.0*/
public class T2 {public static void main(String[] args) {ZonedDateTime now = ZonedDateTime.now();System.out.println(now);}
}
3.Gateway格式的时间
2024-03-26T15:12:23.371+08:00[Asia/Shanghai]

4.或者直接从官网获取这个Gateway格式的时间
5.应用实例
predicates:- Path=/member/get/**- After=2025-01-20T17:42:47.789+08:00[Asia/Shanghai] # 断言条件:在2025年1月20日下午5点42之后发送的请求
6.启动服务发送请求

3.Before Route Predicate 某个时间之前发送请求
1.需求分析

2.应用实例
predicates:- Path=/member/get/** - Before=2025-01-20T17:42:47.789-07:00[America/Denver] # 断言条件:2025年1月20日之前(这里是美国时间)
3.postman发送请求

4.Between Route Predicate 两个时间之间发送请求
1.需求分析

2.应用实例
predicates:- Path=/member/get/**- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2025-01-21T17:42:47.789-07:00[America/Denver] # 断言条件,在2017年1月20日到2025年1月21日之间
3.postman发送请求

5.Cookie Route Predicate 携带某个Cookie的请求
1.需求分析

2.应用实例
predicates:- Path=/member/get/** - Cookie=user, sun # 断言条件,有cookie名为user,值为sun
3.postman发送请求并设置cookie
1.携带cookie

2.不携带cookie

6.Header Route Predicate 携带某个Header属性的请求
1.需求分析

2.应用实例
predicates:- Path=/member/get/**- Header=X-Request-Id, hello # 断言条件,Header中有X-Request-Id属性,值为hello
3.postman请求Header携带参数

7.Host Route Predicate 指定主机发送的请求
1.需求分析

2.应用实例
predicates:- Path=/member/get/**- Host=**.sunxiansheng.com,**.anotherhost.org # 断言条件:任意前缀的sunxiansheng.com和anotherhost.org的host
3.postman请求修改host

8.Method Route Predicate 指定请求方式的请求
1.应用实例
predicates:- Path=/member/get/**- Method=GET,POST # 断言条件:请求方式为GET和POST
2.postman测试

9.Path Route Predicate 指定路径的请求
应用实例
predicates:- Path=/member/get/**, /member/get/save # 断言条件:路径为/member/get/**或者/member/get/save,其中的/是本服务的http://ip+端口/上下文路径/
10.Query Route Predicate 参数满足指定条件的请求
1.需求分析

2.应用实例
predicates:- Path=/member/get/**- Query=email, [\w-]+@([a-zA-Z]+\.)+[a-zA-Z]+ # 断言条件:请求携带参数为email,值要满足邮箱的格式
3.postman测试

11.RemoteAddr Route Predicate 指定范围的ip客户端发送的请求
1.需求分析

2.应用实例
predicates:- Path=/member/get/**- RemoteAddr=127.0.0.1 # 断言条件:客户端的ip只能是本机
3.postman测试

12.weight Route Predicate 根据权重进行断言

7.过滤器
1.基本介绍
1.功能

2.工作流程
- 简单来说就是在远程调用之前和远程调用之后可以进行过滤
- 过滤器链跟javaweb的过滤器一样
- 原生的过滤器使用的并不多,更多的是使用自定义的过滤器

2.自定义过滤器
1.需求分析

2.代码实现 com/sun/springcloud/filter/CustomerGateWayFilter.java
package com.sun.springcloud.filter;import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;/*** Description: 编写全局过滤器** @Author sun* @Create 2024/3/26 18:50* @Version 1.0*/
@Component
public class CustomerGateWayFilter implements GlobalFilter, Ordered {/*** 在远程调用之前判断请求的参数user是否等于sun,pwd是否等于666** @param exchange the current server exchange* @param chain provides a way to delegate to the next filter* @return*/@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("CustomerGateWayFilter被执行");// 获取请求的参数,由于使用get方法返回的是一个list所以需要get(0)String user = exchange.getRequest().getQueryParams().get("user").get(0);// 使用getFirst相当于获取了请求参数名为pwd的第一个元素String pwd = exchange.getRequest().getQueryParams().getFirst("pwd");// 不满足要求就设置状态码之后直接返回if (!("sun".equals(user) && "666".equals(pwd))) {System.out.println("非法用户");// 设置响应的状态码exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);// 返回return exchange.getResponse().setComplete();}System.out.println("放行");// 满足要求就放行return chain.filter(exchange);}/*** 根据返回的值来决定过滤器调用的顺序,数字越小则优先级越高** @return*/@Overridepublic int getOrder() {return 0;}
}
3.postman测试

2
相关文章:
【微服务】Gateway
文章目录 1.基本介绍官方文档:https://springdoc.cn/spring-cloud-gateway/#gateway-starter1.引出网关2.使用网关服务架构图3.Gateway网络拓扑图(背下来)4.Gateway特性5.Gateway核心组件1.基本介绍2.断言3.过滤 6.Gateway工作机制 2.搭建Gat…...
王道C语言督学营OJ课后习题(课时14)
#include <stdio.h> #include <stdlib.h>typedef char BiElemType; typedef struct BiTNode{BiElemType c;//c 就是书籍上的 datastruct BiTNode *lchild;struct BiTNode *rchild; }BiTNode,*BiTree;//tag 结构体是辅助队列使用的 typedef struct tag{BiTree p;//树…...
Filter、Listener、AJAX
Filter 概念:Filter 表示过滤器,是JavaWeb三大组件(Servlet、Filter、 Listener)之一。 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。 过滤器一般完成一些通用的操作,比如:权限控制、统一编码处理、敏感…...
FastAPI+React全栈开发04 FastAPI概述
Chapter01 Web Development and the FARM Stack 04 Introducing FastAPI FastAPIReact全栈开发04 FastAPI概述 Now we will look at a brief introducion to the Python REST-API framework of choice - FastAPI. Additionally, we will go over a high-level overview of t…...
基于单片机的二维码LCD显示控制设计
**单片机设计介绍,基于单片机的二维码LCD显示控制设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的二维码LCD显示控制设计是一个集硬件、软件与通信于一体的综合性项目。此设计的主要目标是实现单片机…...
Ubuntu20.04下PCL安装,查看,卸载等操作
Ubuntu20.04下PCL安装,查看,卸载等操作 项目来源 https://github.com/PointCloudLibrary/pclhttps://pointclouds.org/documentation/modules.htmlhttps://pcl.readthedocs.io/projects/tutorials/en/master/ 点云学习: https://github.c…...
Android TargetSdkVersion 30 安装失败 resources.arsc 需要对齐且不压缩。
公司项目,之前targetSDKVersion一直是29,近期小米平台上架强制要求升到30,但是这个版本在android12上安装失败,我用adb命令安装,报错如下图 adb: failed to install c: Program Files (x86)(0A_knight\MorkSpace \Home…...
c++20中的jthread再谈
一、介绍 在前面的C20新功能中,简单的介绍过相关的std::jthread的应用。当时觉得它虽然比std::thread方便一些,但也没有多大的优势。可在后面的不断的学习中,发现std::jthread的使用上确实有优秀之处,相对于传统的线程编程&#…...
Fastgpt 无法启动或启动后无法正常使用的讨论(启动失败、用户未注册等问题这里)
FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景! FastGPT是非常实用并且相当厉害的个人知识库AI项目,项目是非常…...
Rust 实战练习 - 7. FFI, 库, ABI, libc
FFI FFI(Foreign Function Interface)是这样一种机制:用一种编程语言写的程序能调用另一种编程语言写的函数(routines)。 调用约定,类型表示和名称修饰这三者的统称,即是众所周知的应用二进制…...
vue实现把Ox格式颜色值转换成rgb渐变颜色值(开箱即用)
图示: 核心代码: //将0x格式的颜色转换为Hex格式,并计算插值返回rgb颜色 Vue.prototype.$convertToHex function (colorCode1, colorCode2, amount) {// 确保输入是字符串,并检查是否以0x开头let newCode1 let newCode2 if (t…...
Unity 窗口化设置
在Unity中要实现窗口化,具体设置如下: 在编辑器中,选择File -> Build Settings。在Player Settings中,找到Resolution and Presentation部分。取消勾选"Fullscreen Mode",并选择"Windowed"。设…...
Android14之深入理解sp模板类(二百零二)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…...
.NET core 5.0 及以上的Windows Service开发
首先,一定要和.NET Framework区分开, 详细请看微软的2023年的最新官方文档 Create Windows Service using BackgroundService - .NET | Microsoft Learn Create a Windows Service installer - .NET | Microsoft Learn 同样微软的官方微博给出了开发…...
Nginx配置文件解释
Nginx可以作为静态页面的web服务器,同时还支持CGI协议的动态语言,比如perl、php等。但是不支持java。Java程序只能通过与tomcat配合完成。Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的考验,…...
R语言赋值符号<-、=、->、<<-、->>的使用与区别
R语言的赋值符号有<-、、->、<<-、->>六种,它们的使用与区别如下: <-’:最常用的赋值符号。它将右侧表达式的值赋给左侧的变量,像一个向左的箭头。例如,x …...
ffmpeg重点之时间戳,PTS、DTS、time_base
PTS和DTS和时间基time_base 首先我们知道PTS是一帧音频或视频显示的时间,DTS是解码时间戳 既然是时间,PST和DTS的单位是什么呢?秒还是毫秒,抑或是纳秒? 先说结论—都不是 先引入FFmpeg中时间基的概念,也就是time_bas…...
OpenGL 实现“人像背景虚化“效果
手机上的人像模式,也被人们称作“背景虚化”或 ”双摄虚化“ 模式,也称为 Bokeh 模式,能够在保持画面中指定的人或物体清晰的同时,将其他的背景模糊掉。突出画面的主体部分,主观上美感更强烈。 人像模式的一般实现原理是,利用双摄系统获取景深信息,并通过深度传感器和图…...
基于springboot实现校园周边美食探索及分享平台系统项目【项目源码+论文说明】计算机毕业设计
基于springboot实现园周边美食探索及分享平台系统演示 摘要 美食一直是与人们日常生活息息相关的产业。传统的电话订餐或者到店消费已经不能适应市场发展的需求。随着网络的迅速崛起,互联网日益成为提供信息的最佳俱渠道和逐步走向传统的流通领域,传统的…...
AUTOSAR关于内存栈的分层及描述
首先关于关于内存栈的分层:如下图所示,Nvm靠近RTE的;MemIf居中,EA和FEE被包含其中。 其次关于这三层的缩写:可以看到EEPROM的模拟和EEPROM的抽象层。 我们可以看到 大概的数据流: 和大致的结构分层作用&am…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
Vue3中的computer和watch
computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...
