GateWay简介
GateWay是微服务架构下的服务网关。它的诞生背景是Netflix公司,对于推出的zuul 1.x版本不满意,即将推出zuul 2.x,但是2.x的版本又迟迟未完工的情况下。于是Spring Cloud开源社区推出了GateWay来代替zuul 1.x。
Spring Cloud具有以下的特性:
- 基于Spring Framework 5,Project Reactor和Spring Boot 2.x进行构建的。
- 动态路由:能够匹配任何请求路由
- 可以对路由制定Predicate(断言)和Filter(过滤)
- 集成Hystrix的断路器功能
- 集成Spring Cloud服务发现功能
- 请求限流、支持路径重写
GateWay三大核心概念
- Route(路由)
路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如断言为true则匹配该路由。 - Predicate(断言)
参考的是Java8的java.util.function.Predicate
开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由。 - Filter(过滤)
指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。
GateWay的配置使用
- 构建GateWay微服务模块,引入GateWay所需要的依赖
<dependency>#如未使用eureka请忽略该项依赖
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>#引入gateway所需依赖,并剔除掉web依赖
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</exclusion>
</exclusions>
</dependency>
- yml文件中配置GateWay所需要的配置
server:
port: 9527
servlet:
context-path: /
spring:
application:
name: gateway #微服务名称
cloud:
gateway:
routes:
- id: payment_routh #payment_routh #路由的ID,没有固定规则但要求唯一,简易配合服务名
uri: http://localhost:8001 #匹配后提供服务的路由地址
predicates:
- Path=/payment/getPayment/** #断言,路径相匹配的进行路由
- 分别启动8001服务端与gateway配置的9527端口
访问配置的8001端口
若gateway配置成功,则可以通过gateway的yml文件中配置的可以通过9527端口访问到/payment/getPayment/** 下的配置
注意:gateway项目启动过成功,若出现微服务启动成功,但后台报了微服务配置相关错误,请不要忽略报错信息,否则可能会导致网关配置失败!!!
使用GateWay配置外网链接
参考官网配置:https://spring.io/projects/spring-cloud-gateway
- 创建一个配置类GateWayConfig
- 配置相关Bean
@Configuration
public class GateWayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes().route("gateway-route-1", //路由名称,随便取,但是具体开发环境起的名称应该有意义
r -> r.path("/cloudGateWay"). //配置本地访问路径
uri("https://spring.io/projects/spring-cloud-gateway")). //配置远程代理页面
build();
}
}
- 测试
如此我们就可以通过http://localhost:9527/cloudGateWay访问到spring官网的gateway相关的说明Api
以上的配置中,uri被写死了,会造成微服务环境下,扩容的困难
配置动态路由
修改yml配置文件
spring:
application:
name: gateway
cloud:
gateway:
routes:
- id: payment_routh #payment_routh #路由的ID,没有固定规则但要求唯一,简易配合服务名
#uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://PROVIDER-PAYMENT #将uri修改为为微服务模块名称,lb意思为负载均衡
predicates:
- Path=/payment/getPayment/** #断言,路径相匹配的进行路由
discovery: #新增
locator:
enabled: true
启动多个PROVIDER-PAYMENT 模块,就会发现通过9527端口访问的接口,在8001与8002之间切换