资讯专栏INFORMATION COLUMN

微服务指南走北(四):你不愿意做微服务架构的十个理由

Seay / 1839人阅读

摘要:微服务架构模式使得每个微服务独立部署,且每个服务独立扩展,开发者不再需要协调其它服务部署对本服务的影响。微服务架构模式使得持续化部署成为可能。所以使用微服务不是必须的,而是在适当的实际,架构适应应用场景的一种改变。

近段时间离职,跟同事们讲解我之前所做的微服务相关产品,对于同事们提出的问题,做了如下整理出来,加上自己的理解,分享出来跟大家一起探讨下:

问题预览

我为什么要换微服务?能给我带来什么好处?

从交互上来看,单体应用在处理业务实体之间的关系,直接由框架搞定,如java的hibernate等,而使用微服务,还要去花时间去重新整理甚至重构业务结构.

微服务测试起来比较麻烦:首先微服务根据不同的业务实体划分资源服务,那么也许有些业务的操作,会涉及多个微服务,那么测试微服务的话,就需要将所有的相关服务都启动完成,才可以进行测试。

微服务一般对外是restful服务,为了保证安全性,开销也是比较大的:一方面服务内部可能每次访问都需要安全检查,会降低效率;另一方面内部访问开启https,在证书部署维护方面也会增加压力

一般情况下,很多服务都存在类似session等数据存储在内存中,而这些session只在同一WebServer中存在,一般无法进行多实例共享(当然也有共享的方案,但是需要相对复杂的集群设计),该如何解决这些数据的问题呢?

接着上个问题,微服务的使用场景中,基本都需要实现单个服务多个实例的场景,以实现高可用,那么问题来了,我对单个服务运行了10个实例,那么该如何知道服务该向哪个服务发起访问呢?

接着上个问题,当我运行10个WebServer的时候,在主机上需要使用10个端口进行对应,而服务多了以后,对于端口的消耗和管理也是个比较大的麻烦

接着上个问题,一般的应用,我们可以使用haproxy来做代理,那么就需要每增加或者修改一次实例,就需要修改haproxy的配置,管理上的消耗也会成为比较大的麻烦,并且还有可能出错

对于众多的微服务实例,服务较多的至少可以达到数百个甚至数千个,监控和管理上,也将比较大的挑战

上面提到的很多软件,都是比较零散的软件堆叠出来的服务,有没有比较好的成套的解决方案?

问题及自己的理解 1. 我为什么要换微服务?能给我带来什么好处?

可以解决复杂性的问题,在功能不变的情况下,分解为多个相互协作的微服务,通过rest API定义边界,这样极大易于开发、理解和维护。

微服务架构是的每个服务可以由专门的开发团队或者个人开发者进行开发,开发者可以自由选择技术,不必受制于规定的技术和框架,只要API服务协议好交互方式即可(如restful)。这样即使重新技术过时的微服务模块儿或者重写以前的代码,也不是很困难。

微服务架构模式使得每个微服务独立部署,且每个服务独立扩展,开发者不再需要协调其它服务部署对本服务的影响。微服务架构模式使得持续化部署成为可能。

2. 从交互上来看,单体应用在处理业务实体之间的关系,直接由框架搞定,如java的hibernate等,而使用微服务,还要去花时间去重新整理甚至重构业务结构.

首先,在使用框架的同时,也已经受制于框架,甚至是开发语言的选择,单体应用下,看似方便,可是业务实体之间的关系太过于固化,当有一个业务实体需要改变,则整个应用相当于发布了一个新的版本。这种情况对于不care更新停止程序的客户来说是无所谓,可是对于服务更新停止程序敏感性比较强甚至不允许停止程序的公司来说,无疑是个灾难。所以使用微服务不是必须的,而是在适当的实际,架构适应应用场景的一种改变。

3. 微服务测试起来比较麻烦:首先微服务根据不同的业务实体划分资源服务,那么也许有些业务的操作,会涉及多个微服务,那么测试微服务的话,就需要将所有的相关服务都启动完成,才可以进行测试。

微服务测试起来麻烦是没有任何疑问的,不过微服务大多采用restful服务,这为微服务的测试提供了相对的便利性(测试restful接口的工具还是挺多的)。对于微服务带来的便利性,增加这点压力还是可以容忍的。

4. 微服务一般对外是restful服务,为了保证安全性,开销也是比较大的:一方面服务内部可能每次访问都需要安全检查,会降低效率;另一方面内部访问开启https,在证书部署维护方面也会增加压力

首先,一般微服务外部都是需要有API GateWay的,由API GateWay来保证外部访问的安全性,而内部访问,可以省去https和安全检查,仅保留必要的用户信息即可。

5. 一般情况下,很多服务都存在类似session等数据存储在内存中,而这些session只在同一WebServer中存在,一般无法进行多实例共享(当然也有共享的方案,但是需要相对复杂的集群设计),该如何解决这些数据的问题呢?

一般情况下,对于绝大部分有状态服务,在设计之初,就会考虑有状态服务的状态转移等工作,假设我们有服务存在session,那么这些session信息,可以转嫁存储在一套redis集群中,这样子就可以多个实例都访问redis,相当于状态由redis进行处理了。

6. 接着上个问题,微服务的使用场景中,基本都需要实现单个服务多个实例的场景,以实现高可用,那么问题来了,我对单个服务运行了10个实例,那么该如何知道服务该向哪个服务发起访问呢?

