赞
踩
目录
请求先经过gateway,若不处理业务把请求转发到某个微服务,叫做路由
路由目标有多个时,要做负载均衡
作为微服务入口校验用户是否有请求资格,若没有则拦截
请求流量过高时,按照下流的微服务可接受的速度放行请求,避免服务压力过大
基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能
基于Servlet的实现,属于阻塞式编程
引入网关依赖和nacos服务发现依赖
spring-cloud-starter-gateway
spring-cloud-starter-alibaba-nacos-discovery
- server:
- port:81 # 端口号(随便写,但前台访问时会用) # 网关端口
- spring:
- application:
- name: gateway # 服务名称(供其他服务调用的别名)
- cloud:
- nacos:
- server-addr: localhost:8848 # nacos地址
- gateway:
- routes: # 网关路由配置 - 内容 表示 下面的内容是列表集合
- - id: user-service # 1.路由id,自定义,只要唯一即可
- # uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
- uri: lb://userservice # 2.路由的目标地址 lb就是负载均衡,后面跟服务名称
- predicates: # 3.路由断言,也就是判断请求是否符合路由规则的条件
- - Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求
1. 路由id:路由的唯一标示
2. 路由目标(uri):路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡
3. 路由断言(predicates):判断路由的规则,
4. 路由过滤器(filters):对请求或响应做处理
读取在配置文件中写的断言规则,转变为路由判断的条件
Path
- Path=/red/{segment},/blue/**
判断是否以/red/值 开头 或者以/blue/**开头的路径
具体内容查看spring官网 docs.spring.io
作用
对进入网关的请求和微服务返回的响应做处理
1.指定服务路由过滤器
filters: #在routes下级
- 过滤器类型=内容
配置在路由下的过滤器只对当前路由的请求生效
2.默认所有服务路由过滤器
defaultFilters:#与routes平级
- 过滤器类型=内容
对所有路由都生效的过滤器
在web请求(控制层请求)的请求信息
第一种
控制层请求中的参数加入@RequestHeader(value="名" ,required=false) String 名
//设置为false,可以若没有信息,不会报错
第二种
控制的请求参数HttpServletRequest request
request.方法("名")
处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样
1.定义方式是实现GlobalFilter接口,并重写里面的方法
2.添加@Order注解或者实现Ordered接口
3.编写处理逻辑
// 1.获取请求参数
MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();
// 2.获取指定参数
String auth = params.getFirst("参数名");
// 3.校验
// 3.1放行
return chain.filter(exchange);
// 3.2拦截
// 禁止访问,设置状态码
exchange.getResponse().setStatusCode(HttpStatus.状态码);
// 结束处理
return exchange.getResponse().setComplete();
1.GatewayFilter通过配置定义,处理逻辑是固定的
2.GlobalFilter的逻辑需要自己写代码实现。
定义方式是实现GlobalFilter接口,并重写里面的方法
添加@Order注解或者实现Ordered接口
编写处理逻辑
// 1.获取请求参数 MultiValueMap<String, String> params = exchange.getRequest().getQueryParams(); // 2.获取指定参数 String auth = params.getFirst("参数名"); // 3.校验 // 放行 return chain.filter(exchange); // 4.拦截 // 4.1.禁止访问,设置状态码 exchange.getResponse().setStatusCode(HttpStatus.状态码); // 4.2.结束处理 return exchange.getResponse().setComplete();
请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter
- 请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器
- order值越小,优先级越高,执行顺序越靠前。
- GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值
- 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增
- order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行
域名不一致就是跨域
浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题
在gateway的配置文件中添加配置
- spring:
- cloud:
- gateway:
- globalcors: # 全局的跨域处理
- add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
- corsConfigurations:
- '[/**]':
- allowedOrigins: # 允许哪些网站的跨域请求
- - "http://localhost:8090"
- allowedMethods: # 允许的跨域ajax的请求方式
- - "GET"
- - "POST"
- - "DELETE"
- - "PUT"
- - "OPTIONS"
- allowedHeaders: "*" # 允许在请求中携带的头信息
- allowCredentials: true # 是否允许携带cookie
- maxAge: 360000 # 这次跨域检测的有效期
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。