测试环境:window10+jdk11+Nacos 2.1.1+springboot2.6.13+Spring Cloud2021.0.4+Spring Cloud Alibaba2021.0.4.0+spring-cloud-gateway3.1.4+spring-cloud-starter-loadbalancer3.1.4
作用:微服务网关
一、文档、资源
Spring Cloud Alibaba中文文档:
https://github.com/alibaba/spring-cloud-alibaba/blob/2021.x/README-zh.md
Spring Cloud Alibaba的Spring Cloud Gateway、 Nacos Discovery Example示例:
spring-cloud官网中的spring-cloud-gateway:
https://spring.io/projects/spring-cloud-gateway
github中的spring-cloud-gateway:
https://github.com/spring-cloud/spring-cloud-gateway
gateway网关服务(gai1):
链接: https://pan.baidu.com/s/1MWlA6CGtJ8TB1akwFMzZtA
提取码:1111
生产者服务(gai1-provider):
链接: https://pan.baidu.com/s/1U5AUGm-hXkEPUE8bUTPynA
提取码:1111
二、项目搭建
1.服务包括:nacos注册配置中心服务、gateway网关服务(gai1)、生产者服务(gai1-provider)
2.nacos服务、生产者服务搭建方式:
https://sgybk.zxsgy.cn/1/article12
3.gateway网关服务:
bootstrap.properties配置:
# 应用名称
spring.application.name=gai1
# 应用服务 WEB 访问端口
server.port=4002
#nacos地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
在nacos配置列表增加配置文件:
Data ID:gai1.properties
Group:DEFAULT_GROUP
配置格式:Properties
配置内容:
spring.cloud.gateway.routes[0].id=nacos-route-gai1-provider
spring.cloud.gateway.routes[0].uri=lb://gai1-provider
spring.cloud.gateway.routes[0].predicates[0].name=Path
spring.cloud.gateway.routes[0].predicates[0].args[pattern]=/gaip/**
id :路由唯一标示
uri :路由目标地址, http 代表固定地址, lb 代表根据服务名负载均衡
predicates:路由断言,按路径匹配,以/gaip开头就符合要求
发布
加pom依赖:
不能加spring-boot-starter-web,否则会报错
加spring-cloud-starter-loadbalancer提供负载均衡支持,不加会报There was an unexpected error (type=Service Unavailable,status=503)
三、跨域问题
请求通过网关转发就有可能出现跨域问题
非简单请求(PUT、DELETE)等,需要先发送预检请求,只要当想要访问的服务器允许跨域时,才可以发送真实请求
使用nginx解决:部署为同一域
使用gateway解决:配置当次请求允许跨域
四、其他配置
1.路由断言工厂Route Predicate Factory
网关路由可以配置的内容包括:
路由 id :路由唯一标示
uri :路由目的地,支持 lb 和 http 两种
predicates :路由断言,判断请求是否符合要求,符合则转发到路由目的地
filters :路由过滤器,处理请求或响应
路由断言工厂:
在配置文件中写的断言规则被 Predicate Factory 读取并处理转变为路由判断的条件
Spring 提供了 11 种基本的 Predicate 工厂,具体见springcloud官网。
2.路由过滤器 GatewayFilter
Spring提供了31种不同的路由过滤器工厂,例如:AddRequestHeader
将过滤器工厂写到default-filters下对所有的路由都生效
3.全局过滤器
对所有路由都生效的可自定义逻辑的过滤器
实现 GlobalFilter 接口,添加 @Order 注解或实现 Ordered 接口