Gateway网关

  • 一、Gateway概念
  • 二、三大核心概念
    • 1.Route (路由)
    • 2.Predicate (断言)
    • 3.Filter (过滤)
  • 三、工作流程图
  • 四、工程搭建
    • 1、新建Gateway网关工程
    • 2、添加项目需要使用的依赖包
    • 3、application.yml配置
    • 4、启动器
    • 5、测试
    • 6、转发功能同样可以通过代码来实现
    • 7、开启动态创建路由
  • 五、Gateway常用Predicate
  • 六、Gateway的Filter
  • 总结

一、Gateway概念

Cloud全家桶有个狠重要的组件就是网关,在1.x版本中都是采用Zuul网关;但是在2.x版本中,zuul的升级一致跳票,SpringCloud最后自己研发了一个网关替代Zuul, 那就是SpringCloud Gateway

二、三大核心概念

1.Route (路由)

路由是构建网关的基本模块,它由ID,目标URL,一系列的断言和过滤器组成,如果断言为true则匹配该路由

2.Predicate (断言)

参考的是Java8的java.util.function.predicate
开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由

3.Filter (过滤)

指的是Spring框架中的GatewayFilter 的实例,使用过滤器,可以在请求被路由前或者之后请求进行修改

三、工作流程图

客户端向 Spring Cloud Gateway 发出请求。如果 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。 过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。

四、工程搭建

1、新建Gateway网关工程

2、添加项目需要使用的依赖包

<dependencies><!--gateway--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--consul-server服务注册发现--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency>
</dependencies>

3、application.yml配置

server:port: 8080
spring:application:name: cloud-gatewaycloud:consul:host: localhostport: 8500discovery:service-name: ${spring.application.name}  # 注册到consul的服务名称gateway:routes:- id: payment_routh            #路由ID,没有固定的规则单要求唯一,最好和服务名称配置一致uri: http://localhost:9001   #匹配后提供路由的服务地址predicates:- Path=/payment/get/**     #断言,路径相匹配的进行断言- id: payment_routh            #======================可以匹配多个=======================uri: http://localhost:9001 #匹配后提供路由的服务地址predicates:- Path=/payment/consul/**   #断言,路径相匹配的进行断言

4、启动器

/*** @description: 网关启动器* @author: ydf* @date: 2021/1/3 16:08* @version: v1.0*/
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
public class GatewayAppMain {public static void main(String[] args) {SpringApplication.run(GatewayAppMain.class,args);}
}

5、测试


6、转发功能同样可以通过代码来实现

/*** @description: Gateway配置* @author: ydf* @date: 2021/1/3 16:30* @version: v1.0*/
@Configuration
public class GatewayConfig {@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route("path_route", r -> r.path("/guonei").uri("http://news.baidu.com")).build();}}

上面配置了一个 id 为 path_route 的路由,当访问地址http://localhost:8080/guonei时会自动转发到地址:http://news.baidu.com/guonei和上面的转发效果一样,只是这里转发的是以项目地址/guonei格式的请求地址。

7、开启动态创建路由

 gateway:discovery:locator:enabled: true   #开启从注册中心动态创建路由的功能,利用微服务名进行路由routes:- id: payment_routh1#uri: http://localhost:9001uri: lb://provider-service #匹配后提供的路由地址(微服务名进行路由)predicates:- Path=/payment/get/**- id: payment_routh2#uri: http://localhost:9002uri: lb://provider-service #匹配后提供的路由地址(微服务名进行路由)predicates:- Path=/payment/consul/**

测试:

五、Gateway常用Predicate

Predicate 就是为了实现一组匹配规则,方便让请求过来找到对应的 Route 进行处理,接下来我们接下 Spring Cloud GateWay 内置几种 Predicate 的使用。

官方配置:https://docs.spring.io/spring-cloud-gateway/docs/2.2.5.RELEASE/reference/html/#gateway-request-predicates-factories


这里的配置有十多种,官方说的很明确,改一下配置文件就行了,这里小编就不演示了。

六、Gateway的Filter

全局过滤器配置:https://docs.spring.io/spring-cloud-gateway/docs/2.2.5.RELEASE/reference/html/#global-filters

配置类:

/*** @description: 全局配置Gateway的过滤器* @author: ydf* @date: 2021/1/3 19:35* @version: v1.0*/
@Component
public class CustomGatewayFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("GlobalFilter***************************"+new Date());//模拟演示拦截---实际生产当中可以拦截验证头部是否携带token等String uname = exchange.getRequest().getQueryParams().getFirst("uname");if(uname == null){System.out.println("uname为null,非法用户");exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);return exchange.getResponse().setComplete();}return chain.filter(exchange);}@Overridepublic int getOrder() {return 0;}
}

测试:


携带正确的参数,再次请求测试:

http://localhost:8080/payment/consul?uname=dtydf

总结

