API网关在微服务中的应用(1)

API拥有一些职责,如身份验证、监控、负载均衡、缓存、流控。API网关方式的核心要点是,所有客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。

简洁图:
图片
生产图:
图片

网关优点

通过上图中API网关做为系统统一入口,实现了对各个微服务间的整合,同时又做到了对客户端友好,屏蔽系统的复杂性和差异性。对比之前无API网关模式,API网关具有几个比较重要的优点:

1、网关可以和微服务注册中心连接,动态增加微服务应用,进行服务扩容
2、网关对于无法访问的服务,做到自动熔断
3、网关可以方便实现蓝绿部署、金丝雀发布
4、网关可处理微服务公共需求,简化微服务职责
5、网关可帮助客户端实现负载均衡

下面老顾就用图解的方式进行说明

接口优化

图片
我们发现各个微服务的接口返回体是不一样的,在之前没有网关的时候,客户端获取商品id为1的商品信息时,需要分别请求商品信息服务、价格服务、库存服务等,才能获得完整的商品信息。客户端自行进行数据组装处理。
有了网关这个多次接口请求就完全的交给网关进行处理,客户端只要请求/good/1一个接口就行了,网关会请求多个微服务,把多个微服务返回的值进行合并,一次性返回
完整的信息。简化了客户端请求接口的复杂性。

注意:有些业务数据,不一定要同步返回给客户端,也许异步会更好,根据用户体验,业务需求而定。如:促销价格的话,也许就需要客户端单独去请求了,而不是跟商品基础信息一起同步返回。具体要看业务哦

中心化

图片

1、在实际业务中,很多提供的微服务接口,是需要身份认证的;
2、还有就是对外部的流量控制,防止流量过大,把整体系统搞崩溃;需要预估系统能够支撑的流量。
3、访问日志,监控分析

以上的需求,每个微服务都需要,且跟具体业务无关;这种类似的需求,交给网关处理,再适合不过了。由网关统一处理,因为网关是入口,统一处理更加可控,简洁。让微服务接口做业务相关的事情上面。这就是中心化的思想,集中处理

负载均衡

图片
在实际的部署应用中,当应用系统面临大量访问,负载过高时,通常我们会增加服务数量来进行横向扩展,使用集群来提高系统的处理能力。此时多个服务通过某种负载算法分摊了系统的压力,我们将这种多节点分摊压力的行为称为负载均衡

网关为入口,由网关与微服务进行交互,所以网关必须要实现负载均衡的功能;网关会获取微服务注册中心里面的服务连接地址,再配合一些算法选择其中一个服务地址,进行处理业务。这个属于客户端侧的负载均衡,由调用方去实现负载均衡逻辑。

主流注册中心Eureka、Zookeeper等;负载均衡的算法一般有随机,轮询,权重,负载等。

服务熔断

图片

在现实生产环境中,会经常遇到某个服务突然停止了工作,然后返回了大量的错误。这个时间API网关可以实现断路器(circuit breakers)的能力,也就是说超过了指定的阈值,API网关就会停止发送请求到那些失败的服务。

这样就给了我们时间来分析日志,实现修复以及发包更新。通常当你发现一个模块下的某个实例失败后,这时候这个模块依然还会接收流量,然后这个有问题的模块还调用了其他的模块,这样就会发生级联故障,或者叫雪崩

断路器通过简单的断开流量的方式,这样就不会有新的请求到达那些有问题的实例,这时候我们就有相对充分的时间来修复和解决问题

灰度发布

又称金丝雀发布,起源是,矿井工人发现,金丝雀对瓦斯气体很敏感,矿工会在下井之前,先放一只金丝雀到井中,如果金丝雀不叫了,就代表瓦斯浓度高。图片
看看灰度发布逻辑

 在灰度发布开始后,先启动一个新版本应用,但是**并不直接将流量切过来**,而是测试人员对新版本进行线上测试,启动的这个新版本应用,就是我们的金丝雀。如果没有问题,那么可以将**少量的用户流量导入到新版本上**,然后再对新版本做运行状态观察,收集各种运行时数据,如果此时对**新旧版本做各种数据对比**,就是所谓的A/B测试。
新版本没什么问题,那么逐步扩大范围、流量,把**所有用户都迁移到新版本上面来**。

这种发布,通过网关就可以很好的实现,网关通过流控模块,进行控制分流。

现有网关框架

