springcloud微服务篇--6.网关Gateway

一、为什么需要网关?

网关功能:

身份认证和权限校验

服务路由、负载均衡

请求限流

在SpringCloud中网关的实现包括两种:

gateway

zuul Zuul是基于Servlet的实现,属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能。

网关的作用:

对用户请求做身份认证、权限校验

将用户请求路由到微服务,并实现负载均衡

对用户请求做限流

二、搭建网关服务

1、创建新的module,引入SpringCloudGateway的依赖和nacos的服务发现依赖:

<!--网关依赖-->

<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>

2、编写路由配置及nacos地址

**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/开头就符合要求**

三、过滤器工厂。

案例1:

给所有进入userservice的请求添加一个请求头

给所有进入userservice的请求添加一个请求头:Truth=itcast is freaking awesome!

实现方式:在gateway中修改application.yml文件,给userservice的路由添加过滤器:

如果要对所有的路由都生效,则可以将过滤器工厂写到default下。格式如下:

1.过滤器的作用:

过滤器的作用是什么?

对路由的请求或响应做加工处理,比如添加请求头

配置在路由下的过滤器只对当前路由的请求生效

defaultFilters的作用是什么?

对所有路由都生效的过滤器

全局过滤器 GlobalFilter

全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。 区别在于GatewayFilter通过配置定义,处理逻辑是固定的。而GlobalFilter的逻辑需要自己写代码实现。 定义方式是实现GlobalFilter接口。

java 复制代码
public interface GlobalFilter { 

/**     *  处理当前请求,有必要的话通过{@link GatewayFilterChain}将请求交给下一个过滤器处理     *     * @param exchange 请求上下文,里面可以获取Request、Response等信息
     * @param chain 用来把请求委托给下一个过滤器    
 * @return {@code Mono<Void>} 返回标示当前过滤器业务结束     */ 
Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}
案例1:定义全局过滤器,拦截并判断用户身份

需求:定义全局过滤器,拦截请求,判断请求的参数是否满足下面条件: 参数中是否有authorization, authorization参数值是否为admin 如果同时满足则放行,否则拦截

实现全局过滤器的步骤?

实现GlobalFilter接口

添加@Order注解或实现Ordered接口

编写处理逻辑

1.过滤器的执行顺序

路由过滤器、defaultFilter、全局过滤器的执行顺序?

order值越小,优先级越高 当order值一样时,顺序是defaultFilter最先,然后是局部的路由过滤器,最后是全局过滤器

2.跨域问题处理

跨域:域名不一致就是跨域,主要包括:

域名不同: www.taobao.comwww.taobao.orgwww.jd.commiaosha.jd.com 域名相同,端口不同:localhost:8080和localhost8081

跨域问题:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题 解决方案:CORS

相关推荐
paopaokaka_luck几秒前
基于SpringBoot+Uniapp的健身饮食小程序(协同过滤算法、地图组件)
前端·javascript·vue.js·spring boot·后端·小程序·uni-app
Villiam_AY4 分钟前
Redis 缓存机制详解:原理、问题与最佳实践
开发语言·redis·后端
飛_36 分钟前
解决VSCode无法加载Json架构问题
java·服务器·前端
木棉软糖3 小时前
一个MySQL的数据表最多能够存多少的数据?
java
魔尔助理顾问3 小时前
系统整理Python的循环语句和常用方法
开发语言·后端·python
程序视点4 小时前
Java BigDecimal详解:小数精确计算、使用方法与常见问题解决方案
java·后端
GEM的左耳返4 小时前
Java面试全攻略:Spring生态与微服务架构实战
spring boot·redis·spring cloud·微服务·kafka·java面试
愿你天黑有灯下雨有伞4 小时前
Spring Boot SSE实战:SseEmitter实现多客户端事件广播与心跳保活
java·spring boot·spring
你的人类朋友4 小时前
❤️‍🔥微服务的拆分策略
后端·微服务·架构
Java初学者小白4 小时前
秋招Day20 - 微服务
java