微服务之API网关

2023-11-04

隐藏细节

现实生活中有很多隐藏细节的案例,比如我们平时用的电脑,当我们按电源按钮后电脑就自动开始启动了,对用户来讲很简单只需要知道按按钮就行。但电脑内部的工作原理其实是很复杂的一个流程。 
这里写图片描述

如果不隐藏细节会怎样?

我想可能的结果就是电脑只能是特别特别的专业人员才能操作,永远无法像现在一样成为大家的必备工具。对大多数用户来讲他们根本不知道知道什么CPU,内存,硬盘,显卡相互之间是如何配合工作的,只关心打开电脑后能够正常使用软件完成他们的任务即可。

门面模式

在面向对象设计中,GOF有个门面模式就是对客户端隐藏细节的一个典型应用。 
这里写图片描述

WEB API网关

通常WEB API网关是系统的唯一入口,它封装了系统内部架构,为客户端统一提供服务。有一些与业务无关的公共逻辑可以抽象到网关中实现,比如客户端的认证,访问控制,监控,缓存等,示意图如下。 
这里写图片描述

客户端认证

无论是对内网还是外网的接口都是需要做用户身份认证的,而用户认证在一些规模大点的公司都会有统一的单点登录系统,如果每个微服务系统都是做对接单点登录系统的工作,那么显然比较浪费资源,开发效率低。可以将认证的部分抽取到网关层,然后微服务系统无需关注认证的逻辑只关注自身业务即可。

访问控制

对一些特定的接口设置白名单,访问次数,访问频率等各类设置。而这些非业务功能的配置以及变更不会影响微服务的实现可以在网关层单独做操作。

负载均衡

可以灵活的在网关层制定负载均衡策略。

安全

可以统一在网关层增加一个额外的保护层来防止恶意攻击,如果客户端直连微服务的话,每个暴露的微服务都需要面临安全问题。

WEB API网关在设计上与上面提供到门面模式是相当的,也是对客户端隐藏细节。除了上面提供的那些常见公共功能外,还有如下一些实用的功能:

限流

对于大型互联网项目还会有限流的需求。为了防止站点不被未知的大流量冲跨,有可能会采取限流的策略,网关配置一个阀值,当请求数超过阀值时就直接返回错误而不会走剩下的逻辑。

限流如何实现?限流的方案有很多: 
在网关层可以利用hystrix来实现。如果是针对待定的客户端也可以利用nginx的限流。guava提供了一个RateLimiter,它是基于令牌桶的算法实现,以固定的速率往队列中放令牌,可以结合它自己实现限流可以结合它自己实现限流。可兼容更多的协议, 比如有些服务是SOAP,基于二进制的Thrift,还有DUBBO这类RPC实现,可以统一转换成HTTP来对外提供。

微服务带来的问题

随着业务的发展,原来简单的系统会变得越来越复杂,一个团队变成多个团队,多个团队同时在一个系统中开发会存在各种各样的问题,数据量的增长也会使单库的性能越来越慢,所以随其自然的会按业务对系统进行垂直划分,比如: 
- 产品系统 
- 价格系统 
- 促销系统 
- 订单系统 
- 库存系统 
- 评论系统 
- 推荐系统 
- 用户系统 
这些系统当下比较流行的是以微服务的形式存在,暴露一批细粒度的接口给其它系统调用。

前端系统如何调用微服务

比如用户查看一个产品的明细页面,它会包含产品基本信息,价格信息,促销信息,推荐信息,评论信息等,按上面的微服务组成,前端系统想拿到产品的所有数据需要调用众多的微服务,这在要求性能的互联网项目上是不太可行的,光http请求就比之前增加多倍,而且也会增加客户端的复杂度,它需要知道所有这些微服务的详细信息。 
这里写图片描述

不要让前端知道微服务的存在

即使系统从业务领域的层次上被划分成多个独立的微服务,但对于前端系统还是应该隐藏细节,提供粗粒度的接口。 
这里写图片描述

系统架构

这里回顾下以前我参与的一个跨境电商系统,从架构来看还是做的比较标准的。前端是APP以及H5,对接一个mobile api,mobile api内部包含各类子服务。