**1、Tyk:**Tyk是一个开放源码的API网关,它是快速、可扩展和现代的。Tyk提供了一个API管理平台,其中包括API网关、API分析、开发人员门户和API管理面板。Trk 是一个基于Go实现的网关服务。
**2、Kong:**Kong是一个可扩展的开放源码API Layer(也称为API网关或API中间件)。Kong 在任何RESTful API的前面运行,通过插件扩展,它提供了超越核心平台的额外功能和服务。
**3、Orange:**和Kong类似也是基于OpenResty的一个API网关程序,是由国人开发的。
**4、Netflix zuul:**Zuul是一种提供动态路由、监视、弹性、安全性等功能的边缘服务。Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器。
**5、Spring Cloud Gateway:**Spring Cloud Gateway是基于Spring 框架5.0版本和Spring Boot 2.0的版本构建,提供路由等功能。
6、apiaxle: Nodejs 实现的一个 API 网关。
**7、api-umbrella: **Ruby 实现的一个 API 网关。

总结

今天老顾有关网关的功能,就介绍到这里;网关是个非常核心组件,小伙伴们要多多了解,实战哦。

现在都说互联网寒冬,其实只要自身技术能力够强,咱们就不怕!我这边专门针对Android开发工程师整理了一套【Android进阶学习视频】、【全套Android面试秘籍】、【Android知识点PDF】。如有需要获取资料文档的朋友,可以点击我的GitHub免费获取!

最后

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

资料⬅专栏获取
或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

资料⬅专栏获取

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux工具(包含sudo提权与vim快捷配置)

目录 什么是软件包 查看软件包 如何安装软件 1.官方yum源下载 2.扩展yum源下载 如何卸载软件 补充知识如何将普通用户加入白名单 补充知识rzsz vim编辑器 1.命令模式(进入默认为这个模式)用户所有的输入都会被当成命令 2.插入模式 3.底行模…

01--MySQL数据库概述

目录 第1章 MySQL数据库概述 1.1 基本概念 1.2 MySQL数据库管理系统 1.3 表的关系 第2章 MySQL卸载、安装、登录 第3章 客户端使用演示 3.1 命令行客户端 3.1.1 数据库 3.1.2 数据表 3.1.3 导入数据 3.1.4 导出数据 3.2 可视化客户端 第4章 SQL语句 4.1 SQL的分类…

驾考小技巧:老北京布鞋!距离高考出分还剩3天,我却看到有些孩子已经拿了“满分”——早读(逆天打工人爬取热门微信文章解读)

我20年驾校4000多块钱,你呢? 引言Python 代码第一篇 洞见 距离高考出分还剩3天,我却看到有些孩子已经拿了“满分”第二篇 视频新闻结尾 引言 昨天的文章顺利发出 看来“梅西” 这两个字在我们这边 不是敏感词 只是很多个罗粉搞得有点过头了 …

代码随想录——分发饼干(Leetcode455)

题目链接 贪心 class Solution {public int findContentChildren(int[] g, int[] s) {Arrays.sort(g);Arrays.sort(s);int count 0;for(int i 0, j 0; i < g.length && j < s.length; i, j){if(s[j] > g[i]){count;}else{i--;}}return count;} }

【Proteus仿真】【Arduino单片机】基于物联网新能源电动车检测系统设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用LCD1602液晶显示模块、WIFI模块、蜂鸣器、LED按键、ADC、DS18B20温度传感器等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示温…

【进阶篇-Day4:使用JAVA编写石头迷阵游戏】

目录 1、绘制界面2、打乱石头方块3、移动业务4、游戏判定胜利5、统计步数6、重新游戏7、完整代码&#xff1a; 1、绘制界面 上述思路是&#xff1a;使用一个二维数组存放图片的编号&#xff0c;然后在后持遍历即可获取对应的图片。 代码如下&#xff1a; package com.itheima.s…

获取时间戳是使用System.currentTimeMillis()还是使用new Date().getTime()(阿里开发规范)?

1.阿里规范 在阿里的Java开发手册中强制要求使用System.currentTimeMillis() 2.为什么(源码详解) new Date().getTime()它实际上也是调用的System.currentTimeMillis()&#xff0c;源码分析。 这个fastTime是它的成员变量&#xff0c;在new Date()的时候就被赋值了。 扩展一…

计算机组成原理笔记-第3章 系统总线

第三章 系统总线 笔记PDF版本已上传至Github个人仓库&#xff1a;CourseNotes&#xff0c;欢迎fork和star&#xff0c;拥抱开源&#xff0c;一起完善。 该笔记是最初是没打算发网上的&#xff0c;所以很多地方都为了自我阅读方便&#xff0c;我理解了的地方就少有解释&#xf…

Android自定义View之不得不知道的文件attrs

其中demo_style如下:一般都是放的.9图片&#xff0c;为了方便就放个颜色了 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190820183209784.png?x-oss-processimage/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLm NzZG4ubmV0L3FxXzQyNzYxMz…

