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叫路由网关,它包含对请求的路由和过滤的功能. 路由负责将外部的请求转发到具体的微服务实例上,是实现外部访问统一入口的基础.而过滤是负责对请求的处理过程进行干预,是实现 ...
随机推荐
- Git:分支管理
代码中至少有一个分支,就是主分支master,默认都是在主分支上开发. 多分支 分支名: 版本库中必须唯一 不能以 - 开头 可以试用/,但不能以/结尾,被/分隔的名称不能以.开头 不能有连个连续的 ...
- POJ-2516(最小费用最大流+MCMF算法)
Minimum Cost POJ-2516 题意就是有n个商家,有m个供货商,然后有k种商品,题目求的是满足商家的最小花费供货方式. 对于每个种类的商品k,建立一个超级源点和一个超级汇点.每个商家和源 ...
- 什么原因才是阻碍Linux桌面发展的罪魁祸首
我大概2000年上大学在宿舍开始玩Linux,到现在20年了!也算是最早一批痴迷于Linux桌面用户啦!记得当时的毕业设计BBS论坛开发就是在Mandrake Linux(后改名Mandriva,一种 ...
- [GXYCTF2019]Ping Ping Ping 1
进入界面 根据提示进行ping信号 看到网页的内容就想到经典的Linux命令执行,使用命令执行的管道符 " | "尝试列出文件 FLAG应该在Flag.php里面 构造play ...
- Linux下查看文件内容的几种常用命令
[常用] 1,cat 由第一行开始显示内容,并将所有内容输出 cat的功能是将文件从第一行开始连续的将内容输出在屏幕上.但是cat并不常用,原因是当文件大,行数比较多时,屏幕无法全部容下时,只 ...
- JVM线上问题排查
前言 本文介绍服务器内运行的 Java 应用产生的 OOM 问题 和 CPU 100% 的问题定位 1. 内存 OOM 问题定位 某Java服务(比如进程id pid 为 3320)出现OOM,常见的 ...
- vs - 调试的技巧
在自助和局部变量窗口中固定属性 https://docs.microsoft.com/zh-cn/visualstudio/debugger/autos-and-locals-windows?view ...
- iOS 面试秘籍全套
栏目将持续更新--请iOS的小伙伴关注! (答案不唯一,仅供参考,文章最后有福利) iOS面试题大全(上) iOS面试题大全(下) 目录: iOS面试题:Run Loop iOS面试题:性能优化 ...
- android分析之Thread类
线程与线程类要区分开来. 抽象来说,线程是CPU调度的最小单位,但是线程总要执行代码,这个代码就在线程类里说明(即Thread类).无论如何,Thread只是一个类,但其功能就是"启动一个线 ...
- 【.NET 与树莓派】小风扇模块
小风扇,其实就是一个电机(马达),然后轴子上套一个扇叶.扇叶有两叶的,也有三叶的.这种我们小时候没少玩,太阳能帽子上就有一个小风扇,骑着自行车上学,路上只要有太阳光照射到,小风扇就会转.当然还有装干电 ...