3、网关和BFF

news2025/1/31 11:05:15

一、网关和BFF的演进

  1. v1 使用nginx负载均衡简单的微服务体系;

  2. v2 nginx直接暴露

  3. v2.5无线BFF

  4. v3 集群BFF+无线网关

  5. v4无线网关、无线BFF根据业务集群化,废弃nginx集群

    二、网关和反向代理

网关和反向代理的选择:

 

关于网关集群问题:需要根据公司业务大小进行选择 

 三、设计简单网关-faraday

1.核心思想

2.代码实现

  • 路由映射表模块 
    • MappingsProvider路由映射表
      package xyz.staffjoy.faraday.core.mappings;
      
      import com.github.structlog4j.ILogger;
      import com.github.structlog4j.SLoggerFactory;
      import org.springframework.boot.autoconfigure.web.ServerProperties;
      import xyz.staffjoy.faraday.config.FaradayProperties;
      import xyz.staffjoy.faraday.config.MappingProperties;
      import xyz.staffjoy.faraday.core.http.HttpClientProvider;
      
      import javax.annotation.PostConstruct;
      import javax.servlet.http.HttpServletRequest;
      import java.util.List;
      import java.util.stream.Collectors;
      
      import static org.springframework.util.CollectionUtils.isEmpty;
      
      public abstract class MappingsProvider {
      
          private static final ILogger log = SLoggerFactory.getLogger(MappingsProvider.class);
      
          protected final ServerProperties serverProperties;
          protected final FaradayProperties faradayProperties;
          protected final MappingsValidator mappingsValidator;
          protected final HttpClientProvider httpClientProvider;
          protected List<MappingProperties> mappings;
      
          public MappingsProvider(
                  ServerProperties serverProperties,
                  FaradayProperties faradayProperties,
                  MappingsValidator mappingsValidator,
                  HttpClientProvider httpClientProvider
          ) {
              this.serverProperties = serverProperties;
              this.faradayProperties = faradayProperties;
              this.mappingsValidator = mappingsValidator;
              this.httpClientProvider = httpClientProvider;
          }
      
          public MappingProperties resolveMapping(String originHost, HttpServletRequest request) {
              if (shouldUpdateMappings(request)) {
                  updateMappings();
              }
              List<MappingProperties> resolvedMappings = mappings.stream()
                      .filter(mapping -> originHost.toLowerCase().equals(mapping.getHost().toLowerCase()))
                      .collect(Collectors.toList());
              if (isEmpty(resolvedMappings)) {
                  return null;
              }
              return resolvedMappings.get(0);
          }
      
          @PostConstruct
          protected synchronized void updateMappings() {
              List<MappingProperties> newMappings = retrieveMappings();
              mappingsValidator.validate(newMappings);
              mappings = newMappings;
              httpClientProvider.updateHttpClients(mappings);
              log.info("Destination mappings updated", mappings);
          }
      
          protected abstract boolean shouldUpdateMappings(HttpServletRequest request);
      
          protected abstract List<MappingProperties> retrieveMappings();
      }
      
      resolveMapping:根据主机头获取路由映射;
      updateMappings:更新路由表;
  • http映射表
    • 根据路由映射表获取到的路由,通过http映射表对目标服务发起调用
      package xyz.staffjoy.faraday.core.http;
      
      import org.apache.http.impl.client.CloseableHttpClient;
      import org.apache.http.impl.client.HttpClientBuilder;
      import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
      import org.springframework.web.client.RestTemplate;
      import xyz.staffjoy.faraday.config.MappingProperties;
      
      import java.util.HashMap;
      import java.util.List;
      import java.util.Map;
      
      import static java.util.stream.Collectors.toMap;
      import static org.apache.http.impl.client.HttpClientBuilder.create;
      
      public class HttpClientProvider {
          protected Map<String, RestTemplate> httpClients = new HashMap<>();
      
          public void updateHttpClients(List<MappingProperties> mappings) {
              httpClients = mappings.stream().collect(toMap(MappingProperties::getName, this::createRestTemplate));
          }
      
          public RestTemplate getHttpClient(String mappingName) {
              return httpClients.get(mappingName);
          }
      
          protected RestTemplate createRestTemplate(MappingProperties mapping) {
              CloseableHttpClient client = createHttpClient(mapping).build();
              HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(client);
              requestFactory.setConnectTimeout(mapping.getTimeout().getConnect());
              requestFactory.setReadTimeout(mapping.getTimeout().getRead());
              return new RestTemplate(requestFactory);
          }
      
          protected HttpClientBuilder createHttpClient(MappingProperties mapping) {
              return create().useSystemProperties().disableRedirectHandling().disableCookieManagement();
          }
      }
      

