SpringCloud网关Gateway功能实现
作者:咖啡Beans
本文介绍SpringCloud网关Gateway功能实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
摘要
本文介绍微服务中网关的功能,并通过代码展示如何实现服务发现、路由转发、统一认证、日志监控、跨域处理等功能。
认识网关Gateway
网关Gateway是微服务项目的后端入口,负责请求路由、负载均衡、安全控制、协议转换等功能,对整个微服务项目做出统一的请求前置处理功能。通过网关的转发,可避免直接暴露具体服务实例。
功能
- 路由转发:作为API网关,核心功能之一是将请求路由到正确的后端服务,可灵活地定义路由规则,将不同的请求路径、主机或参数等映射到不同的服务。
- 过滤器:用于修改请求和响应,如添加请求头、修改响应体、限流、熔断等。
- 服务发现:与SpringCloud的服务发现组件nacos等集成,自动发现和路由到后端服务实例。
- 统一认证:进行统一的身份认证和授权,保护后端服务不受未授权访问。
- 监控与日志:方便统一收集和处理请求日志,监控系统运行状态。
- 负载均衡:与SpringCloudLoadBalancer集成,实现对后端服务的负载均衡,将请求分发到多个实例上。
- 限流与熔断:支持Hystrix等组件,实现限流和熔断功能,保护后端服务免受过载影响。
- 断言功能:通过断言工厂来实现对请求的灵活匹配,如根据请求路径、方法、参数、头信息等进行路由决策。
代码示例
导入依赖
<!--nacos 注册中心 客户端依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--网关依赖 路由转发+请求限流+身份认证+负载均衡--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
1)路由转发
配置application.yml
spring: application: name: springgateway-use #服务名 servlet: context-path: / cloud: nacos: server-addr: localhost:8848 #nacos服务端地址,默认8848 discovery: ephemeral: true #默认是临时实例 gateway: discovery: locator: enabled: true # 启用服务发现 lower-case-service-id: true # 服务名小写 # 路由配置 routes: -id: feign-producer-route #确保路由 ID 唯一,路径匹配规则正确。 uri: lb://feign-producer # 负载均衡到服务名 feign-producere predicates: - Path=/producer/** # 匹配路径 /producer/** filters: - StripPrefix=1 # 过滤器,去掉路径前缀 去除路径前缀 /producer
配置类
package org.coffeebeans.config; import org.springframework.cloud.gateway.route.RouteLocator; import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class GatewayConfig { //配置自定义的路由规则 @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route("feign-producer", r -> r .path("/producer/**") // 匹配 "/producer/**" 路径的请求 .uri("lb://feign-producer")) // 转发到名为 "feign-producer" 的微服务 .build(); } }
2)过滤器 权限校验
package org.coffeebeans.filter; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; //统一认证 自定义全局过滤器 应用于所有请求 权限校验 @Component public class GlobalAuthFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 检查请求头中的 authorization String authHeader = exchange.getRequest().getHeaders().getFirst("Authorization"); if (authHeader == null || !authHeader.equals("admin")) { exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); return exchange.getResponse().setComplete(); } return chain.filter(exchange); } @Override public int getOrder() { return -1; // 设置过滤器的优先级 } }
3)过滤器 日志监控
package org.coffeebeans.filter; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; //日志过滤 @Slf4j @Component public class GlobalLogFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { long startTime = System.currentTimeMillis(); // 记录请求开始时间 String requestUri = exchange.getRequest().getURI().toString(); // 获取请求地址 // 替换响应对象并继续过滤器链 return chain.filter(exchange.mutate().build()) .doOnSuccess(aVoid -> { long endTime = System.currentTimeMillis(); long duration = endTime - startTime; log.info("请求地址: {}, 耗时: {}ms", requestUri, duration); }); } @Override public int getOrder() { return Ordered.LOWEST_PRECEDENCE; } }
缓存请求
package org.coffeebeans.filter; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.cloud.gateway.support.ServerWebExchangeUtils; import org.springframework.core.Ordered; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; //缓存请求正文 避免Stream closed 错误 @Component public class GlobalCacheRequestFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { return ServerWebExchangeUtils.cacheRequestBodyAndRequest(exchange, (request) -> chain.filter(exchange.mutate().request(request).build()) ); } @Override public int getOrder() { return Ordered.HIGHEST_PRECEDENCE; } }
4)过滤器 跨域处理
package org.coffeebeans.filter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.http.HttpMethod; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.reactive.CorsWebFilter; import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource; import org.springframework.web.util.pattern.PathPatternParser; //过滤器 统一cors跨域策略 @Configuration public class GlobalCorsFilter { @Bean @Order(Ordered.HIGHEST_PRECEDENCE) public CorsWebFilter filter() { CorsConfiguration config = new CorsConfiguration(); config.addAllowedMethod(HttpMethod.GET); // 允许GET请求 config.addAllowedMethod(HttpMethod.POST); // 允许POST请求 config.addAllowedMethod(HttpMethod.OPTIONS); // 允许OPTIONS预检请求 config.addAllowedHeader(CorsConfiguration.ALL); // 允许所有请求头 config.addAllowedOriginPattern(CorsConfiguration.ALL); // 允许所有来源 UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(newPathPatternParser()); source.registerCorsConfiguration("/**", config); // 应用到所有路径 return new CorsWebFilter(source); } }
总结
以上我们了解了SpringCloudGateway的功能,并通过代码展示了如何实现服务发现、路由转发、统一认证、日志监控、跨域处理的基本功能。
到此这篇关于SpringCloud网关Gateway功能实现的文章就介绍到这了,更多相关SpringCloud网关Gateway内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!