微服务API网关Spring Cloud Gateway实战

概述

  • 微服务网关是为了给不同的微服务提供统一的前置功能;
  • 网关服务可以配置集群,以承载更多的流量;
  • 负载均衡与网关互相成就,一般使用负载均衡(例如 nginx)作为总入口,然后将流量分发到多个网关实现复杂功能;
  • 网关核心组件包括路由(分组)、断言(匹配路径)、过滤器(处理逻辑);

什么是微服务网关

在微服务架构中,通常一个系统会被拆分为多个微服务,面对这么多微服务客户端应该如何去调用呢?如果根据每个微服务的地址发起调用,存在如下问题:

  • 客户端多次请求不同的微服务,会增加客户端代码和配置的复杂性,维护成本比价高
  • 认证复杂,每个微服务可能存在不同的认证方式,客户端去调用,要去适配不同的认证
  • 存在跨域的请求,调用链有一定的相对复杂性(防火墙 / 浏览器不友好的协议)
  • 难以重构,随着项目的迭代,可能需要重新划分微服务

为了解决上面的问题,微服务引入了 API 网关的概念,API 网关为微服务架构的系统提供简单、有效且统一的 API 路由管理,作为系统的统一入口,提供内部服务的路由中转,给客户端提供统一的服务,可以实现一些和业务没有耦合的公用逻辑,主要功能包含认证、鉴权、路由转发、安全策略、防刷、流量控制、监控日志等。
image.png

什么是 Spring Cloud Gateway

官网文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/

Spring Cloud Gateway 是 Spring Cloud 官方推出的第二代网关框架,定位于取代 Netflix Zuul。Spring Cloud Gateway 旨在为微服务架构提供一种简单且有效的 API 路由的管理方式,并基于 Filter 的方式提供网关的基本功能,例如说安全认证、监控、限流等等。
Spring Cloud Gateway 是由 WebFlux + Netty + Reactor 实现的响应式的 API 网关。它不能在传统的 servlet 容器中工作,也不能构建成 war 包。

网关组件对比:
image.png

核心概念

  • 路由(route)

路由是网关中最基础的部分,路由信息包括一个ID、一个目的URI、一组断言工厂、一组Filter组成。

  • 断言(predicates))

Java8 中的断言函数,SpringCloud Gateway 中的断言函数类型是 Spring5.0 框架中的 ServerWebExchange。断言函数允许开发者去定义匹配 Http request 中的任何信息,比如请求头和参数等。如果断言为真,则说明请求的 URL 和配置的路由匹配。

  • 过滤器(Filter)

SpringCloud Gateway 中的 filter 分为 Gateway FilIer 和 Global Filter。Filter 可以对请求和响应进行处理。

工作原理

Spring Cloud Gateway 的工作原理跟 Zuul 的差不多,最大的区别就是 Gateway 的 Filter 只有 pre 和 post 两种。

官网图示:
image.png
客户端向 Spring Cloud Gateway 发出请求,如果请求与网关程序定义的路由匹配,则该请求就会被发送到网关 Web 处理程序,此时处理程序运行特定的请求过滤器链。
过滤器之间用虚线分开的原因是过滤器可能会在发送代理请求的前后执行逻辑。所有 pre 过滤器逻辑先执行,然后执行代理请求。代理请求完成后,执行 post 过滤器逻辑。

Spring Cloud Gateway 实战

微服务快速接入 Spring Cloud Gateway

1)引入依赖

<!-- gateway网关 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency><!-- nacos服务注册与发现 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>

注意:gateway 会和 spring-webmvc 的依赖冲突,需要排除 spring-webmvc。

2)编写 yml 配置文件

