当前位置: 首页 > news >正文

提供网站建设费用哈尔滨建设银行招聘信息网

提供网站建设费用,哈尔滨建设银行招聘信息网,网站建设开发上线流程,镇江优化推广目录 网关简介 什么是Spring Cloud Gateway Spring Cloud Gateway 功能特征 核心概念 工作原理 Spring Cloud Gateway快速开始 环境搭建 集成Nacos 路由断言工厂#xff08;Route Predicate Factories#xff09;配置 自定义路由断言工厂 过滤器工厂#xff08; …目录 网关简介 什么是Spring Cloud Gateway Spring Cloud Gateway 功能特征 核心概念 工作原理 Spring Cloud Gateway快速开始 环境搭建 集成Nacos 路由断言工厂Route Predicate Factories配置 自定义路由断言工厂 过滤器工厂 GatewayFilter Factories配置 添加请求头 为匹配的路由统一添加前缀 重定向操作 自定义过滤器工厂 全局过滤器Global Filters配置 Gateway跨域配置CORS Configuration gateway整合sentinel流控降级 网关高可用 网关简介 大家都都知道在微服务架构中一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢 如果没有网关的存在我们只能在客户端记录每个微服务的地址然后分别去用。 这样的架构会存在着诸多的问题 每个业务都会需要鉴权、限流、权限校验、跨域等逻辑如果每个业务都各自为战自己造轮子实现一遍会很蛋疼完全可以抽出来放到一个统一的地方去做。 如果业务量比较简单的话这种方式前期不会有什么问题但随着业务越来越复杂比如淘宝、亚马逊打开一个页面可能会涉及到数百个微服务协同工作如果每一个微服务都分配一个域名的话一方面客户端代码会很难维护涉及到数百个域名另一方面是连接数的瓶颈想象一下你打开一个APP通过抓包发现涉及到了数百个远程调用这在移动端下会显得非常低效。后期如果需要对微服务进行重构的话也会变的非常麻烦需要客户端配合你一起进行改造比如商品服务随着业务变的越来越复杂后期需要进行拆分成多个微服务这个时候对外提供的服务也需要拆分成多个同时需要客户端配合你进行改造非常蛋疼。 上面的这些问题可以借助API网关来解决。 所谓的API网关就是指系统的统一入口它封装了应用程序的内部结构为客户端提供统一服务一些与业务本身功能无关的公共逻辑可以在这里实现诸如认证、鉴权、监控、路由转发等等。 添加上API网关之后系统的架构图变成了如下所示 我们也可以观察下我们现在的整体架构图 什么是Spring Cloud Gateway 网关作为流量的入口常用的功能包括路由转发权限校验限流等。 Spring Cloud Gateway 是Spring Cloud官方推出的第二代网关框架定位于取代 Netflix Zuul1.0。相比 Zuul 来说Spring Cloud Gateway 提供更优秀的性能更强大的有功能。 Spring Cloud Gateway 是由 WebFlux Netty Reactor 实现的响应式的 API 网关。它不能在传统的 servlet 容器中工作也不能构建成 war 包。 Spring Cloud Gateway 旨在为微服务架构提供一种简单且有效的 API 路由的管理方式并基于 Filter 的方式提供网关的基本功能例如说安全认证、监控、限流等等。 其他的网关组件 在SpringCloud微服务体系中有个很重要的组件就是网关在1.x版本中都是采用的Zuul网关但在2.x版本中zuul的升级一直跳票SpringCloud最后自己研发了一个网关替代Zuul那就是SpringCloud Gateway 网上很多地方都说Zuul是阻塞的Gateway是非阻塞的这么说是不严谨的准确的讲Zuul1.x是阻塞的而在2.x的版本中Zuul也是基于Netty也是非阻塞的如果一定要说性能其实这个真没多大差距。 而官方出过一个测试项目创建了一个benchmark的测试项目spring-cloud-gateway-bench其中对比了 性能强劲是第一代网关Zuul的1.6倍 官网文档Spring Cloud Gateway Spring Cloud Gateway 功能特征 基于Spring Framework 5, Project Reactor 和 Spring Boot 2.0 进行构建动态路由能够匹配任何请求属性支持路径重写;集成 Spring Cloud 服务发现功能Nacos、Eruka可集成流控降级功能Sentinel、Hystrix可以对路由指定易于编写的 Predicate断言和 Filter过滤器 核心概念 路由route) 路由是网关中最基础的部分路由信息包括一个ID、一个目的URI、一组断言工厂、一组Filter组成。如果断言为真则说明请求的URL和配置的路由匹配。 断言(predicates) Java8中的断言函数SpringCloud Gateway中的断言函数类型是Spring5.0框架中的ServerWebExchange。断言函数允许开发者去定义匹配Http request中的任何信息比如请求头和参数等。 过滤器Filter) SpringCloud Gateway中的filter分为Gateway FilIer和Global Filter。Filter可以对请求和响应进行处理。 工作原理 执行流程大体如下 Gateway Client向Gateway Server发送请求请求首先会被HttpWebHandlerAdapter进行提取组装成网关上下文然后网关的上下文会传递到DispatcherHandler它负责将请求分发给RoutePredicateHandlerMappingRoutePredicateHandlerMapping负责路由查找并根据路由断言判断路由是否可用如果过断言成功由FilteringWebHandler创建过滤器链并调用请求会一次经过PreFilter--微服务--PostFilter的方法最终返回响应 Spring Cloud Gateway快速开始 环境搭建 引入依赖 !-- gateway网关 -- dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-gateway/artifactId /dependency 注意会和spring-webmvc的依赖冲突需要排除spring-webmvc 编写yml配置文件 server:port: 8888 spring:application:name: api-gatewaycloud:gateway:routes: # 路由数组[路由 就是指定当请求满足什么条件的时候转到哪个微服务]- id: product_route # 当前路由的标识, 要求唯一 uri: http://localhost:8081 # 请求要转发到的地址order: 1 # 路由的优先级,数字越小级别越高predicates: # 断言(就是路由转发要满足的条件)- Path/product-serv/** # 当请求路径满足Path指定的规则时,才进行路由转发filters: # 过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改- StripPrefix1 # 转发之前去掉1层路径. 集成Nacos 现在在配置文件中写死了转发路径的地址, 前面我们已经分析过地址写死带来的问题, 接下来我们从注册中心获取此地址。 引入依赖 !-- nacos服务注册与发现 -- dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId /dependency 编写yml配置文件 server:port: 8888spring:application:name: api-gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:routes:- id: product_routeuri: lb://service-product # lb指的是从nacos中按照名称获取微服务,并遵循负载均衡策略predicates:- Path/product-serve/**filters:- StripPrefix1 测试 这时候就发现只要按照网关地址/微服务/接口的格式去访问就可以得到成功响应。 路由断言工厂Route Predicate Factories配置 https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories  作用 当请求gateway的时候 使用断言对请求进行匹配 如果匹配成功就路由转发 如果匹配失败就返回404 类型内置自定义 SpringCloud Gateway包括许多内置的断言工厂所有这些断言都与HTTP请求的不同属性匹配。具体如下 基于Datetime类型的断言工厂此类型的断言根据时间做判断主要有三个 AfterRoutePredicateFactory 接收一个日期参数判断请求日期是否晚于指定日期 BeforeRoutePredicateFactory 接收一个日期参数判断请求日期是否早于指定日期 BetweenRoutePredicateFactory 接收两个日期参数判断请求日期是否在指定时间段内 ZonedDateTime.now() - After2019-12-31T23:59:59.78908:00[Asia/Shanghai] 基于远程地址的断言工厂  RemoteAddrRoutePredicateFactory接收一个IP地址段判断请求主机地址是否在地址段中 - RemoteAddr192.168.1.1/24 基于Cookie的断言工厂 CookieRoutePredicateFactory接收两个参数cookie 名字和一个正则表达式。 判断请求 cookie是否具有给定名称且值与正则表达式匹配。 -Cookiechocolate, ch. 基于Header的断言工厂 HeaderRoutePredicateFactory接收两个参数标题名称和正则表达式。  判断请求Header是否具有给定名称且值与正则表达式匹配。 -HeaderX-Request-Id, \d 基于Host的断言工厂 HostRoutePredicateFactory接收一个参数主机名模式。判断请求的Host是否满足匹配规则。 -Host**.testhost.org 基于Method请求方法的断言工厂 MethodRoutePredicateFactory接收一个参数判断请求类型是否跟指定的类型匹配。 -MethodGET 基于Path请求路径的断言工厂 PathRoutePredicateFactory接收一个参数判断请求的URI部分是否满足路径规则。 -Path/foo/{segment} 基于Query请求参数的断言工厂 QueryRoutePredicateFactory 接收两个参数请求param和正则表达式 判断请求参数是否具有给定名称且值与正则表达式匹配。 -Querybaz, ba. 基于路由权重的断言工厂 WeightRoutePredicateFactory接收一个[组名,权重], 然后对于同一个组内的路由按照权重转发 routes:-id: weight_route1 uri: host1 predicates:-Path/product/**-Weightgroup3, 1-id: weight_route2 uri: host2 predicates:-Path/product/**-Weight group3, 9 自定义路由断言工厂 自定义路由断言工厂需要继承 AbstractRoutePredicateFactory 类重写 apply 方法的逻辑。在 apply 方法中可以通过 exchange.getRequest() 拿到 ServerHttpRequest 对象从而可以获取到请求的参数、请求方式、请求头等信息。 1、必须spring组件 bean 2. 类必须加上RoutePredicateFactory作为结尾 3. 必须继承AbstractRoutePredicateFactory 4. 必须声明静态内部类 声明属性来接收 配置文件中对应的断言的信息 5. 需要结合shortcutFieldOrder进行绑定 6.通过apply进行逻辑判断 true就是匹配成功 false匹配失败 注意 命名需要以 RoutePredicateFactory 结尾 Component Slf4j public class CheckAuthRoutePredicateFactory extends AbstractRoutePredicateFactoryCheckAuthRoutePredicateFactory.Config {public CheckAuthRoutePredicateFactory() {super(Config.class);}Overridepublic PredicateServerWebExchange apply(Config config) {return new GatewayPredicate() {Overridepublic boolean test(ServerWebExchange serverWebExchange) {log.info(调用CheckAuthRoutePredicateFactory config.getName());if(config.getName().equals(xushu)){return true;}return false;}};}/*** 快捷配置* return*/Overridepublic ListString shortcutFieldOrder() {return Collections.singletonList(name);}public static class Config {private String name;public String getName() {return name;}public void setName(String name) {this.name name;}} } yml中配置 spring:cloud:gateway:#设置路由路由id、路由到微服务的uri、断言routes:- id: order_route #路由ID全局唯一uri: http://localhost:8020 #目标微服务的请求地址和端口predicates:# 测试http://localhost:8888/order/findOrderByUserId/1- Path/order/** #Path路径匹配#自定义CheckAuth断言工厂 - CheckAuthxushu 过滤器工厂 GatewayFilter Factories配置 Gateway 内置了很多的过滤器工厂我们通过一些过滤器工厂可以进行一些业务逻辑处理器比如添加剔除响应头添加去除参数等 Spring Cloud Gateway 过滤器工厂 作用 参数 AddRequestHeader 为原始请求添加Header Header的名称及值 AddRequestParameter 为原始请求添加请求参数 参数名称及值 AddResponseHeader 为原始响应添加Header Header的名称及值 DedupeResponseHeader 剔除响应头中重复的值 需要去重的Header名称及去重策略 Hystrix 为路由引入Hystrix的断路器保护 HystrixCommand 的名称 FallbackHeaders 为fallbackUri的请求头中添加具体的异常信息 Header的名称 PrefixPath 为原始请求路径添加前缀 前缀路径 PreserveHostHeader 为请求添加一个preserveHostHeadertrue 的 属 性路由过滤器会检查该属性以决定是否要发送原始的Host 无 RequestRateLimiter 用于对请求限流限流算法为令牌桶 keyResolver、rateLimiter、statusCode、denyEmptyKey、emptyKeyStatus RedirectTo 将原始请求重定向到指定的URL http状态码及重定向的url RemoveHopByHopHeadersFilter 为原始请求删除IETF组织规定的一系列Header 默认就会启用可以通过配置指定仅删除哪些Header RemoveRequestHeader 为原始请求删除某个Header Header名称 RemoveResponseHeader 为原始响应删除某个Header Header名称 RewritePath 重写原始的请求路径 原始路径正则表达式以及重写后路径的正则表达式 RewriteResponseHeader 重写原始响应中的某个Header Header名称值的正 则表达式重写后的值 SaveSession 在转发请求之前强制执行 WebSession::save 操作 无 secureHeaders 为原始响应添加一系列起安全作用的响应头 无支持修改这些安全响应头的值 SetPath 修改原始的请求路径 修改后的路径 SetResponseHeader 修改原始响应中某个Header的值 Header名称修改后的值 SetStatus 修改原始响应的状态码 HTTP 状态码可以是数字也可以是字符串 StripPrefix 用于截断原始请求的路径 使用数字表示要截断的路径的数量 Retry 针对不同的响应进行重试 retries、statuses、methods、series RequestSize 设置允许接收最大请求包的大 小。如果请求包大小超过设置的值则返回 413 Payload Too Large 请求包大小单位为字节默认值为5M ModifyRequestBody 在转发请求之前修改原始请求体内容 修改后的请求体内容 ModifyResponseBody 修改原始响应体的内容 修改后的响应体内容 添加请求头 spring:cloud:gateway:#设置路由路由id、路由到微服务的uri、断言routes:- id: order_route #路由ID全局唯一uri: http://localhost:8020 #目标微服务的请求地址和端口#配置过滤器工厂filters:- AddRequestHeaderX-Request-color, red #添加请求头 测试http://localhost:8888/order/testgateway GetMapping(/testgateway) public String testGateway(HttpServletRequest request) throws Exception {log.info(gateWay获取请求头X-Request-colorrequest.getHeader(X-Request-color));return success; } GetMapping(/testgateway2) public String testGateway(RequestHeader(X-Request-color) String color) throws Exception {log.info(gateWay获取请求头X-Request-colorcolor);return success; } 添加请求参数 spring:cloud:gateway:#设置路由路由id、路由到微服务的uri、断言routes:- id: order_route #路由ID全局唯一uri: http://localhost:8020 #目标微服务的请求地址和端口#配置过滤器工厂filters:- AddRequestParametercolor, blue # 添加请求参数 测试http://localhost:8888/order/testgateway3 GetMapping(/testgateway3) public String testGateway3(RequestParam(color) String color) throws Exception {log.info(gateWay获取请求参数color:color);return success; } 为匹配的路由统一添加前缀 spring:cloud:gateway:#设置路由路由id、路由到微服务的uri、断言routes:- id: order_route #路由ID全局唯一uri: http://localhost:8020 #目标微服务的请求地址和端口#配置过滤器工厂filters:- PrefixPath/mall-order # 添加前缀 对应微服务需要配置context-path mall-order中需要配置 server:servlet:context-path: /mall-order 测试http://localhost:8888/order/findOrderByUserId/1 》 http://localhost:8020/mall-order/order/findOrderByUserId/1 重定向操作 spring:cloud:gateway:#设置路由路由id、路由到微服务的uri、断言routes:- id: order_route #路由ID全局唯一uri: http://localhost:8020 #目标微服务的请求地址和端口#配置过滤器工厂filters:- RedirectTo302, https://www.baidu.com/ #重定向到百度 测试http://localhost:8888/order/findOrderByUserId/1 自定义过滤器工厂 继承AbstractNameValueGatewayFilterFactory且我们的自定义名称必须要以GatewayFilterFactory结尾并交给spring管理。 Component Slf4j public class CheckAuthGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {Overridepublic GatewayFilter apply(NameValueConfig config) {return (exchange, chain) - {log.info(调用CheckAuthGatewayFilterFactory config.getName() : config.getValue());return chain.filter(exchange);};} } 配置自定义的过滤器工厂 spring:cloud:gateway:#设置路由路由id、路由到微服务的uri、断言routes:- id: order_route #路由ID全局唯一uri: http://localhost:8020 #目标微服务的请求地址和端口#配置过滤器工厂filters:- CheckAuthfox,男 测试 全局过滤器Global Filters配置 部过滤器和全局过滤器区别 局部局部针对某个路由 需要在路由中进行配置全局针对所有路由请求 一旦定义就会投入使用 Reactor Netty 访问日志 要启用 Reactor Netty 访问日志请设置-Dreactor.netty.http.server.accessLogEnabledtrue. 它必须是 Java 系统属性而不是 Spring Boot 属性。 您可以将日志记录系统配置为具有单独的访问日志文件。以下示例创建一个 Logback 配置 logback.xml appender nameaccessLog classch.qos.logback.core.FileAppenderfileaccess_log.log/fileencoderpattern%msg%n/pattern/encoder/appenderappender nameasync classch.qos.logback.classic.AsyncAppenderappender-ref refaccessLog //appenderlogger namereactor.netty.http.server.AccessLog levelINFO additivityfalseappender-ref refasync//logger Gateway跨域配置CORS Configuration 通过yml配置的方式Spring Cloud Gateway spring:cloud:gateway:globalcors:cors-configurations:[/**]:allowedOrigins: *allowedMethods:- GET- POST- DELETE- PUT- OPTION 通过java配置的方式 Configuration public class CorsConfig {Beanpublic CorsWebFilter corsFilter() {CorsConfiguration config new CorsConfiguration();config.addAllowedMethod(*);config.addAllowedOrigin(*);config.addAllowedHeader(*);UrlBasedCorsConfigurationSource source new UrlBasedCorsConfigurationSource(new PathPatternParser());source.registerCorsConfiguration(/**, config);return new CorsWebFilter(source);} } gateway整合sentinel流控降级 网关作为内部系统外的一层屏障, 对内起到一定的保护作用, 限流便是其中之一. 网关层的限流可以简单地针对不同路由进行限流, 也可针对业务的接口进行限流或者根据接口的特征分组限流。 网关限流 · alibaba/Sentinel Wiki · GitHub 添加依赖 dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-sentinel-gateway/artifactId /dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactId /dependency 添加配置 sentinel:transport:# 添加sentinel的控制台地址dashboard: 127.0.0.1:8080 控制台实现方式 Sentinel 1.6.3 引入了网关流控控制台的支持用户可以直接在 Sentinel 控制台上查看 API Gateway 实时的 route 和自定义 API 分组监控管理网关规则和 API 分组配置。 从 1.6.0 版本开始Sentinel 提供了 Spring Cloud Gateway 的适配模块可以提供两种资源维度的限流 route 维度即在 Spring 配置文件中配置的路由条目资源名为对应的 routeId自定义 API 维度用户可以利用 Sentinel 提供的 API 来自定义一些 API 分组 自定义异常方式 1.通过yml spring:cloud.sentinel.scg.fallback.mode response spring.cloud.sentinel.scg.fallback.response-body {code:403,mes:限流了} 2.通过GatewayCallbackManager /**** Author 徐庶 QQ:1092002729* Slogan 致敬大师致敬未来的你*/ Configuration public class GatewayConfig {PostConstructpublic void init(){BlockRequestHandler blockRequestHandler new BlockRequestHandler() {Overridepublic MonoServerResponse handleRequest(ServerWebExchange exchange, Throwable throwable) {return ServerResponse.status(HttpStatus.OK).contentType(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(降级了!));}};GatewayCallbackManager.setBlockHandler(blockRequestHandler);} } 网关高可用 为了保证 Gateway 的高可用性可以同时启动多个 Gateway 实例进行负载在 Gateway 的上游使用 Nginx 或者 F5 进行负载转发以达到高可用。
http://www.hkea.cn/news/14259104/

