(十一)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.mzph.cn/news/663704.shtml

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

相关文章

CSS 外边距合并、塌陷和BFC

外边距合并 CSS中的外边距合并指的是当两个相邻元素都设置了上下外边距时&#xff0c;它们之间会发生重叠。这种现象被称为"margin collapsing"&#xff08;外边距合并&#xff09;或者"margin collapse"&#xff08;外边距塌陷&#xff09;。 可以看出上…

LeetCode--171

171. Excel 表列序号 给你一个字符串 columnTitle &#xff0c;表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。 例如&#xff1a; A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ... 示例 1: 输入: columnTitle "A" 输出:…

vue3-逻辑复用

什么是组合式函数 _无状态逻辑的函数_&#xff1a;它在接收一些输入后立刻返回所期望的输出。 比如 时间格式化的函数。 有状态逻辑的函数: 有状态逻辑负责管理会随时间而变化的状态。 比如 跟踪当前鼠标在页面中的位置。 在 Vue 应用的概念中&#xff0c;“组合式函数”(…

if分支语句和switch分支语句的异同之处(企业面试题)

解答 if-else语句优势 if语句的条件是一个布尔类型值&#xff0c;if条件表达式为true则进入分支&#xff0c;可以用于范围的判断&#xff0c;也可以用于等值的判断&#xff0c;使用范围更广。switch语句的条件是一个常量值&#xff08;byte,short,int,char,枚举,String&#x…

【蓝桥备赛】优先队列

优先队列 队列是基于数组或者链表来实现的&#xff0c;是线性的结构&#xff1b;队列的特点是先进先出。 优先队列是一种特殊类型的队列&#xff0c;其中元素被赋予优先级&#xff0c;具有较高优先级的元素先被处理。 在竞赛中经常会遇到优先队列的思想 基本语法 基本语法…

前端换肤的五种思路和优缺点

一、什么是前端换肤 前端换肤是指在前端开发中&#xff0c;通过改变网页的样式来实现不同的主题或皮肤效果。通过换肤&#xff0c;可以改变网页的颜色、字体、背景等样式&#xff0c;以适应不同的用户喜好或实现特定的设计需求。 静态换肤&#xff1a; 是指在网页加载时&…

MySQL数据存储

MySQL数据存储 Innodb存储引擎的数据存储&#xff0c;可以使用两种方式进行存储&#xff1a;系统表空间和独立表空间 -- ON表示使用的是独立表空间-- OFF表示使用的是系统表空间show variables like %innodb_file_per_table% 系统表空间(共享表空间) 在MySQL5.5之前默认使用的是…

python-自动化篇-运维-可视化-绘图库-matplotlib

文章目录 Matplotlibmatplotlib开发环境搭建绘制基础绘制直线绘制折线设置标签文字和线条粗细绘制一元二次方程的曲线yx^2绘制正弦曲线和余弦曲线散点图绘制柱状图绘制饼状图绘制直方图等高线图绘制三维图 Matplotlib Matplotlib 是一个Python的 2D绘图库。通过 Matplotlib&am…

leetcode 19 , 118

19 .删除链表倒数第n个节点 思路1&#xff1a; 我首先想到的就是使用两个loop来进行解决&#xff1a; 遍历所有节点&#xff0c;得到需要删除节点的位置。再遍历一边所有节点&#xff0c;找到需要删除节点进行删除。 解决方案1&#xff1a; class Solution {public ListNod…

Android开发Rsa的使用

前言 本篇文章主要讲解的有关Android开发中常用的Rsa的处理方式以及应用。 文章目录 前言[TOC](文章目录) 一、公私钥1.公钥加密(用于数据加密)2.私钥解密(用于数据解密)3.私钥加密(用于数据签名)4.公钥解密(用于数据验签) 二、生成密钥对1.生成密钥对2.RSA校验数字签名 总结 …

代码随想录算法训练营第二十四天|● 理论基础 ● 77. 组合

