温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

微服务中的一些知识点总结

发布时间:2021-10-26 17:08:05 来源:亿速云 阅读:164 作者:iii 栏目:编程语言

本篇内容主要讲解“微服务中的一些知识点总结”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“微服务中的一些知识点总结”吧!

微服务架构

  微服务一词来源于Martin Fowle写的一篇文章,开发者可以点击 这里,阅读该文章详情,阅读中文翻译请点击 这里。

  简单来说,微服务是系统架构上的一种设计风格,它的主旨是将一个原本独立的系统拆分成多个小型服务,这些小型服务都在各自独立的进程中运 行,服务之间通过基于HTTP的RESTful风格的API进行通信协作。注意被拆分的每一个小型服务都是围绕着系统中某一项或者一些耦合度较高的业务功能进行构建,并且每个服务都维护着自身的数据存储、业务开发、自动化测试案例以及独立部署机制。由于存在轻量级的通信协议作基础,因此这些微服务可以使用不同的语言来不编写。     

与单体系统的区别

  在以往传统的企业系统架构中,我们针对一个复杂的业务需求通常使用对象或业务类型来构建一个单体项目。在项目中通常将需求分为三个主要部分:数据库、服务端处理、前端展现。在业务发展初期,由于所有的业务逻辑在一个应用中,开发、测试、部署都还比较容易且方便。但是随着企业的发展,系统为了应对不同的业务需求会不断为该单体项目增加不同的业务模块;同时随着移动设备的进步,前端展现模块已经不仅仅局限于Web的形式,这对于系统后端向前端的支持需要更多的接口模块。不断扩大的需求使得单体应用变得越来越臃肿,因此单体应用的缺点也越来越明显。由于单体系统部署在一个进程内,因此当我们修改了一个很小的功能,然后部署上线很可能会影响其他功能的运行。且单体应用中的各个模块的使用场景、并发量、消耗的资源类型等都是不同的,对于资源的利用又是互相影响,这样无疑给我们对于各个业务模块的系统容量的评估带来巨大的影响,这么看来尽管单体系统在初期可以很方便的进行开发和使用,但是随着系统的发展,毫无疑问其维护成本会变得越来越大,且非常难以控制。

  为了解决单体系统变得臃肿后难以维护的问题,微服务架构孕育而生。我们可以将系统中不同的功能模块拆分成多个不同的服务,这些服务都能够独立部署和扩展。由于每个服务都运行在自己的进程内,在部署上有稳固的边界,这样每个服务的更新都不会影响到其他服务的运行。同时由于各个服务均是独立部署的,因此可以更为准确的为每个服务进行性能容量评估,与此同时通过配合服务间的协作流程也可以更容易的发现系统的瓶颈位置,并给出较为准确的系统级性能容量评估。     

微服务带来的挑战

  在实施微服务之前,有必要知道因为微服务的拆分而引发了诸多原本在单体应用中没有的问题和挑战:

(1)运维的新高度。 在微服务架构中,由于系统的拆分,使得运维人员需要维护的进程数量大大增加,这就要求运维人员具备一定的开发能力来编排运维过程并让它们能自动运行起来。

(2)接口的一致性。 虽然我们拆分了服务,但是业务逻辑上的依赖并不会消除,只是从单体应用中的代码依赖变为了微服务间的通信依赖。这就使得开发者对原有接口进行了一丝修改,那么与之对应的交互方也需要协调这样的改变来进行发布,以保证接口的正确调用。也就是说此时需要更完善的接口和版本管理,或者是严格遵循开闭原则。

(3)分布式的复杂性。 由于拆分后的各个微服务都是独立部署并运行在各自的进程内,它们只能通过通信来进行协作,所以分布式环境的问题都是微服务架构设计时需要考虑的重要因素,如网络延迟、分布式事务、异步消息等。

  尽管微服务架构中存在很多缺点,但是你知道的凡是都有两面性,关键在于如何取舍,当你觉得微服务架构中实现的敏捷开发、自动化部署等是你着重需要考虑的问题,那么此时选择微服务架构是不错的选择。

     

