SpringCloud之服务网关Gateway,入门+实操

二、 GateWay核⼼概念
- 路由(route): ⽹关最基础的部分,也是⽹关⽐较基础的⼯作单元。路由由⼀个ID、⼀个⽬标URL(最终路由到的地址)、⼀系列的断⾔(匹配条件判断)和Filter过滤器(精细化控制)组成。如果断⾔为true,则匹配该路由。
- 断⾔(predicates):参考了Java8中的断⾔java.util.function.Predicate,开发⼈员可以匹配Http请求中的所有内容(包括请求头、请求参数等)(类似于nginx中的location匹配⼀样),如果断⾔与请求相匹配则路由。
- 过滤器(fifilter):⼀个标准的Spring webFilter,使⽤过滤器,可以在请求之前或者之后执⾏业务逻辑。
三、GateWay⼯作过程
四、应用
第一步、引入pom,注意使用的不是spring-mvc,只需要引入webflux即可
<!--GateWay ⽹关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--引⼊webflux-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
第二步、配置配置文件
1、时间点前匹配


spring:
cloud:
gateway:
routes:
- id: after_route
uri: http://ityouknow.com
predicates:
- Before=2018-01-20T06:06:06+08:00[Asia/Shanghai]
2、时间点后匹配


spring:
cloud:
gateway:
routes:
- id: time_route
uri: http://ityouknow.com
predicates:
- After=2018-01-20T06:06:06+08:00[Asia/Shanghai]
3、时间区间匹配


spring:
cloud:
gateway:
routes:
- id: after_route
uri: http://ityouknow.com
predicates:
- Between=2018-01-20T06:06:06+08:00[Asia/Shanghai], 2019-01-20T06:06:06+08:00[Asia/Shanghai]
4、指定Cookie正则匹配指定值


spring:
cloud:
gateway:
routes:
- id: cookie_route
uri: http://ityouknow.com
predicates:
- Cookie=ityouknow, kee.e
5、指定Header正则匹配指定值


spring:
cloud:
gateway:
routes:
- id: header_route
uri: http://ityouknow.com
predicates:
- Header=X-Request-Id, \d+
6、请求Host匹配指定值


spring:
cloud:
gateway:
routes:
- id: host_route
uri: http://ityouknow.com
predicates:
- Host=**.ityouknow.com
7、请求Method匹配指定请求⽅式


spring:
cloud:
gateway:
routes:
- id: method_route
uri: http://ityouknow.com
predicates:
- Method=GET
8、请求路径正则匹配


spring:
cloud:
gateway:
routes:
- id: host_route
uri: http://ityouknow.com
predicates:
- Path=/foo/{segment}
9、请求包含某参数


spring:
cloud:
gateway:
routes:
- id: query_route
uri: http://ityouknow.com
predicates:
- Query=smile
10、请求包含某参数并且参数值匹配正则表达式


spring:
cloud:
gateway:
routes:
- id: query_route
uri: http://ityouknow.com
predicates:
- Query=keep, pu.
11、远程地址IP匹配


