程序员修神之路--分布式系统使用网关到底是好还是坏?

灵魂拷问

  • 分布式系统需要统一的网关吗?

  • 网关会带来哪些优势?

  • 引入网关会带来灾难吗?

分布式系统的设计大体上分为中心化和非中心化,像现在流行的微服务模式,本质上是把各种业务拆分为独立的进程来实现业务的扩展性。伴随着业务的不断被拆分,整体的系统性能也有所提高,但是系统又往往面临着中心化的需求,这个世界就是这么有趣,我们不但要非中心化的优势,还要保证中心化的优势。

统一的需求

说到非中心化需求,最简单最常见的就是鉴权,简单来说就是判断用户是否有执行某种动作的权限。以鉴权为例,当有N个微服务有同样的鉴权需求的时候,有以下几种解决方案:

  • 每个服务自己实现一遍

  • 写一个公共的服务接口,每个服务都调用这个接口

  • 写到统一的流量入口处,只需要实现一次

有人说第一种方案没人用,是吗?在服务数量不是太多的情况下,据我所知有很多公司初期都是每个服务都实现自己的鉴权,不要说这种做法一无是处,首先在各个团队技术栈不同的情况下,这是一个团队可以快速实现功能的一种解决方案,而且不依赖于任何其他服务,这意味着这个服务不会受到别的服务的影响,这体现的是非中心化最核心的价值之一。

至于第二种解决方案是典型的集中式处理的方案之一,他按照业务功能把鉴权独立成单独的服务,所有使用鉴权服务的系统都依赖于这个服务,所以这个统一的鉴权服务需要保证高可用,而且对性能比较敏感,稍有不慎,流量高峰就有可能对整个系统造成致命打击。但是,还是有不少公司在用这种架构模式,你说奇怪不奇怪,正所谓,存在即合理。

至于第三种使用网关模式,可以说是目前市面上文章吹捧最多的解决方案。当然得到广大程序员的吹捧自然有它的优势,但是请记住,它并非没有劣势。

image

从上图清晰的可以看到,来自于客户端的所有流量都经过网关,所以理论上来讲,所有统一化的需求都可以在网关进行实现,这样每个后端的业务服务代码都不会有任何的侵入性。至于这些需求最常见的有:

  • 网关可以屏蔽后端服务的协议细节,比如有的服务可能采用的rpc方式,有的服务采用的restful方式,有的甚至可能采用的比较古老的web Service,在网关这一层我们可以统一通信协议,这样客户端调用起来会方便很多。

  • 可以统一整个系统的认证和授权功能,甚至可以统一不同的客户端采用的不同认证方式,比如Cookie认证,Session认证等。

  • 可以统一设置后端服务的保护策略,比如:不同的服务可以设置不同的白名单系统,不同的服务可以采用不同的限流策略等。

  • 在网关这个统一的入口,更容易做日志的收集工作。

虽然网关很香,但是一旦整个系统引入网关,就会随之带来一些问题:

  • 增加了网关,在请求的整个过程中就至少多了一层转发,性能会有稍微下降。

  • 网关如果出现问题,降造成整个系统不稳定,甚至down机,这就是网关的单点问题。所以一般网关都会有多个节点。

如何引入网关

在没有网关的时候,系统一般都会有一个无状态的web层,这一层的主要作用是根据业务组织后端服务结果来响应客户端的请求,例如:一个订单详情的请求,web层会同时请求订单服务来查询订单信息,请求用户服务来查询下单人信息,请求商户服务来查询商家信息,然后把这些信息组合成客户端想要的数据格式,然后返回客户端数据。

image

如果做鉴权,限流等操作,同样也是做在这个web层,在引入了网关之后,这个web层到底还要不要呢?不同的公司有不同的做法,不过我还是建议保留web层,用它来做服务的聚合层,这样整体架构就变成了这样

image

网关和负载均衡

通过以上阐述可以看到,网关在部署架构上和负载均衡器很像,但是它们其实是两种东西。虽然它们都会承载统一的入口流量,但是负载均衡器只是单纯的对请求的转发,而网关除了对请求的转发之外,更重要的职责是统一的业务处理,就像鉴权,限流,降级等。

所以从功能角度来说,网关几乎可以代替负载均衡器。

写在最后

你的系统是否需要网关不仅仅要看系统的需求,还要看公司的整体技术运维能力,毕竟一旦引入网关,它对技术上的要求比较高,而且对高可用和性能比较敏感。但是网关对于那些统一化的需求有着天然的优势,无论是鉴权,还是服务的治理,所以很多公司引入了网关。无论是采用自建还是开源来实现网关,我们都要考虑它的扩展性。现在比较流行的网关有:Kong,Zuul,Tyk 等,详细信息可以参见它们的官网。

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

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

相关文章

160. 相交链表(hot100)

一:题目 二:上码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListN…

.NET Core开源任务调度平台ScheduleMaster上新了

ScheduleMaster上一次比较大的更新还是在6月份,转眼已经快过去4个月了,这段时间比较忙,中间只更新过一次修复了几个小bug。要总结这次更新的话,必须要用“千呼万唤始出来”了,因为这次不仅经历的时间比较久&#xff0c…

234. 回文链表(hot100)

一:题目 二:上码 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ …

T-SQL | 逻辑查询处理内幕学习

【T-SQL】| 作者 / Edison Zhou这是EdisonTalk的第296篇学习分享T-SQL是ANSI和ISO SQL标准的MS SQL扩展,其正式名称为Transact-SQL,但一般程序员都称其为T-SQL。本文是我学习《T-SQL查询》一书的读书笔记,为你讲解逻辑查询的内幕。1逻辑查询处…

