车险网站模版,wordpress写文章怎么上传图片,二手建筑铝模板哪里有卖,网页设计图片是怎么显示的前言
本节内容主要是对webflux项目一些常用功能的介绍#xff0c;例如系统集成swagger接口文档#xff0c;方便接口测试以及前后端项目联调测试#xff1b;使用actuator完成系统各种指标的监控功能#xff1b;系统使用logback日志框架完成项目日志的收集#xff1b;使用过…前言
本节内容主要是对webflux项目一些常用功能的介绍例如系统集成swagger接口文档方便接口测试以及前后端项目联调测试使用actuator完成系统各种指标的监控功能系统使用logback日志框架完成项目日志的收集使用过滤器WebFilter完成一些初始化验证使用CorsWebFilter解决系统的跨域问题使用AOP切面实现功能方法操作日志的打印等。
正文
swagger接口文档集成
①引入webflux的springdoc文档的pom依赖
!-- https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-webflux-ui --
dependencygroupIdorg.springdoc/groupIdartifactIdspringdoc-openapi-starter-webflux-ui/artifactIdversion2.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依赖
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-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 version1.0 encodingUTF-8?
configuration debugfalse!--设置存储路径变量--property nameLOG_HOME valueht-webflux/!--控制台输出appender--appender nameCONSOLE classch.qos.logback.core.ConsoleAppender!--设置输出格式--encoder classch.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!--设置编码--charsetUTF-8/charset/encoder/appender!--文件输出,时间窗口滚动--appender nameFILE classch.qos.logback.core.rolling.RollingFileAppender!--日志名,指定最新的文件名其他文件名使用FileNamePattern --File${LOG_HOME}/ht.log/File!--文件滚动模式--rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicy!--日志文件输出的文件名,可设置文件类型为gz,开启文件压缩--FileNamePattern${LOG_HOME}/%d{yyyy-MM-dd}_%i.log/FileNamePattern!--日志文件保留天数--MaxHistory30/MaxHistory!--按大小分割同一天的--timeBasedFileNamingAndTriggeringPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedFNATPmaxFileSize20MB/maxFileSize/timeBasedFileNamingAndTriggeringPolicy/rollingPolicy!--输出格式--encoder classch.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!--设置编码--charsetUTF-8/charset/encoder/appender!--根据环境配置日志--springProfile namedev!-- 打印 日志级别 --root levelINFOappender-ref refCONSOLE/appender-ref refFILE/!-- appender-ref refLOGSTASH/--/root/springProfilespringProfile nametest!-- 打印 日志级别 --root levelINFOappender-ref refCONSOLE/appender-ref refFILE//root/springProfilespringProfile nameprod!--指定基础的日志输出级别--root levelINFO!--appender将会添加到这个logger--appender-ref refCONSOLE/appender-ref refFILE/
!-- appender-ref refLOGSTASH/--/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 MonoVoid filter(ServerWebExchange exchange, WebFilterChain chain) {//可以获取请求域ServerHttpRequest request exchange.getRequest();log.info(url:, request.getURI());//可以获取响应域ServerHttpResponse response exchange.getResponse();log.info(--------------请求处理放行到目标方法之前的过滤器业务处理------------);MonoVoid filter chain.filter(exchange);//流一旦经过某个操作就会变成新流MonoVoid 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 MonoObject aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {// 在方法执行前的逻辑log.info(************************目标方法执行前************************);log.info(args:{},joinPoint.getArgs());// 执行被切入的方法MonoObject result (MonoObject) joinPoint.proceed();// 在方法执行后的逻辑MonoObject mono result.doOnError(error - {log.info(************************目标方法异常以后************************);log.info(error: error);}).doFinally(signalType - {log.info(************************目标方法执行完成以后************************);});return mono;}
}② 访问接口验证操作日志切面是否生效 结语
关于springboot3下WebFlux项目的一些常用功能整合的内容到这里就结束了我们下期见。。。。。。