为什么微服务一定要有网关呢

news2025/1/23 10:15:03

一、什么是服务网关

服务网关 = 路由转发 + 过滤器

1、路由转发:接收一切外界请求,转发到后端的微服务上去;

2、过滤器:在服务网关中可以完成一系列的横切功能,例如权限校验、限流以及监控等,这些都可以通过过滤器完成(其实路由转发也是通过过滤器实现的)。

二、为什么需要服务网关

上述所说的横切功能(以权限校验为例)可以写在三个位置:

  • 每个服务自己实现一遍

  • 写到一个公共的服务中,然后其他所有服务都依赖这个服务

  • 写到服务网关的前置过滤器中,所有请求过来进行权限校验

第一种,缺点太明显,基本不用;第二种,相较于第一点好很多,代码开发不会冗余,但是有两个缺点:

  • 由于每个服务引入了这个公共服务,那么相当于在每个服务中都引入了相同的权限校验的代码,使得每个服务的jar包大小无故增加了一些,尤其是对于使用docker镜像进行部署的场景,jar越小越好;

  • 由于每个服务都引入了这个公共服务,那么我们后续升级这个服务可能就比较困难,而且公共服务的功能越多,升级就越难,而且假设我们改变了公共服务中的权限校验的方式,想让所有的服务都去使用新的权限校验方式,我们就需要将之前所有的服务都重新引包,编译部署。

而服务网关恰好可以解决这样的问题:

  • 将权限校验的逻辑写在网关的过滤器中,后端服务不需要关注权限校验的代码,所以服务的jar包中也不会引入权限校验的逻辑,不会增加jar包大小;

  • 如果想修改权限校验的逻辑,只需要修改网关中的权限校验过滤器即可,而不需要升级所有已存在的微服务。

所以,需要服务网关!!!

三、服务网关技术选型

引入服务网关后的微服务架构如上,总体包含三部分:服务网关、open-service和service。

1、总体流程

  • 服务网关、open-service和service启动时注册到注册中心上去;

  • 用户请求时直接请求网关,网关做智能路由转发(包括服务发现,负载均衡)到open-service,这其中包含权限校验、监控、限流等操作

  • open-service聚合内部service响应,返回给网关,网关再返回给用户

2、引入网关的注意点

  • 增加了网关,多了一层转发(原本用户请求直接访问open-service即可),性能会下降一些(但是下降不大,通常,网关机器性能会很好,而且网关与open-service的访问通常是内网访问,速度很快);

  • 网关的单点问题:在整个网络调用过程中,一定会有一个单点,可能是网关、nginx、dns服务器等。防止网关单点,可以在网关层前边再挂一台nginx,nginx的性能极高,基本不会挂,这样之后,网关服务就可以不断的添加机器。但是这样一个请求就转发了两次,所以最好的方式是网关单点服务部署在一台牛逼的机器上(通过压测来估算机器的配置),而且nginx与zuul的性能比较,根据国外的一个哥们儿做的实验来看,其实相差不大,zuul是netflix开源的一个用来做网关的开源框架;

  • 网关要尽量轻。

3、服务网关基本功能

  • 智能路由:接收

    外部

    一切请求,并转发到后端的对外服务open-service上去;

    • 注意:我们只转发外部请求,服务之间的请求不走网关,这就表示全链路追踪、内部服务API监控、内部服务之间调用的容错、智能路由不能在网关完成;当然,也可以将所有的服务调用都走网关,那么几乎所有的功能都可以集成到网关中,但是这样的话,网关的压力会很大,不堪重负。

  • 权限校验:只校验用户向open-service服务的请求,不校验服务内部的请求。服务内部的请求有必要校验吗?

  • API监控:只监控经过网关的请求,以及网关本身的一些性能指标(例如,gc等);

  • 限流:与监控配合,进行限流操作;

  • API日志统一收集:类似于一个aspect切面,记录接口的进入和出去时的相关日志

  • 。。。后续补充

