分布式之网关介绍

一、网关简介

1、网关背景

  • 由于微服务“各自为政的特性”使微服务的使用非常麻烦。
  • 通常公司会有一个“前台小姐姐”作为统一入口,这就是网关

2、网关作用

  • 统一入口:为服务提供一个唯一的入口,网关起到外部和内部隔离的作用, 保障了后台服务的安全性。
  • 鉴权校验:识别每个请求的权限,拒绝不符合要求的请求。
  • 动态路由:动态的将请求路由到不同的后端集群中。
  • 减少客户端与服务端的耦合:服务可以独立发展,通过网关层来做映射。

3、网关优势

  • 路由和负载均衡:网关可以作为反向代理,接收客户端请求并将其路由到后端的多个服务器。通过使用负载均衡算法,网关可以根据服务器的负载情况分发请求,从而实现请求的平衡和优化。
  • 安全性和访问控制:网关可以充当安全层,通过在请求到达应用程序之前进行身份验证、授权和访问控制来保护应用程序。它可以拦截和阻止恶意请求、DDoS攻击和SQL注入等常见的安全威胁。
  • 协议转换和数据格式转换:网关可以处理不同的协议和数据格式之间的转换。它可以将来自客户端的请求从一种协议转换为另一种协议,或将后端服务的响应转换为适合客户端的数据格式,从而实现系统之间的无缝集成和通信。
  • 监控和分析:网关可以收集和监控来自客户端和后端服务的请求和响应数据。它可以记录日志、统计数据和指标,提供关于请求流量、性能和错误的实时监控和分析。这些信息可以帮助开发人员和管理员识别问题、优化性能和做出决策。

4、网关劣势

  • 在微服务这种去中心化架构中,成为瓶颈点:如果网关挂掉,将会影响整个系统的可用性。作为系统的入口点,网关的故障可能导致无法访问后端服务和应用程序。
  • 服务如果不是异步或者同步非阻塞,耦合度高:如果通过网关调用后端服务不可用或者响应时间超时,我们的连接数量是有限的,这时候网关处理能力下降这时候可能造成其他服务的不可用,严重者甚至导致雪崩效应

二、常见网关的对比

1、Netflix Zuul1.0

  • 中小厂落地案例丰富
  • 基于同步阻塞I0,性能差
  • Netflix已经停止了对Zuul 1.0的维护和开发

2、SpringCloud Gateway

  • 是Spring Cloud生态系统中的官方网关解决方案,与其他Spring Cloud组件(如Eureka、Ribbon、Hystrix等)无缝集成
  • 响应式支持:Spring Cloud Gateway基于Spring WebFlux框架,使用非阻塞式I/O和响应式编程模型,具有高性能和高吞吐量的特点

3、Netflix Zuul2.0

  • 基于非阻塞式I/O模型,性能接近SpringCloud Gateway
  • 它的开发和维护在2019年底停止了。Netflix推荐使用Spring Cloud Gateway作为替代方案,

4、综合对比

Zuul1.0Spring Cloud GatewayZuul2.0
长连接支持不支持支持支持
IO模型阻塞非阻塞非阻塞
性能
编程语言JavaJavaJava
协议支持HttpHttpHttp
流量管理需要二次开发需要二次开发需要二次开发
扩展性
成熟度
使用场景中小型流量项目大部分场景大部分场景

5、为什么自研网关

5.1 开源网关的不足

  • 限制性:开源网关通常具有一些默认的行为和规则,可能无法满足特定业务需求的定制化要求。某些功能可能无法直接扩展或修改,需要深入了解和修改源代码,这对于非开发人员来说可能是一项挑战。
  • 可靠性和稳定性:开源网关在稳定性和可靠性方面可能存在一些问题。尽管开源社区通常会及时修复和改进问题,但是在某些情况下,可能会遇到较长时间的修复周期或仍存在未解决的问题。这对于对高可用性和系统稳定性要求较高的应用来说可能是一个问题。
  • 技术支持和文档:相比商业解决方案,开源网关通常缺乏官方的技术支持和详细的文档。虽然开源社区通常提供一定的支持,但可能无法提供即时和全面的帮助。这对于在生产环境中使用开源网关的企业来说可能是一个潜在的风险。
  • 学习和培训成本:使用开源网关可能需要团队成员投入时间和精力来学习和理解其架构、配置和使用方式。这可能需要额外的培训和学习成本,特别是对于新加入的团队成员来说。
  • 安全性和漏洞:尽管开源网关通常经过广泛的社区审查,但仍然存在潜在的安全漏洞。由于开源代码的公开性,攻击者可以更容易地发现和利用其中的漏洞。这要求团队及时更新和升级网关,以确保应用的安全性。
  • 依赖和版本兼容性:开源网关可能依赖于其他的开源组件和库,可能需要处理版本兼容性和依赖冲突的问题。这可能需要额外的工作量来管理和升级依赖项,以确保系统的稳定性和一致性。

