微服务架构实践:服务注册与发现中负载方案选型

微服务架构不是银弹,在微服务架构中,我们将面临很多新的问题,这时候势必会引入一个服务注册发现问题。本文作者向大家介绍了随着负载均衡位置的不同,三种主要的服务注册与发现和负载均衡方案。

1.微服务架构下服务注册与发现机制

随着微服务架构深入人心,越来越多的企业将微服务架构付诸实践。相比于传统的单体应用架构,微服务架构有着得天独厚的优势;在传统的单体应用架构下,因为功能集中,代码中心化,一个发布包部署发布在一个进程的应用程序中,单体应用架构已经无法满足企业业务快速变化的需求。一方面,代码维护困难,扩展性较差,灵活性较低,另一方面,系统的修改成本,维护成本在增加以及构建时间,发布周期很长。而微服务架构,因为服务之间独立部署,每个服务在开发,测试,部署的时候,无论是开发周期还是难易程度,都比单块应用要好。

然而,微服务架构不是银弹, 在微服务架构中,会面临很多新的问题,微服务架构由一组小的服务组成,服务之间采用轻量级的通讯机制进行沟通,微服务之间调用关系是一个网状结构,一个微服务在调用另一个微服务的时候,无法知道另一个微服务的具体地址;由于每个服务属于"微"服务,每个服务生命周期不长,每个服务可能随时被关闭、重启、替换;在随着访问量增加的时候,微服务需要扩容,访问量减少时,微服务需要缩容;这样就导致每个微服务的地址在动态变化,这时候必然引入一个服务注册发现问题,也就是说客户端在调用的时候,需要知道服务端的地址,服务端在提供服务的时候,需要注册通告自己的地址,供客户端调用;同时服务端一般存在多个实例来提供服务,这就要求需要引入负载均衡的能力,随着负载均衡位置的不同,主要的服务注册与发现和负载均衡方案有三种

2.常见的服务注册与发现的方案

1.集中式负载均衡方案

集中式负载均衡也叫服务端负载均衡,如图1所示,负载均衡器在一台单独的主机上,可以采用软负载,如nginx,apache等,也可以采用硬负载,如F5等,它负责多实例服务的负载均衡,客户端直接通过域名访问负载均衡器,DNS服务器将域名解析到负载均衡器IP上:

(图1 集中式负载)

该方案实现较为简单,仍是业界的主流,可以充分利用负载均衡器的能力,根据不同的负载策略将请求分发到后面的服务实例上;同时,该方案缺点也很明显,负载均衡器存在单点问题,所有的流量都需要通过负载均衡器,如果负载均衡器存在问题,则直接导致服务不能正常提供服务;中间经过负载均衡器做代理,性能也有一定损耗。

2.客户端负载均衡方案

客户端负载针对服务端负载的缺点,做了一定的改进,如图2所示,负载能力由客户端进程提供,服务端实例注册自己的地址到注册中心,客户端从注册中心订阅服务提供者的地址,获取地址后,根据负载均衡实现策略进行服务路由:

(图2 客户端负载)

该方案在解决了服务端负载的单点问题,每个客户端都实现了自己的负载功能,负载能力和客户端进程在一起,和客户端的生命周期一致,如果负载均衡进程down了,则客户端也down了,而且只影响本身客户端,不会影响其他客户端;同时,该方案也有一定的缺点,负载要求每个客户端自己实现,如果不同的技术栈,每个客户端则需要使用不同的语言实现自己的负载能力,技术难度较大;业界的motan,dubbo采用此方案做服务注册与发现。

3.客户端主机独立负载均衡方案

第三种方案综合了前2个方案的优缺点,如图3所示,服务发现和负载的能力从客户端进程移出,客户端进程和负载均衡进程是2个独立的进程,在同一个主机上;服务实例还是在启动的时候注册自己的地址到注册中心,客户端直接发送请求给本机的负载均衡器。

(图3 客户端独立主机负载)

该方案是一个典型的分布式方案,没有单点问题,如果一个主机的负载均衡器出问题,只影响一个节点调用,不影响其他的节点,负载均衡器本身负载也较小,性能损耗较低;同时也不需要多种语言实现自己的负载能力,负载能力是公用的;但是该方案部署复杂,维护困难,出了异常之后,调试负载,定位问题都比较麻烦。

3.新一代的选择

前面说了那么多,对于服务注册与发现,在普元新一代数字化企业云平台中,我们是怎么实践的?在数字化企业云平台中,我们选择了DevOps这条路来实现我们理想的运营,同时以微服务架构为核心。DevOps的逻辑架构(新一代更多内容,请移步本公众号菜单:纯干货—数字化转型)如图4所示:

(图4 DevOps 逻辑视图)

服务注册与发现在DevOps的技术平台中,作为基础框架给上层DevOps后台服

务使用。

DevOps的运行视图如图5所示:

(图5 DevOps运行视图)

从图中可以看出,微服务之间存在错综复杂的调用关系,SRD主要解决各个微服务之间服务注册与发现的问题。在数字化企业云平台中,我们综合考虑了服务注册与发现几个方案的优缺点,同时结合我们平台的一些特点及技术栈,我们考虑了以下问题:

  1. 如何选择负载方案,我们选择了和方案三类似的负载方案;因为方案三弥补了前面两种方案的优缺点,带来的问题是部署复杂,但是我们采用K8S管理微服务的部署,负载本身的复杂由K8S自己解决了,不需要我们花很多成本解决部署难题。
  2. 在选择客户端主机独立负载的情况下,无法在服务提供者启动时获取到Cluster IP,我们的解决办法是通过域名访问,域名默认和当前应用名保持一致。

下面是我们服务注册与发现的架构图

(图6 新一代服务注册与发现架构图)

服务提供者在启动时,将当前应用的域名注册到服务注册表,客户端通过服务注册表拿到服务提供者的服务域名,客户端通过dns解析到Cluster IP,然后发起调用。

关于作者:

杨勇

现任普元SOA产品部高级软件工程师,曾带领团队完成BPFF,BPS Platform 7.2等研发项目。互联网技术高手,分布式,云计算,机器学习技术爱好者。

原文发布于微信公众号 - EAWorld(eaworld)

原文发表时间:2016-07-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ATYUN订阅号

【系统】使用新的开源工具将你自己的Linux带到Windows

AiTechYun 编辑:nanan ? 如果现成的Linux发行版不会让你满意,那么为什么不自己创建呢? 从Ubuntu(一种Linux操作系统)开始之后,微...

3357
来自专栏服务端技术杂谈

20分钟了解微服务

image.png 简介 所有的功能打包在一个war包里,基本没有外部依赖(除了容器),部署在一个JEE容器(Tomcat,JBoss,WebLogic)里,...

2753
来自专栏Java职业技术分享

Spring 中的注解与分层思想

@Controller, @Service, @Component, @Repository

1140
来自专栏程序员互动联盟

【专业技术】Node.js 究竟是什么?

简介 如果您听说过 Node,或者阅读过一些文章,宣称 Node 是多么多么的棒,那么您可能会想:“Node 究竟是什么东西?” 即便是在参阅 Node 的主页...

3337
来自专栏JAVA高级架构

微服务架构下静态数据通用缓存机制

在分布式系统中,特别是最近很火的微服务架构下,有没有或者能不能总结出一个业务静态数据的通用缓存处理机制或方案,这篇文章将结合一些实际的研发经验,尝试理清其中存在...

1012
来自专栏北京马哥教育

13 种在 Linux 系统上检测 CPU 信息的工具

根据你的需要,有各种各样的关于你的CPU处理器信息你需要了解,比如CPU供应商名、模型名、时钟频率、插槽/内核的数量, L1/L2/L3缓存配置、可用的处理器...

3819
来自专栏使用经验总结

关于登录腾讯云官网提示“qq授权失败”的问题

将近半个多月没有上过腾讯云官网,今天想上去看看主机还有几天要续费,但是突然出现了一个未曾遇到过的问题,就是登录失败。qq账号登录的话,提示“qq授权失败#1”。...

1.3K8
来自专栏互联网杂技

什么是微服务

在介绍微服务时,首先得先理解什么是微服务,顾名思义,微服务得从两个方面去理解,什么是"微"、什么是"服务", 微 狭义来讲就是体积小、著名的"2 p...

1811
来自专栏FreeBuf

你所不知道的渗透测试:应用虚拟化的攻防

Web渗透测试大家都耳熟能详,但是针对应用虚拟化的渗透测试或许大家比较少接触,而且网上也没有相关的资料。作为前沿攻防团队,本期技术专题将结合过往的项目经验,针对...

2708
来自专栏FreeBuf

利用HTTP参数污染方式绕过谷歌reCAPTCHA验证机制

今年初,我上报了一个谷歌reCAPTCHA验证码绕过漏洞,该漏洞在于能用一种HTTP参数污染的不安全方式,让Web页面上的reCAPTCHA构造一个针对 /re...

3343

扫码关注云+社区

领取腾讯云代金券