漫谈架构之微服务

目录
  • 一、简介
  • 二、微服务和单体服务
  • 三、微服务的特征
    • 3.1、组件服务化
    • 3.2、组织的划分
    • 3.3、服务之间的通信
    • 3.4、去中心化治理
    • 3.5、去中心化数据管理
    • 3.6、自动化部署
    • 3.7、对异常的响应
  • 四、总结

一、简介

服务的划分是根据具体的业务来的,并且可以通过完全自动化的部署机制独立部署。虽然大家都在谈论微服务,但是什么时候应该使用微服务,使用微服务需要注意哪些问题对于很多人来说仍然是一个模糊的概念。本文将会和大家一起探讨一下微服务相关的一些问题。

二、微服务和单体服务

在最开始的程序体系中,通常都是单体服务。对于单体服务来说,所有的服务都在一个进程中。企业应用程序通常由三个主要部分构建: 客户端用户界面(由 HTML 页面和在用户机器上的浏览器中运行的 javascript 组成),数据库(由插入到公共的、通常是关系的数据库管理中的许多表组成系统)和服务器端应用程序。

服务器端应用程序将处理 HTTP 请求、执行域逻辑、从数据库检索和更新数据,以及选择和填充要发送到浏览器的 HTML 视图。这个服务器端应用程序是一个整体,也就是一个单独的进程。对系统的任何更改都需要重新构建和部署服务器端应用程序的最新版本。

对于单体服务来说,所有的处理请求逻辑都在单个进程中运行,为了结构化和代码编写规范,通常会使用编程语言的基本功能将应用程序划分为类、函数和命名空间等。

虽然单体服务也可以通过负载均衡器后面运行多个实例来水平扩展应用,但是随着服务器端业务越来越复杂,对于服务的每一次很小的变动都会导致对于整体服务的重新构建和部署。并且随着时间的推移,通常很难保持良好的模块化结构,和对现有架构进行扩展。同时因为单体服务在一个进程中运行,如果该进程出现运行时问题,会导致所有的服务不可用,稳定性不够。

俗话说得好,鸡蛋不能放在一个篮子里面。

于是把巨大的单体服务拆分成为一个个的微服务就是现在系统架构的热潮。

微服务架构就是将单体的应用程序拆分为一个个的服务,这些服务可以独立部署和扩展,并且服务之间有牢固的模块边界,服务之间主要通过HTTP协议进行交互。因为服务之间是无内部耦合的,所以我们可以甚至使用不同的编程语言来实现不同的服务。提高了程序的灵活性。

三、微服务的特征

微服务有些什么特征呢?什么样的服务才能被称为是微服务呢?

社会很复杂,单纯的是人。实际工程上的问题,不会向书本上学到的知识那样,有一个明确定义。事实上,出了学校之后,这个世界上的事情已经不是非黑即白了。

比如,我们上学时候学到的圆的定义,它清晰的告诉我们,什么是圆。而对于微服务来说,则并没有这样的定义。

因为微服务是在不断的实践中总结摸索出来的一种架构。虽然不同的人对微服务有不同的理解,但是他们应该都具有下面几个共同的特征。

3.1、组件服务化

自从软件变得复杂之后,为了更好的进行软件开发和后续的扩展,软件逐渐开始组件化。所谓组件就是一个个的可以独立替换和升级的部件。

现代程序中有很多可以称之为组件的东西,比如java中的依赖jar包,python中的依赖包等。

这些lib可以在运行时链接到程序中,以内存中的函数进行运行。

有了链接的lib,为什么我们还需要将这些组件服务化,以单独的进程来运行呢?

使用服务作为组件(而不是库)的一个主要原因是服务是可独立部署的。如果您的应用程序 由单个进程中的多个库组成,则对任何单个组件的更改都会导致必须重新部署整个应用程序。

但是,如果该应用程序分解为多个服务,那么对于该服务的变更,只需要重新部署该服务即可。虽然这不是绝对的,因为有些服务的变化会导致对应的调用接口的变化,所以也需要对应的服务来进行修改和适配。但是一个好的微服务架构的目标是通过服务契约中的内聚服务边界和演化机制来最小化这些变动。

使用服务作为组件的另一个好处是更明确的组件接口。大多数语言没有定义显式发布接口的良好机制,从而导致组件之间的耦合过于紧密。通过使用显式远程调用机制,服务可以更容易的进行定义。

