专栏首页复盘总结文章集合「系统架构」微服务探究之初识微服务

「系统架构」微服务探究之初识微服务

前言

在传统的开发中,我们通常是将所有的功能打包在一起,然后统一部署在一个JEE容器(Tomcat,JBoss,WebLogic)里,包含了 DO/DAO,Service,UI等所有逻辑。如下图所示:

这种开发方式虽然操作简单,代码重用率高,没有分布式的管理和调用消耗,但是由于代码功功能耦合在一起,通常是牵一发动全身,一个微小的问题,都可能导致整个应用挂掉。这对于大型应用来说,是很不可行的。因此,有人提出能不能将每一个小的服务独立开来,分别部署维护呢?如产品服务独立成一块,订单服务独立成一块,用户服务也独立成一块。这样,每一个服务之间都不会有高耦合性,后期维护升级也更加方便。

是的,将每一个服务独立部署分开维护,的确可以解决传统开发中的高耦合性,但是我们也要考虑在传统的开发方式中所有的服务都是本地的,UI可以直接调用,现在按功能拆分成独立的服务,跑在独立的服务器或进程中,客户端UI如何互相访问呢?

后台有N个服务,前台就需要记住管理N个服务,一个服务下线/更新/升级,前台就要重新部署,这明显不服务我们 拆分的理念,特别当前台是移动应用的时候,通常业务变化的节奏更快。

另外,N个小服务的调用也是一个不小的网络开销。还有一般微服务在系统内部,通常是无状态的,用户登录信息和权限管理最好有一个统一的地方维护管理(OAuth)。

因此,基于这些考虑,在上面的基础上,有人又提出加入API网关层,用它来处理以下问题:

  • ① 提供统一服务入口,让微服务对前台透明
  • ② 聚合后台的服务,节省流量,提升性能
  • ③ 提供安全,过滤,流控等API管理功能

至此,一个简单的微服务架构就诞生了。

服务之间如何通信

将每一个服务独立部署后,肯定不能像传统开发中使用类库嵌套的方式调用其他服务。在微服务架构中,服务与服务之间的通信通常有两种方式:

  • ①同步调用
  • ②异步调用

其中,同步调用又包括RPC方式和REST方式。

一般同步调用比较简单,一致性强,但是容易出现调用问题,性能体验上也会差些,特别是调用层次多的时候。

而异步调用在分布式系统中有特别广泛的应用,如异步消息,它既能降低调用服务之间的耦合,又能成为调用之间的缓冲,确保消息积压不会冲垮被调用方,同时能保证调用方的服务体验,继续干自己该干的活,不至于被后台性能拖慢。不过需要付出的代价是一致性的减弱,需要接受数据最终一致性。还有就是后台服务一般要实现幂等性,因为出于性能的考虑,消息的发送一般会有重复(保证消息的被收到且仅收到一次对性能是很大的考验)。最后就是必须引入一个独立的broker,如 果公司内部没有技术积累,对broker分布式管理也是一个很大的挑战。

服务注册

在微服务架构中,一般每一个服务都是有多个拷贝的,每一个拷贝之间采用负载均衡的方式参与业务处理。一个服务随时可能下线,也可能为应对临时访问压力增加新的服务节点。那服务之间如何相互感知?多个服务如何管理呢?

这就设计到服务注册了。服务注册通常有客户端方式服务端方式两种。不过其基本原理都是通过zookeeper等类似技术做服务注册信息的分布式管理。当服务上线时,服务提供者将自己的服务信息注册到ZK(或类似框架),并通过心跳维持长链接,实时更新链接信息。服务调用者通过ZK寻址,根据可定制算法, 找到一个服务,还可以将服务信息缓存在本地以提高性能。当服务下线时,ZK会发通知给服务客户端。

服务异常处理

前面提到,为避免传统开发方式把所有鸡蛋放在同一个篮子里,一荣俱荣,一损俱损的问题,人们转而采用服务独立部署的方式,但独立部署有一个很大的风险就是网络是不可靠的,即网络可能出现故障,如果这一块没有特别的保障,采用微服务架构结局肯定也是噩梦。那微服务如何保证整体业务链路不受网络的影响或者把受到的影响降到最低呢?关于这一方面,微服务主要采用以下几个手段:

  1. 重试机制:多试几次
  2. 限流:减少到该服务的请求
  3. 熔断机制:关闭该服务与其他服务之间的联系
  4. 负载均衡:将指定请求分配到指定服务
  5. 降级(本地缓存):暂时关闭某些无关服务

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 基于Html的SEO(很基础,更是前端必须掌握之点)

    众所周知,搜索引擎对html代码是非常优化的,所以html的优化是做好推广的第一步。一个符合seo规则的代码大体如下界面所示。

    ZhangXianSheng
  • DataList:HTML5中的input输入框自动提示利器

    DataList的作用是在你往input输入框里输入信息时,根据你敲进去的字母,自动显示一个提示下列列表,很像百度或谷歌的搜索框的自动提示,在飞机票火车票的搜索...

    ZhangXianSheng
  • 超级全面的MySQL优化面试解析-2018【精】 转

    price decimal(8,2)有2位小数的定点数,定点数支持很大的数(甚至是超过int,bigint存储范围的数)

    ZhangXianSheng
  • 程序员必须掌握的高薪技术—微服务架构的实施原理技术

    基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发、部署、运维管理、持续开发、持续集成的流程。

    IT大咖说
  • 漫谈微服务

    微服务是一种软件架构风格,一种架构模式,提倡将单体应用划分为一组小的服务,服务之间互相协调,互相配合,为用户提供最终价值。

    用户2937493
  • 微服务的隐性收益

    微服务是一种构建分布式系统的方法,在微服务系统中,服务只能通过API来公开,这是一个API的世界(可以参考没有被了解的API?一个老码农眼中的API世界)。在微...

    半吊子全栈工匠
  • 七种微服务反模式

    流行术语为那些逐步形成的、需要一个好的“标签”来方便交流的概念提供了一个上下文。微服务就是这样的一个新“标签”,它定义了一个领域,这个领域我自己也发现了,并且...

    ★忆先★
  • 微服务架构实施原理

    架构师小秘圈
  • 什么是SOA

    讲在前面的话: 若企业缺乏对服务变更的控制和规则,那么一个服务在经过几个项目之后,就很有可能被随意更改成多个版本,将来变成什么样更是无法预测。久而久之,降低了服...

    小柒2012
  • 微服务与SOA架构(2)

    服务分类学 服务分类学指的是在某种架构下服务是如何归类的。有两种服务分类的基本类型:服务类型和业务领域。服务类型分类法会根据整个架构中服务所扮演的角色进行分类。...

    首席架构师智库

扫码关注云+社区

领取腾讯云代金券