SpringCloud-Gataway

一.Spring Cloud Gataway

在Spring Cloud官方定义了SpringCloud Gateway 的如下特点:

  • 基于 Spring 5,Project Reactor , Spring Boot 2.0
  • 默认集成 Hystrix 断路器
  • 默认集成 Spring Cloud DiscoveryClient
  • Predicates 和 Filters 作用于特定路由,易于编写的 Predicates 和 Filters
  • 支持动态路由、限流、路径重写.

二.Spring Cloud Gataway的核心概念

  • Filter(过滤器):

Spring Cloud Gateway的Filter和Zuul的过滤器类似,可以在请求发出前后进行一些业务上的处理 ,这里分为`两种类型的Filter,分别是Gateway Filter网关filter和Global Filter全局Filter.

  • Route(路由):

网关配置的基本组成模块,和Zuul的路由配置模块类似。一个Route模块由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配,目标URI会被访问。说白了就是把url请求路由到对应的资源(服务),或者说是一个请求过来Gateway应该怎么把这个请求转发给下游的微服务,转发给谁。

  • Predicate(断言):

这是一个 Java 8 的 Predicate,可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。断言的输入类型是一个 ServerWebExchange。简单理解就是处理HTTP请求的匹配规则,在什么样的请情况下才能命中资源继续访问。

三.Spring Cloud Gateway的工作方式

Spring Cloud Gateway 的工作原理跟 Zuul 的差不多,最大的区别就是 Gateway 的 Filter 只有 pre 和 post 两种

客户端向Spring Cloud Gateway发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。该处理程序通过特定于请求的过滤器链来运行请求。筛选器由虚线分隔的原因是,筛选器可以在发送代理请求之前和之后运行逻辑。所有“前置”过滤器逻辑均被执行。然后发出代理请求。发出代理请求后,将运行“后”过滤器逻辑。

四.服务示例

创建项目导入依赖

<!--服务注册与发现--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

配置类

@SpringBootApplication
@EnableDiscoveryClient
public class GatewayServerApp {public static void main(String[] args) {SpringApplication.run(GatewayServerApp.class);}
}

yml配置

server:port: 9099
eureka:client:service-url:defaultZone: http://localhost:10086/eurekainstance:prefer-ip-address: trueinstance-id: gateway-server:${server.port}
spring:application:name: gateway-servercloud:gateway:discovery:locator:enabled: false #开放服务名访问方式lower-case-service-id: true #服务名小写routes:- id: application-user #指定服务名uri: lb://user-server #去注册中心找这个服务名predicates: #断言,匹配访问的路径- Path=/servers/user/**    #服务访问路径filters:- StripPrefix=1    #请求转发的时候会去掉 /servers访问路径- id: application-order #指定服务名uri: lb://order-server #去注册中心找这个服务名predicates: #断言,匹配访问的路径- Path=/servers/order/**    #服务访问路径filters:- StripPrefix=1    #请求转发的时候会去掉 /servers访问路径- id: application-pay #指定服务名uri: lb://pay-server #去注册中心找这个服务名predicates: #断言,匹配访问的路径- Path=/servers/pay/**    #服务访问路径filters:- StripPrefix=1    #请求转发的时候会去掉 /servers访问路径

五.Gateway 的 Filter 过滤器

Gateway的Filter的zuul的Filter有相似之处,与zuul不同的是,Gateway的filter从生命周期上可以为“pre”和“post”类型。根据作用范围可分为针对于单个路由的gateway filter,和针对于所有路由的Global Filer

内置的Gateway filter

针对单个路由的Filter, 它允许以某种方式修改HTTP请求或HTTP响应。过滤器可以作用在某些特定的请求路径上。Gateway内置了很多的GatewayFilter工厂。如果要使用这些Filter只需要在配置文件配置GatewayFilter Factory的名称。下面拿一个内置的Gateway Filter举例:

AddRequestHeader GatewayFilter Factory
该Filter是Gateway内置的,它的作用是在请求头加上指定的属性。配置如下:

spring:cloud:gateway:routes:- id: add_request_header_routeuri: https://example.orgfilters:- AddRequestHeader=X-Request-red, blue

spring.cloud.gateway.routes.filters配置项配置了一个AddRequestHeader ,他是“AddRequestHeader GatewayFilter Factory”的名称,意思是在请求头中添加一个“X-Request-red”的属性,值为blue

自定义Gateway Filter

在Spring Cloud Gateway自定义过滤器,过滤器需要实现GatewayFilter和Ordered这两个接口。我们下面来演示自定义filter计算请求的耗时。

public class RequestTimeFilter implements GatewayFilter, Ordered {private static final Log log = LogFactory.getLog(GatewayFilter.class);private static final String COUNT_Start_TIME = "countStartTime";@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//开始时间exchange.getAttributes().put(COUNT_Start_TIME, System.currentTimeMillis());//执行完成之后return chain.filter(exchange).then(Mono.fromRunnable(() -> {//开始时间Long startTime = exchange.getAttribute(COUNT_Start_TIME);//结束时间Long endTime=(System.currentTimeMillis() - startTime);if (startTime != null) {log.info(exchange.getRequest().getURI().getRawPath() + ": " + endTime + "ms");}}));}@Overridepublic int getOrder() {return Ordered.LOWEST_PRECEDENCE;}
}

提示: getOrder返回filter的优先级,越大的值优先级越低 , 在filterI方法中计算了请求的开始时间和结束时间

最后我们还需要把该Filter配置在对应的路由上,配置如下:

@Configuration
public class FilterConfig {//配置Filter作用于那个访问规则上@Beanpublic RouteLocator customerRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route(r -> r.path("/servers/user/**")//去掉2个前缀.filters(f -> f.stripPrefix(2).filter(new RequestTimeFilter()).addResponseHeader("X-Response-test", "test")).uri("lb://user-server").order(0).id("test-RequestTimeFilter")).build();}}
}

提示:这里将 RequestTimeFilter 添加到 “/user/**”这里路由上,当请求包含/user就会触发Filter的执行。

自定义GlobalFilter

GlobalFilter:全局过滤器,不需要在配置文件中配置,作用在所有的路由上,最终通过GatewayFilterAdapter包装成GatewayFilterChain可识别的过滤器,它为请求业务以及路由的URI转换为真实业务服务的请求地址的核心过滤器,不需要配置,系统初始化时加载,并作用在每个路由上。
这里我们模拟了一个登陆检查的Filter.

@Component
@Slf4j
public class TimeGlobleFilter implements GlobalFilter , Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {List<String> token = exchange.getRequest().getHeaders().get("token");log.info("检查 TOKEN = {}" ,token);if(token == null || token.isEmpty()){//响应对象ServerHttpResponse response = exchange.getResponse();//构建错误结果HashMap<String,Object> data = new HashMap<>();data.put("code",401);data.put("message","未登录");DataBuffer buffer = null;try {byte[] bytes = JSON.toJSONString(data).getBytes("utf-8");buffer = response.bufferFactory().wrap(bytes);//设置完成相应,不会继续执行后面的filter//response.setComplete();response.setStatusCode(HttpStatus.UNAUTHORIZED);response.getHeaders().add("Content-Type","application/json;charset=UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}//把结果写给客户端return response.writeWith(Mono.just(buffer));}log.info("Token不为空 ,放行");return chain.filter(exchange);}@Overridepublic int getOrder() {return 0;}
}

如果请求头中没有 token ,就返回咩有权限的状态吗。

使用 buffer = response.bufferFactory().wrap(bytes) 构建响应内容,通过response.writeWith(Mono.just(buffer)); 把内容写给客户端。

Gateway跨域配置

server:port: 10010
spring:application:name: gateway #服务名称cloud:nacos:server-addr: localhost:8848 #nacos注册服务地址gateway:routes: #网关路由配置- id: user-service #路由id自定义 保证唯一uri: lb://userservice #路由的目标地址 lb表示负载均衡 后面跟服务名称、predicates: #路由断言也就是判断请求是否符合路由规则的条件- Path=/user/** #按照路径匹配只要满足/user/开头就符合要求
#          filters: #路由过滤器
#            - AddRequestHeader=Truth, coderyech is freaking awesome #添加请求头- id: order-serviceuri: lb://orderservicepredicates:- Path=/order/**- Before=2027-01-20T17:42:47.789-07:00[Asia/Shanghai]default-filters:- AddRequestHeader=Truth, coderyech is freaking awesome #添加全局请求头globalcors: # 全局的跨域处理add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题corsConfigurations:'[/**]':allowedOrigins: # 允许哪些网站的跨域请求- "http://localhost:8090"- "http://www.leyou.com"allowedMethods: # 允许的跨域ajax的请求方式- "GET"- "POST"- "DELETE"- "PUT"- "OPTIONS"allowedHeaders: "*" # 允许在请求中携带的头信息allowCredentials: true # 是否允许携带cookiemaxAge: 360000 # 这次跨域检测的有效期
edMethods: # 允许的跨域ajax的请求方式- "GET"- "POST"- "DELETE"- "PUT"- "OPTIONS"allowedHeaders: "*" # 允许在请求中携带的头信息allowCredentials: true # 是否允许携带cookiemaxAge: 360000 # 这次跨域检测的有效期

SpringCloud-Gataway网关的使用相关推荐

  1. Gateway网关简介及使用。Spring Cloud Alibaba---Gateway概述、简单示例。什么是Gataway网关?网关能干什么?Spring Cloud如何搭建一个网关。

    一.什么是网关: 在微服务架构里,每一个微服务都是一个个体,各个服务可以被独立的设计.开发.测试.部署和管理.这时,各个独立部署单元可以用不同的开发测试团队维护,可以使用不同的编程语言和技术平台进行设 ...

  2. SpringCloud Gataway 跨域配置

    SpringCloud Gataway 跨域配置 Spring Boot版本:2.3.4.RELEASE Spring Cloud版本:Hoxton.SR8 一.通过配置文件配置跨域 spring:c ...

  3. SpringCloud系列教程(五)之SpringCloud Gateway 网关聚合开发文档 swagger knife4j 和登录权限统一验证【Hoxton版】

    阅读提醒: 本文面向的是有一定springboot基础者 本次教程使用的Spring Cloud Hoxton RELEASE版本 由于knife4j比swagger更加友好,所以本文集成knife4 ...

  4. springcloud 服务网关Zuul实战(一)基本路由配置

    上篇我们介绍了zuul是什么?大家已经有些了解,废话不多说我们就开始实际代码演示下zuul如何配置 一,新建一个路由网关的微服务 microservicecloud-zuul-gateway-9527 ...

  5. SpringCloud 服务网关 Zuul 自定义路由和排除路由配置

    前言 首先需要说明的是该文是 [带你入门SpringCloud 之 服务网关 Zuul ]的拓展篇,如果还未阅读 [带你入门SpringCloud 之 服务网关 Zuul ]请先阅读完毕后在阅读该文. ...

  6. SpringCloud Zuul 网关

    目录 网关的概念 搭建zuul网关.实现路由转发 使用zuul过滤请求 使用zuul进行限流 网关的概念 API Gateway 网关,是介于客户端.服务器端之间的中间层,是系统对外的唯一入口,可以统 ...

  7. SpringCloud Zuul 网关搭建及配置

    目录 一.Zuul网关 二.Zuul服务的前期准备 2.1 注册中心EurekaServer的搭建 2.2 EurekaService的搭建 三.Zuul服务搭建 五.Zuul的访问 六.Zuul的更 ...

  8. 实测SpringCloud Gateway网关性能(Wrk和Jmeter)

    SpringCloud 的Gateway网关性能到底如何,网上各种传言太多.我用Wrk和Jmeter两种测试工具,在相同环境和代码下进行压测.这里分享一下Wrk压测过程的数据和结果,希望对你的技术选型 ...

  9. SpringCloud: 路由网关(zuul)

    在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.智能路由.配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统.一个简答的微服务系统如下图: ...

  10. springCloud Zuul网关

    1.springboot 仅2.0.x 支持,在此选择 2.0.7 2.新建Module eureka-zuul-client 3.导入依赖 <?xml version="1.0&qu ...

最新文章

  1. iOS架构-cocoapods打包静态库(依赖私有库、开源库、私有库又包含静态库)(14)
  2. 英雄联盟诺手又回来了,国服诺手在上单,可谓一夫当关,万夫莫开
  3. Node.js mimimn图片批量下载爬虫 1.00
  4. 用了这个评估优化LiteOS镜像利器,我有点飘...
  5. 运筹学与计算机知识,计算机、数学、运筹学等领域的36个重要算法
  6. Cypress 简介
  7. 微软Kinect:谁还要控制器?
  8. hihoder 1048
  9. mysql-python:_mysql.c(42) : fatal error C1083: Cannot open include file: 'config-win.h' 非权威指南
  10. 【数学】微积分的大用处
  11. 渲染除了计算机渲染有没有云训啊,80%的设计师都在用云渲染渲图,云渲染究竟怎么样?...
  12. PHP+ mysql实现注册登录功能
  13. Android椭圆offon按钮,如何使椭圆闪烁?
  14. AngularJS的$destory用法
  15. 600 岁的故宫,也上了人工智能的车
  16. 【Unity】碰撞检测
  17. ROS-学习资料参考
  18. android 定时响铃,Android开发振动和响铃
  19. 中国最低调的河,长约1000公里,却养育了上亿人口
  20. python之python3.x版本用urllib爬虫出现的module 'urllib' has no attribute 'urlopen'与urllib.error.HTTPError: HTT

热门文章

  1. CMT2380F32模块开发0-总览
  2. homeassistant搭建_搭建最基本的Home assistant
  3. 概要设计和详细设计区别_小程序设计和APP设计的区别
  4. 国家治理能力现代化的重要标准:“国家大数据中心”
  5. springmvc 发送PUT 和 DELETE 请求
  6. LinkedIn Spark-TFRecord partitionBy案例实战
  7. 用httpUrlConnection实现文件上传
  8. 手机桌面左右滑屏不成功问题log分析
  9. 终于知道为什么程序员都喜欢删库跑路了
  10. yep chain千亿级航母起航——与同济大学达成战略合作