四、大型网关扩展

  • 限流熔断:保障用户体验,保障服务不会挂断
  • 动态路由和负载均衡:当服务多时,采用动态服务发现机制,k8s内部支持
  • 基于Path的路由:通过域名映射到服务
  • 截获器链:多个截获器构成的链状
  • 日志采集和Metrics埋点:日志+日志分析;掌握后台性能状况
  • 响应流优化:响应速度大时,内核态无需拷贝到用户态,直接以流的形式提供给网关

五、主流网关概览

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/39748.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【自动化持续集成必备基础】pipeline常用功能

简介 ​pipeline是一套运行在jenkins上的工作流框架&#xff0c;可以实现复杂流程的编排和可视化运行 pipeline支持两种语法&#xff1a;Declarative Pipeline(声明式流水线)和Scripted Pipeline (脚本式流水线) 本文重点介绍主流的声明式流水线 创建流水线项目 在Jenkins中如果…

SpringBoot SpringBoot 原理篇 2 自定义starter 2.4 使用属性配置设置功能参数【1】

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇2 自定义starter2.4 使用属性配置设置功能参数【1】2.4.1 直接开干2.4.2 小结…

linux驱动之调试技巧--- 应用程序远程gdb+vscode调试应用程序, 串口kgdboc调试.ko驱动程序

环境: Ubuntu: Ubuntu 22.04.1 开发板: imx6ull linux内核版本: Linux4.9.88 虚拟机: vmware15 交叉编译工具gcc版本: 4.9.4 (Linaro GCC 4.9-2017.01) arm-linux-gdb版本: gdb (Linaro_GDB-2017.01) 7.10.1.20160210 先决条件 开发板 虚拟机 PC 可互通网络 交叉编译环境已经搭…

哈希(Hash)

文章目录一、哈希是什么&#xff1f;二、哈希冲突三、开放定址法1.线性探测2.二次探测四、拉链法/哈希桶五、哈希的应用1.位图1.1 面试题1.2 位图概念1.3 位图的应用2.布隆过滤器2.1概念2.2布隆过滤器的查找2.3布隆过滤器的删除一、哈希是什么&#xff1f; Hash&#xff0c;一般…

语音识别系列︱利用达摩院ModelScope进行语音识别+标点修复(四)

终于有时间更新语音识别系列了&#xff0c;之前的几篇&#xff1a; 语音识别系列︱用python进行音频解析&#xff08;一&#xff09; 语音识别系列︱paddlehub的开源语音识别模型测试&#xff08;二&#xff09; 语音识别系列︱paddlespeech的开源语音识别模型测试&#xff08;…

1. JVM类加载机制

1. JVM类加载机制图解 下面我们来详细分析一下这个图解 1.1 其中loadClass()方法的调用的类加载的过程有如下几步 加载->验证->准备->解析->初始化->使用->卸载 加载&#xff1a;在硬盘上查找并通过IO读入字节码文件&#xff0c;当使用到这类的时候才会加…

[GYCTF2020]Ezsqli

先试一下万能密码 1 or 11# 发现有过滤&#xff0c;fuzz看一下过滤了什么 if&#xff0c;|&#xff0c;|| 没过滤&#xff0c;过滤了information_schema MySQL5.7新特性&#xff1a; 由于performance_schema过于复杂&#xff0c;所以mysql在5.7版本中新增了sys schemma&#x…

Docker实战之Redis主从集群搭建实战

实战 本实验将练习三主三从的Redis的docker集群快速搭建&#xff0c;实现集群的动态扩容和缩容&#xff0c;主从切换等常见实践项目。 拉取镜像 docker pull redis:6.0.8搭建主从 docker run -d --name redis-node-1 --net host --privilegedtrue -v /data/redis/share/red…

Allegro输出DXF文件操作指导

Allegro输出DXF文件操作指导 Allegro支持输出DXF文件,用于检查PCB的结构,具体操作如下 首先在PCB上打开需要的输出的层面,需要哪层开哪层,如下图所示 点击file-export 弹出一个对话框,输入文件名,格式选择Reversion14 ,单位选择mm,精度选择4 然后点击Edit 会出现一…

视频播放

