pom配置
报错配置:spring.main.web-application-type: reactive
或者移除web
<dependency><!-- 如果启动GateWay报错 可能是GateWay模块引入了web和监控的starter依赖,需要移除--><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>
yml配置
spring:application:name: cloud-gatewaycloud:gateway:discovery:locator:enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由routes:- id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名#uri: http://localhost:8001 #匹配后提供服务的路由地址uri: lb://cloud-payment-service #匹配后提供服务的路由地址predicates:- Path=/payment/get/** # 断言,路径相匹配的进行路由- id: payment_routh2 #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名#uri: http://localhost:8001 #匹配后提供服务的路由地址uri: lb://cloud-payment-service #匹配后提供服务的路由地址predicates:- Path=/payment/lb/** # 断言,路径相匹配的进行路由- After=2020-03-08T10:59:34.102+08:00[Asia/Shanghai] # 断言,ZonedDateTime now()只有在这个时间后才可以访问,否则404# - Before=2020-03-08T10:59:34.102+08:00[Asia/Shanghai]# - Between=2020-03-08T10:59:34.102+08:00[Asia/Shanghai] , 2020-03-08T10:59:34.102+08:00[Asia/Shanghai]# curl http://localhost:9527/payment/lb --cookie "username=zzyy"# - Cookie=username,zzyy #Cookie=cookieName,正则表达式# 请求头要有X-Request-Id属性并且值为整数的正则表达式 curl http://localhost:9527/payment/lb --cookie "username=zzyy" -H "X-Request-Id:11"# - Header=X-Request-Id, \d+# - Host=**.atguigu.com # curl http://localhost:9527/payment/lb -H "Host:afae.atguigu.com"
yml配置2
server:port: 8009spring:application:name: demo-seata# cloud:# nacos:# server-addr: 192.168.2.20:30010# username: nacos# password: nacossentinel:transport:dashboard: 192.168.2.20:31596 # 控制台的安装位置main:web-application-type: reactivecloud:gateway:discovery:locator:enabled: trueroutes:- id: demo-eureka-clienturi: lb://demo-eureka-clientpredicates:- Path=/eureka-client/**# profiles:# active: public# port: 8719 # 与sentinel单独连接的端口# client-ip: 192.168.2.6 # 本机的ip,如果sentinel装在虚拟机,必须配这个# port: 30195 # 与sentinel单独连接的端口# client-ip: 192.168.2.20 # 本机的ip,如果sentinel装在虚拟机,必须配这个eureka:client:service-url:defaultZone: http://localhost:7001/eurekalogging:level:root: debug
gateway响应式异常处理
handler
package com.demo.gateway.common.filter;import lombok.extern.slf4j.Slf4j;import org.springframework.boot.autoconfigure.web.ErrorProperties;import org.springframework.boot.autoconfigure.web.ResourceProperties;import org.springframework.boot.autoconfigure.web.reactive.error.DefaultErrorWebExceptionHandler;import org.springframework.boot.web.error.ErrorAttributeOptions;import org.springframework.boot.web.reactive.error.ErrorAttributes;import org.springframework.context.ApplicationContext;import org.springframework.http.HttpStatus;import org.springframework.http.MediaType;import org.springframework.web.reactive.function.BodyInserters;import org.springframework.web.reactive.function.server.RequestPredicates;import org.springframework.web.reactive.function.server.RouterFunction;import org.springframework.web.reactive.function.server.RouterFunctions;import org.springframework.web.reactive.function.server.ServerRequest;import org.springframework.web.reactive.function.server.ServerResponse;import reactor.core.publisher.Mono;import java.util.HashMap;import java.util.Map;import java.util.Objects;/*** <p>* 全局异常处理* </p>*/@Slf4jpublic class GlobalExceptionHandler extends DefaultErrorWebExceptionHandler {public GlobalExceptionHandler(ErrorAttributes errorAttributes, ResourceProperties resourceProperties, ErrorProperties errorProperties, ApplicationContext applicationContext) {super(errorAttributes, resourceProperties, errorProperties, applicationContext);}/*** 统一处理异常信息*/protected Map<String, Object> getErrorMap(ServerRequest request, Throwable error) {Map<String, Object> errorAttributes = new HashMap<>(8);errorAttributes.put("message", error.getMessage());errorAttributes.put("code", HttpStatus.INTERNAL_SERVER_ERROR.value());errorAttributes.put("method", request.methodName());errorAttributes.put("path", request.path());return errorAttributes;}/*** 统一处理异常信息*/@Override@SuppressWarnings(value = "unchecked")protected Map<String, Object> getErrorAttributes(ServerRequest request, boolean includeStackTrace) {Throwable error = super.getError(request);//调用处理异常的方法,并将对象转换成mapreturn getErrorMap(request, error);}/*** Extract the error attributes from the current request, to be used to populate error* views or JSON payloads.* @param request the source request* @param options options to control error attributes* @return the error attributes as a Map*/@Overrideprotected Map<String, Object> getErrorAttributes(ServerRequest request, ErrorAttributeOptions options) {Throwable error = super.getError(request);return getErrorMap(request, error);}@Overrideprotected RouterFunction<ServerResponse> getRoutingFunction(ErrorAttributes errorAttributes) {return RouterFunctions.route(RequestPredicates.all(), this::renderErrorResponse);}@Overrideprotected Mono<ServerResponse> renderErrorResponse(ServerRequest request) {boolean includeStackTrace = isIncludeStackTrace(request, MediaType.ALL);Map<String, Object> error = getErrorAttributes(request, includeStackTrace);return ServerResponse.status(getHttpStatus(error)).contentType(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(error));}@Overrideprotected int getHttpStatus(Map<String, Object> errorAttributes) {HttpStatus status = (HttpStatus) errorAttributes.get("status");if (Objects.isNull(status)) {return HttpStatus.OK.value();}return status.value();}}
config
package com.demo.gateway.common.config;import com.demo.gateway.common.filter.GlobalExceptionHandler;import org.springframework.beans.factory.ObjectProvider;import org.springframework.boot.autoconfigure.web.ResourceProperties;import org.springframework.boot.autoconfigure.web.ServerProperties;import org.springframework.boot.context.properties.EnableConfigurationProperties;import org.springframework.boot.web.reactive.error.ErrorAttributes;import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.Bean;import org.springframework.core.annotation.Order;import org.springframework.http.codec.ServerCodecConfigurer;import org.springframework.stereotype.Component;import org.springframework.web.reactive.result.view.ViewResolver;import java.util.Collections;import java.util.List;/*** @author yuwenbo*/@Component@EnableConfigurationProperties({ServerProperties.class, ResourceProperties.class})public class ErrorHandlerConfiguration {private final ServerProperties serverProperties;private final ApplicationContext applicationContext;private final ResourceProperties resourceProperties;private final List<ViewResolver> viewResolvers;private final ServerCodecConfigurer serverCodecConfigurer;public ErrorHandlerConfiguration(ServerProperties serverProperties,ResourceProperties resourceProperties,ObjectProvider<List<ViewResolver>> viewResolversProvider,ServerCodecConfigurer serverCodecConfigurer,ApplicationContext applicationContext) {this.serverProperties = serverProperties;this.applicationContext = applicationContext;this.resourceProperties = resourceProperties;this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList);this.serverCodecConfigurer = serverCodecConfigurer;}@Bean@Order(Integer.MIN_VALUE)public ErrorWebExceptionHandler errorWebExceptionHandler(ErrorAttributes errorAttributes) {GlobalExceptionHandler exceptionHandler = new GlobalExceptionHandler(errorAttributes,this.resourceProperties,this.serverProperties.getError(),this.applicationContext);exceptionHandler.setViewResolvers(this.viewResolvers);exceptionHandler.setMessageWriters(this.serverCodecConfigurer.getWriters());exceptionHandler.setMessageReaders(this.serverCodecConfigurer.getReaders());return exceptionHandler;}}
