1.springcloudAlibaba-nacos

2.springcloudAlibaba-openFeign

3.springcloudAlibaba-负载均衡器Ribbon

4.springcloudAlibaba-nacos配置中心

5.springcloudAlibaba-Seata 分布式事务

6.springcloudAlibaba-sentinel

7.springcloudAlibaba-网关gateway


目录

网关介绍

核心概念

Spring Cloud Gateway快速开始

集成Nacos

路由断言工厂

过滤器工厂( GatewayFilter Factories)配置

全局过滤器(Global Filters)配置

Reactor Netty 访问日志

Gateway跨域配置(CORS Configuration)


网关介绍

在微服务中存在很多服务,前端需要每个服务都维护一个ip,如果搭建集群 更是头疼,再比如鉴权、限流、日志、跨域等问题,都需要每个服务配一下,所以就衍生出网关来进行统一处理,就像家里的大门,所有人都走大门,收快递,防盗 都要在门口处理

Spring Cloud GateWay是Spring Cloud的一个全新项目,目标是取代Netflix Zuul,它基于 Spring5.0+SpringBoot2.0+WebFlux(基于高性能的Reactor模式响应式通信框架Netty,异步非阻塞模 型)等技术开发,性能高于Zuul,官方测试,GateWay是Zuul的1.6倍,旨在为微服务架构提供一种简 单有效的统一的API路由管理方式。

Spring Cloud GateWay不仅提供统一的路由方式(反向代理)并且基于 Filter(定义过滤器对请求过滤, 完成一些功能) 链的方式提供了网关基本的功能,例如:鉴权、流量控制、熔断、路径重写、日志监控 等。

基于Spring Framework 5, Project Reactor 和 Spring Boot 2.0 进行构建;

动态路由:能够匹配任何请求属性;

支持路径重写;

集成 Spring Cloud 服务发现功能(Nacos、Eruka);

可集成流控降级功能(Sentinel、Hystrix);

可以对路由指定易于编写的 Predicate(断言)和 Filter(过滤器)

核心概念

路由(route)

路由是网关中最基础的部分,路由信息包括一个ID、一个目的URI、一组断言工厂、一组Filter组成。如果断言为真,则说明请求的URL和

配置的路由匹配。

断言(predicates)

Java8中的断言函数,SpringCloud Gateway中的断言函数类型是Spring5.0框架中的ServerWebExchange。断言函数允许开发者去定义

匹配Http request中的任何信息,比如请求头和参数等。

过滤器(Filter)

SpringCloud Gateway中的filter分为Gateway FilIer和Global Filter。Filter可以对请求和响应进行处理

Spring Cloud Gateway快速开始

新建modules springcloud-gateway

添加依赖

    <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency></dependencies>

新增启动类

新增application.yml

server:port: 8881
spring:application:name: springcloud-gatewaycloud:gateway:routes: # 路由数组[路由 就是指定当请求满足什么条件的时候转到哪个微服务]- id: product_route # 当前路由的标识, 要求唯一uri: http://localhost:9999 # 请求要转发到的地址order: 1 # 路由的优先级,数字越小级别越高predicates: # 断言(就是路由转发要满足的条件)- Path=/gateway/** # 当请求路径满足Path指定的规则时,才进行路由转发filters:- StripPrefix=1 #转发之前去掉1层路径

这里我们请求http://localhost:8881/gateway/orderController/getInfo

gateway拿到这个地址 截取到 /gateway/ 然后转发到 uri地址 在转发之前 filters会 去掉第一次路径

我们在启动 之前的order module

可以看到 通过gateway 分发到了该服务上

集成Nacos

引入依赖

 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>

修改application.yml

加入nacos 配置 将本服务注册到nacos

uri 就可以直接修改为服务名,同时加入nacos的负载均衡策略

server:port: 8881
spring:application:name: springcloud-gatewaycloud:nacos:server-addr: 49.232.193.91:8848username: nacospassword: nacosnacosgateway:routes: # 路由数组[路由 就是指定当请求满足什么条件的时候转到哪个微服务]- id: product_route # 当前路由的标识, 要求唯一uri: lb://order-service # lb指的是从nacos中按照名称获取微服务,并遵循负载均衡策略order: 1 # 路由的优先级,数字越小级别越高predicates: # 断言(就是路由转发要满足的条件)- Path=/gateway/** # 当请求路径满足Path指定的规则时,才进行路由转发filters:- StripPrefix=1 #转发之前去掉1层路径

再次请求http://localhost:8881/gateway/orderController/getInfo

效果是一样的

同时gateway也提供了一种默认配置

实现方式也很简单 如下

server:port: 8881
spring:application:name: springcloud-gatewaycloud:nacos:server-addr: 49.232.193.91:8848gateway:discovery:locator:enabled: true

等同于

 gateway:routes: # 路由数组[路由 就是指定当请求满足什么条件的时候转到哪个微服务]- id: product_route # 当前路由的标识, 要求唯一uri: lb://order-service # lb指的是从nacos中按照名称获取微服务,并遵循负载均衡策略order: 1 # 路由的优先级,数字越小级别越高predicates: # 断言(就是路由转发要满足的条件)- Path=/order-service/** # 当请求路径满足Path指定的规则时,才进行路由转发filters:- StripPrefix=1 #转发之前去掉1层路径

路由断言工厂

gateway提供了很多断言方式,具体可以看一下官网说明跟样例,这里简单介绍几个

官网地址:Spring Cloud Gateway

作用:当请求gateway的时候,  使用断言对请求进行匹配, 如果匹配成功就路由转发, 如果匹配失败就返回404

基于Datetime类型的断言工厂

此类型的断言根据时间做判断,主要有三个:

AfterRoutePredicateFactory: 接收一个日期参数,判断请求日期是否晚于指定日期

BeforeRoutePredicateFactory: 接收一个日期参数,判断请求日期是否早于指定日期

BetweenRoutePredicateFactory: 接收两个日期参数,判断请求日期是否在指定时间段内

ZonedDateTime.now()

‐ After=2019‐12‐31T23:59:59.789+08:00[Asia/Shanghai]

基于远程地址的断言工厂

RemoteAddrRoutePredicateFactory:接收一个IP地址段,判断请求主机地址是否在地址

‐ RemoteAddr=192.168.1.1/24

基于Header的断言工厂

HeaderRoutePredicateFactory:接收两个参数,标题名称和正则表达式。  判断请求Header是否具有给定名称且值与正则表达式匹配

‐Header=X‐Request‐Id, \d+

基于Host的断言工厂

HostRoutePredicateFactor:接收一个参数,主机名模式。判断请求的Host是否满足匹配

‐Host=**.testhost.org

基于Method请求方法的断言

MethodRoutePredicateFactory:接收一个参数,判断请求类型是否跟指定的类型匹配

‐Method=GET

基于Query请求参数的断言工厂

QueryRoutePredicateFactory :接收两个参数,请求param和正则表达式, 判断请求参数是否具有给定名称且值与正则表达式匹配

‐Query=baz, ba.

基于路由权重的断言工厂

WeightRoutePredicateFactory:接收一个[组名,权重], 然后对于同一个组内的路由按照权重转发

