浙江金圣建设有限公司网站,免费 网站源码,如何创建自己的邮箱,广州网站开发 细致广州亦客网络统一网关Gateway 8.统一网关Gatewaya.搭建网关服务b.路由断言工厂c.路由过滤器GatewayFilterd.全局过滤器GlobalFiltere.过滤器的执行顺序f.网关的cors跨域配置 8.统一网关Gateway
网关功能#xff1a;
身份认证和权限校验服务路由、负载均衡请求限流 网关的技术实现
在Spr… 统一网关Gateway 8.统一网关Gatewaya.搭建网关服务b.路由断言工厂c.路由过滤器GatewayFilterd.全局过滤器GlobalFiltere.过滤器的执行顺序f.网关的cors跨域配置 8.统一网关Gateway
网关功能
身份认证和权限校验服务路由、负载均衡请求限流 网关的技术实现
在SpringCloud中网关的实现包括两种
gatewayzuul
Zuul是基于Servlet的实现属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的WebFlux属于响应式编程的实现具备更好的性能。
a.搭建网关服务
搭建网关服务的步骤
1.创建新的module引入SpringCloudGateway的依赖和nacos的服务发现依赖
!--nacos服务注册发现依赖--
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId
/dependency
!--网关gateway依赖--
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-gateway/artifactId
/dependency2.编写路由配置及nacos地址在application.yml中编写
server:port: 10010
spring:application:name: gatewaycloud:nacos:server-addr: localhost:8848 # nacos地址gateway:routes:- id: user-service # 路由标识必须唯一uri: lb://userservice # 路由的目标地址predicates: # 路由断言判断请求是否符合规则- Path/user/** # 路径断言判断路径是否是以/user开头如果是则符合- id: order-serviceuri: lb://orderservicepredicates:- Path/order/**b.路由断言工厂
网关路由可以配置的内容包括
路由id路由唯一标示uri路由目的地支持lb和http两种predicates路由断言判断请求是否符合要求符合则转发到路由目的地filters路由过滤器处理请求或响应
路由断言工厂Route Predicate Factory
我们在配置文件中写的断言规则只是字符串这些字符串会被Predicate Factory读取并处理转变为路由判断的条件例如Path/user/**是按照路径匹配这个规则是由org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来处理的像这样的断言工厂在SpringCloudGateway还有十几个 PredicateFactory的作用是什么 读取用户定义的断言条件对请求做出判断 Path/user/**是什么含义 路径是以/user开头的就认为是符合的
c.路由过滤器GatewayFilter
GatewayFilter是网关中提供的一种过滤器可以对进入网关的请求和微服务返回的响应做处理 案例给所有进入userservice的请求添加一个请求头
给所有进入userservice的请求添加一个请求头TruthABCDEFGHIJKLMN
实现方式在gateway中修改application.yml文件给userservice的路由添加过滤器
spring:cloud:gateway:routes:- id: user-service uri: lb://userservicepredicates: - Path/user/**filters: # 过滤器- AddRequestHeaderTruth, ABCDEFGHIJKLMN # 添加请求头默认过滤器
如果要对所有的路由都生效则可以将过滤器工厂写到default下。格式如下
spring:cloud:gateway:routes:- id: user-service uri: lb://userservice predicates:- Path/user/**- id: order-serviceuri: lb://orderservicepredicates:- Path/order/**- Before2031-01-20T17:42:47.789-07:00[Asia/Shanghai]default-filters: # 默认过滤器会对所有的路由请求都生效- AddRequestHeaderTruth, ABCDEFGHIJKLMN # 添加请求头需要在相应的Controller中获取请求头的参数与打印
过滤器的作用是什么
对路由的请求或响应做加工处理比如添加请求头配置在路由下的过滤器只对当前路由的请求生效
defaultFilters的作用是什么
对所有路由都生效的过滤器
d.全局过滤器GlobalFilter
全局过滤器的作用也是处理一切进入网关的请求和微服务响应与GatewayFilter的作用一样。
区别在于GatewayFilter通过配置定义处理逻辑是固定的。而GlobalFilter的逻辑需要自己写代码实现。
案例定义全局过滤器拦截并判断用户身份
需求定义全局过滤器拦截请求判断请求的参数是否满足下面条件
参数中是否有authorizationauthorization参数值是否为admin
如果同时满足则放行否则拦截
创建AuthorizeFilter方法实现GlobalFilter接口
添加Order注解或实现Ordered接口
Order(-1)
Component
public class AuthorizeFilter implements GlobalFilter {Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1.获取请求参数ServerHttpRequest request exchange.getRequest();MultiValueMapString, String params request.getQueryParams();// 2.获取参数中的 authorization 参数String auth params.getFirst(authorization);// 3.判断参数值是否等于 adminif (admin.equals(auth)){// 4.是放行return chain.filter(exchange);}// 5.否拦截// 5.1.设置状态码exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);// 5.2.拦截请求return exchange.getResponse().setComplete();}
}e.过滤器的执行顺序
请求进入网关会碰到三类过滤器当前路由的过滤器、DefaultFilter、GlobalFilter
请求路由后会将当前路由过滤器和DefaultFilter、GlobalFilter合并到一个过滤器链集合中排序后依次执行每个过滤器
每一个过滤器都必须指定一个int类型的order值order值越小优先级越高执行顺序越靠前。GlobalFilter通过实现Ordered接口或者添加Order注解来指定order值由我们自己指定路由过滤器和defaultFilter的order由Spring指定默认是按照声明顺序从1递增。当过滤器的order值一样时会按照 defaultFilter 路由过滤器 GlobalFilter的顺序执行。
f.网关的cors跨域配置
跨域问题处理
跨域域名不一致就是跨域主要包括
域名不同 www.taobao.com 和 www.taobao.org 和 www.jd.com 和 miaosha.jd.com域名相同端口不同localhost:8080和localhost8081
跨域问题浏览器禁止请求的发起者与服务端发生跨域ajax请求请求被浏览器拦截的问题
解决方案CORS
网关处理跨域采用的同样是CORS方案并且只需要简单配置即可实现
spring:cloud:gateway:globalcors: # 全局的跨域处理add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题corsConfigurations:[/**]:allowedOrigins: # 允许哪些网站的跨域请求- http://localhost:8090- http://www.leyou.comallowedMethods: # 允许的跨域ajax的请求方式- GET- POST- DELETE- PUT- OPTIONSallowedHeaders: * # 允许在请求中携带的头信息allowCredentials: true # 是否允许携带cookiemaxAge: 360000 # 这次跨域检测的有效期