目录
Gateway
什么是Gateway
由于Netflix的zuul发生问题,spring公司自己研发了一套网关框架Gateway用于取代zuul的使用。什么是gateway呢?spring cloud Gateway是使用Webflux中的reactor-netty响应式编程组件,底层使用的是netty通讯框架。
什么是api网关
API gateway 处于客户端与各个微服务之间,它担任了反向代理的角色,将不同的请求路由到相对应的微服务中去。与此同时,它还有以下功能:安全,限流,缓存,日志,监控,重试,熔断等。网关就是所有项目的一个统一入口,也可以说是进入系统的唯一节点。
网关的三个核心概念
路由(Route)
路由是构建网关的基本模块,它由ID、目标URI、一系列的断言和过滤器组成,如果断言为真则匹配该路由。就是根据断言和过滤器提供的某些规则,将请求发送到指定服务上
断言(Predicate)
开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由,就是定义匹配规则,只有满足断言的请求才会继续进行路由
过滤(Filter)
指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。当请求进行断言之前,或者满足断言后会继续进行路由,但是由于过滤的存在请求会再次被过滤条件进行指定的修改操作
gateway的工作流程
客户端向Spring Cloud Gateway发出请求。然后在Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到GatewayWeb Handler。Handler再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。
过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。Filter在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。
如何使用Gateway
gateway路由转发
使用配置文件
第一步: 创建一个子模块用于配置gateway,导入相关依赖,其中最重要的就是gateway的启动器。一定不能引入web场景启动器依赖,否则gateway模块将无法启动
<!--gateway-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
第二步: 配置文件
server:
port: 9527
spring:
application:
name: cloud-gateway
eureka:
instance:
hostname: cloud-gateway-service
client: #服务提供者provider注册进eureka服务列表内
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://localhost:7001/eureka
第三步: 现在我们想在支付微服务8001之前使用gateway网关,让请求在访问8001微服务之前先经过gateway网关。于是我们需要先配置配置文件
spring:
cloud:
gateway:
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/create/** # 断言,路径相匹配的进行路由
- After=2020-03-08T10:59:34.102+08:00[Asia/Shanghai]
经过如上操作,即可实现如果通过9527端口也可以访问8001的接口,也就是说请求先是通过9527网关,将符合yml配置文件中配置的请求进行路由转发至8001端口
使用代码配置
使用代码配置的话就需要使用到自定义配置类了,将上面的第三步由配置文件配置修改为自定义配置类,前两步要保持一致。其中route方法的第一个参数相当于id配置,r.path相当于predicates断言,r.path.uri就是请求将要路由到的地址
@Configuration
public class GateWayConfig {
@Bean
public RouteLocator customRouteLocatorBuilder(RouteLocatorBuilder routeLocatorBuilder) {
RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
routes.route(\"path_route_atguigu\",
r -> r.path(\"/guonei\")
.uri(\"http://news.baidu.com/guonei\"))
.build();
return routes.build();
}
}
路由实现负载均衡
之前都是通过ribbon来实现请求的负载均衡,其实gateway网关也可以通过注册中心的微服务名来实现负载均衡,也就是动态路由的功能。这里我们先通过以下配置开启从注册中心动态创建路由的功能
spring:
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
然后将原先写死的路径改为微服务名,通过这个实现对微服务的轮询
spring:
cloud:
gateway:
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/create/** # 断言,路径相匹配的进行路由
gateway九种断言
gateway的断言实际上就是配置文件中的predicates配置项,既然这个单词是复数,那就意味着它不仅仅可以配置一种断言,实际上断言的类型有九种,它们的意思以及使用方式我都写在了下面
predicates:
- Path=/payment/create/** # 路径断言,路径相匹配的进行路由
- Before=2020-03-08T10:59:34.102+08:00[Asia/Shanghai] # 时间断言,时间Before、After、Between指定时间的请求进行路由
- After=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]
- Cookie=username,zzyy # cookie断言,携带名为username且值为zzyy的请求进行路由(zzyy可以替换为正则)
- Header=X-Request-Id, \\d+ # header断言,请求头携带X-Request-Id且值满足正则"\\d+"的请求进行路由
- Host=**.atguigu.com, **.atg.com # host断言,请求格式符合的请求进行路由
- Method=GET # method断言,请求方式为get的请求进行路由
- Query=username, \\d+ # query断言,有参数名为username且值满足正则"\\d+"的请求进行路由
gateway过滤修改
使用配置文件实现filter过滤修改很简单,类似于断言的使用,在配置文件直接配置即可
filters:
- AddRequestParameter=X-Request-Id,1024
但是一般不这么使用filter,我们都是自定义一个全局GlobalFilter,重点就是@Component注解,类实现GlobalFilter, Ordered接口重写方法,设置过滤规则和优先级
@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
/**
* 判断请求中包含uname参数且它的值不为空,否则拒绝请求
*/
String uname = exchange.getRequest().getQueryParams().getFirst(\"uname\");
if (uname == null) {
log.info(\"*******用户名为null,非法用户,o(╥﹏╥)o\");
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
/**
* 加载过滤器顺序,数字越小优先级越高
* @return
*/
@Override
public int getOrder() {
return 0;
}
}
:本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可, 转载请附上原文出处链接。
1、本站提供的源码不保证资源的完整性以及安全性,不附带任何技术服务!
2、本站提供的模板、软件工具等其他资源,均不包含技术服务,请大家谅解!
3、本站提供的资源仅供下载者参考学习,请勿用于任何商业用途,请24小时内删除!
4、如需商用,请购买正版,由于未及时购买正版发生的侵权行为,与本站无关。
5、本站部分资源存放于百度网盘或其他网盘中,请提前注册好百度网盘账号,下载安装百度网盘客户端或其他网盘客户端进行下载;
6、本站部分资源文件是经压缩后的,请下载后安装解压软件,推荐使用WinRAR和7-Zip解压软件。
7、如果本站提供的资源侵犯到了您的权益,请邮件联系: 442469558@qq.com 进行处理!
猪小侠源码-最新源码下载平台 PHP教程 SpringCloud服务网关Gateway的使用教程详解 http://www.20zxx.cn/586329/xuexijiaocheng/qes.html
相关文章
- php参数怎么隐藏 2023-07-12
- 如何使用PHP在MongoDB中实现数据清理和优化 2023-07-12
- iis安装ssl证书php获取不了数据怎么办 2023-07-12
- php5没有监听9000端口如何解决 2023-07-12
- php如何用正则表达式只匹配身份证 2023-07-12
- PHP和Elasticsearch实现的实时数据分析和预测技术 2023-07-12
- 使用PHP和MQTT实现远程门禁控制的步骤 2023-07-12
- php换行的转义字符是什么 2023-07-12
- php 查询数组有几个键值 2023-07-12
- PHP中如何在数组中按值的字母顺序进行排序 2023-07-12
做猪小侠源码的代理,提供一站式服务
如果你不懂得搭建网站或者服务器,小程序,源码之类的怎么办? 第一通过本站学习各种互联网的技术 第二就是联系客服,我帮帮你搭建(当然要收取部分的费用) 第三成为我们的代理,我们提供整套的服务。