1、微服务的定义

将一个单体应用拆分成一组微小的服务组件,每个微小的服务组件运行在自己的进程上,组件之间通过如RESTful API这样的轻量级机制进行交互,这些服务以业务能力为核心,用自动化部署机制独立部署,另外,这些服务可以用不同的语言进行研发,用不同技术来存储数据

通过以上的定义描述,我们可以基本确定给出微服务的节特征:

  • 在分布式环境中,将单体应用拆分为一系列服务,共同组成整个系统。
  • 每个服务都轻量级,单独部署,运行在自己的进程中。
  • 每个微服务注重自己的核心能力的开发,微服务组件之间采用轻量级通信方式进行通信,包括但不限于RESTful API。
  • 按照业务边界进行划分。
  • 微服务是一种编程架构思想,有不同的语言实现。

2、微服务架构设计需要考虑的问题

用微服务来进行实践到生产项目中,首先要考虑一些问题。比如下图的微服务业务架构:

在上图图表展示的架构图中,我们假设将业务商户服务A、订单服务B和产品服务C分别拆分为一个微服务应用,单独进行部署。此时,我们面临很多要可能出现的问题要解决,比如:

1、客户端如何访问这些服务?

2、每个服务之间如何进行通信?

3、多个微服务,应如何实现?

4、如果服务出现异常宕机,该如何解决?

以上这些都是问题,需要一个个解决。

3、客户端如何访问服务

在单体应用开发中,所有的服务都是本地的,前端UI界面,移动端APP程序可以直接访问后端服务器程序。

现在按功能拆分成独立的服务,跑在独立的进程中。如下图所示:

此时,后台有N个服务,前台就需要记住管理N个服务,一个服务下线更新升级,前台和移动端APP就要重新部署或者重新发包,这明显不服务我们拆分的理念。尤其是对当下业务需求的飞速发展,业务的变更是非常频繁的。

除了访问管理出现困难以外,N个小服务的调用也是一个不小的网络开销。另外,一般微服务在系统内部,通常是无状态的,而我们的用户在进行业务操作时,往往是跨业务模块进行操作,且需要是有状态的,在此时的这个系统架构中,也无法解决这个问题。传统的用来解决用户登录信息和权限管理通常有一个统一的地方维护管理(OAuth),我们称之为授权管理。

基于以上列出的问题,我们采用一种叫做网关(英文为API Gateway)的技术方案来解决这些问题,网关的作用主要包括:

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

网关(API Gateway)可以有很多广义的实现办法,可以是一个软硬一体的盒子,也可以是一个简单的MVC框架,甚至是一个Node.js的服务端。他们最重要的作用是为前台(通常是移动应用)提供后台服务的聚合,提供一个统一的服务出口,解除他们之间的耦合,不过API Gateway也有可能成为单点故障点或者性能的瓶颈。

最终,添加了网关(API Gateway)的业务架构图变更为如下所示:

4、服务之间如何通信

所有的微服务都是独立部署,运行在自己的进程容器中,所以微服务与微服务之间的通信就是IPC(Inter Process Communication),翻译为进程间通信。进程间通信的方案已经比较成熟了,现在最常见的有两大类:同步调用、异步消息调用

同步调用

同步调用比较简单,一致性强,但是容易出调用问题,性能体验上也会差些,特别是调用层次多的时候。同步调用的有两种实现方式:分别是RESTRPC

  • REST:REST基于HTTP,实现更容易,各种语言都支持,同时能够跨客户端,对客户端没有特殊的要求,只要具备HTTP的网络请求库功能就能使用。
  • RPC:rpc的特点是传输效率高,安全性可控,集成熔断、限流等功能,在系统内部调用实现时使用的较多。

基于REST和RPC的特点,我们通常采用的原则为:向系统外部暴露采用REST,向系统内部暴露调用采用RPC方式。

异步消息调用

