Gateway是啥玩意?
说法一:gateway是springmvc之上构建api网关的库,提供了一种简单的方法,来路由API,为api提供横切关注点(安全性,监控,度量,弹性-可扩展性)
说法二:为微服务架构提供一种简单而有效的统一API路由管理方式。Spring Cloud Gateway目标是替代zuul,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关的基本功能,例如:安全,监控、埋点,限流等。
Gateway官方结构
看起来有点想springmvc的访问流程,经过dispatcher分发到控制中心HandlerMapping,springmvc工作流程可以参考这位博主:https://www.cnblogs.com/hamawep789/p/10840774.html
![](https://i-blog.csdnimg.cn/blog_migrate/3a4dc50be628e9d7804628a36434d69b.png)
Gateway职能
1、请求接入:作为所有API接口服务请求的接入点
2、业务聚合:作为所有后端业务服务的聚合点,所有服务访问都从网关出发
3、中介策略:实现安全性、验证、路由、过滤、流量控制等策略
4、统一管理:对所有API服务和策略进行统一管理
Gateway重要概念
Route(路由):这是网关的基本,它是一个ID,一个目标URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。
Predicate(断言):输入类型是一个ServerWeb。
FIlter(过滤器):Gateway中的Filter分为两种类型的Filter,分别是GatewayFilter和Global Fileter。过滤器Filter将会对请求和响应进行修改处理。
gateway:
routes:
- id: user_server
#uri: http://localhost:9998/
uri: lb://user9998 #这个是注册中心的服务名
predicates:
- Path=/user/**
Gateway最小案例
开发流程:1、创建网关服务模块
![](https://i-blog.csdnimg.cn/blog_migrate/181e42abeb2511272f887c3acfb6b3b4.png)
2、依赖配置,尽量和我的保持一致,参考前面创建项目的文档,这里注释了web依赖,添加版本管理、consul注册中心、健康检查、Gateway网关等依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.demo</groupId>
<artifactId>gateway</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gateway</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR6</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--consul注册中心的依赖 因为eureka2.0已经停止更新 所以就没有去用他-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!--这个包是用来健康监控的-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--引入gateway-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3、这里需要修改一下配置文件名字,properties改成yum,为了同步官网的配置
server:
port: 8989 #网关端口
spring:
application:
name: gateway #consul注册名
cloud:
consul:
host: localhost
port: 8500 #把自己往consul注册中心扔
gateway:
routes:
- id: user_server
uri: http://localhost:9998/
#uri: lb://user9998 #这个是注册中心的服务名
predicates:
- Path=/user/**
- id: product_server #自己给服务取的名字
uri: http://localhost:9997/ #服务访问的地址
#uri: lb://product9997 #从注册中心拿到该服务的名称
predicates: #断言
- Path=/product/**
4、访问测试
a、网关测试user服务访问,先确定服务能够正常访问
![](https://i-blog.csdnimg.cn/blog_migrate/36da5799a97d126851e2248975386caa.png)
网关访问,这样看来没问题的
![](https://i-blog.csdnimg.cn/blog_migrate/0e6118817f180ff0d87d1865934b562a.png)
b、网关测试product服务访问,先确定服务跑通
![](https://i-blog.csdnimg.cn/blog_migrate/5ffe086751542c31d9420a4abf93132e.png)
网关测试,确定能够访问
![](https://i-blog.csdnimg.cn/blog_migrate/7c30154818d0b578789a7cea84092525.png)
5、上述访问,在配置文件中都是把路径给定死了的,不能进行负载均衡访问,我们需要改一下yml中的配置,让访问从定死的连接变成consul注册中心的服务名。
![](https://i-blog.csdnimg.cn/blog_migrate/9637644fbfbad74cd2dd059494d346b0.png)
总结
任何访问路由route都要经过网关,网关进行统一管理交给openfeign进行负载均衡分发。也就是说,不管是直接访问user,还是user——>product,都是从gateway进行路由转发。