注册中心与API网关不是这样用的!
之前在做顾问和咨询项目的时候,见到了一种非常经典的关于API网关和注册中心的错误用法。这个案例在我的星球里已经分享过,没想到最近又碰到了两个类似的使用姿势。也许这样的问题还存在不少团队的应用中,所以拿出来再分享一下,希望可以帮助读者更好的理解注册中心与API网关的作用,并将它们用对地方!
在微服务架构中,我们都会使用API网关来作为暴露服务的唯一出口。这样可以将与业务无关的各项控制,集中的在API网关中进行统一管理,从而使得业务服务可以更加专注于业务领域本身。
而在微服务构建的系统内部,各个服务之间的调度,我们通常采用注册中心和客户端负载均衡的方式来实现服务之间的调用。
所以,大致的结构是这样子的:
在这样的架构实践中,注册中心和API网关的功能,主要有以下两点:
- API网关通过注册中心发现所有后端服务,从来实现动态代理
- 后端服务集群间,通过注册中心互相发现对方,而实现直接调用(通常使用Ribbon、Feign这些框架)
下面就来具体说说今天的主角(错误案例),先上图:
注意图中的两个地方:
- 存在两套网关,一套对内访问、一套对外访问
- 对内访问的网关实际就是起到了一个代理作用,较之前的图对比以下,就知道,这个方案中并没有利用到服务治理机制去直接让服务A调用服务B,而是通过网关去做了一次代理。
更震惊的是,在我看到代码的时候,他们居然也是用feign来编写服务间调用的,但在配置请求路径的时候,是使用在内部API网关上配置的二级域名来实现(比如:http://service-name.didispace.com/api-path,这里service-name对应不同的服务名),而熟悉Spring Cloud的读者都知道,其实service-name.didispace.com这部分直接用服务名替代就可以了...是不是瞬间有种脱裤子放x的感觉?
如果这样来使用的话,其实引入注册中心的用处就很小了,实际上只有给两个网关提供了集中的后端服务发现功能。如果要实现这种功能,其实注册中心都可以不需要,每个服务都直接上报地址给网关就好了,架构会更加简单。
同时,在这样的实现方式之下,内部调用都要经过内部网关多一跳的调度过程,除了要多出内部网关的部署资源之外,每一次内部调用的时间开销实际上都大了。所以这样的用法是非常不推荐的!
对于API网关的定位,还是以作为对外出口的管理为最佳,内部的代理调用,均交给服务注册与发现机制 + 客户端负载均衡就ok了。没有必要再增加一层代理,不但增加部署成本,同时还会降低的性能。完全是赔了夫人又折兵的做法,非常不可取!
除非有一种情况,如果你的业务集群很大,对前端暴露用一套网关,同时后端服务有几千几万,由很多个不同的团队在维护,那么在团队的边界处设立内部的网关,那还是合理的。同时这种情况下,对于注册中心,按团队做隔离也是有必要的。因为这样可以分而治之,更好的做好接口的访问控制与管理。但是,如果你本身服务不多,团队也不大,那就别折腾这么复杂的架构了,越复杂稳定性就越难保障,这点一定要平衡好。
最后,大家结合自己团队的注册中心与API网关应用是否有犯一样的问题呢?或者如果有其他问题与疑问,不妨留言交流一下?也可以加入我们的技术交流群一起探讨技术问题!
拓展阅读
注册中心与API网关不是这样用的!的更多相关文章
- Taurus.MVC 微服务框架 入门开发教程:项目集成:1、服务端:注册中心、网关(提供可运行程序下载)。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...
- 如果让我设计一套,TPS百万级API网关!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 是滴,小傅哥又要准备搞事情了!这次准备下手API网关项目,因为这是所有互联网大厂都有的一个核心 ...
- 开发dubbo应用程序(二)dubbo注册中心相关概述
1.注册中心概述 在Dubbo微服务体系中,注册中心是其核心组件之一.Dubbo通过注册中心实现了分布式环境中各微服务之间的注册与发现,是各分布式节点之间的纽带.其主要作用如下: 动态加入.一个服 ...
- 【架构】SpringCloud 注册中心、负载均衡、熔断器、调用监控、API网关示例
示例代码: https://github.com/junneyang/springcloud-demo 参考资料: SpringCloud系列 Eureka 一句话概括下spring框架及spring ...
- .net core Ocelot Consul 实现API网关 服务注册 服务发现 负载均衡
大神张善友 分享过一篇 <.NET Core 在腾讯财付通的企业级应用开发实践>里面就是用.net core 和 Ocelot搭建的可扩展的高性能Api网关. Ocelot(http:// ...
- 微服务技术栈:API网关中心,落地实现方案
本文源码:GitHub·点这里 || GitEE·点这里 一.服务网关简介 1.外观模式 客户端与各个业务子系统的通信必须通过一个统一的外观对象进行,外观模式提供一个高层次的接口,使得子系统更易于使用 ...
- .NET5 API 网关Ocelot+Consul服务注册
1|0网关介绍 网关其实就是将我们写好的API全部放在一个统一的地址暴露在公网,提供访问的一个入口.在 .NET Core下可以使用Ocelot来帮助我们很方便的接入API 网关.与之类似的库还有Pr ...
- 学习一下 SpringCloud (六)-- 注册中心与配置中心 Nacos、网关 Gateway
(1) 相关博文地址: 学习一下 SpringCloud (一)-- 从单体架构到微服务架构.代码拆分(maven 聚合): https://www.cnblogs.com/l-y-h/p/14105 ...
- Eureka服务注册中心相关错误com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect
启动项目报错如下 原因: 在默认设置下,Eureka服务注册中心也会将自己作为客户端来尝试注册它自己,所以会出现 com.sun.jersey.api.client.ClientHandlerExce ...
随机推荐
- PHP代码审计_用==与===的区别
目录 背景介绍 如何审计 绕过案例1 绕过案例2 背景介绍 比较==与===的差别 == 是等于符号,=== 是恒等于符号,两个符号的功能都是用来比较两个变量是否相等的,只不过两个符号的比较维度不一样 ...
- 剑指 Offer 20. 表示数值的字符串 + 有限状态自动机
剑指 Offer 20. 表示数值的字符串 Offer 20 常规解法: 题目解题思路:需要注意几种情况: 输入的字符串前后可能有任意多个空格,这是合法的. 正负号: (1)正负号只能出现一次. (2 ...
- 如何在 C# 中使用 const,readonly,static
平时在开发时经常会用到 const,readonly,static 关键字,可以肯定这些关键词是完全不同的概念,但有时候他们在用法上很相似以至于在场景中不知道选择哪一个,这篇文章我们就来讨论 C# 中 ...
- AtCoder Beginner Contest 194
A I Scream int main() { IOS; int a, b; cin >> a >> b; if(a + b >= 15 && b > ...
- C# 应用 - 多线程 4) Task cancel
1. 操作取消 1.1 步骤 实例化 CancellationTokenSource 对象,该对象管理取消通知并将其发送给单个取消标记 将 CancellationTokenSource.Token ...
- JavaScript数组的几个常用的API
一. 扁平化嵌套数组/展平和阵列孔--flat() 1.实现效果 var arr1 = [1, 2, [3, 4]]; arr1.flat(); // [1, 2, 3, 4] var arr2 = ...
- LAB1 启动操作系统
从机器上电到运行OS发生了什么? 在电脑主板上有一个Flash块,存放了BIOS的可执行代码.它是ROM,断电不会丢掉数据.在机器上电的时候,CPU要求内存控制器从0地址读取数据(程序第一条指令)的时 ...
- github个人主页 阿里云域名的绑定
域名解析 我在阿里云上买了一个新域名:gaolu.name,我已经在GitHub Pages上建立了自己的博客:http://gaolu1215.github.io.现在我希望将gaolu.name映 ...
- win8 下删除服务
1.右键 我的电脑-管理-服务和应用程序-服务,找到想要删除的服务,双击后复制服务名称. 2.管理员身份运行cmd 在命令框中输入 sc delete "secbizsrv" 就删 ...
- springboot 配置文件application
application.properties # ----------------------------------------# 核心属性# --------------------------- ...