微服务-网关

   在微服务架构中,每个服务都是一个可以独立开发和运行的组件,而一个完整的微服务架构由一系列独立运行的微服务组成。其中每个服务都只会完成特定领域的功能,比如订单服务提供与订单业务场景有关的功能、商品服务提供商品展示功能等。各个微服务之间通过轻量级通信机制REST API或者RPC完成通信。

   实现微服务之后在某些层面会带来一定的影响,比如,一个用户查看一个商品的详情,对于客户端来说,可能需要调用商品服务、评论服务、库存服务、营销服务等多个服务来完成数据的渲染。如图10-1所示,在这个场景中,客户端虽然能通过调用多个服务实现数据的获取,但是会存在一些问题,比如:

  • 客户端需要发起多次请求,增加了网络通信的成本及客户端处理的复杂性。
  • 服务的鉴权会分布在每个微服务中处理,客户端对于每个服务的调用都需要重复鉴权。
  • 在后端的微服务架构中,可能不同的服务采用的协议不同,比如有HTTP、RPC等。客户端如果需要调用多个服务,需要对不同协议进行适配。

在这里插入图片描述

一 API网关的作用

   网关可以用来解决这个问题,如图10-2所示,在客户端与服务端之间增加了一个API网关。整体来看,网关有点类似于门面,所有的外部请求都会先经过网关这一层。
对于商品详情展示的场景来说,增加了API网关之后,在API网关层可以把后端的多个服务进行整合,然后提供唯一的业务接口,客户端只需要调用这个接口即可完成数据的获取及展示。在网关中会再消费后端的多个微服务,进行统一的整合,给客户端返回唯一的响应。

在这里插入图片描述
网关不仅只是做一个请求的转发及服务的整合,有了网关这个统一的入口之后,它还能提供以下功能。

  • 针对所有请求进行统一鉴权、限流、熔断、日志
  • 协议转化。针对后端多种不同的协议,在网关层统一处理后以HTTP对外提供服务。用过Dubbo框架的读者应该知道,针对Dubbo服务还需要提供一个Web应用来进行协议转化。
  • 统一错误码处理
  • 请求转发,并且可以基于网关实现内、外网隔离

下面针对上述网关作用的分析,选择几种常见的方案进行详细说明。

二、网关场景说明

2.1 统一认证鉴权

统一认证鉴权包含如下两部分。

  • 客户端身份认证:主要用于判断当前用户是否为合法用户,一般的做法是使用账号和密码进行验证。当然,对于一些复杂的认证场景会采用加密算法来实现,比如公、私钥。
  • 访问权限控制:身份认证和访问权限一般是相互联系的,当身份认证通过后,就需要判断该用户是否有权限访问该资源,或者该用户的访问权限是否被限制了。

在单体应用中,客户端身份认证及访问权限的控制比较简单,只需要在服务端通过session保存该用户信息即可。但是在微服务架构下,单体应用被拆分成多个微服务,鉴权的过程就会变得很复杂。

  • 首先要解决的问题是,原来单体应用中的session方式已经无法用于微服务场景。
  • 其次就是如何实现对每个微服务进行鉴权。

当然,对于第一个问题,目前已经有非常多的成熟解决方案了,比如AccessToken、Oauth(开放API)等。对于第二个问题,我们可以把鉴权的功能抽离出一个统一认证服务,所有的微服务在被访问之前,先访问该认证服务进行鉴权。这种解决方案看似合理,但是在实际应用中,一个业务场景中可能会调用多个微服务,就会造成一次请求需要进行多次鉴权操作,增加了网络通信开销。

如图10-3所示,增加API网关之后,在网关层进行请求拦截,获取请求中附带的用户身份信息,调用统一认证中心对请求进行身份认证,在确认了身份之后再检查是否有资源的访问权限

在这里插入图片描述

2.2 灰度发布

互联网公司的产品有一个特点,就是迭代非常快,很多公司会采用一周发布一个版本的选代模式。在这种高频率的迭代模式下,往往会伴随着一些风险,比如:

  • 新发布的代码出现兼容性问题。
  • 新的功能发布后,用户是否能够接受,如果不能,会造成用户流失。
  • 代码中存在隐藏的Bug,导致线上故障。

为了规避这些问题,对于有较大的功能性改动的版本一般都会采取灰度发布(又名金丝雀发布)的方式来实现平滑过渡

所谓灰度发布,就是指将要发布的功能先开放给一小部分用户使用,把影响范围控制在一个非常小的范围比如A/B Test就是一种灰度发布方式,即一部分用户继续使用A功能,另外一小部分用户使用新的B功能。通过对使用B功能的用户进行满意度调查,以及对新发布的代码的性能和稳定性指标进行评测,逐步放大该新版本的投放,直到全量或者回滚该版本。

