
1. 网关介绍1.1 问题通过Eureka/Nacos 解决了服务注册/服务发现的问题。使用Spring Cloud LoadBalance 结局了负载均衡的文艺使用OpenFeign解决了远程调用的问题但是目前所有微服务的接口都是直接对外暴露的可以直接通过外部访问为了保证对外服务的安全性服务端实现的为服务接口通常带有一定的权限校验机制由于使用了微服务原本一个应用的多个模块拆分成了多个应用我们不得不实现多次校验逻辑当这套逻辑需要修改时需要修改多个应用针对以上问题一个常用的解决方案时使用API网关1.2 声明时API网关API网关也是一个服务通常时后端读完的唯一入口它定义类似设计模式的Facade模式厂面模式也称外观模式它里斯整个微服务的架构门面所有的外部客户端访问都需要金国它来进行调度和过滤网关核心功能权限控制作为微服务入口对用户进行权限校验如果校验失败则进行拦截动态路由一切请求先经过网关但网关不处理业务而是根据某种规则将请求转发到某个为服务负载均衡当路由的目标服务有多个时还需要做负载均衡限流请求流量过高时按照网关中配置微服务能够接收的流量进行放行避免服务压力过大1.3 常见的网关实现ZuulZuul 是MNetfix 公司开源的一个API网关组件可以和Eureka/Ribbon等组件配合使用但是后续进入维护状态Spring Cloud Gateway是Spring Cloud 的一个全新的API网关项目基于SpringSpringBoot等奇数开发旨在为微服务架构提供一种简单而有效的途径来转发请求并为题目提供横切关注点比如安全性/监控/指控和弹性GitHub - spencergibb/spring-cloud-gateway-bench: Simple benchmark comparing zuul and spring cloud gateway · GitHub2. Spring Cloud Gateway2.1 快速上手引入依赖编写启动类配置uri目标服务地址支持普通url及 lb://应用注册服务名称,lb表示负载均衡使用lb;//方式表示从注册中心获取服务地址predicates路由条件根据匹配结果决定是否执行该请求路由访问时网关服务从Nacos获取服务列表2.2 Route Predicate FactoriesPredicatePredicate 是Java 8 提供的一个函数式编程接口它接收一个参数并返回一个布尔值用于条件过滤请求参数的校验FunctionalInterface public interface PredicateT { boolean test(T t); //... }匿名内部类lambdaPredicate的其他方法Route Predicate Factories路由断言工厂在Spring Cloud Gateway中Predicate提供了路由规则的匹配机制Spring Cloud Gateway2.3 Gateway Filter Factories网关过滤工厂Predicate 决定了请求由哪一个路由处理如果在请求处理亲厚需要加一些逻辑这就是Filter过滤器的作用范围了Filter分为两种类型Pre类型和Post类型Pre类型过滤器路由处理之前中心请求转发到后端服务之前执行在pre类型过滤器中可以做鉴权限流等Post过滤器请求中心完成之后将结果返回给客户端之前执行Spring Cloud Gateway 中内置了很多Filter用于拦截和链式处理web请求比如权限校验访问超时等设定Spring Cloud Gateway从作用范围上可以分为GatewayFilter应用到单个路由或者一个分组的路由上GlobalFilter应用到所有的路由上也就是对所有的请求生效GatewayFilterDefault Filters前面的filter添加在指导路由下所以只对当前路由生效若需要对全部路由生效可以使用spring.cloud.gateway.default-filtersGlobalFilterGlobalFilter是Spring Cloud Gateway中的全局过滤器,它和GatewayFilter的作⽤是相同的. GlobalFilter 会应⽤到所有的路由请求上,全局过滤器通常⽤于实现与安全性,性能监控和⽇志记录等相 关的全局功能.Spring Cloud Gateway内置的全局过滤器也有很多,⽐如:• GatewayMetricsFilter: ⽹关指标,提供监控指标• ForwardRoutingFilter: ⽤于本地forword,请求不转发到下游服务器• LoadBalancerClientFilter: 针对下游服务,实现负载均衡........2.4 过滤器执行顺序请求路由后网关会把当前项目中的GatewayFilter 和 GlobalFilter 合并到一个过滤器链中并进行排序一次执行过滤器每一个过滤器都必须指导一个int类型和order值默认值为0表示过滤器的优先级order越校优先级越高执行顺序越靠前Filter通过实现Order接口或者添加Order注解来指定order值Spring Cloud Gateway 提供的Filter由Spring指定用户也可以自定义Filter由用户指定当过滤器的order值一样时会按照defaultFilterGatewayFilterGlobalFilter2.5 自定义过滤器Spring Cloud Gateway提供了过滤器的扩展功能开发者可以根据实际业务来自定义过滤器同样自定义过滤器也支持GatewayFilter和GlobalFilter两种GatewayFilterGlobalFilter需求是拦截所有进入网关的请求比如全局限流、全局鉴权、全局日志你只需要直接实现GlobalFilter接口并加上Component注解即可。一旦写了 GlobalFilter它会对所有路由自动生效YAML 中不需要写任何配置。