SpringCloud-getway路由网关
配置以及整个项目代码请到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路由网关相关推荐
- springcloud 之 路由网关 zuul
话不多说,先上图(图是丑陋了点,大家别介意哈),这幅图是我根据公司现有的业务设计出来的一个简单的基于springcloud微服务架构图. 在springcloud微服务体系中,我们一般不对外直接暴露服 ...
- SpringCloud教程- 路由网关Zuul (SpringCloud版本Greenwich.SR4)
文章目录 Zuul简介 创建zuul-gateway工程 服务过滤 代码地址:github-spring-cloud地址 Zuul简介 Zuul是NetFlix开源的微服务网关,它可以和Eureka. ...
- 【微服务架构】SpringCloud之路由网关(zuul)
什么是zuul zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用. Zuul 在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架.Zu ...
- SpringCloud之路由网关zuul(五)
2019独角兽企业重金招聘Python工程师标准>>> 在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.智能路由.配置管理等,由这几个基础 ...
- SpringCloud 学习--路由网关
在微服务架构中,需要几个基础的微服务,包括服务的注册与发现,服务消费,负载均衡,断路器,咋能路由,配置管理等,由这几几个基础组件相互协作,共用组建一个简单的微服务系统. -Zuul 简介 Zuul是N ...
- SpringCloud Getway服务网关
Gateway网关 网关的角色是作为一个 API 架构,用来保护.增强和控制对于 API 服务的访问. API 网关是一个处于应用程序或服务(提供 REST API 接口服务)之前的系统,用来 管理授 ...
- SpringCloud学习系列之七 ----- Zuul路由网关的过滤器和异常处理
前言 在上篇中介绍了SpringCloud Zuul路由网关的基本使用版本,本篇则介绍基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的路由 ...
- SpringCloud:网关getway 路由转发
Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开 ...
- springcloud家族路由系列之getway
springcloud家族路由系列之geteway springcloud家族路由系列之geteway 基础项目搭建(idea) 1.新建项目选择项目类型 2.设置项目团队名.产品名.项目类型.语言. ...
- SpringCloud Alibaba微服务实战(七) - 路由网关(Gateway)全局过滤
说在前面 全局过滤器作用于所有的路由,不需要单独配置,我们可以用它来实现很多统一化处理的业务需求,比如权限认证,IP 访问限制,监控,限流等等. 创建路由网关(Gateway)启动服务cloud-ac ...
最新文章
- 原始ajax方式调用asp.net后台方法
- 成为软件架构师的4个过程
- 登录和oauth机制
- 百分比单位始终根据父元素相应值来计算_CSS Viewport 单位,很多人还不知道使用它来快速布局!...
- windows创建任务计划(周期执行bat脚本)
- SharedMaterial的一些问题
- Win10网络图标消失,网络图标变成灰色,打开网络设置闪退等问题解决
- 安装rpcbind出错
- 最新版计算机知识超全题库,超全的计算机基础知识题库.doc
- 企业可以自己开发一套CRM系统吗?
- mysql5.6卸载干净_Mysql完全干净卸载教程
- 小白系统初始化配置资源失败怎么办
- Word设置默认粘贴格式,自动更改粘贴格式
- photoshop 用户名、组织或序列号丢失或无效的解决方法(转http://apps.hi.baidu.com/share/detail/10025023)
- RFC 822 中文版 MIME解析基础(4)(第5-6也)
- PayPal开发文档整理(8)——PayPal支付产品和解决方案
- 告别夏日的烤串,迎来秋季的凉爽
- 千万别小瞧九宫格 一道题就能让候选人原形毕露!
- FreeType 用法
- 大数据行业部署实战2:环境大数据统计