对于应用系统来说,无非就是将新的功能发布在特定的灰度机器上,然后根据设定的规则将部分请求路由到灰度服务器上。

网关是所有客户端请求的入口,因此在网关层可以通过灰度规则进行部分流量的路由,从而实现灰度发布
如图10-4所示,网关对请求进行拦截之后,会根据分流引擎配置的分流规则进行请求的路由。

在这里插入图片描述

三、网关的本质及技术选型

通过前面的分析可以发现,网关的本质应该是对请求进行路由转发,以及对请求进行前置和后置的过滤

  • 请求的转发和路由:接收客户端的所有请求,并将请求转发到后端的微服务中。因为微服务的粒度比较细,所以API网关又类似于门面模式,对多个微服务进行功能整合,提供唯一的业务接口给客户端。
  • 过滤:网关会拦截所有的请求来完成一系列的横切工作,比如鉴权、限流。

常见的开源API网关实现方案有很多,比如OpenResty、Zuu、GateWay、Orange、Kong、Tyk等,下面

3.1 openResty

OpenResty实际上是由Nginx与Lua集成的一个高性能Web应用服务器,它的内部集成了大量优秀的Lua库、第三方模块。并且OpenResty团队自己研发了很多优秀的Nginx模块,开发人员可以使用Lua脚本来调用Nginx支持的C模块及Lua模块。
简单来说**,OpenResty本质上就是将Lua嵌入Nginx中,在每一个Nginx的进程中都嵌入了一个LuaJIT虚拟机来执行Lua脚本**。
对于OpenResty来说,它本质上仍然是Nginx服务器,可以实现反向代理和负载均衡。但是OpenResty为什么能够实现网关功能呢?

前面我们提到过,网关的本质是对请求进行路由转发及过滤,这意味着OpenResty在接收到客户端的请求时,同样可以拦截请求进行前置和后置的处理。事实上,OpenResty确实支持这种操作,它可以在不同的阶段来挂载Lua脚本实现不同阶段的自定义行为。如图10-5所示,可以看到init_by_lua、init_worker by_lua、setby_ua等11个指令,OpenResty实现网关功能的核心就是在这11个步骤中挂载Lua脚本来实现功能的扩展。

在这里插入图片描述
一个请求进入OpenResty之后,会根据请求所在的不同阶段按照如图10-5所示的流程执行不同的指令,每个指令的作用如下。

  • init_by_lua:当Nginx Master进程加载Nginx配置文件时会运行这段Lua脚本。
  • init_worker_by_lua:每个Nginx worker进程启动时会执行的Lua脚本,可以用来做健康检查
  • ssl_certificate_by_lua:当Nginx开始对下游进行SSL(HTTPS)握手连接时,该指令执行用
    在这里插入图片描述

3.2 Spring Cloud Zuul

Zuul是Netflix开源的微服务网关,它的主要功能是路由转发和过滤。大部分读者接触到Zuul应该是在SpringCloud Netflix生态中,它被整合到Spring Cloud中为微服务架构提供API网关的功能。
如图10-6所示,Zuul的核心由一系列过滤器组成,它定义了4种标准类型的过滤器,这些会对应请求的整个生命周期。

在这里插入图片描述

  • Pre Filters:前置过滤器,请求被路由之前调用,可以用于处理鉴权、限流等。
  • Routing Filters:路由过滤器,将请求路由到后端的微服务。
  • Post Filters:后置过滤器,路由过滤器中远程调用结束后执行。可以用于做统计、监控、日志等。
  • Error Filters:错误过滤器,任意一个过滤器出现异常或者远程服务调用超时会被调用。

3.3 Spring Cloud Gateway

Spring Cloud Gateway是Spring官方团队研发的API网关技术,它的目的是取代Zuul为微服务提供一种简单高效的API网关。
一般来说,Spring团队不会重复造轮子,为什么又研发出一个Spring Cloud Gateway呢?有以下几方面原因。

  • Zuul 1.x采用的是传统的thread per connection方式来处理请求,也就是针对每一个请求,会为这个请求专门分配一个线程来进行处理,直到这个请求完成之后才会释放线程,一旦后台服务器响应较慢,就会使得该线程被阻塞,所以它的性能不是很好
  • Zuul本身存在的一些性能问题不适合于高并发的场景,虽然后来Netfix决定开发高性能版Zuul2.x,但是Zuu 2.x的发布时间一直不确定。虽然Zuul 2.x后来已经发布并且开源了,但是Spring Cloud并没有打算集成进来
  • Spring Cloud Gateway是依赖于Spring Boot 2.0、Spring Webflux和Project Reactor等技术开发的网关,它不仅提供了统一的路由请求的方式,还基于过滤链的方式提供了网关最基本的功能。下面通过一些案例来了解Spring Cloud Gateway

