gate网关是什么?
gateway网关是用来保护,控制,和增强对api的访问。让外部不能直接访问提供服务的系统。而是先访问gateway网关,在gateway官网内先路径匹配,如果匹配成功网关就会先转发到相对应的服务提供者。gateway网关是和业务紧耦合的。
gateway三大核心
- 路由(Route): 路由是构建网关的基本模块,它由ID、目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由
- 断言(Predicate): 相当于匹配条件
- 过滤器(Filter): 相当于拦截器
Predicate 加上Filter再加上目标的uri就是一个路由。
gateway的工作原理
对于这张图的解释官网是这样说的:
客户端向 Spring Cloud 网关发出请求。如果网关处理程序映射确定请求与路由匹配,则会将其发送到网关 Web 处理程序。 此处理程序通过特定于请求的筛选器链运行请求。 筛选器用虚线划分的原因是筛选器可以在发送代理请求之前和之后运行逻辑。 执行所有“pre”过滤器逻辑。然后发出代理请求。发出代理请求后,将运行“post”筛选器逻辑。
这给核心的逻辑就是:路由转发+过滤器链
gateway网关的使用
先导入spring-cloud-starter-gateway依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
注意:
如果报错:
Exception encountered during context initialization - cancelling refresh attempt:
org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'dataSource' defined in class path resource
[org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Dbcp2.class]:
Bean instantiation via factory method failed;
nested exception is org.springframework.beans.BeanInstantiationException:
Failed to instantiate [org.apache.commons.dbcp2.BasicDataSource]:
Factory method 'dataSource' threw exception; nested exception is
org.springframework.boot.autoconfigure.jdbc.DataSourceProperties
$DataSourceBeanCreationException: Failed to determine a suitable driver class
要在@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})排除数据源的自动配置。
编写配置文件(包括处理跨域问题)
server:
port: 88
spring:
cloud:
gateway:#一下是配置跨域问题
globalcors:
cors-configurations:
'[/**]':
allowedOrigins: "*"#允许全部访问源
allowedMethods: "*" #允许所有访问方式
allowCredentials: true #允许跨越发送cookie
allowedHeaders: "*" #放行全部原始头信息
add-to-simple-url-handler-mapping: true
default-filters:
- DedupeResponseHeader=Access-Control-Allow-Origin Access-Control-Allow-Credentials Vary, RETAIN_UNIQUE #剔除响应头中重复的值
#配置路由
routes:
- id: product #自定义(保证唯一)
uri: lb://gulimall-product(lb 表示负载均衡 gulimall-product表示服务名)
predicates:# 匹配条件
- Path=/api/product/**
filters:
- RewritePath=/api/product/(?<segment>.*),/$\{segment} #对发送到gateway的路径进行重写
#例如:
#访问gateway的是/api/product/list 那么重写后是:/list
#重写后的路径是真正访问的服务对应的接口。
- id: gete_way_VerificationCode
uri: lb://renren-fast
predicates:
- Path=/api/**
filters:
- RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}