文章目录
一、网关简介
前言
在微服务生产环境中,用户调用微服务要经过网关(API Gateway)。在单体应用中,调用服务及其简单。但在微服务中,调用服务就比较麻烦,因为不同的微服务可能用了不同的开发语言和协议。在微服务中,通过网关来处理服务的调用。
网关统一向外部系统(如访问者、服务)提供REST API。在Spring Cloud中使用Zuul、Spring Cloud Gateway等作为网关来实现动态路由、监控、回退、安全等功能。
1、Spring Cloud Gateway简介
1)简介
Spring Cloud Gateway是Spring Cloud生态系统中的网关,它是基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的,旨在为微服务提供一种简单有效的、统一的API路由管理方式,并为微服务架构提供安全、监控和弹性等功能。其目标是替代Zuul。(注意:本实验的Spring Cloud 版本较新,之前使用Zuul的方法已不适用,所以本实验采用Spring Cloud自自己的网关Spring Cloud Gateway)
2)特点
①基于Spring Framework 5、Project Reactor和Spring Boot2.0构建。
②能够匹配任何请求属性的路由。
③易于编写断言(Predicates)和过滤器(Filters)。 支持路径重写。
④支持动态路由。
⑤支持断路器。
⑥支持限流。
3)相关概念
①路由(Route)
路由是网关的基本单元。由一个ID、一个目标URI、一组断言(Predicates)和一组过滤器(Filters)来定义。
②断言(Predicates)
路由转发的判断条件,我们可以通过 Predicate 对 HTTP 请求进行匹配,例如请求方式、请求路径、请求头、参数等,如果请求与断言匹配成功,则将请求转发到相应的服务。
③过滤器(Filter)
使用它对请求进行拦截和修改,还可以使用它对上文的响应进行再处理。
4)Spring Cloud Gateway 通过 Predicate 断言来实现 Route 路由的匹配规则。简单点说,Predicate 是路由转发的判断件,请求只有满足了 Predicate 的条件,才会被转发到指定的服务上进行处理。
2、Spring Cloud Gateway的工作流程
二、网关入门实验
基本流程:
1、创建eureka-server项目
2.、创建eureka-provider项目
3.、创建gateway项目
4.、项目测试
(这里使用之前创建的eureka-server和eureka-provider项目)
1.在父级目录下创建lesson06-gateway模块。
2.在Pom文件中添加网关依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
3.添加配置文件
解释:
4.创建主包Gateway和启动类GatewayApplicaiton
(在gateway的启动类GatewayApplication中添加@EnableEurekaClient注解启动熔断功能)
5.启动测试
分别启动eureka-server2、eureka-provider2和gateway服务,在网页地址栏输入http://127.0.0.1:8835/port和http://127.0.0.1:8835/eureka-provider/student?id=自己学号,正常出现以下两个效果说明网关初步搭建成功。
6.路由规则测试
在application.yml中添加路由的时间断言。
根据实际情况修改时间后重启gateway服务,并在网页中重新访问http://127.0.0.1:8835/port
现象:
原因:这句话的意思是在4.4号20时之前的请求,才会被转发到http://127.0.0.1:8835/上;
现将时间改为19时,目前时间为19:10分,请求没有被转发,报错,如下:
三、动态路由实验
1.对实验一中的application.yml进行修改,修改成如下:
(在微服务很多情况下,不太可能记住所有微服务的ip地址,因此需要借助gateway的动态路由功能,动态路由只需在配置文件中进行修改)
2.重启gateway项目,在网页上输入http://127.0.0.1:8835/port并一直刷新,如果在7006和7007之间相互切换说明动态路由成功。
四、网关断路器实验
网关应该对与异常的服务进行熔断,避免因服务异常导致网关出现访问积压,需要为网关开启断路器。
1.在pom中添加依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
</dependency>
整体:
其中:
注意:新版Spring Cloud 已把hytrix更新为了circuitbreaker
2.在application.yml中添加断路过滤器,注意缩进!!!
3.创建Controller包,在包内编写断路器触发时的回退方案:
(当所访问的服务出现异常,则网关会进入/fallback进行熔断降级)
4.测试断路器
重启gateway项目,在网页中输入http://127.0.0.1:8835/port,此时应该是正常的返回:
关闭provider其中的一个(如关闭7006),此时刷新网页,如果出现以下界面说明断路器成功:
五、网关统一鉴权实验
统一鉴权是实际开发中比较常见的,只有拥有授权的用户才能通过网关访问微服务内部的服务,统一鉴权一般在全局过滤器中实现。
1.创建Filters包并在包在创建AutoCheckFilter类实现GlobalFilter接口,具体代码如下截图:
2.测试鉴权
重启gateway,在网页上输入http://127.0.0.1:8835/port,如果出现以下界面,说明鉴权成功。
3.使用Postman带鉴权访问,首先双击Postman-win64-9.15.2-Setup.exe安装.
运行postman后添加一个访问:
注意保证7006和7007两个服务提供者都处于开启状态,如果第一次访问出现被熔断现象,可以多点send几次。