四、Reactor 技术特点

Reactor 是一个用于JVM的完全非阻塞的响应式编程框架,具备高效的需求管理(即对 “背压(backpressure)”的控制)能力。它与 Java 8 函数式 API 直接集成Reactor 是一个用于JVM的完全非阻塞的响应式编程框架,具备高效的需求管理(即对 “背压(backpressure)”的控制)能力。它与 Java 8 函数式 API 直接集成,比如 CompletableFuture, Stream, 以及 Duration。它提供了异步序列 API Flux(用于[N]个元素)和 Mono(用于 [0|1]个元素),并完全遵循和实现了“响应式扩展规范”(Reactive Extensions Specification)。

Reactor 的 reactor-ipc 组件还支持非阻塞的进程间通信(inter-process communication, IPC)。 Reactor IPC 为 HTTP(包括 Websockets)、TCP 和 UDP 提供了支持背压的网络引擎,从而适合 应用于微服务架构。并且完整支持响应式编解码(reactive encoding and decoding)。

<dependencyManagement> 
    <dependencies>
        <dependency>
            <groupId>io.projectreactor</groupId>
            <artifactId>reactor-bom</artifactId>
            <version>2023.0.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>io.projectreactor</groupId>
        <artifactId>reactor-core</artifactId> 
        
    </dependency>
    <dependency>
        <groupId>io.projectreactor</groupId>
        <artifactId>reactor-test</artifactId> 
        <scope>test</scope>
    </dependency>
</dependencies>

4.2、响应式编程

响应式编程是一种关注于数据流(data streams)和变化传递(propagation of change)的异步编程方式。 这意味着它可以用既有的编程语言表达静态(如数组)或动态(如事件源)的数据流。
参考:https://blog.csdn.net/qq_63438013/article/details/136461257

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

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

相关文章

SpringBoot文件上传--头像上传

目录 1.在配置文件中写好物理路径和访问路径 2.写配置文件 3.页面上传 4.控制层 5.效果 1.在配置文件中写好物理路径和访问路径 &#xff08;自定义&#xff09;file:uploadPath: D:/upload/img/ 物理路径path: /file/** 访问路径 2.写配置文件 package com.example…

BCLinux8U6系统基线加固致无法su的问题分析

本文对BCLinux8U6系统进行基线加固致无法su的问题分析。 一、问题现象 对BCLinux8U6系统进行基线加固&#xff0c;su切换用户失败&#xff0c;报错信息如下&#xff1a; [ABCDlocalhost ~]$ su - 密码&#xff1a; su: 模块未知 二、问题分析 1、错误排查 出错前&#xf…

探索进程控制第一弹(进程终止、进程等待)

文章目录 进程创建初识fork函数fork函数返回值fork常规用法fork调用失败的原因 写时拷贝进程终止进程终止是在做什么&#xff1f;进程终止的情况代码跑完&#xff0c;结果正确/不正确代码异常终止 如何终止 进程等待概述进程等待方法wait方法waitpid 进程创建 初识fork函数 在…

自定义校验(这里是Validation)

1.自定义注解State package com.itheima.anno;import com.itheima.Validator.StateValidator; import jakarta.validation.Constraint; import jakarta.validation.Payload;import java.lang.annotation.*;Documented//元注解 Target(ElementType.FIELD) Retention(RetentionP…

力扣HOT100 - 239. 滑动窗口最大值

解题思路&#xff1a; class Solution {public int[] maxSlidingWindow(int[] nums, int k) {if(nums.length 0 || k 0) return new int[0];Deque<Integer> deque new LinkedList<>();int[] res new int[nums.length - k 1];// 未形成窗口for(int i 0; i <…

瑞山集团携手数环通iPaaS,实现ERP与CRM无缝对接

01 客户背景 瑞山集团位于粤港澳大湾区核心商圈----佛山市&#xff0c;是一家致力于各种新型材料添加剂应用推广&#xff0c;集科研、销售和服务于一身的新材料企业&#xff0c;产品覆盖了塑料黏胶剂、水性涂料、3D打印材料、电子材料、纳米材料等各种行业。 公司旗下拥有几间不…

pdffactory pro 8注册码序列号下载 附教程

PdfFactory Pro可以说是一款行业专业且技术领先的的PDF虚拟打印机软件。其不仅占用系统内存小巧&#xff0c;功能强大&#xff0c;可支持用户无需使用Acrobat来创建Adobe PDF即可以进行PDF组件的创建和打印。同时&#xff0c;现在全新的PdfFactory Pro 8也正式上线来袭&#xf…

雄安建博会:中矿雄安新区的总部开工建设

