Gateway服务
在SpringCloud 客户管理系统开发定制中网关的实现包括两种: ① gateway② zuulzuul是基于servlet的实现, 客户管理系统开发定制属于阻塞式编程, 而springcloudgateway则是基于spring5中提供的webflux, 客户管理系统开发定制属于响应式编程的实现, 客户管理系统开发定制具备更好的性能.
gateway快速入门 1 创建新的module , 引入SpringCloudGetaway 的依赖和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: nacos: 8848 # nacos地址 gateway: routes: - id: user- service # 路由标示,必须唯一 uri: lb: / / userservice # 路由的目标地址 predicates: # 路由断言,判断请求是否符合规则 - Path = / user
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
断言工厂 读取断言规则例如: Path = / user
过滤器工厂
路由过滤器( GatewayFilter ) 是网关中提供的一种过滤器, 可以对进入网关的请求和微服务返回的响应处理. 过滤器的作用? ① 对路由的请求或响应做加工处理, 比如请求头 ② 配置在路由下的过滤器只对当前路由的请求生效default - filters的作用? ① 对所有路由都生效的过滤器 spring: application: name: gateway cloud: nacos: server- addr: localhost: 8848 # nacos地址 gateway: routes: - id: user- service # 路由标示,必须唯一 uri: lb: / / userservice # 路由的目标地址 predicates: # 路由断言,判断请求是否符合规则 - Path = / user
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 全局过滤器(GlobalFilter) 全局过滤器的作用也是处理一切进入网关的请求和微服务响应, 与GatewayFilter 的作用一样区别在于GatewayFilter 通过配置定义, 处理逻辑是固定的, 而GlobalFilter 的逻辑需要自己写代码实现. 全局过滤的作用? 对所有路由都生效的过滤器, 并且可以自定义处理逻辑实现全局过滤的步骤? ① 实现GlobalFilter 接口 ② 添加@Order 注解或者实现Ordered 接口 ③ 编写处理逻辑
自定义过滤器 实现GlobalFilter接口 import org. springframework. cloud. gateway. filter. GatewayFilterChain ; import org. springframework. cloud. gateway. filter. GlobalFilter ; import org. springframework. core. Ordered ; 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 public class AuthorizeFilter implements GlobalFilter , Ordered { @Override public Mono < Void > filter ( ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange. getRequest ( ) ; MultiValueMap < String , String > params = request. getQueryParams ( ) ; String auth = params. getFirst ( "authorization" ) ; if ( "admin" . equals ( auth) ) { return chain. filter ( exchange) ; } exchange. getResponse ( ) . setStatusCode ( HttpStatus . UNAUTHORIZED) ; return exchange. getResponse ( ) . setComplete ( ) ; } @Override public int getOrder ( ) { return - 1 ; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 过滤器的执行顺序 路由过滤器、defaultFilter、全局过滤器的执行顺序? ① order值越小, 优先级越高 ② 当order值一样时, 顺序是defaultFilter最先, 然后是局部的路由过滤器, 最后是全局的过滤器.
网关的跨域问题处理 跨域: 域名不一致就是跨域主要包括 ① 域名不同: www. taobao. com和www. jd. com ② 域名相同, 端口不同: localhost: 8080 和localhost: 8081 跨域问题: 浏览器禁止请求的发起者和服务端发生跨域ajax请求, 请求被浏览器拦截的问题解决方案: CORS
网关处理跨域采用的同样是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 # 这次跨域检测的有效期
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 需要项目代码联系博主.