微服务9大特性

  由于存在环境、资源、团队等各种因素的影响,因此架构师在对一个大型系统架构的设计与实施过程中几乎不会出现完全相同的架构设计。对于微服务架构而言更是如此,由于微服务架构只是一种建议,不是硬性规定,因此架构师通常会根据自身理解和实际情况来进行设计,并在发展的过程中不断演进和完善。当然了,俗话说的好,不以规矩无以成方圆,因此非服务架构存在9大特性,通过这9大特性的学习,对于架构师设计架构有着指导性意义。

(1)服务组件化。 所谓的组件,是指一个可以独立更换和升级的单元。在微服务架构中,需要我们对服务进行组件化分解。服务,是一种进程外的组件,它通过HTTP等通信协议进行协作,而不是像传统组件那样以嵌入的方式协调工作。每一个服务都独立开发、测试、部署,可以有效的避免一个服务的修改引起整个系统的重新部署。

(2)按业务组织团队。 当决定如何划分微服务时,通常也意味着我们要开始对团队进行重新规划和组织。按照以往的方式,我们会从技术层面将团队划分为多个,如DBA团队,运维团队,后端团队,前端团队,设计师团队等。但是如果我们此时还按照这种方式组织团队来实施微服务架构开发,那么极易出现当一个服务需要修改时(可能是一个非常简单的变动,如对某个对象新增一个字段等),那么这就要求从数据存储开始考虑一直到设计和前端,尽管大家修改的内容很少,甚至部分节点是不需要修改的,但是这势必会造成不必要的跨团队沟通,而这在企业中尽量是需要避免的。

  在微服务架构的实施时,需要采用不同的团队分割方法。由于每一个服务都是针对特定业务的宽栈或者是全栈实现,既要负责数据的持久化存储,又要负责用户的接口定义等各种跨专业领域职能。因此在面对大型项目的时候,对于微服务团队的拆分笔者建议按照业务线的方式进行拆分,一方面可以有效的减少服务内部修改所产生的内耗;另一方面团队的边界变得更加清晰。

(3)做产品的态度。 在实施微服务架构的团队中,每个小团队都应该是以做产品的方式对其产品的整个生命周期负责,而不是以项目的模式,以完成开发与交互并将成果交给维护者为最终目标。

  一般来说,开发团队通过了解服务在具体生产环境中的情况,可以增加他们对于具体业务的理解,所以需要开发者用做产品的态度来对待每一个微服务,持续关注服务的运作情况,并不断分析以帮助用户来改善业务功能。

(4)智能端点与哑管道。 在单体应用中,组件之间可以直接通过函数调用的方式来进行交互协作;而在微服务架构中,由于服务不在一个进程中,因此组件的通信模式发送了变化,如果仅仅是将原本在进程内的方法调用改成RPC方式的调用,这样会导致微服务之间产生繁琐的通信,使得系统表现更为糟糕,因此我们需要更粗粒度的通信协议。

  在微服务架构中,一般会使用如下两种服务调用方式:(1)使用HTTP的RESTful风格的API或者轻量级的消息发送协议,实现消息传递与服务调用的触发。(2)通过在轻量级的消息总线上传递消息,使用类似于RabbitMQ等一些提供可靠异步交换的中间件。

  除了上述两种方式之外,在一些极度强调性能的情况下,有些团队会使用二进制的消息发送协议,如protobuf。但是即便是这样,这些系统依旧可能出现前面说的“智能端点与哑管道”的特点,这是为了在易读性和高效性之间取得平衡。当然了,大多数的Web应用或者企业系统其实并不需要在这两者之间做出选择,因为能够获得易读性已经是非常不错了。