中矿落位雄安&#xff1a;助力国家战略与新区发展 雄安新区&#xff0c;作为中国未来发展的重要战略支点&#xff0c;正迎来一系列央企总部的疏解与建设。最近&#xff0c;中国矿产资源集团有限公司&#xff08;简称“中矿”&#xff09;在雄安新区的总部项目正式开工建设&…

在win10上虚拟一个LoongOS系统(类似虚拟机)作为开发环境

文章目录 1.安装1.1.下载这三个东西1.2.安装好qemu。1.3.创建一个启动脚本startup_mate.bat&#xff0c;然后把三部分东西放到一起1.4.然后双击startup.bat就可以启动了。 2.文件的传输2.1.使能虚拟机系统的ssh2.2.连接ssh 3.Qt相关安装Qt安装opencv 1.安装 注意&#xff0c;一…

Web前端—属性描述符

属性描述符 假设有一个对象obj var obj {a:1 }观察这个对象&#xff0c;我们如何来描述属性a&#xff1a; 值为1可以重写可以遍历 我们可以通过Object.getOwnPropertyDescriptor得到它的属性描述符 var desc Object.getOwnPropertyDescriptor(obj, a); console.log(desc);我…

uniapp 2.0可视化开发工具:提升跨平台应用开发效率的新篇章

摘要 随着移动互联网的迅猛发展&#xff0c;跨平台应用开发成为前端开发者关注的热点。uniapp作为一款优秀的跨平台应用框架&#xff0c;其2.0版本的发布为开发者带来了更多的便利和可能性。其中&#xff0c;可视化开发工具的出现更是为前端开发带来了革命性的变革&#xff0c…

Windows下docker-compose部署DolphinScheduler

参照&#xff1a;快速上手 - Docker部署(Docker) - 《Apache DolphinScheduler v3.1.0 使用手册》 - 书栈网 BookStack 下载源文件 地址&#xff1a;https://dolphinscheduler.apache.org/zh-cn/download/3.2.1 解压到指定目录&#xff0c;进入apache-dolphinscheduler-xxx-…

【Qt 学习笔记】Qt信号和槽的其他说明及Lambda表达式

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt信号和槽的其他说明及Lambda表达式 文章编号&#xff1a;Qt 学习笔记…

ctfshow--web入门--文件上传--web168--web170

web168 法一免杀脚本 还是检查&#xff0c;准备上传图片马 我写的是<?php eval($_POST[a]);?> 上传之后没反应 那么查一下&#xff0c;原来是发现对eval,system还有$_POST和$_GET进行过滤,$_REQUEST还可以用 那么再写一个马&#xff08;免杀脚本&#xff09; <?…

ht1622不显示无反应问题解决

如果你正在写ht1622 驱动时&#xff0c;怎么看程序都没问题&#xff0c;抓取波形&#xff0c;示波器分析波形&#xff0c;如果都没有问题&#xff0c;那么很大可能是硬件问题&#xff0c;检测看看 ht1622 RD是不是接地了。 RD 低会进入读取模式&#xff0c;所以不用RD 请将RD悬…

2024年河北省职业院校技能大赛高职组“信息安全管理与评估”赛项样题

培训、环境、资料、考证 公众号&#xff1a;Geek极安云科 网络安全群&#xff1a;775454947 网络系统管理群&#xff1a;223627079 网络建设与运维群&#xff1a;870959784 极安云科专注于技能提升&#xff0c;赋能 2024年广东省高校的技能提升&#xff0c;受赋能的客户院校均…

某次众测的加解密对抗

前言 起源于某次众测中&#xff0c;遇到请求包响应包全密文的情况&#xff0c;最终实现burp中加解密。 用到的工具有 sekiro&#xff08;rpc转发&#xff09;flask&#xff08;autodecoder自定义接口&#xff09;autodecoder&#xff08;burp插件转发&#xff09; debug部分…

<网络> 网络Socket编程基于TCP协议模拟简易网络通信

目录​​​​​​​ 前言&#xff1a; 一、字符串回响 &#xff08;一&#xff09;程序结构 &#xff08;二&#xff09;初始化服务器 &#xff08;三&#xff09;启动服务器 1. 处理连接请求 2. 业务处理 3. 回调函数 &#xff08;四&#xff09;填充server源文件 &…

公司刚招了一个5年测试,竟然连抓包都不会

大家都知道&#xff0c;无论是测试人员还是开发人员&#xff0c;移动端抓包都是必须掌握的关键技能。然而还有人在测试岗位上干了这么久&#xff0c;还是不懂如何进行抓包&#xff01;今天就跟大家分享两款在日常工作中常用的抓包工具&#xff1a;Fiddler和Charles Fiddler和C…

94岁诺奖得主希格斯去世,曾预言「上帝粒子」的存在

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 一位用诗意的语言揭示宇宙秘密的人。 一位 94 岁伟大科学家的逝世&#xff0c;引发了人们广泛…