一般情况下,我们可以使用haproxy之类的服务,将当期服务的所有实例进行代理,可以先对单个服务单点访问,其他服务做备份,又可以使用haproxy的负载均衡,使请求平均分发到各个服务中

7. 接着上个问题,当我运行10个WebServer的时候,在主机上需要使用10个端口进行对应,而服务多了以后,对于端口的消耗和管理也是个比较大的麻烦

可以使用docker来解决,在docker的使用中,一个服务对应一个镜像,而基于一个镜像可以启动多个容器,而每个容器都可以使用统一的内部端口,不同的容器名称,我们使用的haproxy也在docker中运行,通过docker内部网络访问各个服务,这样就解决了端口问题。

8. 接着上个问题,一般的应用,我们可以使用haproxy来做代理,那么就需要每增加或者修改一次实例,就需要修改haproxy的配置,管理上的消耗也会成为比较大的麻烦,并且还有可能出错

对于这个问题,也有解决方案:首先我们可以去尝试使用如下一套解决方案“docker-swarm-consul-haproxy”,Swarm是一个用于创建Docker主机(运行Docker守护进程的服务器)集群的工具,consul用来服务发现及配置中心,haproxy则用来进行代理服务

9. 对于众多的微服务实例,服务较多的至少可以达到数百个甚至数千个,监控和管理上,也将比较大的挑战

无论是做以往的单体应用、SOA还是微服务,服务监控和管理都是必不可少的,对于监控,目前有比较好的容器监控开源程序,如:Prometheus、 cAdvisor等;管理方案可以使用简单的shipyard,复杂的可以使用kubernetes的

10. 上面提到的很多软件,都是比较零散的软件堆叠出来的服务,有没有比较好的成套的解决方案?

整体的解决方案是有的,就是个人感觉略重(我个人搭建的一些服务,没有用kubernetes,而是使用了非常简单compose+swarm)。这个方案就是使用kubernetes(基于Docker),下面可以简单描述下我这边是怎么使用kubernetes来实现微服务的:

首选我的微服务程序都是无状态的或者经过状态转移过的

对于服务发现,以往我们用consul,这里我没有去做服务发现和服务注册,而是使用kubernetes的ReplicationController来保证我的微服务实例数量(系统会自动维护)

对外的代理以前用haproxy,而现在使用kubernetes的service来替代,kubernetes自动处理各个微服务实例的负载及请求的分发,我们只需要保证业务稳定即可。


by 刘迎光@萤火虫工作室
OpenBI交流群:495266201
MicroService 微服务交流群:217722918
mail: liuyg#liuyingguang.cn
博主首页(==防止爬虫==):http://blog.liuyingguang.cn
OpenBI问答社区:http://www.openbi.tk

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26850.html

相关文章

  • 服务架构入门

    摘要:故障处理设计微服务架构所带来的一个后果就是必须考虑每个服务的失败容错机制。因此,微服务非常重视建立架构及相关业务指标的实时监控和日志机制。 微服务架构入门 1. 微服务简介 微服务是一种架构风格,一个大型的复杂软件由一个或多个微服务组成。系统中每个微服务都可以被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成任务。在所有情况下,每个任务代表这一个小的业务能...

    ninefive 评论0 收藏0
  • 不使用Ruby十个理由

    摘要:既然这不是宗教,而是关于如何面对新的事物,我认为我们应该列出所有其他人认为不使用来做开发的理由。在下工作的不好这是一定的。流行度只是衡量使用率,社区活跃度的一个指标,用来帮助人们判断技术的可用性,稳定性和支持程度。不幸的是,人们混淆了和。这是一篇赞美 Ruby 的文章!!!看完再喷不迟  请注意:这是一篇主观意识的文章。它的目的并不是要说服你使用或者不使用Ruby,或者其他任何技术。这...

    young.li 评论0 收藏0
  • 服务指南走北(二):服务架构的进程间通信(IPC)

    摘要:微服务常用的进程间通信技术即表述性状态传递英文,简称是博士在年他的博士论文中提出来的一种软件架构风格。摘自微服务实战从架构到部署处理部分请求失败对于分布式的微服务,必须要面对的一大问题就是局部请求失败的处理。 先抛出几个问题 微服务架构的交互模式有哪些? 微服务常用的进程间通信技术有哪些? 如何处理部分请求失败? API的定义需要注意的事项有哪些 微服务的通信机制与SOA的通信机制之...

    beanlam 评论0 收藏0
  • 服务指南走北(一):服务是什么

    摘要:每个微服务提供一组,供其他微服务或者应用客户端所用。由于微服务架构的分布式特点,测试一个基于微服务架构的应用也是很复杂的任务。微服务架构模式下,应用的改变将会波及多个服务。 微服务Microservices已经成为软件架构最流行的热词之一。网络上看到很多关于微服务的文章,但是感觉很多离我们还很遥远,并且没有找到多少真正在企业场景中应用的实例。此处省略一万字~~~~于是想要将自己最近一段...

    sherlock221 评论0 收藏0
  • 服务指南走北(三):Restful API 设计简述

    摘要:为了避免的变动导致用户使用中产生意外结果或调用失败,最好强制要求所有访问都需要指定版本号。请避免提供默认版本号,一旦提供,日后想要修改它会相当困难。返回结果针对不同操作,服务器向用户返回的结果应该符合以下规范。 API的定义取决于选择的IPC通信方式,如果是消息机制(如 AMQP 或者 STOMP),API则由消息频道(channel)和消息类型;如果是使用HTTP机制,则是基于请求/...

    hqman 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<