(十一)springboot实战——springboot3下关于WebFlux项目的一些常用功能整合

前言

本节内容主要是对webflux项目一些常用功能的介绍,例如系统集成swagger接口文档,方便接口测试以及前后端项目联调测试;使用actuator完成系统各种指标的监控功能;系统使用logback日志框架完成项目日志的收集;使用过滤器WebFilter完成一些初始化验证;使用CorsWebFilter解决系统的跨域问题;使用AOP切面实现功能方法操作日志的打印等。

正文

swagger接口文档集成

①引入webflux的springdoc文档的pom依赖

<!-- https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-webflux-ui -->
<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webflux-ui</artifactId><version>2.3.0</version>
</dependency>

②在资源文件application.yaml中配置接口文档访问地址,并开启接口文档访问权限enabled: true,生产环境可以关闭

springdoc:api-docs:enabled: truepath: /api-docsswagger-ui:enabled: truepath: /swagger-ui/index.htmlshow-actuator: true

③访问swagger文档地址,查看集成效果

④更高级的用法, 通过配置GroupedOpenApi分组,定义不同的分组匹配规则,配置更细粒度的接口分组文档

package com.yundi.atp.config;import io.swagger.v3.oas.models.ExternalDocumentation;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class SpringDocConfig {@Beanpublic GroupedOpenApi sysOpenApi() {return GroupedOpenApi.builder().group("SpringWebflux-系统管理").pathsToMatch("/user/**", "/role/**").build();}@Beanpublic GroupedOpenApi actuatorOpenApi() {return GroupedOpenApi.builder().group("SpringWebflux-系统监控").pathsToMatch("/actuator/**").build();}@Beanpublic OpenAPI springDocOpenAPI() {return new OpenAPI().info(new Info().title("SpringWebflux API").description("SpringWebflux 案例").version("v1.0.0").license(new License().name("Apache 2.0").url("http://springdoc.org"))).externalDocs(new ExternalDocumentation().description("SpringWebflux Wiki Documentation").url("https://springshop.wiki.github.org/docs"));}}

⑤接口文档分组效果,可根据Select a definition切换到不同的文档分组下

actuator监控配置

①引入actuator监控启动器的pom依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

②在资源配置文件application.yaml中配置actuator监控的web访问

management:endpoints:enabled-by-default: true #暴露所有端点信息web:exposure:include: '*'  #以web方式暴露

③通过swagger接口文档,查看actuator监控的web指标接口

logback日志配置

①在resources资源目录下创建一个logback.xml日志文件,定义日志文件的打印格式及规则等

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false"><!--设置存储路径变量--><property name="LOG_HOME" value="ht-webflux"/><!--控制台输出appender--><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><!--设置输出格式--><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%msg:日志消息,%n是换行符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern><!--设置编码--><charset>UTF-8</charset></encoder></appender><!--文件输出,时间窗口滚动--><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!--日志名,指定最新的文件名,其他文件名使用FileNamePattern --><File>${LOG_HOME}/ht.log</File><!--文件滚动模式--><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!--日志文件输出的文件名,可设置文件类型为gz,开启文件压缩--><FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}_%i.log</FileNamePattern><!--日志文件保留天数--><MaxHistory>30</MaxHistory><!--按大小分割同一天的--><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>20MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><!--输出格式--><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern><!--设置编码--><charset>UTF-8</charset></encoder></appender><!--根据环境配置日志--><springProfile name="dev"><!-- 打印 日志级别 --><root level="INFO"><appender-ref ref="CONSOLE"/><appender-ref ref="FILE"/><!--            <appender-ref ref="LOGSTASH"/>--></root></springProfile><springProfile name="test"><!-- 打印 日志级别 --><root level="INFO"><appender-ref ref="CONSOLE"/><appender-ref ref="FILE"/></root></springProfile><springProfile name="prod"><!--指定基础的日志输出级别--><root level="INFO"><!--appender将会添加到这个logger--><appender-ref ref="CONSOLE"/><appender-ref ref="FILE"/>
<!--            <appender-ref ref="LOGSTASH"/>--></root></springProfile>
</configuration>