使用服务也有他的缺点,因为服务之间是通过远程调用的,远程调用比进程内调用更昂贵,所以服务之间的调用通常是更加粗粒度的调用,所以我们在界定服务的时候,需要划分明确的职责分配。

3.2、组织的划分

根据康威定律:组织沟通方式决定系统设计。

通常来说,对于大型的系统可以分为UI团队,服务逻辑团队和数据库团队。但是这样的组织方式就会导致一个团队的改动需要其他团队也进行改动来配合。

所以在微服务中,组织应该是安装具体的业务来划分,这样能够保证组织的灵活性。

3.3、服务之间的通信

对于单体服务而言,依赖的lib是通过内部函数的调用来实现的,它的好处就是速度快,但是如果将单体服务转换成微服务,就需要考虑到服务之间的相互调用问题。

常见的服务之间的调用方式有哪些呢?

最常见的就是HTTP/HTTPS协议之间的调用,这种方式的好处就是协议简单通用,兼容性的成本较低。

如果是跨语言的,通常会用Thrift之类的RPC远程调用协议,这种方式的好处就是会比HTTP调用要快,但是调用起来比较复杂。需要构建特定的客户端。

上面讲的是同步调用,如果是异步的话,还可以使用MQ机制,MQ的作用一是可以削峰,二是可以解耦。

3.4、去中心化治理

对于微服务来说,并不要求所有的微服务都采用同一种语言,同一种架构方式来进行。通常来说了保证系统和代码的可维护性,一般来说是要求所有的服务都使用同样的编程语言和架构。

但是对于特别的部分,比如对性能要求特别高这样的需求,那么可以尝试考虑一个不同的编程语言。

总的来说,就是每个微服务的团队对他们自己的服务负责,只需要保证对外的服务和接口的正确性即可。

3.5、去中心化数据管理

对于单体应用来说, 所有的数据都放在一个数据库中。如果对微服务进行了去中心化管理,那么相应的数据库属于各个微服务组,所以在理论上微服务的数据也应该是去中心化部署的。

但是这样多个数据库照成的后果就是各个数据库中数据的一致性。在单体应用中,这个问题可以通过数据库事务来解决。但是对于微服务来说,分布式事务是不可行的,或者说代价太大。一般来说对于微服务来说,我们需要保证数据的最终一致性。

通过补偿机制来进行数据的校验和修复。

3.6、自动化部署

自动化部署的目标就是持续交付,对于微服务来说,多个服务的自动化是必不可少的。通过自动化编译,自动化测试,自动化集成和自动化部署,可以大大的减轻开发团队和运维团队的任务。提升开发效率。

3.7、对异常的响应

使用服务作为组件的结果是,应用程序需要设计成可以容忍服务失败。 任何服务调用都可能因网络或者其他的原因导致不可用而失败,所以必须尽可能优雅地对此做出响应。

于单体服务相比,这需要引入额外的复杂性来处理它,所以可以看做是微服务的一个缺点。开发团队需要尽量多做异常测试,以保证在极端的环境中程序的正确性。

由于服务随时可能出现故障,因此能够快速检测故障并在可能的情况下自动恢复服务非常重要。微服务应用程序非常重视应用程序的实时监控,检查架构元素(数据库每秒收到多少请求)和业务相关指标(例如每分钟收到多少订单)。语义监控可以提供错误的早期预警系统,让开发团队跟进和调查。 监控对于快速发现不良的紧急行为并加以修复至关重要。

我们希望看到针对每个单独服务的复杂监控和日志记录设置,例如显示启动/关闭状态的仪表板以及各种运营和业务相关指标,还包括有关断路器状态、当前吞吐量和延迟的详细信息等。

四、总结

讲了这么多微服务的特征,微服务虽然有他的灵活性的优点,但是如何划分微服务的边界,和对微服务的监控是一个很复杂的问题,所以到底要不要使用微服务还留给读者自己思考。

最后,问大家一个问题,在现实的项目中,有很多人希望把现有的单体服务拆分成为微服务,但是各个微服务还是共享着同一个数据库,也就是说这些微服务之间还存在着数据交叉。那么这种微服务算不算是真正的微服务呢?

以上就是漫谈架构之微服务的详细内容,更多关于架构微服务的资料请关注我们其它相关文章!

(0)