spring:application:name: gateway-service# 配置nacos注册中心地址cloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:# 设置路由:路由id、路由到微服务的uri、断言routes:- id: order_route  # 路由ID,全局唯一,建议配置服务名uri: lb://order-service  # lb 整合负载均衡器loadbalancerpredicates:- Path=/order/**   # 断言,路径相匹配的进行路由- id: user_route   # 路由ID,全局唯一,建议配置服务名uri: lb://user-service  # lb 整合负载均衡器loadbalancerpredicates:- Path=/user/**   # 断言,路径相匹配的进行路由

3)测试
[http://localhost:8888/order/findOrderByUserId/1](http://localhost:8888/order/findOrderByUserId/1)

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

predicates:路由断言,判断请求是否符合要求,符合则转发到路由目的地。application.yml 配置文件中写的断言规则只是字符串,这些字符串会被 Predicate Factory 读取并处理,转变为路由判断的条件。

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

通过网关启动日志,可以查看内置路由断言工厂:
image.png

路径匹配

spring:cloud:gateway:# 设置路由:路由id、路由到微服务的uri、断言routes:- id: order_route # 路由ID,全局唯一uri: lb://order-service # 目标微服务的请求地址和端口predicates:# 测试:http://localhost:8080/order/findOrderByUserId/1- Path=/order/** # 断言,路径相匹配的进行路由

Header 匹配

spring:cloud:gateway:# 设置路由:路由id、路由到微服务的uri、断言routes:- id: order_route  # 路由ID,全局唯一uri: lb://order-service  # 目标微服务的请求地址和端口predicates:- Path=/order/**   # 断言,路径相匹配的进行路由# Header匹配 请求中带有请求头名为 X-Request-Id,其值与 \d+ 正则表达式匹配- Header=X-Request-Id, \d+

例如:
image.png

过滤器工厂( GatewayFilter Factories)配置

GatewayFilter 是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理。

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

图示说明:
image.png

添加请求头

需求:给所有进入 order-service 的请求添加一个请求头:X-Request-color=red。

只需要修改 gateway 服务的 application.yml 文件,添加路由过滤即可:

spring:cloud:gateway:# 设置路由:路由id、路由到微服务的uri、断言routes:- id: order_route  # 路由ID,全局唯一uri: http://localhost:8020  # 目标微服务的请求地址和端口# 配置过滤器工厂filters:- AddRequestHeader=X-Request-color, red  # 添加请求头

测试代码:

@GetMapping("/testgateway")
public String testGateway(HttpServletRequest request) throws Exception {log.info("gateWay获取请求头X-Request-color:"+request.getHeader("X-Request-color"));return "success";
}
@GetMapping("/testgateway2")
public String testGateway(@RequestHeader("X-Request-color") String color) throws Exception {log.info("gateWay获取请求头X-Request-color:"+color);return "success";
}
// gateWay获取请求头X-Request-color:red
// gateWay获取请求头X-Request-color:red

添加请求参数

spring:cloud:gateway:# 设置路由:路由id、路由到微服务的uri、断言routes:- id: order_route  # 路由ID,全局唯一uri: http://localhost:8020  # 目标微服务的请求地址和端口# 配置过滤器工厂filters:- AddRequestParameter=color, blue  # 添加请求参数

测试代码:

@GetMapping("/testgateway3")
public String testGateway3(@RequestParam("color") String color) throws Exception {log.info("gateWay获取请求参数color:"+color);return "success";
}
// gateWay获取请求参数color:blue

自定义过滤器工厂

继承 AbstractNameValueGatewayFilterFactory 且我们的自定义名称必须要以 GatewayFilterFactory 结尾并交给 spring 管理。

@Component
@Slf4j
public class CheckAuthGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {@Overridepublic GatewayFilter apply(NameValueConfig config) {return (exchange, chain) -> {log.info("调用CheckAuthGatewayFilterFactory==="+ config.getName() + ":" + config.getValue());return chain.filter(exchange);};}
}

配置自定义的过滤器工厂:

spring:cloud:gateway:# 设置路由:路由id、路由到微服务的uri、断言routes:- id: order_route  # 路由ID,全局唯一uri: http://localhost:8020  # 目标微服务的请求地址和端口# 配置过滤器工厂filters:- CheckAuth=fox,男   # 自定义过滤器工厂

全局过滤器(Global Filters)配置

全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与 GatewayFilter 的作用一样。

  • GatewayFilter:网关过滤器,需要通过spring.cloud.routes.filters配置在具体的路由下,只作用在当前特定路由上,也可以通过配置spring.cloud.default-filters让它作用于全局路由上。
  • GlobalFilter:全局过滤器,不需要在配置文件中配置,作用在所有的路由上,最终通过GatewayFilterAdapter 包装成 GatewayFilterChain 能够识别的过滤器。

官方文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#global-filters

图示说明:
image.png

ReactiveLoadBalancerClientFilter

ReactiveLoadBalancerClientFilter 会查看 exchange 的属性ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR的值(一个URI,比如lb://order-service/order/testgateway2?color=blue),如果该值的 scheme 是 lb,比如:lb://myservice ,它将会使用 Spring Cloud 的 LoadBalancerClient 来将 myservice 解析成实际的 host 和 port。
其实就是用来整合负载均衡器 loadbalancer 的。

spring:cloud:gateway:routes:- id: order_routeuri: lb://order-servicepredicates:- Path=/order/**

自定义全局过滤器

自定义全局过滤器定义方式是实现 GlobalFilter 接口。每一个过滤器都必须指定一个 int 类型的 order 值,order 值越小,过滤器优先级越高,执行顺序越靠前。GlobalFilter 通过实现 Ordered 接口来指定 order 值。
示例代码:

@Component
@Slf4j
public class CheckAuthFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 获取tokenString token = exchange.getRequest().getHeaders().getFirst("token");if (null == token) {log.info("token is null");ServerHttpResponse response = exchange.getResponse();response.getHeaders().add("Content-Type","application/json;charset=UTF-8");// 401 用户没有访问权限response.setStatusCode(HttpStatus.UNAUTHORIZED);byte[] bytes = HttpStatus.UNAUTHORIZED.getReasonPhrase().getBytes();DataBuffer buffer = response.bufferFactory().wrap(bytes);// 请求结束,不继续向下请求return response.writeWith(Mono.just(buffer));}// TODO 校验token进行身份认证log.info("校验token");return chain.filter(exchange);}@Overridepublic int getOrder() {return 2;}
}

Gateway 跨域资源共享配置(CORS Configuration)

在前端领域中,跨域是指浏览器允许向服务器发送跨域请求,从而克服 Ajax 只能同源使用的限制。
同源策略(Same Orgin Policy)是一种约定,它是浏览器核心也最基本的安全功能,它会阻止一个域的 js 脚本和另外一个域的内容进行交互,如果缺少了同源策略,浏览器很容易受到 XSS、CSRF 等攻击。所谓同源(即在同一个域)就是两个页面具有相同的协议(protocol)、主机(host)和端口号(port)。

CORS: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS

如何解决gateway跨域问题?

(1)通过yml配置的方式

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

spring:cloud:gateway:globalcors:cors-configurations:'[/**]':allowedOrigins: "*"allowedMethods:- GET- POST- DELETE- PUT- OPTION

(2)通过java配置的方式

@Configuration
public class CorsConfig {@Beanpublic CorsWebFilter corsFilter() {CorsConfiguration config = new CorsConfiguration();config.addAllowedMethod("*");config.addAllowedOrigin("*");config.addAllowedHeader("*");UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());source.registerCorsConfiguration("/**", config);return new CorsWebFilter(source);}
}

Gateway 基于 redis+lua 脚本限流

spring cloud 官方提供了 RequestRateLimiter 过滤器工厂,基于 redis+lua 脚本方式采用令牌桶算法实现了限流。

官方说明:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-requestratelimiter-gatewayfilter-factory

请求不被允许时返回状态:HTTP 429 - Too Many Requests

实操:
1)添加依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>

