① 什么是网关?
API 网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过 API 网关这一层。
网关的出现原因是伴随微服务架构的出现而出现,因为不同的微服务一般有不同的网络地址(ip+port),但客户端的一个请求可能需要多个微服务的接口互调才可以实现。
它是Spring Cloud团队的一个全新项目,基于Spring 5.0、SpringBoot2.0、Project Reactor 等技术开发的网关。 旨在为微服务架构提供一种简单、有效、统一的API路由管理方式。
目标是替代Netflix Zuul。Gateway不仅提供统一路由方式,并且基于Filter链的方式提供网关的基本功能。例如:安全,监控/指标,和限流
② 网关可以做什么?
如果让客户端直接与各个微服务通信,存在下列问题:
客户端会多次请求不同的微服务,增加了客户端的复杂性。(客户端维护微服务的ip+port)
存在跨域请求,在一定场景下处理相对复杂。
认证复杂,每个服务都需要独立认证。
难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信,那么重构将会很难实施。
某些微服务可能使用了防火墙 / 浏览器不友好的协议,直接访问会有一定的困难。
网关的出现可以帮助开发者解决上述问题。
③ 网关的优点?
易于监控。可以在网关收集监控数据并将其推送到外部系统进行分析。
易于认证。可以在网关上进行认证,然后再将请求转发到后端的微服务,而无须在每个微服务中进行认证。
减少了客户端与各个微服务之间的交互次数
2.11 GateWay案例演示
0 明确点
Gateway作为springcloud的网关组件,它本身也是一个微服务,是专门用来处理客户端请求的,对于EurekaServer注册中心来说,网关微服务也是客户端,它也需要交给注册中心管理。
① 创建网关微服务项目
(1)创建gateway_service网关项目,导入依赖

<dependencies><!--网关依赖--><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>

② 标注启动类为注册中心客户端

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

③ 编写application.yml配置文件,配置基础路由

#配置网关服务端口
server:port: 8084
#配置网关服务的名称
spring:application:name: gateway-servicecloud:gateway:routes:- id: user-service  #id是唯一标识,可以任意起名uri: http://127.0.0.1:8081  #此时的路由地址是写死的,只能访问一个微服务predicates:#/user/**所有以/user开始的请求都将被路由到uri指定的服务地址- Path=/user/**
#指定eureka的注册中心地址
eureka:client:service-url:defaultZone: http://127.0.0.1:7001/eureka

④ 启动网关服务,测试
我们通过访问http://localhost:8084/user/find/1,通过网关配置路由到http://localhost:8081/user/find/1

⑤ 动态路由
之前说上面的路由方式是将微服务写死的,实际开发中我们的微服务如果是集群方式,那么静态路由就不再方便使用了,下面我们就看下动态路由如何配置!!!

#配置网关服务的名称
spring:application:name: gateway-servicecloud:gateway:routes:- id: user-service  #id是唯一标识,可以任意起名#uri: http://127.0.0.1:8081  #此时的路由地址是写死的,只能访问一个微服务#lb协议表示从Eureka注册中心获取服务请求地址 lb://服务名称#路由地址如果通过lb协议加服务名称时,会自动使用负载均衡访问对应服务uri: lb://user-producerpredicates:#/user/**所有以/user开始的请求都将被路由到uri指定的服务地址- Path=/user/**

测试:负载均衡Ribbon(默认轮询)

路由配置中uri所用的协议为lb时,gateway将把user-producer解析为实际的主机和端口,并通过Ribbon进行负载均衡
1默认过滤器
Gateway api网关服务 参数解释:
Route(路由):路由是网关的基本单元,由ID、URI、一组Predicate、一组Filter组成,根据Predicate进行匹配转发。
Predicate(谓语、断言):路由转发的判断条件
Filter(过滤器):过滤器是路由转发请求时所经过的过滤逻辑,可用于修改请求、响应内容。
① 过滤器作用
过滤器作为Gateway的重要功能。常用于请求鉴权、服务调用时长统计、修改请求或响应header、限流、去除路径等
② 过滤器分类
(1)默认过滤器 出厂自带 已经实现好的,可以直接使用
全局默认过滤器
局部默认过滤器
(2)自定义过滤器
全局自定义过滤器
局部自定义过滤器
(3)全局过滤器和局部过滤器区别
全局是对所有的id有效,局部只是对某一个id有效
③ 全局过滤器案例演示
需求一:使用全局过滤器,实现对输出响应头设置属性
(1)配置网关服务中的application文件

#配置网关服务的名称
spring:application:name: gateway-servicecloud:gateway:routes:- id: user-service  #id是唯一标识,可以任意起名#uri: http://127.0.0.1:8081  #此时的路由地址是写死的,只能访问一个微服务#lb协议表示从Eureka注册中心获取服务请求地址 lb://服务名称#路由地址如果通过lb协议加服务名称时,会自动使用负载均衡访问对应服务uri: lb://user-producerpredicates:#/user/**所有以/user开始的请求都将被路由到uri指定的服务地址- Path=/user/**default-filters:  #配置默认全局过滤器- AddResponseHeader=X-Response-Default-MyName,swk