(5)去中心化治理。 当我们采用集中化的架构治理方案时,通常在技术平台上都会制定统一的标准,但是每一种技术都有它合适的应用场景,并不是适合所有的场景,这样在碰到其短板时,就需要花费大力气去解决,而且极有可能在日后成为系统的瓶颈。

  在实施微服务架构时,通过采用轻量级的契约定义接口,使得我们对于服务本身的技术平台不再那么敏感,这样整个微服务架构系统中的各个组件就能针对其不同的业务特点选择不同的技术平台,使用最合适的技术,这样就不会出现杀鸡焉用牛刀的尴尬局面。

  我非常喜欢一句话:不是每个问题都是钉子,也不是每个解决方案都是锤子。

(6)去中心化管理数据。 我们在实施微服务架构时,都希望让每一个服务来管理其自有的数据库,这其实就是数据管理的去中心化。

  在去中心化过程中,我们除了将原数据库中的存储内容拆分到新的的同平台的其他数据库实例之中(如将原本存储在MySQL中的表拆分后,存储到多个不同的MySQL实例中),当然也可以将一些具有特殊结构或者业务特性的数据存储到一些其他技术的数据库实例中,如将日志信息存储到MongoDB或者将用户信息存储到Redis中。

  虽然数据管理的去中心化可以让数据管理变得更加细致化,之后通过采用更合适的技术可以让数据存储和性能达到最优解。但是由于数据存储于不同的数据库实例中,那么数据一致性也就成了微服务架构中亟待解决的问题,而分布式事务本身实现的难度就非常大,因此在微服务架构中我们更强调在各服务之间进行“无事务”的调用,而对于数据一致性,只要求数据在最后处理的状态是一致的即可。如果在过程中发现错误,可以通过补偿机制来进行处理,这样使得错误数据能够达到最终的一致性。

(7)基础设施自动化。 随着云计算服务与容器技术的不断发展,运维基础设施的工作变得越来越容易,但是当我们在实施微服务架构的时候,数据库、应用程序虽然变都小了,但是因为拆分的原因,数量成倍增长,这也就使得运维人员不得不花费更多的时间去关注,且操作性任务也会成倍增长,如果这些问题一开始没有引起足够的重视,那么势必会加重运维人员的工作负担。

  因此,在微服务架构中必须从一开始就构建起“持续交付”平台来支撑整个实施过程,一般来说都会包含两个部分:自动化测试和自动化部署。

(8)容错设计。 在单体应用中,一般不存在单个组件故障而其他组件还在运行的情况,通常都是一挂而全挂。但是在微服务架构中,由于各个服务都是运行在独立的进程中,所以存在部分服务出现故障,而其他服务还正常运行的情况。举个例子,假设运行正常的服务B调用发生故障的服务A时,由于故障服务A没有返回,线程被挂起等待,直到超时才会被释放,而此时若触发服务B调用服务A的请求来自于服务C,而服务C频繁调用服务B时,由于其依赖服务A,大量线程被挂起等待,最后导致服务A也不能正常服务,此时就会出现故障的蔓延。

  鉴于此种情形,在微服务架构中快速检测出故障来源并尽可能的自动恢复服务是必须被设计和考虑的。一般来说,我们都希望在每个服务中实现监控和日志记录的组件,然后提供诸如服务状态、断路器状态、吞吐量、网络延迟等关键数据的仪表盘等。

(9)演进式设计。 其实通过上面的学习,我们可以发现要实施一个完美的微服务架构,需要考虑很多东西且成本也挺大的,对于一些没有过足够经验的团队来说,极易可能付出比单体架构应用更多的代价。

  因此在很多情况下,架构师都会以演进的方式进行系统的构建,也就是说一个好的架构不是设计出来的,而是演进出来的。在初期,一般会以单体架构来设计和实施,一方面是因为系统初期体量不会太大,构建和维护成本都不高;另一方面初期的核心业务在后期通常也不会发生巨大的变化。随着系统的发展或者业务的需要,架构师会将一些经常变动或者是有一段时间效应的内容进行微服务处理,并逐渐将原来在单体系统中多变的模块拆分出来,而稳定不太变化的模块就形成了一个核心微服务存在于整个架构中。

     