异步消息的方式在分布式系统中有特别广泛的应用,他既能减低调用服务之间的耦合,又能成为调用之间的缓冲,确保消息积压不会冲垮被调用方,同时能保证调用方的服务体验,继续干自己该干的活,不至于被后台性能拖慢。需要付出的代价是一致性的减弱,需要接受数据最终一致性,所谓的最终一致性就是只可能不会立刻同步完成,会有延时,但是最终会完成数据同步;还有就是后台服务一般要实现幂等性,因为消息发送由于性能的考虑一般会有重复(保证消息的被收到且仅收到一次对性能是很大的考验)。最后就是必须引入一个独立的 Broker,作为中间代理池。

常见的异步消息调用的框架有:Kafaka、Notify、MessageQueue。

最终,大部分的服务间的调用架构实现如下所示:

5、如何实现众多微服务

在微服务架构中,一般每一个服务都是有多个拷贝,来做负载均衡。一个服务随时可能下线,也可能应对临时访问压力增加新的服务节点。这就出现了新的问题:

  • 服务之间如何相互感知,例如有新的服务实例上线,已上线的实例如何知道并与之通信。
  • 服务如何管理,服务实例数量多了,也面临着如何管理的问题。

这就是服务的发现、识别与管理问题。解决多服务之间的识别,发现的问题一般是通过注册的方式来进行。

具体来说:当服务上线时,服务提供者将自己的服务注册信息注册到某个专门的框架中,并通过心跳维持长链接,实时更新链接信息。服务调用者通过服务管理框架进行寻址,根据特定的算法,找到对应的服务,或者将服务的注册信息缓存到本地,这样提高性能。当服务下线时,服务管理框架会发送服务下线的通知给其他服务。

常见的服务管理框架有:Zookeeper等框架。

如上的问题解决方案有两种具体的实现,分别是:基于客户端的服务注册与发现基于服务端的服务注册与发现

基于客户端的服务注册与发现

优点是架构简单,扩展灵活,只对服务注册器依赖。缺点是客户端要维护所有调用服务的地址,有技术难度,一般大公司都有成熟的内部框架支持。

基于服务端的服务注册与发现

优点是所有服务对于前台调用方透明,一般小公司在云服务上部署的应用采用的比较多。

6、服务宕机等异常情况的处理

前面提到,单体应用开发中一个很大的风险是,把所有鸡蛋放在一个篮子里,一荣俱荣,一损俱损。而分布式最大的特性就是网络是不可靠的。通过微服务拆分能降低这个风险,不过如果没有特别的保障,结局肯定是噩梦。

因此,当我们的系统是由一系列的服务调用链组成的时候,我们必须确保任一环节出问题都不至于影响整体链路。相应的手段有很多,比如说:

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

