1、集成sentinal
1、添加依赖,依赖跟所使用的sentinal版本一致即可
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
<version>1.8.0</version>
</dependency>
2、配置yaml这个与正常项目配置是一致的可以参考往期sentinal的配置,这里直接把代码贴出来了
# sentinel控制台配置
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8858
3、在配置类中启动sentinal全局过滤器、sentinal熔断降级自定义返回内容如下
/**
* sentinal 启动全局过滤器
* @return
*/
@Bean
@Order(-1)
public GlobalFilter sentinelGatewayFilter() {
return new SentinelGatewayFilter();
}
/**
* sentinal 自定义返回熔断
* @param myBlockRequestHandler
* @return
*/
@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler(BlockRequestHandler myBlockRequestHandler) {
//重定向 Block 处理
//GatewayCallbackManager.setBlockHandler(new RedirectBlockRequestHandler("http://www.baidu.com"));
// 自定义 Block 处理
GatewayCallbackManager.setBlockHandler(myBlockRequestHandler);
return new SentinelGatewayBlockExceptionHandler(viewResolvers, serverCodecConfigurer);
}
/**
* sentinal 自定义的BlockRequestHandler
*
* @return
*/
@Bean(name = "myBlockRequestHandler")
public BlockRequestHandler myBlockRequestHandler() {
BlockRequestHandler blockRequestHandler = new BlockRequestHandler() {
@Override
public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
// 返回状态码 429 请求太多,
Map<String, Object> map = new HashMap<>();
map.put("code", 5100);
map.put("message", "服务熔断了");
return ServerResponse.status(HttpStatus.TOO_MANY_REQUESTS)
.contentType(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromValue(map));
}
};
return blockRequestHandler;
}
4、注意配置规则时配置的资源名直接是路由的id,没有“/”
2、跨域处理
什么是跨域:访问协议、端口(如果指定了端口的话)、host有一个不同则是跨域请求
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing),它允许浏览器向跨域的另一台服务器发出XMLHttpRequest请求,从而克服了AJAX只能访问同域名下的资源的限制;
这种CORS使用了一个额外的HTTP响应头来赋予当前user-agent(浏览器)获得跨域资源的权限,这里的跨域也就是Cross-Origin的概念,这里的权限就是访问另一个域名下的资源权限;
CORS是现在HTML5标准中的一部分,在大部分现代浏览器中都有所支持,可能在某些老版本的浏览器不支持CORS,如果要兼容一些老的浏览器版本,则需要采用JSONP进行跨域请求;
1、配置通用型允许跨域
@Configuration
public class CorsConfig {
@Bean
public CorsWebFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
//是什么请求方法,比如 GET POST PUT DELATE .....
config.addAllowedMethod("*");
//来自哪个域名的请求,*号表示所有
config.addAllowedOrigin("*");
//是什么请求头
config.addAllowedHeader("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
}
}
参考:GlobalCorsProperties类中参数
spring:
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]':
allowedOrigins: "https://docs.spring.io"
allowedMethods:
- GET