5.2 自研网关优势

  • 定制化能力:自研网关可以根据具体业务需求进行定制和扩展,满足特定场景的需求。你可以根据自己的业务逻辑、安全需求、性能要求等来设计和实现网关,确保网关与整个系统的需求高度匹配。
  • 灵活性和可扩展性:自研网关可以根据业务的发展和变化进行灵活调整和扩展。你可以根据需求添加新的功能、修改路由规则、引入新的协议等,而无需依赖第三方网关的更新和发布周期。
  • 性能和吞吐量:自研网关可以根据需求进行性能优化,以满足高并发和低延迟的要求。你可以选择合适的技术栈、采用非阻塞式I/O模型、引入异步处理等,以提升网关的性能和吞吐量。
  • 安全性和可控性:自研网关可以根据业务需求实现定制化的安全策略和访问控制机制。你可以集成各种认证和授权机制、请求过滤和防御机制,以确保系统的安全性,并根据具体需求进行调整和优化。
  • 增强的监控和调试能力:自研网关可以针对自身的需求添加详细的监控指标和调试功能。你可以收集和展示请求流量、性能指标、错误日志等数据,以便进行监控、故障排查和性能优化。
  • 技术栈选择:自研网关可以根据团队的技术栈和专长选择合适的技术和工具。你可以选择自己熟悉和喜欢的编程语言、框架和库,使网关的开发和维护更加高效和舒适。

三、网关整体设计

1、技术选型

1.1 基础框架

  • SpringIOC ,SpringAOP,Springmvc
  • Spring Boot
  • 原生Java

1.2 网络框架

  • 原生NIO
  • Mina
  • Netty

1.3 注册中心

  • Zookeeper:Zookeeper是一个分布式协调系统,可以用于服务注册与发现。它提供了一个可靠的分布式数据存储,并支持高可用性和一致性。由于他是强一致所以不适合,大数据量的注册
  • Eureka:Eureka是Netflix开源的服务注册与发现组件,被设计为在云环境中运行。它采用了基于REST的架构,具有简单的配置和易于使用的特点。Netflix在官方文档中已宣布停止对Eureka的更新和维护
  • Consul:Consul是一个开源的服务网格解决方案,提供了服务注册与发现、健康检查、键值存储、分布式一致性和多数据中心功能等,但是他是GO语言实现的
  • Nacos:Nacos是阿里巴巴开源的一个服务发现、配置管理和服务治理平台。它提供了统一的服务注册与发现、动态配置管理、服务健康监测和流量管理等功能,帮助构建和管理云原生应用和微服务架构

1.4 配置中心

  • Spring Cloud Config:Spring Cloud Config是Spring Cloud提供的配置管理工具用于集中管理和分发应用程序的配置,但是不支持动态刷新
  • Apollo
  • Nacos

2、高性能要点

2.1异步化处理

  • 单异步模式 (Future)
  • 双异步模式 (completeFuture)

image.png

Future接口在某些方面存在一些局限性,这些局限性包括:

  1. 阻塞式获取结果:Futureget()方法是阻塞的,这意味着如果任务的结果还没有准备好,调用 get()方法的线程将会被阻塞,直到结果可用。这可能会导致应用程序的性能下降,特别是当需要同时处理多个 Future对象时。
  2. 无法取消任务:Future接口提供了 cancel()方法来取消任务的执行,但是这个方法并不能真正地取消任务的执行。它只是尝试去取消任务,并返回一个表示取消成功与否的布尔值。如果任务已经开始执行或已经完成,那么 cancel()方法将无效。
  3. 缺乏异常处理:Future接口的 get()方法会抛出 InterruptedExceptionExecutionException异常。然而,这些异常并不提供足够的信息来了解任务失败的原因。当任务抛出异常时,我们无法在 Future对象上捕获和处理这些异常。
  4. 无法组合多个 Future对象:在某些情况下,我们可能需要组合多个异步任务的结果,例如并行执行多个任务并将它们的结果合并。Future接口本身并不提供直接的支持来处理这种情况,需要使用其他的方法,例如使用 CompletionService或者 CompletableFuture来实现。

