服务发现技术是如何演进出来的?

 昨天写了一篇<微服务的时间和成本去哪儿了>,有人在底下留言:

  我的回答是:

  "微服务可以不用服务发现和负载均衡吗?它是微服务一个核心组件。怎么能说没有关系?"

  我觉得有必要来思考和总结一下服务发现技术是如何演进的。于是周末一通阅读和消化,希望能掰开揉碎在这里讲一下服务发现技术的演进历史。

催生的背景

  为了提升研发效能,赋能业务规模化创新。不管是一线互联网企业还是传统互联网企业,将单块架构解耦成微服务架构,已经成为企业目前数字化转型的一个大趋势。

  

  微服务架构下的服务少则几个,几十个,多则上百个,每个服务一般都以集群HA的方式进行部署。

  这个时候就出现了两个问题:

  • 一个是服务发现,也就是服务的消费方Consumer如何找到服务的提供方Provider。

  • 另外一个是负载均衡,服务消费方如何以负载策略去访问服务当中的服务提供方的实例。

  

 通用解决思路~代理(proxy)

  在服务发现演进过程中,先后出现了三代服务发现解决方案。这三代的核心都是代理,只不过代理在架构中出现的位置是不同的。通过在消费方和提供方中间增加一层代理,由代理来处理服务发现和负载均衡等功能,消费方通过代理间接去访问服务实例。

  

三代服务发现方案

第一代:传统集中式代理  

  

  • 该方案比较简单,在消费和提供方中间部署一层代理服务。

  • 常用的集中制代理有硬件负载均衡器,比如F5/A10;或者软件的负载均衡器,比如Nginx,HAPROXY。也可以是软硬结合,比如前面是F5,后面是Nginx,这种方法兼顾了配置的灵活性,因为Ngix比F5更容易配置。

  • 这种配置需要引入DNS服务域名进行配合,每个服务都要申请注册域名,并且每个域名都要在代理上配置域名和服务IP的映射关系

  • DNS和代理的配置一般由运维人员手工完成。

  

  • 国内外的公司采用这种方式的有ebay,携程,拍拍贷。

  • 缺点是手工配置,效率不高也缺乏灵活性,对开发人员不友好。

第二代:客户端嵌入式代理

  随着微服务和云技术的兴起,企业对服务发现的效率和灵活性提出了更高的要求,于是出现了第二代方案。

  • 该方案将服务发现和负载均衡以客户库Library的形式嵌入到应用或服务程序中。

  • 该方案需要独立的服务注册中心配合,服务启动的时候将服务自动注册到中心,并且定期的报心跳进行保活。客户端通过服务注册中心发现服务的ip列表,通过某种负载均衡策略选择某个服务进行调用,这种对开发人员比较友好,可以做到开发自助,不需要太多的运维介入。

  这种做法也是很多互联网公司的一个主流,相应的开源也很多。比如:

  • eureka就是一个注册中心,配套ribbon客户端代理。

  • dubbo和近期开源的nacos

  • consul+ribbon

  

   缺点:

  • 客户端依赖语言栈,不同的语言需要开发不同的客户端,在微服务下可能出现的多语言问题,显然开发成本太高。

  • 另外嵌入式代理也给客户端增加了复杂性

第三代:主机独立进程方案。

  随着容器和云原生技术的兴起,业界开始探索第三代的解决方案。

  

  主机独立进程方案是上面两种方案的折中,代理既不集中部署,也不嵌入在客户的应用程序当中,而是作为独立的进程部署在每个主机上,这个主机可以是物理的或者虚拟的。一个主机上的多个消费者可以共享这个代理,实现服务发现和负载均衡。

  第三代结构和第二代是类似的,也需要引入服务注册中心进行配合,三代之间只不过代理的位置发生了变化

  这个方案目前有个更时髦的称谓叫ServiceMesh。

  

   开源产品:Envoy,Linkerd,Istio对应到服务注册中心,当然K8S也内置支持服务发现机制,也是属于第三代的主机独立进程方案。

K8S服务发现机制

  考虑到K8S在业界比较火,而且内部服务发现机制比较复杂,这里独立出来就进行剖析。

  

  如上图所示,在K8S中一个服务是由一组Pod构成的服务集群。

  • Pod是K8S当中最基本的调度单位,它相当于K8S集群当中虚拟机的概念。

  • 每个Pod都有一个PodIP,并且相互之间是通过PodIP相互访问,但是服务的PodIP在K8S当中是不固定的,可能会变(包括预期和非预期)。

  • 为了屏蔽这种变化,K8S引入了服务Service这个概念,一方面实现服务发现和负载均衡,另一方面屏蔽PodIP可能的变更。

  • 在服务发布的时候,K8S会为每个服务分配一个虚拟的ClusterIP

  

  在K8S的worker节点上,有kubelet和kube-proxy,其中后者是实现服务发现的关键,上面是简化的服务发现流程。