(2)访问测试

④ 局部过滤器案例演示
需求一:添加路径前缀
(1)修改网关服务的application文件,添加前缀路径

#配置网关服务的名称
spring:application:name: gateway-servicecloud:gateway:routes:- id: user-service  #id是唯一标识,可以任意起名#uri: http://127.0.0.1:8081  #此时的路由地址是写死的,只能访问一个微服务#lb协议表示从Eureka注册中心获取服务请求地址 lb://服务名称#路由地址如果通过lb协议加服务名称时,会自动使用负载均衡访问对应服务uri: lb://user-producerpredicates:#/user/**所有以/user开始的请求都将被路由到uri指定的服务地址#- Path=/user/**- Path=/**   #注意:这个要修改filters:   #局部过滤器添加前缀- PrefixPath=/userdefault-filters:  #配置默认全局过滤器- AddResponseHeader=X-Response-Default-MyName,swk

(2)路由地址信息:
(3)测试

需求二:去除路径前缀
注意:去除前缀和添加前缀不可以同时使用
(1)修改网关服务的application文件,去除前缀路径

#配置网关服务的名称
spring:application:name: gateway-servicecloud:gateway:routes:- id: user-service  #id是唯一标识,可以任意起名#uri: http://127.0.0.1:8081  #此时的路由地址是写死的,只能访问一个微服务#lb协议表示从Eureka注册中心获取服务请求地址 lb://服务名称#路由地址如果通过lb协议加服务名称时,会自动使用负载均衡访问对应服务uri: lb://user-producerpredicates:#/user/**所有以/user开始的请求都将被路由到uri指定的服务地址#- Path=/user/**- Path=/**filters:#- PrefixPath=/user #添加前缀- StripPrefix=1     #去除前缀(添加和去除不可以同时使用)default-filters:  #配置默认全局过滤器- AddResponseHeader=X-Response-Default-MyName,swk

(2)路由地址信息

(3)测试

2自定义过滤器
① 自定义全局过滤器
需求:模拟登陆校验
基本逻辑:如果请求中有Token参数,则认为请求有效放行,如果没有则拦截提示授权无效
(1)在网关服务中,编写全局过滤器

@Component
public class LoginGlobalFilter implements GlobalFilter, Order {@Overridepublic Class<? extends Annotation> annotationType() {return null;}@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();ServerHttpResponse response = exchange.getResponse();//从参数中获取tokenString token = request.getQueryParams().getFirst("token");if(StringUtils.isEmpty(token)){//token不存在,则没有登录,状态设置401response.setStatusCode(HttpStatus.UNAUTHORIZED);//结束请求return response.setComplete();}//带有token,直接放行return chain.filter(exchange);}/**** 定义过滤器执行顺序* 返回值越小,越靠前执行* @return*/@Overridepublic int value() {return 0;}
}

(2)访问接口测试,带token和不带token


② 自定义局部过滤器
自定义局部过滤器,该过滤器在控制台输出配置文件中指定名称的请求参数及参数的值。
局部过滤器作用范围:该局部过滤器在哪个id下配置,则该局部过滤器只针对该id的路由规则有效。
(1)编写自定义局部过滤器

//注意:局部过滤器类起名时MyParam后面部分是固定的,主要是前面部分
@Component
public class MyParamGatewayFilterFactory extends AbstractGatewayFilterFactory {/*** 拦截当前id对应的请求* @param config* @return*/@Overridepublic GatewayFilter apply(Object config) {return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("局部拦截器!!!");return chain.filter(exchange);}};}/**** 构造函数*/public MyParamGatewayFilterFactory() {super(MyParamGatewayFilterFactory.Config.class);}/***** 在该类执行初始化后,可以在这里执行相关初始化操作*/public static class Config {}
}

(2)指定使用局部过滤器

#配置网关服务的名称
spring:application:name: gateway-servicecloud:gateway:routes:- id: user-service  #id是唯一标识,可以任意起名#uri: http://127.0.0.1:8081  #此时的路由地址是写死的,只能访问一个微服务#lb协议表示从Eureka注册中心获取服务请求地址 lb://服务名称#路由地址如果通过lb协议加服务名称时,会自动使用负载均衡访问对应服务uri: lb://user-producerpredicates:#/user/**所有以/user开始的请求都将被路由到uri指定的服务地址#- Path=/user/**- Path=/**filters:#- PrefixPath=/user #添加前缀- StripPrefix=1     #去除前缀(添加和去除不可以同时使用)- MyParam          #配置局部过滤器default-filters:  #配置默认全局过滤器- AddResponseHeader=X-Response-Default-MyName,swk