为了克服这些局限性,Java 8 引入了 CompletableFuture类,它提供了更强大和灵活的功能,包括更好的异常处理、组合多个任务的结果以及异步任务的回调等。CompletableFuture类提供了一种更现代和易于使用的方式来处理异步编程任务。

CompletableFuture

CompletableFuture是Java编程语言中的一个类,它在Java 8中引入作为CompletableFuture API的一部分。它属于java.util.concurrent包,并提供了一种执行异步编程和处理异步计算结果的方式。

CompletableFuture代表了一个可能在未来完成的计算,并允许你将多个操作链接在一起形成一个流水线。每个操作都是异步执行的,这意味着它可以与其他操作或任务并发运行。

以下是关于CompletableFuture的一些关键特性和概念:

  1. 异步执行:CompletableFuture提供了一种异步执行任务的方式,这意味着你可以启动一个任务并继续执行其他操作,而不需要等待任务完成。
  2. 组合:你可以将多个CompletableFuture实例链接在一起,形成一个操作的流水线。这使得你可以表达复杂的异步工作流和任务之间的依赖关系。
  3. 完成动作:CompletableFuture允许你指定在CompletableFuture完成时应执行的动作,无论是正常完成还是异常完成。你可以附加回调函数,在计算结果可用时执行,或者处理任何发生的异常。
  4. 结果合并:CompletableFuture提供了多种方法,在多个CompletableFuture都完成时合并它们的结果。例如,你可以使用 thenCombine方法指定一个函数,将两个CompletableFuture的结果合并并产生一个新的结果。
  5. 异常处理:CompletableFuture提供了多种方法来处理计算过程中发生的异常。你可以使用 exceptionally方法指定一个备用值,或者使用 handle方法处理异常并基于异常产生一个结果。
  6. 异步执行模型:CompletableFuture支持不同的执行模型,例如使用单独的线程异步执行任务,或者利用线程池执行任务。

image.png