相关文章:

  • 建设网站公司选哪家好营销外包团队
  • 企业网站开发技术题库那些做环保网站的好
  • 建设工程平台网站深圳软件定制
  • 滨海住房和城乡建设局网站做网站美工排版
  • soho需要建网站吗WordPress下级
  • 详细论述制作网站的步骤商城模板建站
  • 郑州网站seo推广网站建设公司郑州
  • 怎么制作属于自己的网站天猫网上商城
  • 网站含义湖北什么是网络营销
  • 云南网站建设找三好科技兰州最新消息今天又封了
  • 网站开发账务处理wordpress 安卓 管理系统
  • 响应式网站开发的国内网站设计公司
  • 网站建设公司排名前十洛阳哪里有做网站的
  • 上海网站关键词优化方法建网站程序
  • 服饰网站建设规划书廊坊seo排名
  • 网站目录结构网站建设为什么要全款
  • wordpress好玩排名sem优化软件
  • 做网站建设业务员怎么样网站如何搬家
  • 手机网站建设林肖云南高端网站建设
  • aaa云主机可以建网站吗seo做的好的网站有哪些
  • 网站开发者工具电子商务网站建设与管理基础
  • 简洁网站倒计时代码做网站需要好多图片
  • 网站开发三大流行语言seo优化软件大全
  • 汽车网站排行榜前十名代刷开通建设网站
  • 深圳电商网站设计广东新闻发布会
  • 福建永安建设局网站wordpress邮件有<>
  • 网站和域名区别吗python 做网站很快吗
  • 如何策划网站佛山微网站建设天博
  • 技术支持 石家庄网站建设vs做网站登录界面
  • 网站怎么套模板江苏元鼎建设工程有限公司网站