微服务技术

  接下来学习一些优秀企业分享的它们在微服务架构中针对不同应用场景出现的各种问题的各种解决方案和开源框架:

(1)服务治理:阿里巴巴开源的Dubbo和当当网在其基础上扩展的DubboX、NetFlix的Eureka、Apache的Consul等;

(2)分布式配置管理:百度的Disconf、Netflix的Archaius、360的QConf、Spring Cloud的Config、淘宝的Diamond等;

(3)批量任务:当当网的Elastic-Job、LinkedIn的Azkaban、Spring Cloud的Task等;

(4)服务跟踪:京东的Hydra、Spring Cloud Sleuth和Twitter的Zipkin等;

  当然上面列举的只是一部分,对于有选择困难症的人来说,对于某一个问题存在多个答案的选择也是一个问题。其实仔细看也就发现上面这些框架都是为了解决部分问题,那么问题来了其实完全可以选择一个较为系统的工具,Spring Cloud就是这样的工具,它是一个解决微服务架构实施的综合性解决框架,它不是重复的造轮子,而是整合诸多被广泛实践和证明过的框架作为实施的基础部件,然后在该基础上创建了一些非常优秀的边缘组件。

     

Spring Cloud简介

  Spring Cloud是一个基于Spring Boot实现的微服务架构开发工具,它为微服务架构中涉及的配置管理、服务治理、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。

Spring Cloud包含了很多子项目,如下所示:

(1)Spring Cloud Config:配置管理,支持使用Git存储配置内容,可以使用它来实现应用配置的外部化存储,并支持客户端配置信息刷新、加密/解密配置内容等;

(2)Spring Cloud Netflix:这是Spring Cloud的核心组件,对多个Netflix OSS开源套件进行整合:

  • Eureka:服务治理组件,包含服务注册中心、服务注册与服务发现机制的实现;
  • Hystrix:容错管理组件,实现断路器模式,帮助服务依赖中出现的延迟和为故障提供强大的容错能力;
  • Ribbon:客户端负载均衡的服务调用组件;
  • Feign:基于Ribbon和Hystrix的声明式服务调用组件;
  • Zuul:网关组件,提供智能路由、访问过滤等功能;
  • Archaius:外部化配置组件。

(3)Spring Cloud Bus:事件、消息总线,用于传播集群中的状态变化或事件,以触发后续的处理,如用来动态刷新配置信息等;

(4)Spring Cloud Cluster:针对Zookeeper、Redis、Hazelcast、Consul的选举算法和通用模式的实现;

(5)Spring Cloud Cloudfoundry:与Pivotal Cloudfoundry的整合支持;(6)Spring Cloud Consul:服务发现与配置管理工具;

(7)Spring Cloud Stream:通过Redis、RabbitMQ或者Kafka实现的消费微服务,可以通过简单的声明式模型来发送和接收消息;

(8)Spring Cloud AWS:用于简化整合Amazon Web Service的组件;

(9)Spring Cloud Security:安全工具包,提供在Zuul代理中对于OAuth3客户端请求的中继器;

(10)Spring Cloud Sleuth:Spring Cloud应用的分布式服务跟踪实现,可以完美的整合Zipkin;

(11)Spring Cloud Zookeeper:基于Zookeeper的服务发现与配置管理组件;

(12)Spring Cloud Starters:Spring Cloud的基础组件,它是基于Spring Boot风格项目的基础依赖模块;

(13)Spring Cloud CLI:用于在Groovy中快速创建Spring Cloud应用的Spring Boot CLI插件。

当然绝对不只是这些组件,还有很多的组件等着我们去学习。

到此,相信大家对“微服务中的一些知识点总结”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI