配置以及整个项目代码请到gitee查看https://gitee.com/xwb1056481167/spring-cloud/

服务网关

SpringCloud中集成的Zuul版本,采用的是Tomcat容器,使用传统的Servlet IO处理  
Servlet是由Servlet container进行声明周期管理  
container启动时构建servlet对象并调用servlet init()进行初始化  
container运行时接受请求,并为每一个请求分配一个线程(一般从线程池中获取空闲线程)然后调用service();
congainer关闭时调用servlet destory()销毁servlet;

zuul(netflix公司)

2.0版本还没出来(核心人才跳槽,其他人争论目标不统一)

GateWay(spring公司)

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

官方架构图

说明

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

gateway的核心逻辑 路由转发+执行过滤链

Spring Cloud Gateway具有如下特点

1、基于Spring Framework 5 ,Project Reactor和Spring Boot1.0进行构建
2、动态路由:能够匹配任何请求属性
3、可以对路由指定Predicate(断言)和Filter(过滤器)
4、集成Hystrix的断路器功能
5、集成Spring Cloud 服务发现功能
6、易于编写的Predicate(断言)和Filter(过滤器)
7、请求限流功能
8、支持路经重新

三大核心概念

1、Route(路由)
路由是由构建万股干的基本模块,他由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由
2、Predicate(断言)
参考的是java8的java.util.function.Predicate开发人员可以匹配HTTP请求中的所有内容(例如请求头和请求参数),如果请求与断言相匹配则进行路由
3、Filter(过滤)
指的是Spring框架中的GatewayFilter的实例,使用过滤器,可以在请求被路由钱或者而之后对请求进行修改

项目当中的使用

创建路由网关cloud-gateway-gateway9527

1、pom.xml

<dependencies><!-- gateway路由网关 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- eureka 服务发现 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>

2、网关application.yml

spring:application:name: cloud-gateway9527 #服务名cloud:gateway:routes:- id:  payment_route #payment_route  路由的id,没有固定规则但要求唯一,建议配合服务名uri: http://localhost:8001 #匹配后提供服务的路由地址predicates:- Path=/payment/get/**  #断言,路径相匹配的进行路由- id: payment_route2 #payment_route2  路由的id,没有固定规则但要求唯一,建议配合服务名uri: http://localhost:8001 #匹配后提供服务的路由地址predicates:- Path=/payment/lb/**  #断言,路径相匹配的进行路由

3、测试

启动7001,cloud-provider-payment8001(什么都不用变动),cloud-gateway-gateway9527后访问一下地址

http://localhost:8001/payment/get/1后

总结:相当于在访问8001的前面加了一层保护,

两种路由方式

configuration

@Configuration
public class GateWayConfig {/*** 配置了一个Id为route-name的路由规则,方访问地址http://localhost:9527/guonei是会自动转发到地址http://news.baidu.com/guonei*/@Beanpublic RouteLocator customerRouteLocator(RouteLocatorBuilder routeLocatorBuilder) {RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();routes.route("path_route_xwb", r -> r.path("/guonei").uri("http://news.baidu.com/guonei")).build();return routes.build();}
}

但是以上不推荐使用,配置比较麻烦,推荐使用yml的方式

一、gateWay动态路由配置

server:port: 9527
spring:application:name: cloud-gateway9527 #服务名cloud:gateway:discovery:locator:enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由routes:- id:  payment_route #payment_route  路由的id,没有固定规则但要求唯一,建议配合服务名#uri: http://localhost:8001 #匹配后提供服务的路由地址#cloud-payment-service为eureka注册的服务名 lb是url的协议,表示启用Gateway的负载均衡功能uri: lb://cloud-payment-service #微服务提供服务的路由地址()predicates:- Path=/payment/get/**  #断言,路径相匹配的进行路由- id: payment_route2 #payment_route2  路由的id,没有固定规则但要求唯一,建议配合服务名#uri: http://localhost:8001 #匹配后提供服务的路由地址uri: lb://cloud-payment-service #匹配后提供服务的路由地址predicates:- Path=/payment/lb/**  #断言,路径相匹配的进行路由

说明

1、必须启用一下配置spring.cloud.gateway.discovery.locator.enable=true 开启通过服务名进行路由的开关
2、uri: lb://cloud-payment-service 通过服务名访问服务,lb是loadBalanceClient (https://docs.spring.io/spring-cloud-gateway/docs/2.2.5.RELEASE/reference/html/#the-between-route-predicate-factory)负载均衡功能

实际展示效果:

二、断言predicates

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

共有:11种配置方式。

1、After Route Predicate Factory

predicates:- After=2017-01-20T17:42:47.789-07:00[America/Denver]

2、Before Route Predicate Factory

predicates:- Before=2017-01-20T17:42:47.789-07:00[America/Denver]

3、Between Route Predicate Factory

 predicates:- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]

4、Cookie Route Predicate Factory

predicates:- Cookie=chocolate, ch.p

5、Header Route Predicate Factory

predicates:- Header=X-Request-Id, \\d+

6、Host Route Predicate Factory

predicates:- Host=**.somehost.org,**.anotherhost.org

7、Method Route Predicate Factory

predicates:- Method=GET,POST

8、Path Route Predicate Factory

predicates:- Path=/red/{segment},/blue/{segment}

9、The Query Route Predicate Factory

predicates:- Query=green

10、RemoteAddr Route Predicate Factory

predicates:- RemoteAddr=192.168.1.1/24

11、Weight Route Predicate Factory

predicates:- Weight=group1, 2

eg:

spring:application:name: cloud-gateway9527 #服务名cloud:gateway:discovery:locator:enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由routes:- id:  payment_route #payment_route  路由的id,没有固定规则但要求唯一,建议配合服务名#uri: http://localhost:8001 #匹配后提供服务的路由地址#cloud-payment-service为eureka注册的服务名 lb是url的协议,表示启用Gateway的负载均衡功能uri: lb://cloud-payment-service #微服务提供服务的路由地址()predicates:- Path=/payment/get/**  #断言,路径相匹配的进行路由- After=2020-12-06T16:05:15.580+08:00[Asia/Shanghai] #在当前访问时间之后有效- Method=GET- id: payment_route2 #payment_route2  路由的id,没有固定规则但要求唯一,建议配合服务名#uri: http://localhost:8001 #匹配后提供服务的路由地址uri: lb://cloud-payment-service #匹配后提供服务的路由地址predicates:- Path=/payment/lb/**  #断言,路径相匹配的进行路由- Host=**.gateway9527.com #当匹配规则为此路径的时候允许访问

curl http://localhost:9527/payment/lb -H "Host:gateway9527.com"
本人的"Host:gateway9527.com"中的gateway9527.com是host中配置了。

三、Filter(过滤)

自定义过滤器

在9527的项目中添加自定义过滤器

/*** Gateway的Filter过滤连* 总的全局过滤器,档在所有微服务前面,进行校验*/
@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("*********************** come in MyLogGatewayFilter:" + new Date());String uname = exchange.getRequest().getQueryParams().getFirst("uname");if (uname == null) {log.info("************用户名为null,非法用户,(꒦_꒦) ");exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);return exchange.getResponse().setComplete();}return chain.filter(exchange);}@Overridepublic int getOrder() {return 0;}
}

说明:9527挡在所谓有微服务的前面,在请求的时候(7001,8001,8002,9527)的时候,通过访问地址 http://localhost:9527/payment/lb?uname=234来回刷新,访问正常,如果去掉uname则调用失败

SpringCloud-getway路由网关相关推荐

  1. springcloud 之 路由网关 zuul

    话不多说,先上图(图是丑陋了点,大家别介意哈),这幅图是我根据公司现有的业务设计出来的一个简单的基于springcloud微服务架构图. 在springcloud微服务体系中,我们一般不对外直接暴露服 ...

  2. SpringCloud教程- 路由网关Zuul (SpringCloud版本Greenwich.SR4)

    文章目录 Zuul简介 创建zuul-gateway工程 服务过滤 代码地址:github-spring-cloud地址 Zuul简介 Zuul是NetFlix开源的微服务网关,它可以和Eureka. ...

  3. 【微服务架构】SpringCloud之路由网关(zuul)

    什么是zuul zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用. Zuul 在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架.Zu ...

  4. SpringCloud之路由网关zuul(五)

    2019独角兽企业重金招聘Python工程师标准>>> 在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.智能路由.配置管理等,由这几个基础 ...

  5. SpringCloud 学习--路由网关

    在微服务架构中,需要几个基础的微服务,包括服务的注册与发现,服务消费,负载均衡,断路器,咋能路由,配置管理等,由这几几个基础组件相互协作,共用组建一个简单的微服务系统. -Zuul 简介 Zuul是N ...

  6. SpringCloud Getway服务网关

    Gateway网关 网关的角色是作为一个 API 架构,用来保护.增强和控制对于 API 服务的访问. API 网关是一个处于应用程序或服务(提供 REST API 接口服务)之前的系统,用来 管理授 ...

  7. SpringCloud学习系列之七 ----- Zuul路由网关的过滤器和异常处理

    前言 在上篇中介绍了SpringCloud Zuul路由网关的基本使用版本,本篇则介绍基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的路由 ...

  8. SpringCloud:网关getway 路由转发

    Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开 ...

  9. springcloud家族路由系列之getway

    springcloud家族路由系列之geteway springcloud家族路由系列之geteway 基础项目搭建(idea) 1.新建项目选择项目类型 2.设置项目团队名.产品名.项目类型.语言. ...

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

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

最新文章

  1. 原始ajax方式调用asp.net后台方法
  2. 成为软件架构师的4个过程
  3. 登录和oauth机制
  4. 百分比单位始终根据父元素相应值来计算_CSS Viewport 单位,很多人还不知道使用它来快速布局!...
  5. windows创建任务计划(周期执行bat脚本)
  6. SharedMaterial的一些问题
  7. Win10网络图标消失,网络图标变成灰色,打开网络设置闪退等问题解决
  8. 安装rpcbind出错
  9. 最新版计算机知识超全题库,超全的计算机基础知识题库.doc
  10. 企业可以自己开发一套CRM系统吗?
  11. mysql5.6卸载干净_Mysql完全干净卸载教程
  12. 小白系统初始化配置资源失败怎么办
  13. Word设置默认粘贴格式,自动更改粘贴格式
  14. photoshop 用户名、组织或序列号丢失或无效的解决方法(转http://apps.hi.baidu.com/share/detail/10025023)
  15. RFC 822 中文版 MIME解析基础(4)(第5-6也)
  16. PayPal开发文档整理(8)——PayPal支付产品和解决方案
  17. 告别夏日的烤串,迎来秋季的凉爽
  18. 千万别小瞧九宫格 一道题就能让候选人原形毕露!
  19. FreeType 用法
  20. 大数据行业部署实战2:环境大数据统计

热门文章

  1. maven 模块打包 找不到符号
  2. u3d011 秘密行动_学习记录
  3. 高校宿舍预付费用电管理平台
  4. ie浏览器启动时报错 0xc0000005
  5. Ubuntu安装sougou输入法
  6. C++笔记之return的用法
  7. Shader教程系列XNA
  8. 云数据库时代,华为GaussDB系列数据库走向市场第一
  9. java课程与成绩管理计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  10. pythonadb之安卓手机加速多线程kill所有第三方程序脚本