位置: IT常识 - 正文

微服务网关Gateway实践总结(微服务网关作用)

编辑:rootadmin
有多少请求,被网关截胡; 一、Gateway简介 微服务架构中,网关服务通常提供动态路由,以及流量控制与请求识别等核心能力,在之前的篇幅中有说过Zuul组件的使用流程,但是当下Gateway组件是更常规的选择,下面就围绕Gateway的实践做详细分析; 从架构模式上看,网关不管采用什么技术组件,都是 ...

推荐整理分享微服务网关Gateway实践总结(微服务网关作用),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:微服务网关gateway作用,微服务网关有哪些,微服务网关和api网关的区别,微服务网关作用,微服务网关gateway简书,微服务网关gateway作用,微服务网关gateway性能优化,微服务网关gateway作用,内容如对您有帮助,希望把文章链接给更多的朋友!

有多少请求,被网关截胡;

一、Gateway简介

微服务架构中,网关服务通常提供动态路由,以及流量控制与请求识别等核心能力,在之前的篇幅中有说过Zuul组件的使用流程,但是当下Gateway组件是更常规的选择,下面就围绕Gateway的实践做详细分析;

从架构模式上看,网关不管采用什么技术组件,都是在客户端与业务服务中间提供一层拦截与校验的能力,但是相比较Zuul来说,Gateway提供了更强大的功能和卓越的性能;

基于实践的场景来看,在功能上网关更侧重请求方的合法校验,流量管控,以及IP级别的拦截,从架构层面看,通常需要提供灵活的路由机制,比如灰度,负载均衡的策略等,并基于消息机制,进行系统级的安全通知等;

下面围绕客户端、网关层、门面服务的三个节点,分析Gateway的使用细节,即客户端向网关发出请求,经过网关路由到门面服务处理;

二、动态路由1、基础概念

路由:作为网关中最核心的能力,从源码结构上看,包括ID、请求URI、断言集合、过滤集合等组成;

public class RouteDefinition {private String id;private URI uri;private List<PredicateDefinition> predicates = new ArrayList<>();private List<FilterDefinition> filters = new ArrayList<>();}微服务网关Gateway实践总结(微服务网关作用)

断言+过滤:通常在断言中定义请求的匹配规则,在过滤中定义请求的处理动作,结构上看都是名称加参数集合,并且支持快捷的方式配置;

public class PredicateDefinition {private String name;private Map<String, String> args = new LinkedHashMap<>();}public class FilterDefinition {private String name;private Map<String, String> args = new LinkedHashMap<>();}2、配置路由

以配置的方式,添加facade服务路由,以路径匹配的方式,如果请求路径错误则断言失败,StripPrefix设置为1,即在过滤中去掉第一个/facade参数;

spring: application: name: gateway cloud: gateway: routes: - id: facade uri: http://127.0.0.1:8082 predicates: - Path=/facade/** filters: - StripPrefix=1

执行原理如下:

这里是以配置文件的方式,设置facade服务的路由策略,其中指定了路径方式,在Gateway文档中提供了多种路由样例,比如:Header、Cookie、Method、Query、Host等断言方式;

3、编码方式

基于编码的方式管理路由策略,在Gateway文档同样提供了多种参考样例,如果路由服务少并且固定,配置的方式可以解决,如果路由服务很多,并且需要动态添加,那基于库表方式更适合;

@Configurationpublic class GateConfig { @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route("facade",r -> r.path("/facade/**").filters(f -> f.stripPrefix(1)) .uri("http://127.0.0.1:8082")).build(); }}4、库表加载

在常规的应用中,从库表中读取路由策略是比较常见的方式,定义路由工厂类并实现RouteDefinitionRepository接口,涉及加载、添加、删除三个核心方法,然后基于服务类从库中读取数据转换为RouteDefinition对象即可;