QMediaPlayer不仅可以播放音频&#xff0c;还可以播放视频&#xff0c;不过要在屏幕上显示的话需要使用QVideoWidget和QGraphicsVideoItrm或自定义的类。QMovie 播放GIF文件QVideoWidget和QGraphicsVideoItrm都属于QMulimedia Widgets模块QVideoWidget 继承自QWiaget&#xff0…

Android Studio下载安装

一、下载 二、安装步骤 点击下载的安装包&#xff0c;选择地址的时候可以自定义&#xff0c;其他按照默认配置即可。 启动应用&#xff0c;开始配置 选择安装类型为标准安装&#xff1a; 选择主题 确认配置 同意协议 开始下载相关组件&#xff1a; 下载完成

SpringCloud - GateWay服务网关

文章目录一. Gateway概述1.Gateway是什么2. Gateway作用3. 微服务架构中网关的位置4. SpringCloud Gateway概念5. SpringCloud Gateway IO 模型二.Gateway的三大核心概念1. Route 路由2. Predicate 断言3. Filter 过滤4. 总结三.Spring Cloud Gateway工作流程四.服务搭建1. 创建…

Android 基础知识3-3(九妹)图怎么用呢?

1.本节引用&#xff1a; 可能有的一些疑问&#xff1a; 1.什么是.9图片&#xff1f; 答&#xff1a;图片后缀名前有.9的图片,如pic1.9.png这样的图片 2. .9图片能干嘛&#xff1f; 答&#xff1a; 在图片拉伸的时候特定的区域不会发生图片失真&#xff0c;而不失真的区域可以…

知识库指南4.0|AIGC Web3 元宇宙发展趋势的学习与实践指引

如何突破信息层面的认知&#xff0c;在 AIGC、Web3 与 元宇宙领域从 “围观” “看热闹” 到真正入门理解&#xff0c;并跟紧行业发展趋势&#xff0c;探索实践落地&#xff1f;&#xff08;阅读原文领取限量优惠券&#xff09;Mixlab小杜满足上述学习需求的知识库需要包含四要…

大数据(9f)Flink双流JOIN

文章目录概述开发环境使用状态列表实现 INNER JOIN&#xff08;双流connect后CoProcessFunction&#xff09;基于间隔的JOIN&#xff08;Interval Join&#xff09;基于窗口的JOIN&#xff08;Window Join&#xff09;概述 Flink双流JOIN可用算子或SQL实现&#xff0c;FlinkSQ…

图论基础学习笔记

图论1.简单图2.简单图的补图3.图的同构4.完全图5.偶图6.完全偶图1.简单图 简单图&#xff1a;无环无平行边的图。下图&#xff1a;左环右平行边 平凡图&#xff1a;G(1,0)G(1,0)G(1,0) 零图&#xff1a;G(p,0)G(p,0)G(p,0) 2.简单图的补图 补图&#xff1a;对于 G(V,E)G(V,…

继电器电路分析-继电器放电时间、反向冲击电压

继电器的应用&#xff0c;相信大家都知道&#xff0c;在电路中只要给它供电、断电也就可以工作了。 然而&#xff0c;它的应用细节&#xff0c;不知道大家有没注意 。下面谈谈我的观点。 01 现在流行的接法 如下图&#xff1a; 图中&#xff0c;继电器的线圈经过Q1作为开关…

《丞相好梦中杀人,我喜梦中听课》(1)密码学入门

前言 &#x1f340;作者简介&#xff1a;被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。 &#x1f341;个人主页&#xff1a;红中 &#x1fad2;每日emo&#xff1a;等我把脸皮磨厚 &#x1f342;专栏地址&#xff1a;网安专栏 今天周日&#xf…

金融开放度指数-世界银行三位数字编码、ISO Alpha-3 Code等多指标数据

1、数据来源&#xff1a;http://web.pdx.edu/~ito/Chinn-Ito_website.htm 2、时间跨度&#xff1a;1970-2019 3、区域范围&#xff1a;全国 4、指标说明&#xff1a; Chinn-Ito指数(KAOPEN)是衡量一个国家资本账户开放程度的指标。 该指数最初是在Chinn和Ito (Journal of D…

并发基础(四):线程池

尺有所短&#xff0c;寸有所长&#xff1b;不忘初心&#xff0c;方得始终。 请关注公众号&#xff1a;星河之码 线程池技术是一种多线程处理形式&#xff0c;将任务添加到队列中&#xff0c;通过线程池中创建出来的现成执行这些任务&#xff0c;省去了创建线程和销毁线程的消耗…