2)修改 application.yml ,添加 redis 配置和 RequestRateLimiter 过滤器工厂配置

spring:application:name: gateway-servicedata:# 配置redis地址redis:host: localhostport: 6379database: 0timeout: 5000lettuce:pool:max-active: 200max-wait: 10000max-idle: 100min-idle: 10# 配置nacos注册中心地址cloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:# 设置路由:路由id、路由到微服务的uri、断言routes:- id: order_route  # 路由ID,全局唯一,建议配置服务名# 测试 http://localhost:8888/order/findOrderByUserId/1uri: lb://order-service  # lb 整合负载均衡器ribbon,loadbalancerpredicates:- Path=/order/**   # 断言,路径相匹配的进行路由# 配置过滤器工厂filters:- name: RequestRateLimiter   # 限流过滤器args:redis-rate-limiter.replenishRate: 1 # 令牌桶每秒填充速率redis-rate-limiter.burstCapacity: 2 # 令牌桶的总容量key-resolver: "#{@keyResolver}" # 使用SpEL表达式,从Spring容器中获取Bean对象 

3)配置 keyResolver,可以指定限流策略,比如 url 限流,参数限流,ip 限流等等

@Bean
KeyResolver keyResolver() {// url限流return exchange -> Mono.just(exchange.getRequest().getURI().getPath());// 参数限流// return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));
}