@Componentpublic class DefRouteFactory implements RouteDefinitionRepository { @Resource private ConfigRouteService routeService ; // 加载 @Override public Flux<RouteDefinition> getRouteDefinitions() { return Flux.fromIterable(routeService.getRouteDefinitions()); } // 添加 @Override public Mono<Void> save(Mono<RouteDefinition> route) { return route.flatMap(routeDefinition -> { routeService.saveRouter(routeDefinition); return Mono.empty(); }); } // 删除 @Override public Mono<Void> delete(Mono<String> idMono) { return idMono.flatMap(routeId -> { routeService.removeRouter(routeId); return Mono.empty(); }); }}

在源码仓库中采用的就是库表管理的方式,代码逻辑的更多细节可以移步Git参考,此处不再过多粘贴;

三、自定义路由策略自定义断言,继承AbstractRoutePredicateFactory类,注意命名以RoutePredicateFactory结尾,重写apply方法,即可执行特定的匹配规则;@Componentpublic class DefCheckRoutePredicateFactory extends AbstractRoutePredicateFactory<DefCheckRoutePredicateFactory.Config> { public DefCheckRoutePredicateFactory() { super(Config.class); } @Override public Predicate<ServerWebExchange> apply(Config config) { return new GatewayPredicate() { @Override public boolean test(ServerWebExchange serverWebExchange) { log.info("DefCheckRoutePredicateFactory:" + config.getName()); return StrUtil.equals("butte",config.getName()); } }; } @Data public static class Config { private String name; } @Override public List<String> shortcutFieldOrder() { return Collections.singletonList("name"); }}自定义过滤,继承AbstractNameValueGatewayFilterFactory类,注意命名以GatewayFilterFactory结尾,重写apply方法,即可执行特定的过滤规则;@Componentpublic class DefHeaderGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory { @Override public GatewayFilter apply(AbstractNameValueGatewayFilterFactory.NameValueConfig config) { return (exchange, chain) -> { log.info("DefHeaderGatewayFilterFactory:"+ config.getName() + "-" + config.getValue()); return chain.filter(exchange); }; }}配置加载方式,此处断言与过滤即快捷的配置方式,所以在命名上要遵守Gateway的约定;spring: cloud: gateway: routes: - id: facade uri: http://127.0.0.1:8082 predicates: - Path=/facade/** - DefCheck=butte filters: - StripPrefix=1 - DefHeader=cicada,smile

通常来说,在应用级的系统中都需要进行断言和过滤的策略自定义,以提供业务或者架构层面的支撑,完成更加细致的规则校验,尤其在相同服务多版本并行时,可以更好的管理路由策略,从而避免分支之间的影响;

四、全局过滤器

在路由中采用的过滤是GatewayFilter,实际Gateway中还提供了GlobalFilter全局过滤器,虽然从结构上看十分相似,但是其职责是有本质区别的;

全局过滤器1:打印请求ID@Component@Order(1)public class DefOneGlobalFilter implements GlobalFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { log.info("request-id:{}",exchange.getRequest().getId()) ; return chain.filter(exchange); }}全局过滤器2:打印请求URI@Component@Order(2)public class DefTwoGlobalFilter implements GlobalFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { log.info("request-uri:{}",exchange.getRequest().getURI()) ; return chain.filter(exchange); }}

Gateway网关作为微服务架构系统中最先接收请求的一层,可以定义许多策略来保护系统的安全,比如高并发接口的限流,第三方授权验证,遭到恶意攻击时的IP拦截等等,尽量将非法请求在网关中拦截掉,从而保证系统的安全与稳定。

五、参考源码应用仓库:https://gitee.com/cicadasmile/butte-flyer-parent组件封装:https://gitee.com/cicadasmile/butte-frame-parent
本文链接地址:https://www.jiuchutong.com/zhishi/309254.html 转载请保留说明!

上一篇:帝国cms源码怎么安装(帝国cms商城源码)