服务注册阶段:

  1. 其中kubelet负责启动Pod服务实例--->

  2. 启动完成后kubelet会把Pod的IP列表注册到Master节点上-->

  3. 最后通过服务Service的发布,K8S会为服务分配相应的ClusterIP,相关信息也会记录在Master上。

服务发现阶段:

  • kube-proxy会发现clusterIP和podIP列表之间的映射关系,并且修改本地iptables的转发规则,进行负载均衡和转发到对应的PodIP

  • 当有消费者Pod要访问某个目标服务实例Pod的时候,通过ClusterIP发起调用,这个ClusterIP会被本地的Iptables机制截获,然后进行负载均衡,转发到指定的Pod实例。

  • 实际消费这Pod也是通过服务名进行访问ClusterIP,因为ClusterIP本身也会变,为了屏蔽变化,K8S还引入了kubeDNS这个概念,它通过master可以发现服务名和ClusterIP之间的映射关系。这样消费者Pod通过kubeDNS间接的发现服务的ClusterIP。

 比较总结和选型

  

  三种方案各有利弊,没有绝对的好坏。他们都有大规模的成功落地的案例。架构师需要在理解这些方案优劣的基础上,根据企业的实际上下文,综合考量,做出技术选型。

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

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

相关文章

3分钟搞懂前后端开发的区别

上周末见了好多开发的年轻朋友&#xff0c;问了我一个问题&#xff1a;“前后端的区别和要求是什么&#xff1f;”分不清前后端开发的区别和要求&#xff0c;一种是因为前后端都了解&#xff0c;号称“全栈工程师”&#xff0c;但又什么都不是很精通&#xff1b;另一种是前端的…

基于 Kubernetes 的微服务部署即代码

在基于 Kubernetes 的基础设施即代码一文中&#xff0c;我概要地介绍了基于 Kubernetes 的 .NET Core 微服务和 CI/CD 动手实践工作坊使用的基础设施是如何使用代码描述的&#xff0c;以及它的自动化执行过程。如果要查看基于 Kubernetes 的基础设施即代码架构全图&#xff0c;…

使用Arduino开发ESP32开发环境搭建

1.打开Arduino IDE&#xff0c;选择文件->首选项->设置 复制下方的ESP32板管理网址&#xff0c;添加到附加开发板管理器中&#xff1a; https://dl.espressif.com/dl/package_esp32_index.json 2.选择&#xff1a;工具->开发板->开发板管理器 在弹出的对话框中搜索…

.NET ORM FreeSql 第一个正式版本发布 v1.0.0

一、简介FreeSql 是 .NET 平台下的对象关系映射技术(O/RM)&#xff0c;支持 .NetCore 2.1 或 .NetFramework 4.0 或 Xamarin。从 0.0.1 发布到今历时整整一年的迭代更新&#xff0c;现在终于敢发布第一个正式版。本文内容从简&#xff0c;介绍项目的主要功能框架&#xff0c;以…

Windows上搭建EMQTT服务器

1.官网下载EMQ 2.复制如图文件路径 3.打开终端cmd&#xff0c;输入&#xff1a; 再输入&#xff1a; 4.打开浏览器&#xff0c;进入&#xff1a;http://192.168.1.25:18083/* (localhost可打开终端输入ipconfig查看) 用户名&#xff1a;admin 密码&#xff1a;public

.NET解所有相机RAW格式照片

再聊.NET解相机RAW格式照片上次我发了一篇文章《用.NET解索尼相机ARW格式照片》&#xff0c;提到通过安装 SonyRawFileDecoder的方式&#xff0c;然后调用 WindowsImagingComponents来解析 RAW格式文件。后来我经过进一步研究、探索&#xff0c;发现还有更简单的办法。新的方法…

AspNetCore结合Redis实践消息队列

这是年中首发在博客园上的文章&#xff0c;个人觉得是AspNetCore结合Redis做的一次比较优秀的消息队列重构&#xff0c;其中对于点对点/发布-订阅的思路应该也是面试必考题。引言.Net TPL Dataflow是一个进程内数据流管道&#xff0c;应对高并发、低延迟的要求非常有效&#xf…

提升Azure App Service的几个建议

本文介绍了6个技巧&#xff0c;这些技巧可以改善Azure App Service托管应用程序的性能。其中一些技巧是你现在就可以进行的配置变更&#xff0c;而其他技巧则可能需要对应用程序进行一些重新设计和重构&#xff0c; 本文的几个技巧对于常规企业部署依旧有指引作用。长话短说开发…

单向链表的逆转(数据结构)(c语言)