上述功能是网关的基本功能,网关还可以实现以下功能:

  • A|B测试:A|B测试时一块比较大的东西,包含后台实验配置、数据埋点(看转化率)以及分流引擎,在服务网关中,可以实现分流引擎,但是实际上分流引擎会调用内部服务,所以如果是按照上图的架构,分流引擎最好做在open-service中,不要做在服务网关中。

  • 。。。后续补充

4、技术选型

笔者准备自建一个轻量级的服务网关,技术选型如下:

  • 开发语言:java + groovy,groovy的好处是网关服务不需要重启就可以动态的添加filter来实现一些功能;

  • 微服务基础框架:springboot;

  • 网关基础组件:netflix zuul;

  • 服务注册中心:consul;

  • 权限校验:jwt;

  • API监控:prometheus + grafana;

  • API统一日志收集:logback + ELK;

  • 压力测试:Jmeter;

  • 。。。后续补充

在后续的介绍中,会逐渐介绍各个知识点,并完成一个轻量级的服务网关!!!

 

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

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

相关文章

Anaconda环境GDAL库基于whl文件的配置方法

本文介绍在Anaconda环境下,基于.whl文件安装Python中高级地理数据处理库GDAL的方法。 在文章Anaconda下Python中GDAL模块的下载与安装方法(https://blog.csdn.net/zhebushibiaoshifu/article/details/124307748)中,我们介绍了基于…

[附源码]计算机毕业设计的实验填报管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis MavenVue等等组成,B/S模式…

我是如何使用docker安装nginx并配置https服务的

文章目录前言一、前期准备1、备案好的域名2、安装nginx2.1 下载nginx的docker镜像2.2 新建用于映射的目录2.3 从容器中拷贝nginx配置2.4 启动 nginx二、配置步骤1、申请免费的证书2、下载证书3、把证书上传至服务器4、配置 .conf 文件4.1 后端接口服务 api.conf 配置4.2 前端项…

数据智仓功能介绍(四)

字段设置 使用场景介绍 字段设置,即在数据智仓中,对输入上一数据处理节点的字段进行显示和隐藏、排序、重命名等操作。 操作配置 对数据类型的转换,主要用户复杂数据的处理的情况下 ,例如某个字段是JSON ,那么通过数…

用 JS 解析 excel 文件需要分几步

八月长江万里晴,千帆一道带风轻。 大家好,我是嘿嘿,今天来聊一聊如何使用 JS 来解析 excel 文件,当然不是直接使用 exceljs、sheetjs 之类的库,那就没意思了,而是主要说一下 JS 解析 excel 表格是如何实现的…

STM32F4 IAP 跳转 APP问题

1. 概念 IAP 的作用,网上其他资料已经有很多介绍了,这里放一个链接,不进行深入的介绍。本文的关注重点是Bootloader在跳转APP程序中出现的问题。 IAP的实现原理讲解以及中断向量表的偏移 2. 程序 本人主要做应用层的开发,所有Boo…

深蓝学院-多传感器融合定位课程-第7章-基于滤波的融合方法I

专栏文章: 深蓝学院-多传感器融合定位课程-第1章-概述_goldqiu的博客-CSDN博客 深蓝学院-多传感器融合定位课程-第2章-3D激光里程计I_goldqiu的博客-CSDN博客 深蓝学院-多传感器融合定位课程-第3章-3D激光里程计II_goldqiu的博客-CSDN博客 深蓝学院-多传感器融合定位课程-第…

自学100天,零基础转行软件测试,我要以更好的姿态奔赴下一场山海~

三年大专一场空 专业是电子商务,18年毕业,当时在报考时时觉得电子商务挺高大上的,觉得电商肯定会有前途,以后毕业肯定好找工作,跟大多数人一样,我开始幻想我以后毕业以后的纸醉金迷的生活,我以…

落地 DevOps,探索高效研发运营一体化解决方案

前言与概述 伴随着企业业务的快速发展,为了支撑业务发展,提高 IT 对业务的支撑能力建设。在研发工程协同方面,希望加强代码管理,实现持续构建、自动化测试、自动化部署、自动化运维,同时加强产品的安全和质量管理&…

华为路由器 静态路由

需求&#xff1a; 实现 PC1 与 PC2 互通 1、拓扑图 主机IP掩码网关PC1192.168.10.10255.255.255.0192.168.10.1PC2192.168.40.40255.255.255.0192.168.40.1PC3192.168.30.30255.255.255.0192.168.30.1 2、R1 路由器 <Huawei>undo ter mo Info: Current terminal monit…

c#调用c++捕获SEH异常

C代码&#xff1a; extern "C" __declspec(dllexport) int ExceptionTest() { int* pointer NULL;*pointer 100; return 100; }c#代码&#xff1a; class C_Sharp_Call_C__{[DllImport("testDll.dll", CallingConvention CallingConvention.Cdecl)]p…

SpringMVC:Spring与SpringMVC各自bean加载控制(2)

问题提出&#xff1a;学习Spring技术的时候在config目录下创建了一个配置类SpringConfig。现在学习SpringMVC技术在config目录下又创建一个SpringMvcConfig配置类。这两个配置类都需要加载资源&#xff0c;那么它们分别都需要加载哪些内容? 目录结构&#xff1a; config目录存…

[附源码]Python计算机毕业设计房屋租赁管理系统设计Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

完全可用的迁移docker目录方案(centos/redhat)

完全可用的迁移docker目录方一、前提二、具体操作如下&#xff1a;2.1 先模拟运行一个 docker mysql2.2 先停docker进程2.3 新建存储目录2.4 修改启动默认的目录2.4.1 使用软链接(推荐)2.4.2 修改/etc/docker/daemon.json &#xff08;推荐&#xff09;2.4.3 指定容器启动参数&…

【深度学习】PyTorch深度学习实践 - Lecture_12_Basic_RNN

文章目录一、RNN介绍1.1 RNN为什么能处理有序数据&#xff1f;1.2 RNNCell内部剖析二、How to use RNNCell In PyTorch2.1 参数分析2.2 PyTorch代码实现三、How to use RNN In PyTorch3.1 参数分析3.2 NumLayers3.3 PyTorch代码实现3.4 其他参数四、Example1&#xff1a;Using …

fpga实操训练(锁相环pll)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 锁相环pll是fpga区别于stm32、soc很重要的一个特征。通常来说&#xff0c;输入的晶振一般是25m、50m这样的&#xff0c;不一定能满足功能的开发。这…

QT—QList与QLinkedList类的常用方法

QList<T>维护了一个指针数组&#xff0c;数组元素指向每一个链表项&#xff0c;因此QList<T> 提供了基于下标的快速访问。QLinkedList<T>是一个链式列表&#xff0c;不能使用下标访问&#xff0c;与QList相比&#xff0c;当对一个很大的列表进行插入操作时&a…

最近爆火chatGTP是人工智能还是人工智障?

关于chatGTP和一些话题? OpenAI 发布了 ChatGPT&#xff0c;是一个可以对话的方式进行交互的模型&#xff0c;因为它的智能化&#xff0c;得到了很多用户的欢迎。 ChatGPT是InstructGPT的兄弟模型&#xff0c;可以以对话的形式与用户交互&#xff0c;这使得ChatGPT能够回答问…

linux第五章---git的基本操作

git作为代码管理仓库&#xff08;版本管理工具&#xff09;&#xff0c;主要有GitHub和Gitee等等。&#xff0c;大家可以登录官网注册&#xff0c;Github经常访问不到&#xff08;看运气&#xff09;&#xff0c;Gitee作为国内比较火的一个平台(较商业化)。 1.git基本概念 工…

Java连接Access数据库改成MySQL连接数据库

升级诉求&#xff1a;Java连接Access已经算是过时的产物了&#xff0c;一般作为存储服务的应用在Java界比较常用的还是MySQL&#xff0c; 当然还有Oracle数据库。这里要讲的就是连接MySQL数据库了。 就是因为有了SQL标准&#xff0c;各大厂商实现SQL语句基本上大同小异&#xf…