统一网关--gateway(仅供自己参考)
1、网关的概念:
2、网关的功能:
(1):身份认证和权限校验
(2):服务路由(具体的业务路由到具体的服务),负载均衡(多台服务的话,服务之间进行负载均衡)
(3):请求限流(不能超过服务承受的最大请求)
3、springcloud中网关实现的两种方式:
(1):zuul
(2):gateway
两个的优缺点:zuul是基于servlet实现的阻塞式编程,而gateway是基于spring5提供的webflux实现的响应式的编程。gateway的性能比较好,吞吐量比较好
二、
1、gateway的基本配置
2、路由断言工厂(Route Predicates Factory):
+ :我们配置文件中配置的路由字符串规则会被factory路由工厂读取,然后将这些字符串规则转为判断条件。当有请求进入,看这个请求是否符合这些条件。符合则向服务器转发, 不符合则返回404
三、路由过滤器(GatewayFilter)可以对进入网关的请求和微服务的响应做处理
1、局部路由过滤器:(在相应路由的微服务生效)
添加方式:
gateway:
routes:
- id: user-service #路由id,唯一即可
#uri: http://loaclhost:8080 目标地址也可以是这样,但常用的是下方的
uri: lb://user-server #路径的目标地址,lb负载均衡。user-service是具体的服务名称
predicates:
- Path=/user/**
- id: order-service
uri: lb://order-server
predicates:
- Path=/order/**
default-filters:
- AddRequestHeader=truth,cc is awesome #全局default
# filters:
# - AddRequestHeader=truth,cc is awesome #局部
2、默认路由过滤器:default-filters(所有的微服务都可以生效)
3、全局过滤器(GlobalFilter):在已经有了一个default-filter全局的情况下为什么还需要这个全局的呢?因为全局过滤器可以更好地实现逻辑的处理。default-filter是配置的情况,复杂逻辑难以实现,所以产生了全局过滤器。
package org.example.filter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpHeaders;
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;
@Component
@Order(1) //设置过滤器的等级,越小等级越高,负数也可以
public class AuthGlobalFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest(); //请求request
HttpHeaders headers = request.getHeaders();
MultiValueMap<String, String> queryParams = request.getQueryParams(); //request中携带的参数
String auth = queryParams.getFirst("auth"); //获取某一个参数
if("admin".equals(auth)) //参数相等则继续到下一个过滤器
{
return chain.filter(exchange); //放行
}
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); //设置响应code
return exchange.getResponse().setComplete(); //拦截返回
}
}
4、过滤器的执行顺序,局部和默认过滤器的order值为1,如果下面有多个则依次增大。
如果全局和局部和默认过滤器的order值相等的话,则依次按照默认->局部->全局的执行顺序
五、Gateway的cors的跨域问题:
跨域:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题
跨域出现的情况:
-
不同协议:比如从
http://example.com
请求https://example.com
。 -
不同域名:从
http://example.com
请求http://another-domain.com
。 -
不同端口:从
http://example.com:80
请求http://example.com:8080
。
解决方案: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 # 这次跨域检测的有效期