仅做学习笔记&#xff0c;详细请访问代码随想录 ● 理论基础 ● 77. 组合 ● 理论基础 回溯法解决的问题 回溯法&#xff0c;一般可以解决如下几种问题&#xff1a; 组合问题&#xff1a;N个数里面按一定规则找出k个数的集合 切割问题&#xff1a;一个字符串按一定规则有几…

项目中的空指针处理

NullPointerException 是 Java 代码中最常见的异常&#xff0c;我将其最可能出现的场景归为以下 5 种&#xff1a; • 参数值是 Integer 等包装类型&#xff0c;使用时因为自动拆箱出现了空指针异常&#xff1b; • 字符串比较出现空指针异常&#xff1b; • 诸如 ConcurrentHa…

新增模型检验,指标自动评估模型效果|ModelWhale 版本更新

二月将至&#xff0c;ModelWhale 迎来开年首次版本更新&#xff0c;期待为大家带来更优质的使用体验。 本次更新中&#xff0c;ModelWhale 主要进行了以下功能迭代&#xff1a; 新增 模型检验&#xff08;团队版✓&#xff09;优化 模型评审测试&#xff08;团队版✓&#xf…

如何在Shopee平台上进行手机类目选品?

在Shopee平台上进行手机类目的选品是一个关键而复杂的任务。卖家需要经过一系列的策略和步骤&#xff0c;以确保选品的成功和销售业绩的提升。下面将介绍一些有效的策略&#xff0c;帮助卖家在Shopee平台上进行手机类目选品。 先给大家推荐一款shopee知虾数据运营工具知虾免费…

c#的反汇编对抗

文章目录 前记nim攻防基础FFI内存加载加解密、编码 后记C#类型转换表nim基础 前记 随便编写一个c#调用winapi并用vs生成dll,同时用csc生成exe using System; using System.Runtime.InteropServices; namespace coleak {class winfun{[DllImport("User32.dll")]publ…

【算法】约数之和(数论)

题目 给定 n 个正整数 ai&#xff0c;请你输出这些数的乘积的约数之和&#xff0c;答案对 1097 取模。 输入格式 第一行包含整数 n。 接下来 n 行&#xff0c;每行包含一个整数 ai。 输出格式 输出一个整数&#xff0c;表示所给正整数的乘积的约数之和&#xff0c;答案需…

3593 蓝桥杯 查找最大元素 简单

3593 蓝桥杯 查找最大元素 简单 // C风格解法1&#xff0c;通过率100%&#xff0c;多组数据处理样式//str "abcdefgfedcba" //abcdefg(max)fedcba//str "xxxxx" //x(max)x(max)x(max)x(max)x(max)#include<bits/stdc.h>const int N 1e2 10;char …

android.MediaMuxer时间裁剪

使用MediaMuxer裁剪视频_安卓muxer 裁剪视频画布-CSDN博客 关键步骤 mediaExtractor.seekTo(beginTime, MediaExtractor.SEEK_TO_PREVIOUS_SYNC);long presentTimeUs mediaExtractor.getSampleTime(); if (presentTimeUs > endTime)break; 功能代码 VideoView videoVie…

【每日一题】石子游戏 VI

文章目录 Tag题目来源解题思路方法一&#xff1a;贪心排序 写在最后 Tag 【贪心排序】【数组】【2024-02-02】 题目来源 1686. 石子游戏 VI 解题思路 方法一&#xff1a;贪心排序 思路 假设有两个石子 i 和 j&#xff0c;Alice 和 Bob 认为它们的价值分别为 a i a_i ai​…

Linux系统Shell脚本-----------正则表达式 文本三剑客之---------grep、 sed

一、正则表达式 1.前言 正则表达式(regular expression)描述了一种字符串匹配的模式&#xff08;pattern&#xff09;&#xff0c;可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。在Linux中也就是代表我们定义的模式模板&…