Gateway 整合 sentinel 限流

从 1.6.0 版本开始,Sentinel 提供了 Spring Cloud Gateway 的适配模块,可以提供两种资源维度的限流:

  • route 维度:即在 Spring 配置文件中配置的路由条目,资源名为对应的 routeId
  • 自定义 API 维度:用户可以利用 Sentinel 提供的 API 来自定义一些 API 分组

sentinel网关流控:https://sentinelguard.io/zh-cn/docs/api-gateway-flow-control.html

Gateway 整合 sentinel 实现网关限流

1)引入依赖

<!-- gateway接入sentinel  -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2)添加 yml 配置,接入 sentinel dashboard,通过 sentinel 控制台配置网关流控规则

server:port: 8888
spring:application:name: gateway-sentinel-demomain:allow-bean-definition-overriding: true# 配置nacos注册中心地址cloud:nacos:discovery:server-addr: 127.0.0.1:8848sentinel:transport:# 添加sentinel的控制台地址dashboard: 127.0.0.1:8080gateway:# 设置路由:路由id、路由到微服务的uri、断言routes:- id: order_route  # 路由ID,全局唯一,建议配合服务名uri: lb://order-service  # lb 整合负载均衡器loadbalancerpredicates:- Path=/order/**- id: user_routeuri: lb://user-service  #lb 整合负载均衡器loadbalancerpredicates:- Path=/user/**

注意:基于 SpringBoot3 的 Spring Cloud Gateway 和 Sentinel 还存在兼容性问题,等待 Sentinel 官方对最新的 Gateway 适配包更新。

Sentinel 网关流控实现原理

当通过 GatewayRuleManager 加载网关流控规则(GatewayFlowRule)时,无论是否针对请求属性进行限流,Sentinel 底层都会将网关流控规则转化为热点参数规则(ParamFlowRule),存储在 GatewayRuleManager 中,与正常的热点参数规则相隔离。转换时 Sentinel 会根据请求属性配置,为网关流控规则设置参数索引(idx),并同步到生成的热点参数规则中。
外部请求进入 API Gateway 时会经过 Sentinel 实现的 filter,其中会依次进行路由/API分组匹配、请求属性解析和参数组装。Sentinel 会根据配置的网关流控规则来解析请求属性,并依照参数索引顺序组装参数数组,最终传入SphU.entry(res, args) 中。Sentinel API Gateway Adapter Common 模块向 Slot Chain 中添加了一个 GatewayFlowSlot,专门用来做网关规则的检查。GatewayFlowSlot 会从 GatewayRuleManager 中提取生成的热点参数规则,根据传入的参数依次进行规则检查。若某条规则不针对请求属性,则会在参数最后一个位置置入预设的常量,达到普通流控的效果。
图示:
image.png

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

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