微服务入门|微服务架构怎么设计相关推荐

  1. Java生鲜电商平台-微服务入门与服务的拆分架构实战

    Java生鲜电商平台-微服务入门与服务的拆分架构实战 刚开始进入软件行业时还是单体应用的时代,前后端分离的概念都还没普及,开发的时候需要花大量的时间在"强大"的JSP上面,那时候S ...

  2. TensorFlow是什么?TensorFlow入门与实践 架构与设计详解

    TensorFlow是什么? TensorFlow基于数据流图,用于大规模分布式数值计算的开源框架.节点表示某种抽象的计算,边表示节点之间相互联系的张量.计算图实例TensorFlow支持各种异构的平 ...

  3. 微众银行:分布式架构之高可用

    作者:Noe来源:51CTO [51CTO.com原创稿件]导言 在互联网金融快速发展的当下,面对爆发式增长的数据量.高并发海量交易场景,传统集中式架构的性能瓶颈愈发凸显.基于此,越来越多的银行等金融 ...

  4. 架构设计之「 微服务入门 」

    戳蓝字"CSDN云计算"关注我们哦! 作者 | 奎哥 来源 | 不止思考 微服务这几年不可谓不火,很多技术团队都开始在自己的项目上引入了微服务.一方面这些团队确实很好的推动了微服务 ...

  5. 专为云原生、微服务架构而设计的链路追踪工具 【SkyWalking介绍及搭建】

    文章目录 前言. 当前企业级分布式微服务集群架构图 一. skywalking是什么 二. 为什么需要服务追踪 三 链路追踪框架对比 3.1 性能对比 四. 链路追踪的实际应用预览 4.1 捋清业务 ...

  6. Spring Cloud 微服务入门(二)--Spring Cloud 架构

    Spring Cloud整体核心架构:Rest服务,在Spring Cloud配置过程中,都是遵循Rest风格规范,在Rest处理中,必不可少两个对象端:服务的提供者(provider)和服务消费者( ...

  7. 阿里P8架构师谈:微服务Dubbo和SpringCloud架构设计、优劣势比较

    本文主要围绕微服务的技术选型.通讯协议.服务依赖模式.开始模式.运行模式等几方面来综合比较Dubbo和Spring Cloud 这2种开发框架.架构师可以根据公司的技术实力并结合项目的特点来选择某个合 ...

  8. 微服务Dubbo和SpringCloud架构设计、优劣势比较

    一.微服务介绍 微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.虽然微服务架构没有公认的技术标准和规 ...

  9. 云原生时代微服务的高可用架构设计

    简介: 在8月20日"阿里巴巴技术质量精品课"上,来自蚂蚁的经国分享了对云原生时代微服务的高可用架构设计的全面解析,为大家介绍了应用架构演进路径.云原生时代的技术福利.高可用架构的 ...

最新文章

  1. for循环10000次花多长时间_我的三菱FX PLC学习之子程序调用与循环
  2. 2015 11月30日 一周工作计划与执行
  3. 实现一个正则表达式引擎in Python(三)
  4. C语言指针,申请、释放内存,线程
  5. java实验多线程机制_JAVA 多线程机制(一)
  6. vue修改代码同步页面_vue实现两个组件之间数据共享和修改操作
  7. 【转】什么是线程安全和线程不安全
  8. 软件外包中常见的七个错误之一 - 不懂用户需求
  9. c语言关键字c11,_Generic关键字及其语法和应用(C11标准),C语言_Generic详解
  10. antd FormItem嵌套FormItem的适用场景
  11. 电脑突然蓝屏要怎么办?电脑为啥会蓝屏?
  12. Vue - 搜索关键字标红高亮(用户输入关键词搜索后,在搜索结果的列表标题上匹配并标红加粗)怎么使内容文本标红高亮的最详细教程,Nuxt.js uni-app 也适用,搜索功能及搜索结果关键字高亮源码
  13. 基于FPGA的2FSK调制解调器
  14. Spark性能优化之-开发调优
  15. git 推送出现 “fatal: The remote end hung up unexpectedly“ 解决方案
  16. pdfviewpager_Android客户端实现查阅PDF文件功能
  17. 危化品柜颜色如何区分?
  18. Qt入门-文本框类QLineEdit和QTextEdit
  19. 浅析物联网的商业模式
  20. 做web前端开发就是爽!不仅工资高而且没事还能写个游戏玩!真棒

热门文章

  1. Dlink 重磅来袭,让 FlinkSQL 更加丝滑
  2. unique去重函数
  3. 浙大160位学者入选2020“中国高被引学者” 榜单!
  4. liferay mysql_Liferay中搭配MySQL数据库的两种措施
  5. es java 查询为空和非空的数据
  6. css伪类炫酷迷幻边框
  7. 山狮来临,Notes何往
  8. 舍友整日沉迷代码?偷偷给他的idea装上防沉迷插件!!
  9. 匹马抢三关:讯飞翻译机3.0的破障之战
  10. 【cocos2d-x入门实战】微信飞机大战之十三:游戏场景过渡