package com.msb;import java.util.concurrent.*;public class FutureTaskTest {public static void main(String[] args) throws ExecutionException, InterruptedException {// 创建任务T2 FutureTaskFutureTask<String> ft2 = new FutureTask<>(new T2Task());// 创建任务T1的 FutureTaskFutureTask<String> ft1 = new FutureTask<>(new T1Task(ft2));// 线程1 执行T2任务Thread t1 = new Thread(ft2);t1.start();// 线程2执行  任务他Thread t2 = new Thread(ft1);t2.start();//等待返回结果System.out.println(ft1.get());}}
// T1 任务 洗水壶,烧开水,泡茶class T1Task implements Callable<String>{FutureTask<String> ft2;public T1Task(FutureTask<String> ft2) {this.ft2 = ft2;}@Overridepublic String call() throws Exception {System.out.println("T1 洗水壶。。。。。");TimeUnit.SECONDS.sleep(1);System.out.println("T1 烧开水。。。。。");TimeUnit.SECONDS.sleep(2);// 获取T2线程String res = ft2.get();System.out.println("T1 拿到茶叶。。。" + res);System.out.println("T1 泡茶。。。。。");return "喝茶" + res;}
}
// T2任务 洗茶壶、洗茶杯、拿茶叶class T2Task implements Callable<String>{@Overridepublic String call() throws Exception {System.out.println("T2 洗茶壶。。。。。");TimeUnit.SECONDS.sleep(1);System.out.println("T2 洗茶杯。。。。。");TimeUnit.SECONDS.sleep(2);System.out.println("T2 拿茶叶。。。。。");TimeUnit.SECONDS.sleep(1);return "铁观音";}
}
package com.msb;import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;public class CompletableFutureTest {public static void main(String[] args) {// 任务1: 洗水壶 -> 烧开水CompletableFuture<Void> f1 = CompletableFuture.runAsync(() -> {System.out.println("T1 洗水壶。。。。。");sleep(1,TimeUnit.SECONDS);System.out.println("T1 烧开水。。。。。");sleep(2,TimeUnit.SECONDS);});// 任务2: 洗茶壶 -> 洗茶杯 -> 拿茶叶CompletableFuture<String> f2 = CompletableFuture.supplyAsync(() -> {System.out.println("T2 洗茶壶。。。。。");sleep(1,TimeUnit.SECONDS);System.out.println("T2 洗茶杯。。。。。");sleep(2,TimeUnit.SECONDS);System.out.println("T2 拿茶叶。。。。。");sleep(1,TimeUnit.SECONDS);return "铁观音";});// 任务3: 任务1和任务2完成后执行:泡茶CompletableFuture<String> f3 = f1.thenCombine(f2, (__, tf) -> {System.out.println("T1 拿到茶叶。。。。" + tf);System.out.println("T1 泡茶");return "喝茶:" + tf;});// 等待任务3的执行结果System.out.println(f3.join());}static void sleep(int t ,TimeUnit u){try {u.sleep(t);} catch (InterruptedException e) {e.printStackTrace();}}
}

2.2 使用缓存机制

尽量使用内容作为缓存(Map、Queue) ,比如加载的配置

2.3 合理利用串行和并行化机制

  • 串行化使用场景

    耗时较小,性能要求较高的场景

  • 并行化使用场景

    耗时较久,任务之间没有依赖关系,比如远程RPC调用场景

3、整体架构

image.png

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

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

相关文章

阿里云幻兽帕鲁4核16G和8核32G服务器优惠价格

2024阿里云幻兽帕鲁专用服务器价格表&#xff1a;4核16G幻兽帕鲁专用服务器26元一个月、149元半年&#xff0c;默认10M公网带宽&#xff0c;8核32G幻兽帕鲁服务器10M带宽价格90元1个月、271元3个月。阿里云提供的Palworld服务器是ECS经济型e实例&#xff0c;CPU采用Intel Xeon …

C#,图论与图算法,用于检查给定图是否为欧拉图(Eulerian Graph)的算法与源程序

1 欧拉图 欧拉图是指通过图(无向图或有向图)中所有边且每边仅通过一次通路, 相应的回路称为欧拉回路。具有欧拉回路的图称为欧拉图(Euler Graph), 具有欧拉通路而无欧拉回路的图称为半欧拉图。 对欧拉图的一个现代扩展是蜘蛛图,它向欧拉图增加了可以连接的存在点。 这给…

AJAX-综合

文章目录 同步代码和异步代码回调函数地狱解决回调函数地狱Promise-链式调用async函数和awaitasync函数和await-捕获错误 事件循环宏任务与微任务Promise.all静态方法 同步代码和异步代码 同步代码&#xff1a;逐步执行&#xff0c;需原地等待结果后&#xff0c;才继续向下执行…

阿里云效流水线—发布公用jar到Maven私仓

后端项目发布 1.选择流水线 2.新建流水线 3.选择模板 4.选择代码仓库 5.调整构建命令 添加mvn install 重新构建项目 6.添加镜像 在wms-app目录下新建Dockerfile文件(Dockerfile文件名中的D一定要是大写的&#xff09;文件&#xff0c;重新推送项目 #基础镜像 FROM openjd…

【力扣hot100】1. 两数之和 49.字母异位词分组 128. 最长连续序列

目录 1. 两数之和题目描述做题思路参考代码 49.字母异位词分组题目描述做题思路参考代码 128. 最长连续序列题目描述做题思路参考代码 1. 两数之和 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数…

EPO企业生产运营数智化平台助力制造企业迈向智能制造

随着“中国制造2025”和工业4.0的不断推进&#xff0c;越来越多的制造企业准备迈入智能制造和智慧制造领域&#xff0c;实现数智化管理。企业通过搭建EPO企业生产运营平台&#xff0c;结合自身业务现状和数字化需求&#xff0c;从各个业务场景、部门人员、产品组成等方面进行分…

Django缓存(二)

一、视图缓存 Django的缓存可以设置缓存指定的视图,具体方式使用django.views.decorators.cache.cache_page, 方法有2种方式: 装饰器:以方法以装饰器的方式使用 from django.views.decorators.cache import cache_page@cache_page(60 * 15,cache="default") def…

【算法每日一练]-图论(保姆级教程篇16 树的重心 树的直径)#树的直径 #会议 #医院设置

目录 树的直径 题目&#xff1a;树的直径 &#xff08;两种解法&#xff09; 做法一&#xff1a; 做法二&#xff1a; 树的重心&#xff1a; 题目&#xff1a; 会议 思路&#xff1a; 题目&#xff1a;医院设置 思路&#xff1a; 树的直径 定义&#xff1a;树中距离最…

科技革新背后:码垛机器人在不同领域的实践应用

随着科技的进步&#xff0c;机器人技术已经渗透到各个行业之中&#xff0c;成为提高生产效率、减少人工成本的重要工具。码垛机器人作为自动化技术的杰出代表&#xff0c;其在各个行业中的应用场景日益广泛&#xff0c;从食品饮料到化工产品&#xff0c;再到物流仓储&#xff0…

睿考网:注册会计师考试有年龄限制吗?

参加注册会计师考试是否有年龄限制&#xff1f;现行的规定并没有要求考生的年龄&#xff0c;所以只要符合既定的报名条件任何人都是可以参加的。 报名资格要求如下&#xff1a; 1. 报考者须为中国国籍公民&#xff0c;并且具备完全的民事行为能力。 2. 学历要求方面&#xf…

CSS的特殊技巧

1.精灵图 使用精灵图核心总结&#xff1a; 1. 精灵图主要针对于小的背景图片使用。 2. 主要借助于背景位置来实现--- background-position 。 3. 一般情况下精灵图都是负值。&#xff08;千万注意网页中的坐标&#xff1a; x轴右边走是正值&#xff0c;左边走是负值&#xf…

海康威视-AIOT的业务转型

海康威视的转型和定位为智能物联网&#xff08;AIoT&#xff09;解决方案和大数据服务的提供商。 公司不仅仅聚焦于其核心的视频监控业务&#xff0c;而且正在积极拓展到新的技术领域和市场。通过专注于物联感知、人工智能、大数据等技术的创新&#xff0c;对未来技术发展方向的…

生产计划数据模型,实现能源企业数字化高效管理

随着市场经济的快速发展&#xff0c;能源企业在经济发展中的地位也随之提高。但由于能源企业在生产计划经济管理上存在指标不平衡、市场观念落后和环保意识欠缺等问题&#xff0c;导致企业的经济效益降低。目前&#xff0c;提高企业的生产计划管理是改善能源企业现状最有利的途…

计算机网络:物理层下的传输媒体概览

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

MySQL---视图

目录 一、介绍 二、语法 三、视图的更新 四、视图作用 一、介绍 视图&#xff08;View&#xff09;是一种虚拟存在的表。视图中的数据并不在数据库中实际存在&#xff0c;行和列数据来自定义视图的查询中使用的表&#xff0c;并且是在使用视图时动态生成的。 通俗的讲&#…

Ambari——编译——解决解决windows和linux下phantomjs链接超时问题

您的支持是我继续创作与分享的动力源泉!!! 您的支持是我继续创作与分享的动力源泉!!! 您的支持是我继续创作与分享的动力源泉!!! 错误日志: [INFO] Copying extracted folder C:\Users\LENOVO\AppData\Local\Temp\phantomjs\phantomjs-2.1.1-windows.zip-extract-1786692…

『K8S 入门』三:资源调度

『K8S 入门』三&#xff1a;资源调度 一、Label 和 Selector 可以通过 Selector 基于 Label 匹配需要的资源 Label 标签 配置文件中&#xff08;metadata.labels&#xff09;配置 metadata: # Pod相关的元数据&#xff0c;用于描述Pod的数据name: nginx-demo #Pod的名称lab…

后端Jwt实现Token编码、解码以及axios的request请求头的Token传输方式

目录 一、什么是JWT&#xff1a; 二、Jwt的使用&#xff1a; 第一步&#xff1a;引入依赖&#xff1a; 第二步&#xff1a;配置拦截器&#xff1a;JwtInterceptor.java&#xff1a; 其中异常文件ServiceException配置如下&#xff1a; 全局异常文件GlobalException.java文…

利用Base64加密算法将数据加密解密

1. Base64加密算法 Base64准确来说并不像是一种加密算法&#xff0c;而更像是一种编码标准。 我们知道现在最为流行的编码标准就是ASCLL&#xff0c;它用八个二进制位&#xff08;一个char的大小&#xff09;表示了127个字符&#xff0c;任何二进制序列都可以用这127个字符表…

逻辑 | 逻辑先修营

学习到更新日期逻辑先修营-3常见逻辑连词及逻辑表达2024-3-23 1.形式逻辑基础1 2.形式逻辑基础2 3.常见逻辑连词及逻辑表述 4.OR相关考点 5.AND相关考点 6.逻辑箭头基本考点1 7.逻辑箭头基本考点2 8.代入逻辑推理事实真1 9.代入逻辑推理事实真2 10.形式逻辑四大基本考点…