相关推荐

  • 浅谈Redis在微服务架构中的几种应用场景

    本文介绍在SpringCloud中使用Redis作为Pub/Sub异步通信.缓存或主数据库和配置服务器的三种场景应用. Redis可以广泛用于微服务架构.它可能是您应用程序以多种不同方式利用的少数流行软件解决方案之一.根据要求,它可以充当主数据库,缓存或消息代理.虽然它也是一个键/值存储,但我们可以将它用作微服务体系结构中的配置服务器或发现服务器.虽然它通常被定义为内存中的数据结构,但我们也可以在持久模式下运行它. 这里我将向您展示一些使用Redis与Spring Boot和Spring Clo

  • 浅谈SpringCloud实现简单的微服务架构

    Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载均衡.断路器.数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署.Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟.经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂.易部署和易维护的分布式系统开发工具包. 接下

  • 新手学习微服务SpringCloud项目架构搭建方法

    这篇文章主要介绍了新手学习微服务SpringCloud项目架构搭建方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Spring的微服务框架SpringCloud受到众多公司欢迎,给大家带来一篇框架搭建入门.本次采用的版本是Spring Cloud版本为Finchley.RELEASE. 一.SpringCloud项目简介 spring cloud: 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.

  • 详解Java 微服务架构

    一.传统的整体式架构 传统的整体式架构都是模块化的设计逻辑,如展示(Views).应用程序逻辑(Controller).业务逻辑(Service)和数据访问对象(Dao),程序在编写完成后被打包部署为一个具体的应用.如图所示: 系统的水平扩展 如果要对系统进行水平扩展,通常情况下,只需要增加服务器的数量,并将打包好的应用拷贝到不同的服务器,然后通过负载均衡器(Nginx)就可以轻松实现应用的水平扩展. 整体式架构的缺点 应用复杂度增加,更新.维护困难. 易造成系统资源浪费. 影响开发效率. 应用

  • 浅谈架构模式变迁之从分层架构到微服务架构

    前言 谈到软件系统设计的方法论,在代码层面,有我们熟悉的23种设计模式(design pattern),对应到架构层面,则有所谓的架构模式(architecture pattern).它们分别从微观和宏观的角度指导着我们设计出良好的软件系统,因此,作为一个软件工程师,我们不仅要熟悉设计模式,对常见的架构模式也要熟稔于心.正如看到一个设计模式的名字脑里就能浮现出大致的结构图,当我们看到一个架构模式的名字时,也要马上想到对应的架构图及其基本特点.比如,当谈到分层架构时,我们就应该想起它的架构图是怎样

  • 详解多云架构下的JAVA微服务技术解析

    微服务生态 微服务生态本质上是一种微服务架构模式的实现,包括微服务开发SDK,以及微服务基础设施. 目前比较成熟的 JAVA 微服务生态包括 servicecomb(华为), spring-cloud (Pivotal), dubbo(阿里), tsf(腾讯)等.gRPC.Thrift 等也用于内部服务之间的通信,但是微服务基础设施比较欠缺. 核心的微服务基础设施包括:注册中心.配置中心.应用网关.此外,分布式事物管理.计划任务.调用链跟踪系统等也是微服务基础设施的组成部分.完整的微服务基础实施

  • 漫谈架构之微服务

    目录 一.简介 二.微服务和单体服务 三.微服务的特征 3.1.组件服务化 3.2.组织的划分 3.3.服务之间的通信 3.4.去中心化治理 3.5.去中心化数据管理 3.6.自动化部署 3.7.对异常的响应 四.总结 一.简介 服务的划分是根据具体的业务来的,并且可以通过完全自动化的部署机制独立部署.虽然大家都在谈论微服务,但是什么时候应该使用微服务,使用微服务需要注意哪些问题对于很多人来说仍然是一个模糊的概念.本文将会和大家一起探讨一下微服务相关的一些问题. 二.微服务和单体服务 在最开始的

  • 了解java架构之微服务架构—雪崩效应

    前言 微服务化产品线,每一个服务专心于自己的业务逻辑,并对外提供相应的接口,看上去似乎很明了,其实还有很多的东西需要考虑,比如:服务的自动扩充,熔断和限流等,随着业务的扩展,服务的数量也会随之增多,逻辑会更加复杂,一个服务的某个逻辑需要依赖多个其他服务才能完成. 一但一个依赖不能提供服务很可能会产生雪崩效应,最后导致整个服务不可访问. 微服务之间进行rpc或者http调用时,我们一般都会设置调用超时,失败重试等机制来确保服务的成功执行,看上去很美,如果不考虑服务的熔断和限流,就是雪崩的源头. 假

  • 解析SpringCloud简介与微服务架构

    1. 微服务架构 1.1 微服务架构理解 微服务架构(Microservice Architecture)是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦.你可以将其看作是在架构层次而非获取服务的类上应用很多SOLID原则.微服务架构是个很有趣的概念,它的主要作用是将功能分解到离散的各个服务当中,从而降低系统的耦合性,并提供更加灵活的服务支持. 概念:把一个大型的单个应用程序和服务拆分为数个甚至数十个的支持微服务,它可扩展单个组件而不是整个的应用程序堆栈,从而满足服务等

  • Java从单体架构升级到微服务要注意的一些问题

    前言 由于近年来的移动端的发展和 2C模式 的红利,一些在风口的企业的业务得到爆发式增长.从架构层面来说,业务驱动技术的变革,所以微服务架构的概念得到很多企业的青睐,因为可以解决服务的大流量和高并发以及稳定性的要求. 但是任何架构设计不是一蹴而就的,不能从起步就开始使用微服务,一般都是先通过单体架构来快速实现需求和抢占市场,然后再迭代式扩展.不能一口气吃个胖子. 这几年自己有经历从单体到微服务的架构演变,也有直接参与到已经落地的微服务架构的项目中.见过好的架构设计,也见过一些孬的设计.好的架构设

  • 微服务架构拆分策略详解

    目录 1 微服务迁移准备 2 微服务颗粒的拆分策略 2.1 基于业务逻辑拆分 2.1.1 领域模型拆分 2.1.2 用户群体拆分 2.2 基于可扩展拆分 2.3 基于可靠性拆分 2.3.1 核心模块拆分 2.3.2 主次链路拆分 2.4 基于性能需求拆分 3 总结拆分原则 微服务架构及其演进史 微服务全景架构全面瓦解 前面我们学习了微服务的全景架构,了解到相对于传统单体架构,微服务的优势,以及系统服务化的发展趋势. 对于新启动的项目,我们在权衡之后可以大方的使用微服务架构.但其实大部分情况下,我

  • 微服务全景架构全面瓦解

    目录 1 微服务优势与挑战 1.1 微服务的优势 1.1.1 单一职责 1.1.2 轻量级通信 1.1.3 独立性 1.1.4 进程隔离 1.1.5 混合技术栈和混合部署方式 1.1.6 简化治理 1.1.7 安全可靠,可维护. 1.2 面临的挑战 1.2.1 分布式固有复杂性 1.2.2 服务的依赖管理和测试 1.2.3 有效的配置版本管理 1.2.4 自动化的部署流程 1.2.5 对于DevOps更高的要求 1.2.6 运维成本 2 微服务全景架构 3 微服务核心组件 3.1 服务注册与发现

  • Spring Cloud Alibaba Nacos服务治理平台,服务注册、RestTemplate实现微服务之间访问负载均衡访问的问题

    目录 Nacos简介 ☘Spring Cloud 组件依赖版本 ☘Nacos部署 ☘访问Nacos平台 Nacos服务注册.微服务访问.负载均衡实现 nacos-consumer微服务创建 ☘nacos-provider微服务创建 测试 Nacos简介 Github:https://github.com/alibaba/nacos官网文档:https://nacos.io/zh-cn/docs/what-is-nacos.htmlNacos 提供了发现.配置和管理微服务能力,能快速实现动态服务发

  • Spring Cloud微服务架构的构建:分布式配置中心(加密解密功能)

    前言 要会用,首先要了解.图懒得画,借鉴网上大牛的图吧,springcloud组建架构如图: 微服务架构的应用场景: 1.系统拆分,多个子系统 2.每个子系统可部署多个应用,应用之间负载均衡实现 3.需要一个服务注册中心,所有的服务都在注册中心注册,负载均衡也是通过在注册中心注册的服务来使用一定策略来实现. 4.所有的客户端都通过同一个网关地址访问后台的服务,通过路由配置,网关来判断一个URL请求由哪个服务处理.请求转发到服务上的时候也使用负载均衡. 5.服务之间有时候也需要相互访问.例如有一个

随机推荐