routes:‐id: weight_route1uri: host1predicates:‐Path=/product/**‐Weight=group3, 1‐id: weight_route2uri: host2predicates:‐Path=/product/**‐Weight= group3, 9

这些基本上开发使用够用了,同事也提供了自定义断言方式 有兴趣可以了解一下

过滤器工厂( GatewayFilter Factories)配置

大体修改方式大同小异

像  AddRequestParameter 添加参数 、  PrefixPath为匹配的路由统一添加前缀 、‐ Redirect 重定向 还是用的挺多的 同事也提供了自定义过滤器

过滤器工厂

作用

参数

AddRequestHeader

为原始请求添加Header

Header的名称及值

AddRequestParameter

为原始请求添加请求参数

参数名称及值

AddResponseHeader

为原始响应添加Header

Header的名称及值

DedupeResponseHeader

剔除响应头中重复的值

需要去重的Header名称及去重策略

Hystrix

为路由引入Hystrix的断路器保护

Hystrixcommand的名称

FallbackHeaders

为fallbackUri的请求头中添加具体的异常信息

Header的名称

PrefixPath

为原始请求路径添加前缀

前缀路径

PreserveHostHeader

为请求添加一个preserveHostHeader=true的属性,路由过滤器会检查该属性以决定是否要发送原始的Host

RequestRateLimiter

用于对请求限流,限流算法为令牌桶

keyResolver、rateLimiter、statusCode、denyEmptyKey、emptyKeyStatus

RedirectTo

将原始请求重定向到指定的URL

http状态码及重定向的url

RemoveHopByHopHeadersFilter

为原始请求删除IETF组织规定的一系列Header

Header名称

RemoveResponseHeader

为原始请求删除某个Header

Header的名称

RewritePath

重写原始的请求路径

原始路径正则表达式以及重写后路径的正则表达式

RewriteResponseHeader

重写原始响应中的某个Header

Header名称,值的正则表达式,重写后的值

SaveSession

在转发请求之前,强制执行websession::save操作

secureHeaders

为原始响应添加一系列起安全作用的响应头

无,支持修改这些安全响应头的值

SetPath

修改原始的请求路径

修改后的路径

SetResponseHeader

修改原始响应中某个Header的值

Header名称,修改后的值

SetStatus

修改原始响应的状态码

HTTP状态码,可以是数字,也可以是字符串

StripPrefix

用于截断原始请求的路径

使用数字表示要截断的路径的数量

Retry

针对不同的响应进行重试

retries、statuses、methods、 series

RequestSize

设置允许接收最大请求包的大小。如果请求包大小超过设置的值,则返413Payload Too Large

请求包大小,单位为字节,默认值为5M

ModifyRequestBody

在转发请求之前修改原始请求体内容

修改后的请求体内容

ModifyResponseBody

修改原始响应体的内容

修改后的响应体内容

全局过滤器(Global Filters)配置

局部过滤器和全局过滤器区别:

局部:局部针对某个路由, 需要在路由中进行配置

全局:针对所有路由请求, 一旦定义就会投入使用

GlobalFilter 接口和 GatewayFilter 有一样的接口定义,只不过, GlobalFilter 会作用于所有路由

package oo.config;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Component
public class LogFilter implements GlobalFilter {Logger log = LoggerFactory.getLogger(this.getClass());@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info(exchange.getRequest().getPath().value()+"-----------------");return chain.filter(exchange);}
}

Reactor Netty 访问日志

要启用 Reactor Netty 访问日志,请设置­Dreactor.netty.http.server.accessLogEnabled=true.

它必须是 Java 系统属性,而不是 Spring Boot 属性。

您可以将日志记录系统配置为具有单独的访问日志文件。以下示例创建一个 Logback 配置:

<appender name="accessLog" class="ch.qos.logback.core.FileAppender"><file>access_log.log</file><encoder><pattern>%msg%n</pattern></encoder></appender><appender name="async" class="ch.qos.logback.classic.AsyncAppender"><appender‐ref ref="accessLog" />
</appender><logger name="reactor.netty.http.server.AccessLog" level="INFO" additivity="false"><appender‐ref ref="async"/></logger>

Gateway跨域配置(CORS Configuration)

  globalcors:cors-configurations:'[/**]':allowCredentials: true#springboot2.4后需用allowedOriginPatternsallowedOriginS: "*"allowedMethods: "*"allowedHeaders: "*"

7.springcloudAlibaba-网关gateway相关推荐

  1. 6.SpringCloud -- 注册中心与配置中心 Nacos、网关 Gateway

    6.SpringCloud -- 注册中心与配置中心 Nacos.网关 Gateway 一.了解一下 SpringCloud Alibaba 1.1 SpringCloudAlibaba (1)简单说 ...

  2. SpringCloud Alibaba微服务实战(七) - 路由网关(Gateway)全局过滤

    说在前面 全局过滤器作用于所有的路由,不需要单独配置,我们可以用它来实现很多统一化处理的业务需求,比如权限认证,IP 访问限制,监控,限流等等. 创建路由网关(Gateway)启动服务cloud-ac ...

  3. 限流10万QPS、跨域、过滤器、令牌桶算法-网关Gateway内容都在这儿

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 作者:雄 ...

  4. Spring Cloud 终于按捺不住推出了自己的服务网关 Gateway

    转载自  Spring Cloud 终于按捺不住推出了自己的服务网关 Gateway Spring 官方最终还是按捺不住推出了自己的网关组件:Spring Cloud Gateway ,相比之前我们使 ...

  5. SpringCloud 微服务网关Gateway 动态路由配置

    概述:在上一章节<SpringCloud 微服务网关Gateway介绍及简单路由配置>中我们讲述了Gateway的最简单的路由配置方式.但是其中比较明显的问题就是我们在配置路由服务的地址时 ...

  6. Spring cloud网关gateway代理websocket报Max frame length of 65536 has been exceeded

    Spring cloud网关gateway代理websocket报io.netty.handler.codec.http.websocketx.CorruptedWebSocketFrameExcep ...

  7. day02 Nacos集群配置、Feign远程调用和统一网关Gateway

    1.Nacos配置管理 Nacos除了可以做注册中心,同样可以做配置管理来使用. 统一配置管理 当微服务部署的实例越来越多,达到数十.数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错.我们需要一 ...

  8. SpringCloud 网关 Gateway

    哈喽~大家好,这篇来看看SpringCloud 网关 Gateway.

  9. SpringCloud:统一网关Gateway

    目录 1.网关介绍 2.搭建网关服务 3.路由断言工厂 4.路由过滤器 5.全局过滤器GlobalFilter 6.过滤器执行顺序 7.跨域问题处理 1.网关介绍 网关(Gateway)又称网间连接器 ...

  10. 【微服务技术09】统一网关Gateway

    [微服务技术09]统一网关Gateway 案例代码:https://gitee.com/pikachu2333/spring-cloud-hexuan 1.网关作用 网关功能: 身份认证和权限校验 服 ...

最新文章

  1. 【干货下载】聚美优品、中商惠民、倍全,如何让数据驱动“新零售”落地?...
  2. How to install Toad on linux with Corssover
  3. 接口测试基础之入门篇(待续)
  4. kafka原理_kafka入门(原理搭建简单使用)
  5. Centos实现svn本地认证apache认证
  6. 为啥非要用Python?Excel不香吗?
  7. UVALive 6508 Permutation Graphs
  8. 【Redis】Redis 乐观锁
  9. 算法与数据结构篇(暂未解答)
  10. python爬取微博评论_python爬虫手把手教你抓取微博评论(完整代码)
  11. 伯努利贝叶斯分类算法
  12. 一个按钮控制定时器的开始与暂停
  13. mac键盘快捷键详解,苹果电脑键盘快捷键图文教程
  14. MobileNet v2的Inverted Bottleneck为什么可以抵消ReLU激活函数所带来的信息损失
  15. 如何下载OpenJDK安装版本
  16. 原生JS javascript解除绑定事件 JS删除绑定事件
  17. h5 修改title 微信_iH5中级教程:微信必备,为H5设定标题
  18. 华为南研所提前批面试(2015年8月22日)
  19. 柏拉图团队-手把手教你发代币(二)remix入门
  20. 将页面中的指定 div 下载为图片

热门文章

  1. dcm4che 介绍及下载安装
  2. char* strlen()学习
  3. No result defined for action com.zhen.user.UserInfoAction and result success
  4. 洛谷 P3959 [NOIP2017]宝藏 题解
  5. python面向对象试题_python面向对象程序设计-中国大学mooc-试题题目及答案
  6. Delphi字符串操作的常用函数二
  7. html怎么优化导航条,seo优化教程seo技巧:网站html面包屑导航栏代码
  8. matlab如何做粒子模拟,求助,如何用matlab做蒙特卡罗模拟!!??
  9. html网页播放器编辑代码大全
  10. BIM在工程中的20种典型应用