再谈微服务

传统方式 VS 微服务

传统开发方式遇到的问题:

  • 开发效率低:所有的开发在一个项目改代码,递交代码相互等待,代码冲突不断。
  • 代码部署难:代码功能耦合在一起,新人不知道如何下手。
  • 部署不灵活:构建时间长,任何小的修改必须重新构建整个项目。
  • 稳定性不高:一个问题往往导致整个应用挂掉。
  • 扩展性差:无法满足高并发情况下业务需求。

简单说:

微服务的目的是有效的拆分应用,实现敏捷开发部署。

官方对于微服务的定义:

  • 一系列独立服务共同组成系统;
  • 单独部署,跑在自己的进程中;
  • 每个服务为独立业务开发;
  • 分布式管理;

微服务标准:

  • 分布式服务组成系统;
  • 按照业务而不是技术划分组织;
  • 做有生命的产品而不是项目;
  • 自动化运维;
  • 容错;
  • 快速演化;

使用微服务的问题:

  • 客户端如何访问微服务;
  • 服务之间如何通信;
  • 服务多了怎么找?
  • 服务挂了怎么办?
客户端访问微服务

之前的UI和服务都是本地的,UI可以直接调用,现在按功能拆分成独立的服务,每个服务都跑着独立的虚拟机上的JAVA进程中。后台有N个服务,客户端就需要记住N个服务,一个服务下线/更新/升级,前台都需要重新部署。N个服务的调用也是不小的网络开销,用户授权管理需要统一。

所以一般在客户端和N个服务之间,建立代理或者API Gateway:

  • 提供统一服务入口,让服务对客户端透明;
  • 聚合后台服务,节省流量,提升性能;
  • 提供安全,过滤,控流等API管理功能;
服务之间如何通信

所有服务都是独立的JAVA进程跑在独立的虚拟机上,所以服务间的通信是IPC,有很多成熟的解决方案,通用的有两种方式:

  • 同步调用:
    • REST (JAX-RS,Spring Boot)
    • RPC (Thrift,Dubbo)
  • 异步消息调用(Kafka,Notify,MetaQ)

同步调用:

简单,一致性强,容易出调用问题,性能体验会差一些,调用层次多的时候可能耗时。 REST基于HTTP,更易实现,更易接受,服务端实现更加灵活,各个语言都能支持,同时能跨客户端,对客户端没有特殊要求,使用更广。 RPC有自己的优点,传输协议更高效,安全性更可控。

异步调用:

降低系统服务之间耦合,为调用之间建立缓冲,确保消息积压不会冲垮被调用方; 需要付出一致性代价,后台服务一般需要实现幂等性,因为消息发送出于性能考量一般会重复; 需要引入独立的broker,对broker分布式管理也是一个挑战;

服务多了怎么找?

一般一个服务有多份拷贝,做负载均衡。一个服务随时可能下线,也可能面临访问压力时增加新服务节点。 服务之间如何感知?服务如何管理?

  • 基于zookeeper框架实现服务注册分布式管理。
  • 客户端做:优点是架构简单,扩展灵活,只对服务注册器依赖。缺点是客户端需要维护所有调用服务地址,有技术难度,可使用Dubbo。
  • 服务端做:优点是简单,所有服务对前台调用透明,一般在小公司云服务上部署采用较多。
服务多了挂了怎么办?

单体应用风险是鸡蛋放在一个篮子中,分布式的特征是网络不可靠。所以当系统由一些列服务调用链组成的时候,必须确保任何环节不出问题而影响整个链路。手段如下:

  • 重试机制;
  • 限流;
  • 熔断;
  • 负载均衡;
  • 降级(本地缓存);

最后提到微服务离不开DevOps和Docker,理解微服务架构是核心,devops和docker是工具,是手段。

原文发布于微信公众号 - 服务端技术杂谈(ITIBB2014)

原文发表时间:2016-10-25

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏携程技术中心

Ctrip·Tech——架构师一席谈(2)Zookeeper在分布式应用中的作用

是不是要在标题的“作用”之前加上“重要”两个字,我犹豫了一下,zookeeper提供的功能是如此的重要,以至于如果你在应用中不使用它,早晚也会在你的应用中去实现...

21390
来自专栏腾讯移动品质中心TMQ的专栏

Windows开机过程和测试方法探索

用户会经常抱怨自从安装自己的应用后,电脑开机变慢,到底是系统的原因还是应用的原因,为了了解这里的问题,探秘了下windows的开机过程和测试方法。 一、开机过...

326100
来自专栏windealli

系统性能的影响因素和优化方向小结

系统性能是系统设计、实施中的重要目标。这里简单小结下影响系统性能的几个常见因素,以及优化方案。

28070
来自专栏Golang语言社区

转-游戏服务端大访问量大并发的优化解决方案?

所有的对象都放在内存,20万用户以下无压力。 如果游戏的用户很多,例如超过50万,内存就会不够,可使用LRU算法来淘汰一些数据。 流程:收到用户请求 - 在...

52590
来自专栏IT技术精选文摘

使用API网关构建微服务

当您选择将应用程序构建为一组微服务时,您需要确定应用程序的客户端将如何与微服务器进行交互。使用单体应用程序,只有一组(通常是复制的,负载均衡的)端点。然而,在微...

44680
来自专栏JAVA高级架构

分布式事务原理及解决方案

分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在这几年越来越火的微服务架构中,几乎可以说是无法避免,本文就围绕单机...

14520
来自专栏网商云

腾讯云cvm--linux结合腾讯云企业邮箱配置mailx

新账号关联我们公司购买腾讯云产品,有优惠哦!联系电话:13430587834(微信同号)

50640
来自专栏LuckQI

分布式管理器~Zookeeper初识

12830
来自专栏FreeBuf

从零开始学Android应用安全测试(Part4)

在本节内容中,我们会介绍一款分析安卓应用略屌的工具,在上一节内容我们就已经提及过了,他就是Drozer。 ‍‍‍‍‍‍‍‍‍ Drozer是一款针对Androi...

20650
来自专栏finleyMa

(转) 网站统计中的数据收集原理及实现

原文地址:http://blog.codinglabs.org/articles/how-web-analytics-data-collection-syste...

25110

扫码关注云+社区

领取腾讯云代金券