Gateway-网关
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
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、创建网关服务模块
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、访问测试,启动项目出现错误,两篇博客:(1)https://blog.csdn.net/qq_44349459/article/details/113613868 (2)https://blog.csdn.net/qq_44349459/article/details/113613287
a、网关测试user服务访问,先确定服务能够正常访问
网关访问,这样看来没问题的
b、网关测试product服务访问,先确定服务跑通
网关测试,确定能够访问
5、上述访问,在配置文件中都是把路径给定死了的,不能进行负载均衡访问,我们需要改一下yml中的配置,让访问从定死的连接变成consul注册中心的服务名。
总结
任何访问路由route都要经过网关,网关进行统一管理交给openfeign进行负载均衡分发。也就是说,不管是直接访问user,还是user——>product,都是从gateway进行路由转发。