其实我们是针对项目的,电商系统对接mobile api,另外一个线下店的APP对接的新开发的store api。这两个api是完全独立的,并不是一个公司一个web api,所以说我们这两web api是项目级别的网关,而有些公司可能会提供公司级别的网关。 
这里写图片描述

架构简要说明:

前端是APP+H5 
H5站点是通过Nginx做反向代理去执行js,不懂APP,所以略过。 
Mobile API,H5以及APP唯一对接后端的入口,采用Spring MVC实现。里面包含了所有前端需要用到的接口。

微服务,DUBBO实现的RPC, 数据库中间件mybatis。缓存,基于Spring Cache+redis。检索系统,基于elasticsearch。消息系统,RabbitMQ。上图中没有体现,是将业务数据更新到检索系统的一个broker。 
未用到限流,当时数据量太小,担心的不是服务器被冲跨是担心没人冲。 
也不包含一些并行请求合并的高级用法,可以理解成一个高内聚的服务。

WEB API网关的优点

  • 隐藏细节,对客户端友好
  • 简化了客户端开发复杂度
  • 降低了客户端与服务端交互交互
  • 可统一做切面任务,避免每个子系统各自为营,五花八门
  • 使客户端与服务端解耦,容易构造异构系统

WEB API网关的缺点

需要增加一个高可用伸缩性强的站点。WEB API网关项目在开发上是个串行任务,每暴露一个接口都需要去更新WEB API网关,如果同时有不同部门的需求去更新就会存在排队更新的情况。

 