(3)测试

3 总结
①掌握网关的作用
②会配置动态路由
③会配置过滤器
④能自定义全局过滤器

springcloud五大神兽之Gateway相关推荐

  1. springcloud五大神兽之Eureka介绍

    一.springcloud简介 1.0 什么是微服务? ① 业务角度 从业务角度分析,就是将整体项目(传统的一站式应用)按照业务拆分,将每个业务拆分为一个个独立的服务,彻底解除业务模块之间的耦合,每个 ...

  2. SpringCloud五大神兽之Eureka服务注册(三)——Eureka的自我保护

    一.ACID与CAP 传统ACID: A:atomicity   原子性 C:consistency    一致性 I:isolation    独立性 D:durability    持久性 目前流 ...

  3. SpringCloud五大神兽快速入门

    Spring Cloud 单一应用架构 :主要解决ORM 数据库访问层. 垂直应用架构 : 解决分层问题,实现应用的分层开发,提升开发效率. 分布式应用架构:解决系统间调用问题,引发了SOA(面向服务 ...

  4. springcloud五大神兽及其原理

    一.使用eureka做注册中心 个人版本的初级springcloud总体结构 一.使用eureka做注册中心 总体说明: 会员和订单都以服务的形式存在(即只有接口,没有页面的那种工程),springc ...

  5. springCloud五大神兽(思维导图)

    SpringCloud的五大件 思维导图 服务发现--Netflix Eureka 客服端负载均衡--Netflix Ribbon 断路器--Netflix Hystrix 服务网关--Netflix ...

  6. SpringCloud五大神兽01-Eureka注册中心

    SpringCloud01-Eureka注册中心 1.简介 Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间 ...

  7. SpringCloud五大神兽03-Hystrix断路器(豪猪)

    1.简介 雪崩:在微服务架构中,假如某个微服务无法正常运行就会形成阻塞,导致调用这个微服务的其他所有微服务都会阻塞.到达某个时间节点,服务器的并发量会达到峰值,这样的话,后续其他请求即使访问的不是当前 ...

  8. 一、SpringCloud五大神兽之Eureka(eurekaServer集群)

    基本概念和方案 Eureka是基于REST(Representational State Transfer,代表性状态传输)的服务,主要用于AWS云中定位服务,以实现中间层服务器的负载平衡和故障转移. ...

  9. SpringCloud五大神兽之Eureka服务注册(一)

    一.什么是Eureka? 官方翻译:Eureka是一个基于Rest的服务,用于定位服务,以实现云端中间层服务发现和故障转移.即--Eureka主管服务的注册与发现. 在微服务架构中,只需要使用服务的标 ...

最新文章

  1. 中国大学生创业报告发布
  2. android studio没有org.apache.http.client.HttpClient;等包问题 解决方案
  3. 幼儿园课程体系结构图_全人教育、均衡发展课程体系介绍
  4. Ubuntu启用休眠hibernate
  5. Docker使用国内镜像仓库
  6. 7.4.3 矩阵极分解和平方根分解
  7. CCIE理论-第九篇-IPV6详细介绍
  8. python 数据分析 实际案例_python在实际工作中运用的案例
  9. python的cgi配置教程_Python CGI环境在不同操作系统中配置方法
  10. Unity打开的文件是杂项文件的处理方法
  11. 笔记四:onsubmit和onclick的区别
  12. php 中访问常量,php 中的常量
  13. 中国联通沃支付echop支付插件
  14. 什么是深度卷积神经网络,卷积神经网络怎么学
  15. wps中怎么在奇数页的页眉中设置整本书的标题,而在偶数页中设置该章的标题,同时请问怎样修改页码的字体?
  16. 点云配准icp算法推导
  17. Linux stress
  18. Navigation网站收藏和导航平台
  19. python文件操作seek()偏移量,读取指正到指定位置
  20. 动态连接库和静态链接库

热门文章

  1. 高中计算机应用基础知识课件,计算机应用基础(windows 7+office 2010)课件 第一章 计算机基础知识.ppt.pdf-汇文网...
  2. soul网关mysql8_深度解析 Soul 网关——数据同步
  3. 【物联网】三大厂家NB-IOT卡对比
  4. Pyqt qtableview 大量动态刷新数据
  5. java断路器原理_spring cloud 入门系列四:使用Hystrix 实现断路器进行服务容错保护...
  6. 庚子中秋之际,走进刘易斯的S4 刘易斯逻辑之十
  7. MySQL数据库如何对查询结果进行编号、编序号
  8. 【PMP考前冲刺题-第一小节(2022.7)】
  9. 怎样快速对二进制和十进制进行互转化——IP地址规划与设计总结
  10. 如何运用计算机辅助英语教学,谈英语计算机辅助教学 (中学英语教学论文)