相关文章

mybatis参数输入 #{}和${}

1、建库建表 CREATE DATABASE mybatis-example;USE mybatis-example;CREATE TABLE t_emp(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id) );INSERT INTO t_emp(emp_name,emp_salary) VALUES("tom",200.33); INSERT INTO…

Unity中Shader编译目标渲染器

文章目录 前言一、Unity在打包时&#xff0c;会把Shader编译成不同平台对应的代码我们在状态栏&#xff0c;可以看见我们目前所处于的目标平台 二、在Unity中&#xff0c;怎么指定目标平台1、#pragma only_renderers2、#pragma exclude_renderers 三、我们测试一下看看效果1、 …

C语言重点突破(六)文件操作

本章重点 1. 为什么使用文件 2. 什么是文件 3. 文件的打开和关闭 4. 文件的顺序读写 5. 文件的随机读写 6. 文本文件和二进制文件 7. 文件读取结束的判定 8. 文件缓冲区 1. 为什么使用文件 我们在前面的文章介绍了通讯录的程序&#xff0c;当通讯录运行起来的时候&#xff0c…

ubuntu终端代理配置

ubuntu浏览器的无需手动设置,主要解决在终端中的配置问题,按照下面配置后可能会ping不通一些ip,但wget/git都是可以的,具体原因以后再分析 查找端口 首先要找到自己代理对应的HTTP端口,以QV2ray软件作为示例,我为8889 手动配置 # 配置系统proxy export http_proxy=1…

Java Swing管理系统万能模板 课程设计素材

JavaSwing管理系统万能模板 视频教程&#xff1a; 【课程设计】2小时学会JavaSwing课程设计-万能模板-图书管理系统-[你的课程我设计] 万能模板是用Java Swing开发的&#xff0c;包含管理系统常用的多角色登录、数据查询、添加、修改、删除。常用的管理系统都可以使用万能模板…

MySQL与其他数据库产品的比较,优势在哪里?

作为数据库管理领域的博主作家&#xff0c;我深知数据库在软件开发和数据管理中的重要性。在当今众多的数据库产品中&#xff0c;MySQL作为一种流行的开源关系型数据库管理系统&#xff0c;具有许多优势和特点。下面&#xff0c;我将通过对与其他数据库产品的比较以及MySQL的优…

原来字节跳动这么容易就能进····

“字节是大企业&#xff0c;是不是很难进去啊&#xff1f;” “在字节做软件测试&#xff0c;能得到很好的发展吗&#xff1f; 一进去就有12.5K&#xff0c;其实也没有想的那么难” 直到现在&#xff0c;心情都还是无比激动&#xff01; 本人211非科班&#xff0c;之前在字节…

CHEM 14 not know

Goals of this lab: • Create and use a calibration curve for the absorbance/concentration relationship for crystal violet • Evaluate absorbance versus time measurements to determine the order of a reaction • Analyze graphs of data to determine best linea…

TiDB专题---1、TiDB简介和特性

什么是TiDB TiDB 是一个分布式 NewSQL 数据库&#xff0c;它支持水平弹性扩展、ACID 事务、标准 SQL、MySQL 语法和 MySQL 协议&#xff0c;具有数据强一致的高可用特性&#xff0c;是一个不仅适合 OLTP 场景还适合 OLAP 场景的混合数据库。 TiDB 是 PingCAP 公司自主设计、研发…

土壤养分分析仪:精准农业,从“土”开始

