网关功能:
身份认证和权限校验
服务路由、负载均衡
请求限流
?在SpringCloud中网关的实现包括两种:
gateway
zuul Zuul是基于Servlet的实现,属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能。
网关的作用:
对用户请求做身份认证、权限校验
将用户请求路由到微服务,并实现负载均衡
对用户请求做限流?
?<!--网关依赖-->
<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>
server:
? port: 10010 # 网关端口
spring:
? application:
? ? name: gateway # 服务名称
? cloud:
? ? nacos:
? ? ? server-addr: localhost:8848 # nacos地址
? ? gateway:
? ? ? routes: # 网关路由配置
? ? ? ? - id: user-service # 路由id,自定义,只要唯一即可
? ? ? ? ? # uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
? ? ? ? ? uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称
? ? ? ? ? predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
? ? ? ? ? ? - Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求
?
?给所有进入userservice的请求添加一个请求头
给所有进入userservice的请求添加一个请求头:Truth=itcast is freaking awesome!
实现方式:在gateway中修改application.yml文件,给userservice的路由添加过滤器:
如果要对所有的路由都生效,则可以将过滤器工厂写到default下。格式如下:?
?
过滤器的作用是什么?
对路由的请求或响应做加工处理,比如添加请求头
配置在路由下的过滤器只对当前路由的请求生效
defaultFilters的作用是什么?
对所有路由都生效的过滤器
?全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。 区别在于GatewayFilter通过配置定义,处理逻辑是固定的。而GlobalFilter的逻辑需要自己写代码实现。 定义方式是实现GlobalFilter接口。
public interface GlobalFilter {?
/** ? ? * ?处理当前请求,有必要的话通过{@link GatewayFilterChain}将请求交给下一个过滤器处理 ? ? * ? ? * @param exchange 请求上下文,里面可以获取Request、Response等信息
? ? * @param chain 用来把请求委托给下一个过滤器 ? ?
* @return {@code Mono<Void>} 返回标示当前过滤器业务结束 ? ? */?
Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}
需求:定义全局过滤器,拦截请求,判断请求的参数是否满足下面条件: 参数中是否有authorization, authorization参数值是否为admin 如果同时满足则放行,否则拦截
?
实现全局过滤器的步骤?
实现GlobalFilter接口
添加@Order注解或实现Ordered接口
编写处理逻辑?
?
路由过滤器、defaultFilter、全局过滤器的执行顺序?
order值越小,优先级越高 当order值一样时,顺序是defaultFilter最先,然后是局部的路由过滤器,最后是全局过滤器?
?跨域:域名不一致就是跨域,主要包括:
域名不同: www.taobao.com 和 www.taobao.org 和 www.jd.com 和 miaosha.jd.com 域名相同,端口不同:localhost:8080和localhost8081
跨域问题:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题 解决方案:CORS