Gateway 网关
作者:互联网
Gateway
gateway功能:
-
身份认证和权限校验
-
服务路由(访问哪一个服务),负载均衡(服务之间Ribbon)
-
对用户请求限流
gateway的技术实现:
-
gateway
-
zuul
*zuul是基于servlet的实现,属于阻塞式编程,
*SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能
网关搭建的步骤
-
创建项目,引入nacos服务发现和gateway的依赖
<!--gateway starter依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--Nacos的服务发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency> -
配置application.yml,包括服务基本信息,nacos地址,路由
-
路由:
-
路由id, 路由的唯一标识
-
路由目标uri: 路由的目标地址,http代表固定地址,lb代表根服务名据负载均衡
-
路由断言(predicates);判断路由的规则
-
路由过滤器(filters):对请求或者响应做处理。
-
server:
port: 10010 #服务端口
spring:
application:
name: gateway #服务名称
cloud:
nacos:
server-addr: localhost:8848 #nacos 的地址
#配置网关
gateway:
routes: #配置路由,可以配置多个
- id: user-server #gateway唯一标识(任意)
uri: lb://userservice #lb是loadBalanced的缩写(负载均衡),然后是服务名
predicates: #断言 boolean表达式 判断请求是否否和路由规则
- Path=/user/** #符合这个路径的放行
- id: order-server
uri: lb://orderserver
predicates: #可以配置多个
- Path=/order/**
路由断言工厂Route Predicate Factory
-
作用:
-
判断用户的断言规则,然后解析成对应的判断条件,用户请求过来做判断
-
-
在我们的配置文件中写的断言只是字符串,这些字符串会被Predicate Factory 读取并解析,转变为判断路由的判断条件
-
这样的断言工厂在SpringCloudGateway还有十几个
路由过滤器 GatewayFilter
-
GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理。
-
过滤器的作用是什么?
-
对路由的请求或者响应做加工处理,比如添加请求头
-
配置在路由下的过滤器只对当前路由的请求生效
-
-
defaultFilter的作用是什么?
-
对所有路由都生效的过滤器
-
全局过滤器GlobalFilter
-
全局过滤器的作用也是处理一切是进入网关的请求和微服务响应,与GatewayFilter的作用一样。
-
区别在于GatewayFilter通过配置定义,处理逻辑是固定的,
-
GlobalFilter的逻辑需要自己写代码实现。
-
定义方式是实GlobalFilter接口。
package cn.itcast.gateway;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.lang.annotation.Annotation;
//@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter , Order {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//获取请求对象
ServerHttpRequest request = exchange.getRequest();
//获取请求参数
MultiValueMap<String, String> queryParams = request.getQueryParams();
//获取authorization
String auth = queryParams.getFirst("authorization");
//判断是否等于admin
if ("admin".equals(auth)) {
//等于放行
return chain.filter(exchange);
}
//拦截
//禁止访问
// exchange.getResponse().getStatusCode(HttpStatus.FORBIDDEN);
//结束处理
return exchange.getResponse().setComplete();
}
@Override
public int value() {
return -1;
}
@Override
public Class<? extends Annotation> annotationType() {
return null;
}
}
GatewayFilter 的过滤执行顺序
-
order值越小,优先级越高
-
当order值一样时,顺序是defaultFilter最先,然后是局部的路由过滤器,最后是全局过滤器
网关的CORS跨域
-
跨域:域名不一致,主要包括:
-
域名不同:
-
域名相同,端口不同:
-
跨域问题:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题。
-
解决方案:CORS
-
spring:
cloud:
gateway:
globalcors: # 全局的跨域处理
add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
corsConfigurations:
'[/**]':
allowedOrigins: # 允许哪些网站的跨域请求
- "http://localhost:8090"
- "http://www.leyou.com"
allowedMethods: # 允许的跨域ajax的请求方式
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowedHeaders: "*" # 允许在请求中携带的头信息
allowCredentials: true # 是否允许携带cookie
maxAge: 360000 # 这次跨域检测的有效期
标签:网关,请求,springframework,gateway,org,import,Gateway,路由 来源: https://www.cnblogs.com/yzlworld/p/16500105.html