②启动项目,查看日志输出

过滤器WebFilter整合

①通过实现WebFilter接口,定义一个自定义的web过滤器MyWebFilter,并加入spring容器中

package com.yundi.atp.filter;import lombok.extern.slf4j.Slf4j;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;@Component
@Slf4j
public class MyWebFilter implements WebFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {//可以获取请求域ServerHttpRequest request = exchange.getRequest();log.info("url:", request.getURI());//可以获取响应域ServerHttpResponse response = exchange.getResponse();log.info("--------------请求处理放行到目标方法之前的过滤器业务处理------------");Mono<Void> filter = chain.filter(exchange);//流一旦经过某个操作就会变成新流Mono<Void> mono = filter.doOnError(error -> {log.info("---------------目标方法异常以后--------------");log.info("error:" + error);}).doFinally(signalType -> {log.info("---------------目标方法执行完成以后--------------");});return mono;}
}

②访问任意一个接口,查看web过滤器是否生效

CorsWebFilter跨域配置

①配置CorsWebFilter过滤器,解决接口请求跨域问题

package com.yundi.atp.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;@Configuration
public class MyCorsConfig {@Beanpublic CorsWebFilter corsWebFilter() {CorsConfiguration corsConfig = new CorsConfiguration();// 允许所有来源corsConfig.addAllowedOrigin("*");// 允许所有HTTP方法corsConfig.addAllowedMethod("*");// 允许所有请求头corsConfig.addAllowedHeader("*");UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", corsConfig);return new CorsWebFilter(source);}
}

②查看浏览器响应头中是否包含跨域配置

 

AOP切面

①创建一个操作日志的OperateLogAspect切面,记录请求方法执行过程日志

package com.yundi.atp.aop;import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;@Slf4j
@Aspect
@Component
public class OperateLogAspect {/*** 切点*/@Pointcut("execution(* com.yundi.atp.controller.*.*(..))")public void logPointCut() {}@Around("logPointCut()")public Mono<Object> aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {// 在方法执行前的逻辑log.info("************************目标方法执行前************************");log.info("args:{}",joinPoint.getArgs());// 执行被切入的方法Mono<Object> result = (Mono<Object>) joinPoint.proceed();// 在方法执行后的逻辑Mono<Object> mono = result.doOnError(error -> {log.info("************************目标方法异常以后************************");log.info("error:" + error);}).doFinally(signalType -> {log.info("************************目标方法执行完成以后************************");});return mono;}
}

② 访问接口,验证操作日志切面是否生效

结语

关于springboot3下WebFlux项目的一些常用功能整合的内容到这里就结束了,我们下期见。。。。。。

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

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

相关文章

【python】在python中使用单元测试unittest

在python中使用单元测试unittest 大家好&#xff0c;欢迎来到我的技术乐园&#xff01;今天&#xff0c;我们将一起踏入Python单元测试的奇妙旅程&#xff0c;探索这个让我们的代码更可靠、更强壮的令人愉快的世界。 前言&#xff1a;为什么单元测试如此重要&#xff1f; 在我…

互联网加竞赛 基于深度学习的人脸表情识别

文章目录 0 前言1 技术介绍1.1 技术概括1.2 目前表情识别实现技术 2 实现效果3 深度学习表情识别实现过程3.1 网络架构3.2 数据3.3 实现流程3.4 部分实现代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的人脸表情识别 该项目较…

StarRocks -- 基础概念(数据模型及分区分桶)

1. 数据模型 StarRocks提供四种数据模型&#xff1a; Duplicate Key, Aggregate Key, Unique Key, Primary Key 1.1 Duplicate Key 适用场景&#xff1a; 分析原始数据&#xff0c;如原始日志和原始操作记录。可以使用多种方法查询数据&#xff0c;不受预聚合方法的限制。加…

阿里十年 “帕鲁” 手把手带你 学习 ThreadLocal

阿里十年 “帕鲁” 手把手带你 学习 ThreadLocal 文章目录 阿里十年 “帕鲁” 手把手带你 学习 ThreadLocal前言目录ThreadLocal代码演示ThreadLocal的数据结构GC 之后 key 是否为 null&#xff1f;ThreadLocal.set()方法源码详解ThreadLocalMap Hash 算法ThreadLocalMap Hash …

Docker的使用方式

一、Docker概念 Docker类似于一个轻量的虚拟机。 容器和镜像是Docker中最重要的两个概念&#xff0c;镜像可以保存为tar文件&#xff0c;Dockerfile是配置文件&#xff0c;仓库保存了很多第三方已经做好的镜像。 基本指令 查找镜像 docker search nginx 拉取nginx镜像 do…

亚信安慧AntDB:AntDB-M元数据锁(十)

5.8 锁等待及通知 每个线程的锁上下文都有一个条件变量来进行锁等待。线程在没有获取锁的授权时&#xff0c;会将自己的ticket添加到锁对象的等待队列&#xff0c;并进入等待状态。等待队列的锁授予检测有3个时机&#xff1a; 1&#xff09;加锁申请阶段&#xff0c;hog,pigl…

海外云手机开辟企业跨境电商新道路

近几年&#xff0c;海外云手机为跨境电商、海外媒体引流、游戏行业等互联网领域注入了蓬勃活力。对于国内跨境电商而言&#xff0c;在亚马逊及其他平台上&#xff0c;短视频引流和社交电商营销成为最为有效的流量来源。如何通过海外云手机的助力&#xff0c;在新兴社交平台为企…

【WPF.NET开发】优化性能:图形呈现层

本文内容 图形硬件呈现层定义其他资源 呈现层为运行 WPF 应用程序的设备定义图形硬件功能和性能级别。 1、图形硬件 对呈现层级别影响最大的图形硬件功能包括&#xff1a; 视频 RAM - 图形硬件中的视频内存量决定了可用于合成图形的缓冲区大小和数量。 像素着色器 - 像素着…

数据结构—栈实现前缀表达式的计算

前缀表达式计算 过程分析 中缀表达式&#xff1a;&#xff08;1 5&#xff09;*3 > 前缀表达式&#xff1a;*153 &#xff08;可参考这篇文章&#xff1a;中缀转前缀&#xff09; 第一步&#xff1a;从右至左扫描前缀表达式&#xff08;已存放在字符数组中&#xff09;&a…

华为VRP系统简介

因为现在国内主流是华为、华三、锐捷的设备趋势&#xff0c;然后考的证书也是相关的&#xff0c;对于华为设备的一个了解也是需要的。 一、VRP概述 华为的VRP(通用路由平台)是华为公司数据通信产品的通用操作系统平台&#xff0c;作为华为公司从低端到核心的全系列路由器、以太…

《Lua程序设计》-- 学习9

迭代器和泛型for 迭代器和闭包 迭代器&#xff08;iterator&#xff09;是一种可以让我们遍历一个集合中所有元素的代码结构。在Lua语言中&#xff0c;通常使用函数表示迭代器&#xff1a;每一次调用函数时&#xff0c;函数会返回集合中的“下一个”元素。 一个闭包就是一个…

App全测试扫描漏洞工具

APP 有漏洞被测要下架&#xff0c;怎么处理&#xff1f; 如题&#xff0c;今天被问到&#xff1a;市面上有什么好的 APP 漏洞扫描工具推荐&#xff1f;我们的 APP 有漏洞&#xff0c;需要下架 APP&#xff1f; 前言 事情的经过是这样的&#xff1a; 1&#xff1a;学员公司测试…