IDS使用规则

ids入侵检测系统 Snort(基于特征的入侵检测系统) 软硬件配套 snort官网链接&#xff1a;Snort - Network Intrusion Detection & Prevention System(https://www.snort.org) 环境&#xff1a;centos7,拖动需要开共享粘贴板和开双向 一、daq 1、预装dap所需程序 yum inst…

Unity 限时免费资源 - FANTASTIC万圣节资源包

Unity 资源 - FANTASTIC - Halloween Pack 万圣节包 前言资源包内容领取兑换码 前言 亲爱的 Unity 游戏开发者们&#xff0c;今天要给大家介绍一款限时免费的优质资源包 - FANTASTIC - Halloween Pack 万圣节资源包。 这个资源包为您的游戏创作带来了丰富的万圣节主题元素。其…

《STM32 HAL库》CAN通信系列函数详尽解析——HAL_CAN_Init()

食用指南&#xff1a;本文主要内容为梳理CAN初始化函数主要运行逻辑及重点功能实现代码的详尽解析。函数源码在文末&#xff0c;建议在阅读源码之后观看。 CAN相关寄存器图&#xff1a; 主要逻辑分析&#xff1a; 下面分点梳理函数的主要逻辑&#xff08;注意逻辑序号&#xf…

Python提取PDF文本和图片,以及提前PDF页面中指定矩形区域的文本

前言 从PDF中提取内容能帮助我们获取文件中的信息&#xff0c;以便进行进一步的分析和处理。此外&#xff0c;在遇到类似项目时&#xff0c;提取出来的文本或图片也能再次利用。要在Python中通过代码提取PDF文件中的文本和图片&#xff0c;可以使用 Spire.PDF for Python 这个…

为什么五笔没人用了?

五笔输入法现在较少人使用的原因主要有以下几点&#xff1a; 学习门槛高&#xff1a;五笔输入法的学习难度相对较大&#xff0c;需要掌握所有的字根&#xff0c;全面了解编码的规律&#xff0c;并学习每个字的拆字原则&#xff0c;这要求用户有相当高的耐心和时间去学习和练习…

openh264 帧级码率控制原理:RcCalculatePictureQp 函数

RcCalculatePictureQp 函数 函数功能 在码控中&#xff0c;当eSliceType为P_SLICE时 计算 P 帧的帧级量化参数QP 值。 函数原理过程 初始化各类变量&#xff1b;计算帧复杂度iFrameComplexity&#xff0c;如果iUsageType是SCREEN_CONTENT_REAL_TIME&#xff0c;重复赋值帧复…

MySQL【触发器、存储过程、函数、范式】

day53 MySQL 触发器 创建触发器&#xff1a;&#xff08;before &#xff1a; 前置触发器、after &#xff1a;后置触发器&#xff09; 语法&#xff1a; delimiter xx 指定分隔符xxcreate trigger 触发器名 [before | after] 触发事件 on 表名 for each row 执行语句begin…

maven:中央仓库验证方式改变:401 Content access is protected by token

前几天向maven中央仓库发布版本&#xff0c;执行上传命令mvn release:perform时报错了&#xff1a; [ERROR] Failed to execute goal org.sonatype.plugins:nexus-staging-maven-plugin:1.6.13:deploy (injected-nexus-deploy) on project xxxxx: Failed to deploy artifacts: …

智慧互联,Vatee万腾平台引领新潮流

在数字化、智能化的新时代&#xff0c;智慧互联正成为推动社会进步的重要力量。在这一潮流中&#xff0c;Vatee万腾平台凭借其卓越的技术实力和创新理念&#xff0c;正引领着新潮流&#xff0c;将智慧互联的理念融入生活的方方面面。 Vatee万腾平台是一个以大数据、云计算、人工…

C#利用SignalR实现通信事例Demo

1.服务端安装SignalR的Nuget包 dotnet add package Microsoft.AspNet.SignalR --version 2.4.3 2.接下来&#xff0c;创建一个ChatHub类&#xff0c;它是SignalR通信的核心&#xff1a; using Microsoft.AspNetCore.SignalR;public class ChatHub : Hub {public static Dict…

聊聊 C# dynamic 类型,并分享一个将 dynamic 类型变量转为其它类型的技巧和实例

前言 dynamic 是一种有别于传统变量类型的动态类型声明&#xff0c;刚开始接触可能在理解上会有些困难&#xff0c;可以简单地把它理解为一个盲盒&#xff0c;你可以任意猜测盒子有什么东西&#xff0c;并认为这些东西真正存在而进行处理&#xff0c;等到真正打开时&#xff0…