逆转单向链表的意思是&#xff1a;给定你一个单向链表&#xff0c;一个整数n&#xff08;n为要逆转的结点数&#xff09;&#xff0c;要求你把链表从头结点到第n个结点给逆转过来 图示&#xff1a; 给出一个单向链表&#xff0c;一个整数n4。也就是要求把该链表从头结点&#x…

广东职业教育信息化研究会2019年会暨区块链专题研讨会

兹定于2019年12月28日&#xff08;星期六&#xff09;上午9:30召开广东职业教育信息化研究会2019年会暨专题研讨会&#xff0c;本次会议由广东职业教育信息化研究会主办&#xff0c;华南师范大学网络教育学院协办。会议地址&#xff1a;广州市天河区中山大道西55号华南师范大学…

如何快速融入一个团队?

作者&#xff1a;邹溪源&#xff0c;长沙资深互联网从业者&#xff0c;架构师社区特邀嘉宾&#xff01;一我们难免需要离开一个圈子&#xff0c;加入一个陌生的集体。毋庸置疑&#xff0c;离开熟知的圈子&#xff0c;走向未知的圈子难免会产生许多畏惧甚至情怯&#xff0c;这都…

关于C#异步编程你应该了解的几点建议

前段时间写了一篇关于C#异步编程入门的文章&#xff0c;你可以点击《C#异步编程入门看这篇就够了》查看。这篇文章我们来讨论下关于C#异步编程几个不成文的建议&#xff0c;希望对你写出高性能的异步编程代码有所帮助。注&#xff1a;本文的很多内容都是学习《Effective C#》的…

数据库分区

一、分区原理分区并不是生成新的数据表&#xff0c;而是将表的数据均衡分摊到不同的硬盘&#xff0c;系统或是不同服务器存储介子中&#xff0c;实际上还是一张表。要实现这一功能&#xff0c;首先要了解数据库对水平分区表进行分区存储的原理。数据库分区和分表相似&#xff0…

如何在 C# 平台调用云开发?

▌关于作者苏震巍&#xff0c;云开发Linker计划成员&#xff0c;《微信开发深度解析》作者、Senparc.Weixin 微信 SDK 作者、微软最有价值专家&#xff08;MVP&#xff09;、盛派网络创始人兼首席架构师、微软 Ignite 技术大会讲师、从事软件及互联网研发已有26年&#xff0c;发…

如何打造组织级敏捷,你想知道的都在这里!

“敏捷是适应和响应变化的能力……敏捷组织将变化视为机遇&#xff0c;而不是威胁。” — Jim Highsmith注&#xff1a;Highsmith 在软件开发和 IT 行业有着超过 30 年的经验&#xff0c;曾是敏捷宣言的签署人之一&#xff0c;敏捷联盟的发起人和第一任理事&#xff0c;在很多行…

Azure DevOps Server CI - 自搭跨平台容器代理Agents

前言最近在地端(On-premises)幫團隊搭一套CI/CD流程&#xff0c;也順帶整理了一下從無到有的搭建過程&#xff0c;這次使用了docker技術來解決現有團隊使用CI/CD時讓現有CI/CD hosting環境過於複雜的問題。在開始之前&#xff0c;我先預備一下搭建的環境&#xff0c;如下:Windo…

.Net Core 认证组件源码解析

不知不觉.Net Core已经推出到3.1了,大多数以.Net为技术栈的公司也开始逐步的切换到了Core,从业也快3年多了,一直坚持着.不管环境怎么变,坚持自己的当初的选择,坚持信仰 .Net Core是个非常优秀的框架,如果各位是从WebForm开始,一步步走到今天,自然而然就会发现.微软慢慢的开始将…

在.NET Core下的机器学习--学习笔记

摘要.NET Core 在机器学习的应用场景&#xff0c;除了 ML .NET 还会介绍一个非常棒的開源技術 TensorFlow .NET &#xff0c; Keras .NET.讲师介绍本课内容人工智能介绍ML .NETICSharpCoreTensorFlow .NETKeras .NETSciSharp人工智能应用图像识别/物体识别自然语言/翻译搜索/知…

asp.net core 自定义基于 HttpContext 的 Serilog Enricher

asp.net core 自定义基于 HttpContext 的 Serilog EnricherIntro通过 HttpContext 我们可以拿到很多有用的信息&#xff0c;比如 Path/QueryString/RequestHeader 等请求信息, StatusCode/ResponseHeader 等响应信息&#xff0c;借助 HttpContext 我们可以在日志中记录很多有用…

我的 .NET Core 博客性能优化经验总结

点击上方蓝字关注“汪宇杰博客”导语去年8月&#xff0c;我用 .NET Core 重写了我的博客系统。经过一年多的优化&#xff0c;服务器响应速度从上线时候的 80ms 提高到了现在的 8ms&#xff0c;十倍提速。可惜由于部署在国外&#xff0c;自然不可抗力会导致中国用户晚上访问速度…