下一篇:教你wordpress此站点遇到了致命错误如何解决(wordpress woocommerce 建站)

  • miui12.5增强版内存扩展在哪里(miui12.5增强版有什么新功能)

    miui12.5增强版内存扩展在哪里(miui12.5增强版有什么新功能)

  • 支付宝手机号怎么换号码(支付宝手机号怎么查看)

    支付宝手机号怎么换号码(支付宝手机号怎么查看)

  • 苹果手机录屏功能怎么设置(苹果手机录屏功能在哪里找)

    苹果手机录屏功能怎么设置(苹果手机录屏功能在哪里找)

  • 荣耀30手机多重(荣耀60手机参数)

    荣耀30手机多重(荣耀60手机参数)

  • qq的聊天记录怎么迁移到新手机上(qq的聊天记录怎么全部删除)

    qq的聊天记录怎么迁移到新手机上(qq的聊天记录怎么全部删除)

  • reno4是什么处理器(oppo reno4什么处理器?)

    reno4是什么处理器(oppo reno4什么处理器?)

  • 电脑怎么缩小显示比例(电脑怎么缩小显示比例win10)

    电脑怎么缩小显示比例(电脑怎么缩小显示比例win10)

  • 三星s8手机进入安全模式怎么退出(三星s8手机*#0*#进去后有什么功能)

    三星s8手机进入安全模式怎么退出(三星s8手机*#0*#进去后有什么功能)

  • 麦克风和耳机唱歌区别(麦克风和耳机唱歌一样吗)

    麦克风和耳机唱歌区别(麦克风和耳机唱歌一样吗)

  • 微信车主服务是什么(微信车主服务要钱吗)

    微信车主服务是什么(微信车主服务要钱吗)

  • 华为8x怎么分屏(华为8x手机怎么分屏使用教程)

    华为8x怎么分屏(华为8x手机怎么分屏使用教程)

  • iphone11怎么把电池电量百分比调出来(iphone11怎么把电话卡取出来)

    iphone11怎么把电池电量百分比调出来(iphone11怎么把电话卡取出来)

  • 腾讯视频上传视频审核要多久(腾讯视频上传视频超过1小时)

    腾讯视频上传视频审核要多久(腾讯视频上传视频超过1小时)

  • qq可以设置自动上下线吗(qq可以设置自动拒绝qq电话吗)

    qq可以设置自动上下线吗(qq可以设置自动拒绝qq电话吗)

  • 电池3750和4000差多少(电池容量3750和4000的多大区别?)

    电池3750和4000差多少(电池容量3750和4000的多大区别?)

  • 电脑怎么关机步骤(电脑怎么关机步骤英语版)

    电脑怎么关机步骤(电脑怎么关机步骤英语版)

  • 去除图片水印的方法(去除图片水印的软件)

    去除图片水印的方法(去除图片水印的软件)

  • 抖音每天关注上限是多少(抖音每天关注上限怎么解决)

    抖音每天关注上限是多少(抖音每天关注上限怎么解决)

  • 远程连接不上怎么处理(远程连接不上怎么回事)

    远程连接不上怎么处理(远程连接不上怎么回事)

  • ios微信怎么换透明头像(苹果微信透明主题教程)

    ios微信怎么换透明头像(苹果微信透明主题教程)

  • 苹果11和7p哪个屏幕大(苹果11和7p哪个信号强)

    苹果11和7p哪个屏幕大(苹果11和7p哪个信号强)

  • 苹果x防水到什么程度(苹果x防水不?)

    苹果x防水到什么程度(苹果x防水不?)

  • 怎么取消唱吧自动续费(如何取消唱吧自动续费功能)

    怎么取消唱吧自动续费(如何取消唱吧自动续费功能)

  • js调用gpt3.5(支持流回显、高频功能)(js调用函数的几种方法)

    js调用gpt3.5(支持流回显、高频功能)(js调用函数的几种方法)

  • python如何二值化图像(python 二值化)

    python如何二值化图像(python 二值化)

  • 税收滞纳金调增填哪张表
  • 资本公积转增资本的要求
  • 公账的钱取现金
  • 累计缴税扣除额
  • 工会经费应税项怎么算
  • 补交以前年度车船税
  • 出口未开票怎么会计处理
  • 2019一般纳税人新政策
  • 个税受雇日期以哪个日期
  • 职工薪酬会计准则
  • 机动车发票申请流程
  • 上一年度多计提折旧怎么调整
  • 简易征收税额航天信息服务费可以抵扣吗?
  • 日用品发票能报销吗
  • 电子商务平台支付的区别
  • 冠名发票申请要求有哪些?
  • 个人所得税怎么查
  • 股东入资印花税怎么计算
  • 税法三流合一是哪一项法律依据
  • 企业职工教育经费
  • 分红未及时扣缴税款要缴滞纳金吗?
  • 公司账户电子承兑
  • 公积金是否计入个人所得税
  • 财务每月需要报哪些税
  • 资本公积的借方和贷方各表示什么
  • 软件开发增值税即征即退2022
  • 如何在虚拟机上下载软件
  • macbookair重制系统
  • 收回已核销的坏账并入账是什么意思
  • 在win7系统中将打开窗口拖到屏幕顶端
  • php psr2
  • php str函数
  • windows11怎么操作
  • 强烈的建议
  • 土地使用税若干问题的补充规定
  • 建筑业统一发票真伪查询
  • 会计中持有至到期投资是什么意思
  • javaweb学生信息管理系统idea
  • 泛微oa二次开发难吗
  • 杭州西湖古风
  • 出售还在摊销的产品
  • Python 人脸识别系统
  • lsattr命令不存在
  • python删除nan
  • python中的sum函数怎么用
  • 工程款发票的数量和单价
  • 公司帐户到银行怎么取钱
  • 今天收到的
  • 织梦如何开启会员功能
  • 小规模企业免征增值税如何做账
  • 筹建期间的开办费属于资产吗
  • 哪些发票可以报销哪些不可以
  • 购买商标需要交什么税
  • 预收账款冲销账户怎么做
  • 有留抵税额的会计处理
  • 税控盘的主要功能
  • mysql几天能学会
  • mysql中的触发器
  • innodb怎么实现
  • 深入浅出了解啥意思
  • win2008r2密码忘了
  • win7系统安装程序无法创建新的系统分区
  • awk正则表达式中引入变量
  • linux yum安装apache
  • win8网络设置
  • 2015.6.28开始写博客记录cocos2dx学习历程
  • android 滚动选择器
  • 代码sd是什么意思
  • cmd for /f
  • 动态修改ip
  • python 线程教程
  • Using Django with GAE Python 后台抓取多个网站的页面全文
  • python数据操作
  • python中url
  • javastudio
  • 金税盘的操作步骤
  • 3.0t交强险
  • 银行是不是要交社保
  • 深圳布吉下水径旧改
  • 转卖车辆车船税多少
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设