461. 汉明距离(详解)

一:题目 二:上码 class Solution {/**在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数换句话说就是将字符串转换成另一个字符串需要替换的字符的个数*/public int hammingDistance(int x, int y) {int count 0;if (x y) return 0;…

在 Azure 上给我的博客配置负载均衡

点击上方蓝字关注“汪宇杰博客”导语前阵有美国读者嘲讽我的博客在美国地区页面加载速度太慢,还好意思写性能优化的文章。为了让美国朋友们闭嘴,并不给中国人丢脸,我使用了钞能力,在 Azure 国际版上给我的博客部署了一个美国地区的…

543. 二叉树的直径(详解)

一:题目 二:上码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

C#实现乞丐版IOC容器

一、前言netcore中的容器非常好用,今天我们自己来简单实现一个。实现容器的核心接口有两个:IServiceCollection、IServiceProvider。其中IServiceCollection定义容器集合,IServiceProvider提供容器中对象的访问。话不多说,直接编码…

leetcode hot100.2. 两数相加(详解)

一:题目 二:上码 // /** // * Definition for singly-linked list. // * public class ListNode { // * int val; // * ListNode next; // * ListNode() {} // * ListNode(int val) { this.val val; } // * ListNode(int val, ListNode next) { t…

COSCon‘20 参会指南 | 你想知道的都在这里(文末有福利)

中国开源年会 COSCon20,本周末你准备好了吗业界最具影响力的开源年度盛会2020中国开源年会 (COSCon20) 将于 10月24-25日由开源社举办。本次大会较往年出现了许多新变化,您可能有许多问题,为了让大家尽快参与其中,小编在这里为大家…

leetcode647. 回文子串(动态规划)

一:题目 二:上码 class Solution {/**思路:1.确定dp数组dp[i][j]:表示的是区间范围内[i,j]的字符串是否是回文串 2.确定dp数组递推公式1>:如果s[i] ! s[j] 那就是false2>:如果s[i] s[j] 如果 i - j < 1 那么的话 dp[i][j] 就为true如果 i - j > 1 的话 那就要看…

搬砖的八种境界

这一点文字&#xff0c;纯属有感而发。世上的道路千万条&#xff0c;搬砖的队伍更是前仆后继&#xff0c;延绵不绝。我总结有八种境界&#xff0c;请各位看官对号入座&#xff0c;不要客气。不知道怎么搬砖。职业早期&#xff0c;无可厚非。但如果长期处于这个阶段&#xff0c;…

芯片项目谁支持谁负责 重大损失将予以通报

随着全国掀起半导体热&#xff0c;全国各地都在大力投资&#xff0c;其中不乏浑水摸鱼的存在&#xff0c;在江苏、四川、湖北、贵州已经有多个半导体大项目先后停摆。在南京&#xff0c;号称投资30亿美元的德科码已经烂尾。在淮安&#xff0c;规划总投资450亿元的德淮半导体烂尾…

leetcode5. 最长回文子串

一:题目 二:上码 class Solution {/**思路:1.确定dp数组2.确定dp数组的递推公式s[i] ! s[j] 那么dp[i][j] 肯定为falses[i] s[j] 那么的话 i - j < 1 为true ans max(ans,i-j 1);i - j > 1的话 那么dp[i1][j-1] true的话那么dp[i][j] trueans max(ans,i-j1);3.确定…

leetcode11. 盛最多水的容器

一:题目 二:上码 // class Solution { // public int maxArea(int[] height) { // int len height.length; // int ans 0;// for (int i 0; i < len; i) { // for (int j len - 1; j > i; j--) {// int x …

技术债! 怎样简洁高效的实现多个 Enum 自由转换

一&#xff1a;背景 1. 讲故事前段时间和同事负责一个项目的两个业务模块&#xff0c;可能大家缺少沟通&#xff0c;导致本该定义一个 Enum 的地方结果我俩各自定义了一个&#xff0c;导致后面这两个 Enum 进行对接就烦了&#xff0c;为了方便理解&#xff0c;也不想让大家看这…

分享套接字数据包序列化与反序列化方法

分享套接字数据包序列化与反序列化方法“简单说一下&#xff0c;本文不涉及Socket的连接、数据接收&#xff0c;只是对数据包(byte[])的序列化和反序列化方法的封装介绍。本文目录本文背景一般操作本文操作总结1.本文背景经常做C/S&#xff0c;客户端与服务端通信基本是TCP/UDP…

leetcode22. 括号生成(回溯)

一:题目 二:上码 class Solution {public List<String> generateParenthesis(int n) {List<String> ans new ArrayList<>();def(ans,new StringBuilder(),n,n);return ans;}/**left:左边还可以用的括号数量right:右边还可以用的括号数量*/public void def(…

leetcode31. 下一个排列

一:题目 二:上码 class Solution {/**规律: 从后往前找到那个比其小的数进行交换 然后 在小的数后面的数都进行排序12345 --> 1235412354 --> 12453 --> 12435*/public void nextPermutation(int[] nums) {int len nums.length;for (int i len - 1; i > 0; i--)…

回顾 | 进击吧! Blazor !第三期 信息交互

Blazor 是一个 Web UI 框架&#xff0c;可通过 WebAssembly 在任意浏览器中运行 .Net 。Blazor 旨在简化快速的单页面 .Net 浏览器应用的构建过程&#xff0c;它虽然使用了诸如 CSS 和 HTML 之类的 Web 技术&#xff0c;但它使用 C&#xff03;语言和 Razor 语法代替 JavaScrip…