手机网站链接微信,软文推广范文,痘痘该怎么去除效果好,网站策划书格式前言
在微服务架构中#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端调用多个微服务接口的地址。另外微服务架构的请求中#xff0c;90%的都携带认证信息/用户登录信息#xff0c;都需要做相关的限制管理#xff0c;API网关由此应允而生。
这样的架构会存…前言
在微服务架构中一个系统会被拆分为很多个微服务。那么作为客户端调用多个微服务接口的地址。另外微服务架构的请求中90%的都携带认证信息/用户登录信息都需要做相关的限制管理API网关由此应允而生。
这样的架构会存在许多的问题
客户端多次请求不同的微服务增加客户端代码或配置编写的复杂性。认证复杂每个服务都需要独立认证。存在跨域请求在一定场景下处理相对复杂。
所谓的API网关就是指系统的统一入口它封装了应用程序的内部结构为客户端提供统一服务一些与业务本身功能无关的公共逻辑可以在这里实现诸如认证、鉴权、监控、路由转发等等。
网关的核心功能特性
请求路由权限控制限流
常见网关
1Ngnixlua
基于NginxLua开发性能高稳定有多个可用的插件(限流、鉴权等等)可以开箱即用。
使用nginx的反向代理和负载均衡可实现对api服务器的负载均衡及高可用。 lua是一种脚本语言,可以来编写一些简单的逻辑, nginx支持lua脚本。
缺点
只支持Http协议。二次开发自由扩展困难。提供管理API缺乏更易用的管控、配置方式。
2Zuul
Zuul的路由功能实现了统一处理外部请求的功能负责将外部请求转发到具体的微服务实例上是实现外部访问统一入口的基础。zuul还提供过滤器功能负责对请求的处理过程进行干预是实现请求校验、服务聚合等功能的基础。Zuul的底层基于Servlet本质上就是一系列的filter过滤器也是它的核心。Zuul2是采用Netty实现异步IO。
缺点
缺乏管控无法动态配置。依赖组件较多。处理Http请求依赖的是Web容器性能不如Nginx。
3Gateway
底层使用了高性能的通信框架Netty,提供了异步支持提供了抽象负载均衡提供了抽象流控并默认实现了RedisRateLimiter。
介绍
Spring Cloud Gateway基于 Spring 5.0Spring Boot 2.0 和 Project Reactor 等技术开发的网关它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。基于 Filter 链的方式提供了网关基本的功能例如安全监控/指标和限流。底层使用了高性能的通信框架Netty,提供了异步支持提供了抽象负载均衡提供了抽象流控并默认实现了RedisRateLimiter。
为了提升网关的性能SpringCloud Gateway是基于WebFlux框架实现的而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。
特性
1基于 Spring Framework 5Project Reactor 和 Spring Boot 2.0
2可集成 Hystrix 、Sentinel实现熔断降级
3集成 Spring Cloud DiscoveryClient
4Predicates 和 Filters 作用于特定路由易于编写的 Predicates 和 Filters
5具备一些网关的高级功能动态路由、限流、路径重写
三大核心概念:
Filter过滤器
**使用它拦截和修改请求并且对上游的响应进行二次处理。**org.springframework.cloud.gateway.filter.GatewayFilter的实例用于请求被路由前或者之后对请求进行修改。
pre类型
Filter在pre类型的过滤器可以做参数效验、权限效验、流量监控、日志输出、协议转换等。
post类型
Filter在post类型的过滤器可以做响应内容、响应头的修改、日志输出、流量监控等
Route路由
网关配置的基本组成模块和Zuul的路由配置模块类似。一个Route模块由一个 ID一个目标 URI一组断言和一组过滤器定义。如果断言为真则路由匹配目标URI会被访问。
Predicate断言
这是一个 Java 8 的 Predicate。输入类型是一个 ServerWebExchange。可以使用它来匹配来自 HTTP 请求的任何内容例如 headers 或参数。如果请求与断言相匹配则进行路由。
Gateway核心架构
1、路由 Route
路由(Route) 是 gateway 中最基本的组件之一表示一个具体的路由信息载体。主要定义了下面的几个信息
id路由标识符区别于其他 Route。uri路由指向的目的地 uri即客户端请求最终被转发到的微服务。order用于多个 Route 之间的排序数值越小排序越靠前匹配优先级越高。predicate断言的作用是进行条件判断只有断言都返回真才会真正的执行路由。filter过滤器用于修改请求和响应信息。predicate断言用于进行条件判断只有断言都返回真才会真正的执行路由。
2、过滤器
Gateway的过滤器的作用是是在请求的传递过程中,对请求和响应做一些手脚。
1Gateway的过滤器的生命周期
Pre这种过滤器在请求被路由之前调用。可利用这种过滤器实现身份验证、在集群中选择 请求的微服务、记录调试信息等。
Post这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
Gateway 的Filter从作用范围可分为两种: GatewayFilter与GlobalFilter。GatewayFilter应用到单个路由或者一个分组的路由上GlobalFilter应用到所有的路由上。
2GatewayFilter 局部过滤器
局部过滤器是针对单个路由的过滤器。他分为内置过滤器和自定义过滤器。在SpringCloud Gateway中内置了很多不同类型的网关路由过滤器。
内置的局部过滤器内容
过滤器工厂作用参数AddRequestHeader为原始请求添加HeaderHeader的名称及值AddRequestParameter为原始请求添加请求参数参数名称及值AddResponseHeader为原始响应添加HeaderHeader的名称及值DedupeResponseHeader剔除响应头中重复的值需要去重的Header名称及去重策略Hystrix为路由引入Hystrix的断路器保护HystrixCommand 的名称FallbackHeaders为fallbackUri的请求头中添加具体的异常信息Header的名称PrefixPath为原始请求路径添加前缀前缀路径PreserveHostHeader为请求添加一个preserveHostHeadertrue的属性路由过滤器会检查该属性以决定是否要发送原始的Host无RequestRateLimiter用于对请求限流限流算法为令牌桶keyResolver、 rateLimiter、 statusCode、 denyEmptyKey、 emptyKeyStatusRedirectTo将原始请求重定向到指定的URLhttp状态码及重定向的urlRemoveHopByHopHeadersFilter为原始请求删除IETF组织规定的一系列Header默认就会启用可以通过配置指定仅删除哪些HeaderRemoveRequestHeader为原始请求删除某个HeaderHeader名称RemoveResponseHeader为原始响应删除某个HeaderHeader名称RewritePath重写原始的请求路径原始路径正则表达式以及重写后路径的正则表达式RewriteResponseHeader重写原始响应中的某个HeaderHeader名称值的正则表达式重写后的值SaveSession在转发请求之前强制执行WebSession::save操作无secureHeaders为原始响应添加一系列起安全作用的响应头无支持修改这些安全响应头的值SetPath修改原始的请求路径修改后的路径SetResponseHeader修改原始响应中某个Header的值Header名称修改后的值SetStatus修改原始响应的状态码HTTP 状态码可以是数字也可以是字符串StripPrefix用于截断原始请求的路径使用数字表示要截断的路径的数量Retry针对不同的响应进行重试retries、statuses、methods、seriesRequestSize设置允许接收最大请求包的大小。如果请求包大小超过设置的值则返回 413 Payload Too Large请求包大小单位为字节默认值为5MModifyRequestBody在转发请求之前修改原始请求体内容修改后的请求体内容ModifyResponseBody修改原始响应体的内容修改后的响应体内容
当内置过滤器没有办法满足需求的时候就可以通过继承AbstractGatewayFilterFactory来实现自定义过滤器。
3GlobalFilter 全局过滤器
全局过滤器作用于所有路由, 无需配置。通过全局过滤器可以实现对权限的统一校验安全性验证等功能。SpringCloud Gateway内部也是通过一系列的内置全局过滤器对整个路由转发进行处理。 全局过滤器常用于访问鉴权大概执行逻辑如下 当客户端第一次请求服务时服务端对用户进行信息认证登录。 认证通过将用户信息进行加密形成token返回给客户端作为登录凭证。 以后每次请求客户端都携带认证的token。 服务端对token进行解密判断是否有效。 //鉴权示例
Component
public class AuthGlobalFilter implements GlobalFilter {Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {String token exchange.getRequest().getQueryParams().getFirst(token);if (StringUtils.isBlank(token)) {System.out.println(鉴权失败);exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}return chain.filter(exchange);}
} 网关限流
网关是所有请求的公共入口所以可以在网关进行限流。可以采用Sentinel组件/Hystrix组件来实现网关的限流。 从1.6.0版本开始Sentinel提供了SpringCloud Gateway的适配模块可以提供两种资源维度的限流 route维度即在Spring配置文件中配置的路由条目资源名为对应的routeId自定义API维度用户可以利用Sentinel提供的API来自定义一些API分组 当在限流的时候不想返回默认的错误那么就需要自定义错误指定自定义的返回格式。
//route维度
PostConstruct
public void initBlockHandlers() {BlockRequestHandler blockRequestHandler new BlockRequestHandler() {public MonoServerResponse handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {Map map new HashMap();map.put(code, 0);map.put(message, 接口被限流了);return ServerResponse.status(HttpStatus.OK).contentType(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(map));}
};GatewayCallbackManager.setBlockHandler(blockRequestHandler);
}
//--------------------------------------------------------------------
//自定义API维度
PostConstruct
private void initCustomizedApis() {SetApiDefinition definitions new HashSet();ApiDefinition api1 new ApiDefinition(order_api).setPredicateItems(new HashSetApiPredicateItem() {{add(new ApiPathPredicateItem().setPattern(/order-serv/api/**). setMatchStrategy(SentinelGatewayConstants.URL_MATCH_STRATEGY_PREFIX));}});definitions.add(api1);GatewayApiDefinitionManager.loadApiDefinitions(definitions);
}
PostConstruct
private void initGatewayRules() {SetGatewayFlowRule rules new HashSet();rules.add(new GatewayFlowRule(product_route).setCount(3).setIntervalSec(1));rules.add(new GatewayFlowRule(order_api).setCount(1).setIntervalSec(1));GatewayRuleManager.loadRules(rules);
}执行流程
Gateway Client 向 Spring Cloud Gateway 发送请求请求首先会被 HttpWebHandlerAdapter 进行提取组装成网关上下文然后网关的上下文会传递到 DispatcherHandler 它负责将请求分发给 RoutePredicateHandlerMappingRoutePredicateHandlerMapping 负责路由查找并根据路由断言判断路由是否可用如果过断言成功由FilteringWebHandler 创建过滤器链并调用通过特定于请求的 Fliter 链运行请求Filter 被虚线分隔的原因是Filter可以在发送代理请求之前pre和之后post运行逻辑执行所有pre过滤器逻辑。然后进行代理请求。发出代理请求后将运行“post”过滤器逻辑。处理完毕之后将 Response 返回到 Gateway 客户端
其他
1、Nginx网关和Gateway网关的区别
Nignx是流量网关Gateway是业务网关。 一般流量网关配置在前业务网关配置在后。
流量网关相当于访问的一个总入口前端页面的一个容器类似于防火。主要的功能有管理日志流量监控黑白名单请求的负载均衡全局限流等。Nginx是C语言写的Nginx主要是负载均衡反向代理以及做web服务器。
而业务网关是针对具体的后端应用和服务主要的功能是缓存策略、鉴权策略等。GateWay是java语言写的Gateway主要是路由、断言和过滤器利用这些可以做流控。
2、Gateway 组件缺陷以及优化思路
问题1、每次请求级别都会重新组装出一个 FilterChain并进行排序内存分配和排序会占用 CPU
问题2、在默认情况下如果其中一个路由配置出错了会导致整个网关路由不可用除非 isFailOnRouteDefinitionError 被关闭。
问题3、路由内存优化同一份路由的配置内容竟然以 3 种形式常驻于内存中。
问题4、内存泄漏优化。通讯底座是netty,通信内容较大时例如文件上传则会触发内存的新分配,而 SpringCloud Gateway 在对接 netty 时存在逻辑缺陷会导致新分配的池化内存无法完全回收导致堆外内存泄漏。并且这块堆外内存时 netty 使用 unsafe 自行分配的通过常规的 JVM 工具还无法观测非常隐蔽。
问题5、预构建 URI 。针对不可变对象的一次变更从而进行了一次深拷贝重新重构了一个 URI
问题6、对象缓存。尽量避免调用链路中出现 new 关键字它会加大 CPU 的开销从而影响 IO可以使用 ThreadLocal 或者对象池化技术进行对象复用。
来自SpringCloud Gateway 在微服务架构下的最佳实践
3、登录鉴权图 总结
Gateway主要用于为微服务架构提供一种简单有效的统一的 API 路由管理方式主要用于微服务API共性做统一要求。采用Filter链的形式对API做了请求头部信息做限制对微服务常用的认证授权也做了对应限制并可对高并发进行流量限制。经过层层过滤之后对请求接口进行服务接口路由到对应的服务接口。