在农业生产中&#xff0c;土壤的质量是决定农作物产量和品质的关键因素。然而&#xff0c;传统的土壤检测方法耗时费力&#xff0c;且结果往往不够准确。随着科技的发展&#xff0c;土壤养分分析仪为现代农业带来了新的可能。 土壤养分分析仪是一种专门用于测量土壤中各种养分含…

C++和Python混合编程在数据采集程序中的应用

目录 一、引言 二、C和Python的特性及其在数据采集程序中的应用 1、C的特性及其在数据采集程序中的应用 2、Python的特性及其在数据采集程序中的应用 三、C和Python混合编程在数据采集程序中的实现方法 四、混合编程的优缺点以及未来发展趋势 五、代码示例 六、结论 一…

c语言通过前序遍历构建二叉树

前言&#xff1a; 在链式二叉树中&#xff0c;我们一般都是通过一个建立好的二叉树从而算出他的前序遍历&#xff0c;那么如何通过一个前序遍历来创建一个二叉树呢&#xff0c;本文将详细解读前序遍历每一个步骤是如何创建二叉树的。 1、分析前序遍历&#xff0c;构建出二叉树…

智慧垃圾分拣站:科技改变城市环境,创造更美好的未来

随着城市化进程的不断加快&#xff0c;垃圾处理问题日益凸显。为了更好地解决垃圾分类问题&#xff0c;越来越多的城市开始推广智慧垃圾分拣站&#xff0c;利用创新科技实现高效垃圾分类处理。 山海鲸使用三维建模技术&#xff0c;建立了一个智慧垃圾分拣站数字孪生模型&#x…

外包干了5个月,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

每天一点python——day81

#每天一点Python——81 #递归函数&#xff1a; 递归函数&#xff1a; 一个函数在该函数体内调用了该函数本身&#xff0c;这个函数称为递归函数 【释&#xff1a;我自己调用自己的函数】 递归函数的组成部分&#xff1a; 递归调用与递归终止条件。 【一定有一个跳出循环的终止条…

解决WPS拖动整行的操作

如上图&#xff0c;想要把第4行的整行内容&#xff0c;平移到第1行。 1.选中第4行的整行 2.鼠标出现如图的样子时&#xff0c;按住鼠标左键&#xff0c;上移到第1行位置后&#xff0c;放开左键即可。

计算机网络:应用层(上篇)

文章目录 前言一、应用层协议原理1.网络应用的体系结构2.进程通信 二、Web与HTTP1.HTTP概况2.HTTP连接3.HTTP请求报文4.用户-服务器状态&#xff1a;cookies5.Web缓存&#xff08;代理服务器&#xff09; 三、FTP&#xff1a;文件传输协议1.FTP&#xff1a;控制连接与数据连接分…

watch监听中重复触发如何解决?

在实际开发工程中通过获取后端数据监听判断数组中长度是否大于0从而调用其他的方法&#xff0c;但是如果data域中的数据出现变化的话&#xff0c;就会导致监听中的方法重复调用&#xff0c;导致一些不必要的bug&#xff0c;例如&#xff1a; 原理&#xff1a; watch监听的数据…

Diffusion:通过扩散和逆扩散过程生成图像的生成式模型

在当今人工智能大火的时代&#xff0c;AIGC 可以帮助用户完成各种任务。作为 AIGC 主流模型的 DDPM&#xff0c;也时常在各种论文中被提起。DDPM 本质就是一种扩散模型&#xff0c;可以用来生成图片或者为图片去噪。 扩散模型定义了一个扩散的马尔科夫过程&#xff0c;每一步逐…

视频监控平台EasyCVR多场景应用,AI视频分析技术助力行业升级转型

传统的视频监控系统建设&#xff0c;经常存在各方面的因素制约&#xff0c;造成管理机制不健全、统筹规划不到位、联网共享不规范&#xff0c;形成“信息孤岛”、“数据烟囱”。在监控系统的建设中缺乏统一规划&#xff0c;标准不统一、视频图像信息利用率低等问题日益突出。随…