转载:https://blog.csdn.net/zdp072/article/details/76473383

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微服务之API网关 的相关文章

  • CSS —— line-height详解

    本文导读 行高 指一行文子的高度 具体来说是指两行文子间基线间的距离 在CSS line height被用来控制行与行之间的垂直距离 line height 属性会影响行框的布局 在应用到一个块级元素时 它定义了该元素中基线之间的最小距离而
  • c语言蜂鸣声音音乐代码

    include include
  • 单例(Singleton)设计模式

    单例 Singleton 设计模式 1 概念 某个类只能存在一个对象实例 并且该类只提供一个取得该对象实例的方法 2 实现方式 懒汉式 这种写法线程不安全 package com lmwei p20 import com sun org a
  • SQL 高级查询

    select from score select from Student 统计函数 count总数 max最大 min最小 avg平均 sum求和 count select count from Student max select ma
  • 公有链VS联盟链

    相信有人也听说过区块链分为公有链 私有链和联盟链 那么 它们三者有何区别 业内外人士对于该采用哪种类型的区块链看法不一 并引发了诸多围绕公有链 联盟链与私有链的争论 但是业内普遍认为联盟链与私有链实属一类 目前金融机构多偏向私有链 但也有人
  • 详解vue中diff算法

    详解vue中diff算法 vue中diff算法 作用 1 真实DOM和虚拟DOM 2 diff的比较方式 diff涉及到的函数 总结 vue中diff算法 本质 找出两个对象之间的差异 核心 子节点数组进行比较 首尾两端对比 作用 渲染真实
  • halcon——缺陷检测常用方法总结(模板匹配(定位)+差分)

    引言 机器视觉中缺陷检测分为一下几种 blob分析 特征 模板匹配 定位 差分 光度立体 halcon 缺陷检测常用方法总结 光度立体 唯有自己强大 博客园 cnblogs com 特征训练 测量拟合 频域 空间域结合 halcon 缺陷检
  • 射极跟随器实验报告数据处理_射极跟随器实验报告

    射极跟随器实验报告 由会员分享 可在线阅读 更多相关 射极跟随器实验报告 3页珍藏版 请在人人文库网上搜索 1 实验六 射极跟随器一 实验目的l 掌握射极跟随器的特性及测量方法 2 进一步学习放大器各项参数的测量方法 二 实验原理下图为射极
  • 自定义异常 raise 关键字

    目录 自定义抛出异常关键字 raise 使用raise主动引发异常 raise 关键字的用法 触发异常 自定义异常类 python从小白到总裁完整教程目录 https blog csdn net weixin 67859959 articl
  • 移动端安全通信的利器——端到端加密(E2EE)技术详解

    前言 端到端加密允许数据在从源点到终点的传输过程中始终以密文形式存在 采用端到端加密 又称脱线加密或包加密 时消息在被传输时到达终点之前不进行解密 因为消息在整个传输过程中均受到保护 所以即使有节点被损坏也不会使消息泄露 端到端加密系统与链
  • jsoncpp库使用实例

    jsoncpp与json json是什么 JSON JavaScript Object Notation 是一种轻量级的数据交换格式 它是一种文本格式 它实际上是一种独立于编程语言的数据格式 几乎所有现代编程语言都支持解析和生成JSON数据
  • C++回文子串

    回文子串 给定一个字符串 你的任务是计算这个字符串中有多少个回文子串 回文串是一个正读和反读都一样的字符串 具有不同开始位置或结束位置的回文串 即使是由相同的字符组成 也会被计为是不同的子串 输入 仅包含一个字符串 长度不会超过 1000
  • RSA私钥及公钥生成

    1 生成密钥 cmd 进入jdk的bin目录下 输入如下命令 keytool genkey alias xxxx keyalg RSA keysize 1024 storetype pkcs12 keystore D xxxx p12 会出
  • xml文件的注释展示

    xml文件的注释格式 lt 被注释的内容 gt 注释不能嵌套定义 XML可以从HTML中分离数据 即能够在HTML文件之外将数据存储在XML文档中 这样可以使开发者集中精力使用HTML做好数据的显示和布局 并确保数据改动时不会导致HTML文
  • Latex中的(左边有大括号的)方程组解决方案汇总

    CODE begin equation begin cases eq1 eq2 end cases end equation 对于不需对齐的方程组这样写比较方便 需要对齐的时候间距太大了 有时候需要对齐 这时候我用 CODE begin e
  • 欢迎来到 C# 9.0(Welcome to C# 9.0)

    C 9 0 已于 2020年11月10日 正式发布了 请点击链接转至 C 9 0 正式发布了 C 9 0 on the record 阅读最新版内容 https mp weixin qq com s b7yd5FoR6jDrhx8K 310
  • php 返回header,PHP header返回http头类型大全 header( Content-T

    php 代码库 定义编码 header Content Type text html charset utf 8 Atom header Content type application atom xml CSS header Conten
  • qt5.5.1 linux 64下载,[更新]Qt Enterprise v5.5.1正式发布[附下载]

    原标题 更新 Qt Enterprise v5 5 1正式发布 附下载 Qt最早诞生于1991年 长期以来一直以 linux平台下 最著名的开发平台 身份 在全世界开发者中享有盛誉 Qt Enterprise是目前最先进 最完整的跨平台C

随机推荐

  • 这个Chrome 插件,让你的GPT无比丝滑!

    ChatGPT的官网最近几天报错越来越频繁了 相信大家都发现了 一旦你离开页面时间比较久 再度返回跟它进行对话 就会出现如下报错 虽然这个报错信息以前也出现过 但现在的频率确实过高 对于每天需要使用 ChatGPT 处理大量任务的用户来说
  • 我们压缩了一批深度学习进阶“传送门”给小白

    编译 ShanLIU Chloe 笪洁琼 Harry 作者 Seth Weidman 阅读这篇文章的必要性 无论是作为行业内的从业者还是一个组织 在开始深度学习应用之前 都需要掌握两件事 1 知其然 掌握一个基础概念 知道深度学习的最新发展
  • Vue路由跳转到新页面之后,返回旧页面保持状态不变

    新项目中遇到了登录时点击用户协议 进入协议页面让用户阅读 然后返回登录页面时发现原来填写的手机号验证码全都没有了 解决方案 使用keep alive 在vue app中添加keep alive标签
  • MyBatis快速入门(四) MyBatis和Spring集成

    导入依赖包 前面介绍了MyBatis的相关知识 现在来介绍一下如何和Spring进行集成 MyBatis和Spring的集成工作是由MyBatis团队完成的 所以我们首先要先引入MyBatis和Spring的集成依赖包 这里我用的是Grad
  • 【渗透测试】Apache Shiro系列漏洞

    目录 Shiro 550 CVE 2016 4437 1 漏洞原理 2 影响版本 3 漏洞利用 Shiro 721 1 漏洞原理 2 影响版本 3 漏洞利用 Shiro认证绕过漏洞 CVE 2020 1957 1 漏洞原理 2 影响版本 3
  • 前端js调用方法的几种方式

    最近在做前端项目 因为没上vue还是原生的jq方法 所以遇到各种各样的问题 在这记录下几种前端触发的方法 1 onclick 在标签内直接写 nclick qz this 即可 然后js中写方法 2 fxbsbutton click 第一个
  • 变量的作用域和变量提升

    京东面试题 面试官小姐姐给出了一道题 var a 100 function test console log a a 10 console log a console log this a var a test 问我这三个会打印出来的值是什
  • 大数乘法 V2

    给出2个大整数A B 计算A B的结果 Input 第1行 大数A 第2行 大数B A B的长度 lt 100000 A B gt 0 Output 输出A B 如果用正常的大数乘法来做 会发现时间复杂度是的 显然是会TLE的 为了避免这种
  • 爬虫scrapy框架进阶-CrawlSpider, Rule

    文章适合于所有的相关人士进行学习 各位看官看完了之后不要立刻转身呀 期待三连关注小小博主加收藏 小小博主回关快 会给你意想不到的惊喜呀 文章目录 scrapy中加入CrawlSpider 创建项目 提取器和规则RULE scrapy爬虫实战
  • Inno Setup使用方法备份

    http www 360doc com content 13 0327 03 4221543 274250221 shtml
  • Java 注解计算12生肖,java Data中获取年,根据生日日期获取生肖注解,根据输入时间获取生肖,自定义注解的方式获取生肖 根据年份时间获取十二生肖

    最近 开发中需要增加生肖 但是不想增加字段 于是通过注解的方式 实现生日与生肖的转换 话不多说 直接上代码 如下 实体类中的字段 添加自定义注解 ToChineseZodiacSerializer 生肖 根据生日计算生肖 JsonSeria
  • Feign:Decoder与ErrorDecoder

    Feign在spingcloud架构中 各微服务之间的调用工具 它整合了ribbon的负载均衡 采用声明调用 使服务之间的调用更加简单 FeignClient value product configuration FeignBaseCon
  • DecimalFormat格式化显示数字

    DecimalFormat 是 NumberFormat 的一个具体子类 用于格式化十进制数字 可以实现以最快的速度将数字格式化为你需要的样子 DecimalFormat 类主要靠 和 0 两种占位符号来指定数字长度 0 表示如果位数不足则
  • 树莓派外设开发之玩传感器

    参考 用树莓派玩传感器 作者 LEO max 发布时间 2021 02 24 16 30 46 网址 https blog csdn net zouchengzhi1021 article details 114026649 spm 100
  • Linux下的USB总线驱动(一)

    Linux下的USB总线驱动 一 分类 linux驱动 子系统 总线 Mini2440 2012 11 23 11 06 516人阅读 评论 0 收藏 举报 版权所有 转载请说明转自 http my csdn net weiqing1981
  • 把Objects365制作为Tensorflow数据集

    Objects365是北京旷视科技有限公司与北京智源人工智能研究院共同发布的全球最大的目标检测数据集 该数据集总共包含63万张图像 覆盖365个类别 高达1000万框数 具有规模大 质量高 泛化能力强的特点 远超Pascal VOC COC
  • SystemView 应用笔记

    一 什么是Systemview SystemView 是一个可以在线调试嵌入式系统的工具 它可以分析有哪些中断 任务执行了 以及这些中断 任务执行的先后关系 还可以查看一些内核对象持有和释放的时间点 比如信号量 互斥量 事件 消息队列等 这
  • mysql是一种什么类型的数据库管理系统_mysql是一种什么类型的数据库管理系统?...

    我就废话不多说了 大家还是直接看代码吧 create or replace function aa1 a1 integer a2 bigint returns void AS declare ii integer declare num i
  • JqGrid 使用方法详解 一

    JQGrid是一个在jquery基础上做的一个表格控件 以ajax的方式和服务器端通信 JQGrid Demo 是一个在线的演示项目 在这里 可以知道jqgrid可以做什么事情 下面是转自其他人blog的一个学习资料 与其说是学习资料 说成
  • 微服务之API网关

    隐藏细节 现实生活中有很多隐藏细节的案例 比如我们平时用的电脑 当我们按电源按钮后电脑就自动开始启动了 对用户来讲很简单只需要知道按按钮就行 但电脑内部的工作原理其实是很复杂的一个流程 如果不隐藏细节会怎样 我想可能的结果就是电脑只能是特别