小总结: 实际项目中网关微服务一般都用来作为整个服务入口的鉴权操作,假设我们再对JWT的加解密过程中使用的对称加密算法,这样就会不可避免的导致一个安全隐患:如果有恶意请求利用密钥生成了JWT令牌来进行登录操作,那就会产生不可预知的后果!
解决方式:
采用非对称算法,生成一个存储着公钥和私钥的密钥库,在生成JWT的时候,使用私钥来进行加密,而解析JWT的服务使用公钥来解析JWT,这样将加密和解析的两把密钥分开来,就可以阻止恶意用户对系统产生恶意攻击了。

SpringCloud Hoxton版微服务- Gateway网关相关推荐

  1. SpringCloud Hoxton版微服务-入门篇

    SpringCloud Hoxton.SR9初级版 文章目录 SpringCloud Hoxton.SR9初级版 前言 一.架构选型 二.父工程创建 1.创建maven工程: 2.全局设置编码: 3. ...

  2. SpringCloud Hoxton版微服务-RestTempalte + @LoadBlanced 实现负载均衡

    RestTempalte + @LoadBlanced 实现负载均衡 一.服务提供者注册 二.服务消费者调用 1.编写服务消费者 2.RestTemplate中开启负载均衡支持 3.启动服务测试 总结 ...

  3. SpringCloud Hoxton版微服务- OpenFeign实现服务调用

    openfeign服务调用 一.OpenFeign概念 二.OpenFeign使用步骤 1.依赖 2.添加注解支持 3.注解业务类调用 三.OpenFeign超时控制 1.服务提供者 2.服务消费者 ...

  4. SpringCloud Hoxton版微服务- Ribbon实现负载均衡

    Ribbon实现负载均衡 Ribbon概念 一.Ribbon策略 二.配置使用 1.编写服务提供者 2.编写服务消费者 3.测试负载均衡随机策略 Ribbon概念 Spring Cloud Ribbo ...

  5. 《springcloud 二》微服务动态网关,网关集群

    动态网关    实际上是网关和分布式配置中心的整合,通过post手动刷新,生效 动态网关 传统方式将路由规则配置在配置文件中,如果路由规则发生了改变,需要重启服务器.结合整合SpringCloud C ...

  6. 【微服务】之六:轻松搞定SpringCloud微服务-API网关zuul

    通过前面几篇文章的介绍,我们可以轻松搭建起来微服务体系中比较重要的几个基础构建服务.那么,在本篇博文中,我们重点讲解一下,如何将所有微服务的API同意对外暴露,这个就设计API网关的概念. 本系列教程 ...

  7. gateway动态路由_微服务与网关技术(SIA-GateWay)

    一.背景 软件架构,总是在不断的演进中... 把时间退回到二十年之前,当时企业级领域研发主要推崇的还是C/S模式,PB.Delphi这样的开发软件是企业应用开发的主流.随着时间的推移,基于浏览器的B/ ...

  8. SpringCloud(若依微服务版)读取Nacos中的配置以及多个服务共享Nacos配置的使用

    场景 若依微服务版手把手教你本地搭建环境并运行前后端项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/109363303 在上 ...

  9. SpringCloud微服务Zuul网关动态路由

    SpringCloud微服务Zuul网关动态路由 zuul动态路由 1. 网关层动态配置路由映射规则 2. 将同一个请求根据自定义的规则,路由到不同服务中 FeignClient动态请求 实现功能 实 ...

最新文章

  1. 人人都应该掌握的9种数据分析思维
  2. 图片的裁剪、旋转、平移、模糊
  3. Winform巧用窗体设计完成弹窗数值绑定-以重命名弹窗为例
  4. F# -- TCP/IP小测试
  5. onvif发送订阅规则
  6. DirectX 9 学习笔记
  7. c#先进行uri解码_JavaScript、C# URL编码、解码总结
  8. 拓端tecdat|数据解锁职场女性潜力
  9. 富文本编辑器(UEditor)的使用
  10. padStart()和padEnd()方法
  11. 神经网络——激活函数的作用
  12. Unity修改编辑器
  13. python绘制3d点云_python – 来自点云的3D凸包
  14. 第三方支付(微信支付)支付流程分析
  15. 关于Vue框架Element UI中分页器,当前页的问题
  16. 华为认证--云计算HCIA
  17. 每日作业20200429 - 二元一次方程 解鸡兔同笼
  18. 四川大学计算机专业调剂,四川大学计算机学院(软件学院)研究生调剂
  19. 数据挖掘的十大经典算法
  20. Machine Learning introduction

热门文章

  1. php开发工程师考试试卷,腾讯PHP开发工程师面试试卷
  2. ts watch路由 参数变化_TypeScript基础(六):TS 在 Vue 中的用法,data,生命周期,methods,computed,props,watch,$emit...
  3. 信息学奥赛一本通 1006:A+B问题 | OpenJudge NOI 1.3 01
  4. 信息学奥赛一本通(2065:【例2.2】整数的和)
  5. 信息学奥赛一本通(1183:病人排队)
  6. 最小生成树计数(洛谷-P4208)
  7. 4-adjacent(AtCoder-2686)
  8. 信息学奥赛C++语言: 比身高
  9. mysql insert id的参数_Mysql----MySQL的mysql_insert_id和LAST_INSERT_ID(转)
  10. python网络编程项目_python网络编程(1):客户端与网络编程简介