spring:
cloud:
gateway:
routes:
- id: remoteaddr_route
uri: http://ityouknow.com
predicates:
- RemoteAddr=192.168.1.1/24
注意:如果是注册中心配置,那需要uri更换为: lb://服务名,同时需要引入客户端pom,和配置客户端注册中心配置。
五、过滤器
- pre:这种过滤器在请求被路由之前调⽤。我们可利⽤这种过滤器实现身份验证、在集群中选择 请求的微服务、记录调试信息等。
- post:这种过滤器在路由到微服务以后执⾏。这种过滤器可⽤来为响应添加标准的 HTTPHeader、收集统计信息和指标、将响应从微服务发送给客户端等。
- GateWayFilter 应⽤到单个路由路由上
- GlobalFilter全局过滤器、应⽤到所有的路由上。实现的时候只需要实现GlobalFilter接口即可,有时候添加Ordered接口,设置拦截器的优先级,数值越⼩,优先级越⾼
spring:
cloud:
gateway:
routes:
- id: service-user8080
uri: lb://service-user8080
predicates:
- Path=/api/user
filters:
- StripPrefix=1 #去掉path第一个路径参数在进行转发
1、GateWayFilter单个路由上
实现GateWayFilter 接口
package city.albert.filter; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.core.Ordered;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono; /**
* @author niunafei
* @function
* @email niunafei0315@163.com
* @date 2020/9/23 1:26 AM
*/
public class IpFilter implements GatewayFilter, Ordered {
Logger logger = LoggerFactory.getLogger(IpFilter.class); @Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
HttpHeaders httpHeaders = exchange.getResponse().getHeaders();
//返回数据格式
httpHeaders.setContentType(MediaType.APPLICATION_JSON); ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
// 从request对象中获取客户端ip logger.info("拦截处理业务");
return chain.filter(exchange);
} @Override
public int getOrder() {
return 0;
}
}
配置生效
package city.albert.config; import city.albert.filter.IpFilter;
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; /**
* @author niunafei
* @function
* @email niunafei0315@163.com
* @date 2020/9/23 2:03 AM
*/
@Configuration
public class GateWayConfig { @Bean
public RouteLocator customerRouteLocator(RouteLocatorBuilder builder) {
RouteLocator build = builder.routes()
//设置拦截接口
.route(r -> r.path("/api/user/register/**")
//去除路径上第一个参数/api
.filters(f -> f.stripPrefix(1)
//自定义的filetr
.filter(new IpFilter())
.addResponseHeader("X-Response-Default-Foo", "Default-Bar"))
.uri("lb://lagou-service-user8080")
.order(0)
.id("lagou-service-user80801")
)
.build();
return build;
} }
2、全局生效
package city.albert.filter; import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse; /**
* @author niunafei
* @function
* @email niunafei0315@163.com
* @date 2020/9/24 1:46 AM
*/
@Configuration
public class AutoFilter {
@Bean
@Order(10)
public GlobalFilter b() {
return (exchange, chain) -> {
HttpHeaders httpHeaders = exchange.getResponse().getHeaders();
//返回数据格式
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse(); //业务逻辑 return chain.filter(exchange);
};
} }
路由配置:https://blog.csdn.net/rain_web/article/details/102469745
过滤器:https://blog.csdn.net/lizhiqiang1217/article/details/90576228
SpringCloud之服务网关Gateway,入门+实操的更多相关文章
- SpringCloud Alibaba实战(11:引入服务网关Gateway)
源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 大家好,我是三分恶. 在前面的章节中,我们已经完成了服务间的调用.统一配置等等,在这 ...
- 八、springcloud之服务网关zuul(一)
一.Zuul简介 zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用. Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器. ...
- SpringCloud微服务治理技术入门(SCN)
1.集群.分布式.微服务 首先先理解三个感念 什么是集群?: 同一个业务,部署在多个服务器上,目的是实现高可用,保证节点可用! 什么是分布式?: 一个业务分拆成多个子业务,部署在不同的服务器上,每个子 ...
- springCloud 微服务框架搭建入门(很简单的一个案例不喜勿扰)
Spring cloud 实现服务注册及发现 服务注册与发现对于微服务系统来说非常重要.有了服务发现与注册,你就不需要整天改服务调用的配置文件了,你只需要使用服务的标识符,就可以访问到服务. clou ...
- 微服务SpringCloud之服务网关zuul二
Zuul的核心 Filter是Zuul的核心,用来实现对外服务的控制.Filter的生命周期有4个,分别是“PRE”.“ROUTING”.“POST”.“ERROR”,整个生命周期可以用下图来表示. ...
- springcloud(十五):Spring Cloud 终于按捺不住推出了自己的服务网关 Gateway
Spring 官方最终还是按捺不住推出了自己的网关组件:Spring Cloud Gateway ,相比之前我们使用的 Zuul(1.x) 它有哪些优势呢?Zuul(1.x) 基于 Servlet,使 ...
- 微服务SpringCloud之服务网关zuul一
前面学习了Eureka.Feign.Hystrix.Config,本篇来学习下API网关zuul.在微服务架构中,后端服务往往不直接开放给调用端,而是通过一个API网关根据请求的url,路由到相应的服 ...
- 服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)
[前言] Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由.请求聚合.服务发现.认证.鉴权.限流熔断.并内置了负载均衡器与Service Fabric.Butt ...
- SpringCloud之服务网关
1.zuul 1.1定义 zuul叫路由网关,它包含对请求的路由和过滤的功能. 路由负责将外部的请求转发到具体的微服务实例上,是实现外部访问统一入口的基础.而过滤是负责对请求的处理过程进行干预,是实现 ...
随机推荐
- .NET Core中的Worker Service
当你想到ASP.NET Core时,可能会想到Web应用程序后端代码,包括MVC和WebAPI.MVC视图和Razor页面还允许使用后端代码生成带有HTML元素的前端UI.全新的Blazor更进一步, ...
- secure 审计暴力登陆
文件路径 cd /var/log -rw------- 1 root root 1200063 Aug 10 20:04 secure 做应急响应,或者做脚本监控的时候,都可以参考如下特征 ... A ...
- FreeBSD WIFI 配置
ee /boot/ loader.conf ee是个编辑器 中写入 rtwn_usb_load="YES" legal.realtek.license_ack=1 在 /etc/ ...
- 关于java的访问修饰符权限
作用域 public protected default private 同一个类 yes yes yes yes 同一个包 yes yes ...
- C/C++ 性能优化背后的方法论:TMAM
开发过程中我们多少都会关注服务的性能,然而性能优化是相对比较困难,往往需要多轮优化.测试,属于费时费力,有时候还未必有好的效果.但是如果有较好的性能优化方法指导.工具辅助分析可以帮助我们快速发现性能瓶 ...
- Web实验报告
- c++ 反汇编 构造函数和析构函数
构造函数和析构函数出现的时机 局部对象 109: // 局部对象定义调用构造函数 110: 111: CNumber Number; 00C8A37D 8D 4D EC lea ecx,[Number ...
- python2 虚拟环境
1.安装virtualenv pip install virtualenv 2.创建虚拟环境 virtualenv 虚拟环境名称 3.激活虚拟环境 source 虚拟环境目录/bin/activat ...
- 攻防世界 reverse re4-unvm-me
re4-unvm-me alexctf-2017 pyc文件,祭出大杀器EasyPythonDecompiler.exe 得到源代码: 1 # Embedded file name: unvm_me. ...
- java中if语句的应用
1. 注释怎么写: 1.1 //单行注释 1.2 /*多行注释*/ 2. If语句的用法 2.1. if(条件语句){ ( ps:只有一行代码时可以不加{} ) } 2.2. if(条件语句) ...