
微服务架构是一种软件设计方法,它将应用程序分解为通过定义明确的 API 进行通信的小型独立服务。由于每个服务都可以由自治团队开发和维护,因此它是最具可扩展性的软件开发方法。
微服务设计与单体开发截然相反。单体是一个实现所有功能的大型代码库(“厨房水槽”)。一切都在一个地方,没有一个组件可以孤立地工作。这意味着应用程序必须作为一个整体进行测试。
从好的方面来说,单体应用很容易启动和运行。由于单体架构不同部分之间的关系是透明的,因此进行广泛的更改很容易。
然而,随着公司的发展和团队规模的扩大,单体开发变得更加困难。很快,系统就不能再装在一个头上了——移动部件太多了,所以事情变慢了。
微服务使公司能够保持团队规模小而敏捷。这个想法是将应用程序分解为可以由紧密结合的团队自主开发和部署的小型服务。
公司采用微服务的主要原因是 可扩展性 。服务可以独立开发和发布,无需在组织内安排大规模的协调工作。
拥有分布式系统的一个好处是能够避免单个故障点。您可以使用支持云的技术在不同的可用区部署微服务,确保您的用户永远不会遇到中断。
使用微服务,开发团队可以保持小而有凝聚力。小组越小,沟通开销越少,协作越好。
亚马逊通过他们的两个披萨团队将团队规模发挥到了极致。这意味着一个团队应该足够小,可以吃两个比萨饼。
对于单体应用,语言和技术堆栈选项几乎从一开始就设置好了。新开发人员必须适应过去做出的任何选择。
相比之下,每个微服务都可以使用最适合解决手头任务的技术堆栈。因此,团队可以为工作和他们的技能选择最佳工具。例如,您可以使用 Go 或 C 实现高性能服务,并使用 Erlang 或 Elixir 实现高容错微服务。
随着小团队迭代速度更快,开发和测试周期更短。而且,由于他们还可以随时部署更新,微服务的部署频率比单体应用要高得多。
有这么多好处,似乎为新项目选择微服务是一件轻而易举的事。但是微服务设计也带来了一些严峻的挑战:
你怎么知道你是否在做正确的微服务设计?如果您的团队可以在不与其他团队协调的情况下随时部署更新,并且如果其他团队可以类似地部署他们的更改而不影响您,那么恭喜您,您掌握了微服务的诀窍。
失去微服务提供的好处的最可靠方法是不遵守解耦规则。如果我们仔细观察,我们会发现微服务都是关于自治的。当这种自主权丧失时,团队必须在开发和部署期间进行协调。需要完美的集成测试来确保所有微服务协同工作。
即便如此,详尽的测试也无法捕捉到所有问题。当出现问题时,耦合服务是很难调试的。当问题被发现时,修复它并不总是像回滚更新那么容易。
紧密的服务依赖关系创建团队依赖关系。
这些都是分布式计算带来的问题。如果您曾经使用过云服务,您就会知道将服务或机器分布在多个地理位置与在同一站点上运行所有内容不同。分布式系统具有更高的延迟,可能存在同步问题,并且更难管理和调试。这种高度耦合的服务架构实际上是一个 分布式单体 架构,具有两全其美的优点,也没有微服务应该带来的任何好处。
如果您在不与其他团队协调或依赖其他微服务的特定版本来部署您的微服务的情况下无法进行部署,那么您只是在分发您的单体应用。
微服务并没有 取代 单体。两者都是有效的方法。事实上,当团队仍在 探索 他们正在构建的东西时,单体应用可能是最佳选择。
单体应用就像是项目的自然起点,因为它易于开发、快速迭代、快速部署、易于调试,并且更能容忍设计错误。在可扩展性成为问题之前,单体应用可以让您走得更远。
微服务是我们开发软件的最具可扩展性的方式。但它们不是免费的午餐。如果您不小心,它们会带来一些很容易发生冲突的风险。当团队正在成长并且您需要保持快速和敏捷时,它们非常有用。但是你需要对要解决的问题有一个很好的理解,否则你最终会得到一个分布式的单体。
简单地说,微服务架构就是以业务域或业务功能为边界,将一个大而全的应用拆分为可以独立开发,独立部署,独立测试,独立运行的一组小的应用,并且使用轻量级,通用的机制在这组应用间进行通信。主流的微服务包括:
1、SpringCloud
Spring Cloud , 来自Spring,具有Spring 社区的强大支撑,还有Netflix强大的后盾与技术输出。Netflix作为一家成功实践微服务架构的互联网公司在几年前就把几乎整个微服务框架栈开源贡献给了社区,这些框架开源的整套服务架构套件是Spring Cloud的核心。
- Eureka:服务注册发现框架;
- Zuul:服务网关;
- Karyon:服务端框架;
- Ribbon:客户端框架;
- Hystrix:服务容错组件;
- Archaius:服务配置组件;
- Servo:Metrics组件;
- Blitz4j:日志组件;
2、Dubbo
Dobbo是一个分布式服务框架,是阿里开放的微服务化治理框架,致力于提高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。其核心部分(官网)
- 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式;
- 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持;
- 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
Dubbo 也是采用全 Spring 配置方式,透明化接入应用,对应用没有任何 API 侵入,只需用 Spring 加载 Dubbo的配置即可,Dubbo 基于 Spring 的 Schema 扩展进行加载。当然也支持官方不推荐的 API 调用方式。
3、lstio
lstio 作为用于微服务聚合层管理的新锐项目,是Google、IBM、Lyft(海外共享出行公司、Uber劲敌),首个共同联合开源的项目,提供了统一的连接,安全,管理和监控微服务的方案。
目前首个测试版是针对Kubernetes环境的,社区宣称在未来几个月内会为虚拟机和Cloud Foundry 等其他环境增加支持。lstio将 流量管理添加到微服务中,并为增值功能(如安全性、监控、路由、连接管理和策略)创造了基础。
- >根据houyi平台规划,日志归集相关的技术组件都是基于k8s进行部署。
相关部署文件列表如图所示:
对应各个技术组件的部署以最简单的单点方式部署,暂时不考虑高可用性及性能d性伸缩等非功能需求。
该部署比较简单,就是对外提供9200,9300两个端口提供服务,也没有考虑数据存储到容器外。
创建一个ClusterService, K8S内服务可以通过服务名称elasticsearch-service或一个固定IP访问es。
自定义logstash logstashconf配置文件及logstashyml文件,配置如下所示:
logstashconf主要配置为:
logstashyml的配置主要是实现与es之间的心跳。(通过监控日志及名称猜测是这个作用 ,并没有核实,如理解有误望指点。)
logstash 容器启动logstash,并指定配置文件,打开5044端口。
通过filebeat config定义filebeat配置文件filebeatyml:
根据filebeat 配置,读取指定路径下的增量日志信息,
简单的说,微服务是架构设计方式,分布式是系统部署方式,两者概念不同
微服务是啥?
这里不引用书本上的复杂概论了,简单来说微服务就是很小的服务,小到一个服务只对应一个单一的功能,只做一件事。这个服务可以单独部署运行,服务之间可以通过RPC来相互交互,每个微服务都是由独立的小团队开发,测试,部署,上线,负责它的整个生命周期。
微服务架构又是啥?
在做架构设计的时候,先做逻辑架构,再做物理架构,当你拿到需求后,估算过最大用户量和并发量后,计算单个应用服务器能否满足需求,如果用户量只有几百人的小应用,单体应用就能搞定,即所有应用部署在一个应用服务器里,如果是很大用户量,且某些功能会被频繁访问,或者某些功能计算量很大,建议将应用拆解为多个子系统,各自负责各自功能,这就是微服务架构。
那么分布式又是啥?
分布式服务顾名思义服务是分散部署在不同的机器上的,一个服务可能负责几个功能,是一种面向SOA架构的,服务之间也是通过rpc来交互或者是webservice来交互的。逻辑架构设计完后就该做物理架构设计,系统应用部署在超过一台服务器或虚拟机上,且各分开部署的部分彼此通过各种通讯协议交互信息,就可算作分布式部署,生产环境下的微服务肯定是分布式部署的,分布式部署的应用不一定是微服务架构的,比如集群部署,它是把相同应用复制到不同服务器上,但是逻辑功能上还是单体应用。
微服务相比分布式服务来说,它的粒度更小,服务之间耦合度更低,由于每个微服务都由独立的小团队负责,因此它敏捷性更高,分布式服务最后都会向微服务架构演化,这是一种趋势, 不过服务微服务化后带来的挑战也是显而易见的,例如服务粒度小,数量大,后期运维将会很难
微服务¹架构的目标是帮助工程团队更快,更安全,更高质量地交付产品。解耦服务允许团队快速迭代,对系统的其余部分影响最小。
在Medium,我们的技术堆栈始于2012年的单片Nodejs应用程序。我们已经构建了几个卫星服务,但我们还没有制定一个系统地采用微服务架构的策略。随着系统变得越来越复杂并且团队不断发展,我们在2018年初转向了微服务架构。在这篇文章中,我们希望分享我们有效地做到这一点并避免微服务综合症的经验。
首先,让我们花一点时间来思考微服务架构是什么,不是什么。 “微服务”是那些过载和混乱的软件工程趋势之一。这就是我们在Medium认为它是什么:
该定义包括三个微服务设计原则:
Three Principles of Modeling Microservices
当我们对微服务进行建模时,我们应该遵守所有三个设计原则。这是实现微服务架构全部潜力的唯一途径。错过任何一个都会成为反模式。
没有一个目的,每个微服务最终会做太多事情,成长为多个“单片”服务。我们不会从微服务架构中获得全部好处,我们也会支付运营成本。
如果没有松散耦合,对一个服务的更改会影响其他服务,因此我们无法快速安全地发布更改,这是微服务架构的核心优势。更重要的是,紧密耦合引起的问题可能是灾难性的,例如数据不一致甚至数据丢失。
如果没有高凝聚力,我们将最终得到一个分布式单片系统 - 一组混乱的服务,必须同时进行更改和部署才能构建单一功能。由于多个服务协调的复杂性和成本(有时跨多个团队),分布式单片系统通常比集中式单片系统差得多。
与此同时,了解 微服务不是什么 很重要:
在Medium,我们总是在做出重大产品或工程决策时会问“为什么现在?”这个问题。 “为什么?”是一个显而易见的问题,但它假设我们拥有无限的人,时间和资源,这是一个危险的假设。当你想到“为什么现在?”时,你突然有了更多的限制 - 对当前工作的影响,机会成本,分心的开销等等。这个问题有助于我们更好地优先考虑。
我们现在需要采用微服务的原因是我们的Nodejs单片应用程序已经成为多个方面的瓶颈。
首先,最紧迫和最重要的瓶颈是其性能。
某些计算量很大且I / O很重的任务不适合Nodejs我们一直在逐步改进整体应用程序,但事实证明它是无效的。它的低劣性能使我们无法提供更好的产品而不会使已经非常慢的应用程序变慢。
其次,整体应用程序的一个重要且有点紧迫的瓶颈是它会减慢产品开发速度。
由于所有工程师都在单个应用程序中构建功能,因此它们通常紧密耦合。我们无法灵活地改变系统的一部分,因为它也可能影响其他部分。我们也害怕做出重大改变,因为影响太大,有时难以预测。整个应用程序作为一个整体进行部署,因此如果由于一次错误提交导致部署停滞,那么所有其他更改(即使它们完全正常工作)也无法完成。相比之下,微服务架构允许团队更快地发货,学习和迭代。他们可以专注于他们正在构建的功能,这些功能与复杂系统的其余部分分离。更改可以更快地进入生产。他们可以灵活地安全地尝试重大变革。
在我们新的微服务架构中,更改会在一小时内完成生产,工程师不必担心它会如何影响系统的其他部分。该团队还 探索 了在开发中安全使用生产数据的方法²多年来一直是白日梦。随着我们的工程团队的发展,所有这些都非常重要。
第三,单一应用程序使得难以为特定任务扩展系统或隔离不同类型任务的资源问题。
使用单一的单一应用程序,我们必须扩展和缩小整个系统,以满足更多资源需求的任务,即使这意味着系统过度配置用于其他更简单的任务。为了缓解这些问题,我们对不同类型的请求进行分片,以分离Nodejs进程。它们在一定程度上起作用,但不会扩展,因为这些微单一版本的单片服务是紧密耦合的。
最后但同样重要的是,一个重要且即将成为紧迫的瓶颈是它阻止我们尝试新技术。微服务架构的一个主要优点是每个服务都可以使用不同的技术堆栈构建,并与不同的技术集成。这使我们能够选择最适合工作的工具,更重要的是,我们可以快速安全地完成工作。
采用微服务架构并非易事。它可能会出错,实际上会损害工程生产力。在本节中,我们将分享七个在采用早期阶段帮助我们的策略:
有人可能会认为采用新的服务器架构意味着产品开发的长时间停顿以及对所有内容的大量重写。这是错误的做法。我们永远不应该为了建立新的服务而建立新的服务。每次我们建立新服务或采用新技术时,都必须具有明确的产品价值和/或工程价值。
产品价值应以我们可以为用户提供的利益为代表。与在单片Nodejs应用程序中构建值相比,需要一项新服务来提供值或使其更快地交付值。工程价值应该使工程团队更好,更快。
如果构建新服务没有产品价值或工程价值,我们将其留在单一的应用程序中。如果十年内Medium仍然有一个支持某些表面的单片Nodejs应用程序,那就完全没了问题。从单一应用程序开始实际上有助于我们战略性地对微服务进行建模。
建立具有明确价值的新服务
有人可能会认为采用新的服务器架构意味着产品开发的长时间停顿以及对所有内容的大量重写。这是错误的做法。我们永远不应该为了建立新的服务而建立新的服务。每次我们建立新服务或采用新技术时,都必须具有明确的产品价值和/或工程价值。
产品价值应以我们可以为用户提供的利益为代表。与在单片Nodejs应用程序中构建值相比,需要一项新服务来提供值或使其更快地交付值。工程价值应该使工程团队更好,更快。
如果构建新服务没有产品价值或工程价值,我们将其留在单一的应用程序中。如果十年内Medium仍然有一个支持某些表面的单片Nodejs应用程序,那就完全没了问题。从单一应用程序开始实际上有助于我们战略性地对微服务进行建模。
单片持久存储被认为是有害的
建模微服务的很大一部分是对其持久数据存储(例如,数据库)进行建模。跨服务共享持久数据存储通常似乎是将微服务集成在一起的最简单方法,然而,它实际上是有害的,我们应该不惜一切代价避免它。这就是原因。
首先,持久数据存储是关于实现细节的。 跨服务共享数据存储会将一个服务的实现细节暴露给整个系统。如果该服务更改了数据的格式,或者添加了缓存层,或者切换到不同类型的数据库,则还必须相应地更改许多其他服务。 这违反了松散耦合的原则。
其次,持久数据存储不是服务行为,即如何修改,解释和使用数据 。如果我们跨服务共享数据存储,则意味着其他服务也必须复制服务行为。 这违反了高内聚的原则 - 给定域中的行为泄露给多个服务。如果我们修改一个行为,我们将不得不一起修改所有这些服务。
在微服务架构中,只有一个服务应该负责特定类型的数据。所有其他服务应该通过负责服务的API请求数据,或者保留数据的 只读非规范(可能具体化)副本 。
这可能听起来很抽象,所以这是一个具体的例子。假设我们正在构建一个新的推荐服务,它需要来自规范帖子表的一些数据,目前在AWS DynamoDB中。我们可以通过两种方式之一为新推荐服务提供发布数据。
在单片存储模型中,推荐服务可以直接访问单片应用程序所执行的相同持久存储。这是一个坏主意,因为:
缓存可能很棘手。 如果推荐服务与单一应用程序共享相同的缓存,我们也必须在推荐服务中复制缓存实现细节;如果推荐服务使用自己的缓存,当单片应用更新帖子数据时,我们将不知道何时使其缓存无效。
如果单片应用程序决定更改为使用RDS而不是DynamoDB来存储帖子数据,我们将不得不重新实现推荐服务中的逻辑以及访问帖子数据的所有其他服务。
单片应用程序具有解释帖子数据的复杂逻辑 ,例如,如何确定帖子是否应该对给定用户不可见。我们必须在推荐服务中重新实现这些逻辑。一旦整体应用程序更改或添加新逻辑,我们也需要在任何地方进行相同的更改。
即使推荐服务是自己的数据访问模式的错误选项,推荐服务仍然停留在DynamoDB上。
在解耦存储模型中,推荐服务不能直接访问发布数据,也不能直接访问任何其他新服务。发布数据的实现细节仅保留在一个服务中。有不同的方法来实现这一目标。
Option A 理想情况下,应该有一个拥有帖子数据的Post服务,其他服务只能通过Post服务的API访问邮政数据。但是,为所有核心数据模型构建新服务可能是一项昂贵的前期投资。
当人员配置有限时,还有一些更实用的方法。根据数据访问模式,它们实际上可能是更好的方式。
在 选项B 中,单一应用程序可让推荐服务知道何时更新相关的帖子数据。通常,这不必立即发生,因此我们可以将其卸载到排队系统。
在 选项C 中,ETL管道生成推荐服务的发布数据的只读副本,以及可能对推荐有用的其他数据。在这两个选项中,推荐服务完全拥有其数据,因此它可以灵活地缓存数据或使用最适合的数据库技术。
解耦“建立服务”和“运行服务”
如果构建微服务很难,那么运行服务往往更难。 当运行服务与构建每个服务相结合时,它会减慢工程团队的速度,团队必须不断重新发明这样做。我们希望让每项服务都专注于自己的工作而不用担心如何运行服务的复杂问题,包括网络,通信协议,部署,可观察性等。服务管理应该与每个服务的实现完全分离。
由于最近在 容器化,容器编排,服务网格,应用程序性能监 控等方面的技术进步,“运行服务”的解耦变得比以往更容易实现。
网络。 网络(例如,服务发现,路由,负载平衡,流量路由等)是运行服务的关键部分。传统方法是为每种平台/语言提供库。它工作但不理想,因为应用程序仍然需要非常繁琐的工作来集成和维护库。通常,应用程序仍然需要单独实现某些逻辑。现代解决方案是在Service Mesh中运行服务。在Medium,我们使用 Istio和Envoy作为边车代理 。构建服务的应用工程师根本不需要担心网络问题。
通信协议 。无论您选择哪种技术堆栈或语言来构建微服务,从一个高效,类型化,跨平台且需要最少开发开销的成熟RPC解决方案开始是非常重要的。支持向后兼容性的RPC解决方案也使部署服务更加安全,即使它们之间存在依赖关系。在Medium,我们选择了gRPC。
一种常见的替代方案是基于>一、清晰轻量的产品逻辑
奥卡姆剃须刀法则同样在产品架构设计中适用,越简单的架构越有利于产品的生长。清晰轻量的产品逻辑,会减少用户的负担感,从而提高交互上的效率和愉悦感。
分析Material Design,会发现Google归纳了两类复杂内容信息的层级关系,分别是Card和Tile(List
以及其他相似定义属于同类的内容信息层级),其他定义多用于UI结构及细节。其中,Google定义Card是一种多功能信息的聚合入口,信息层级应较
高,体现在Z轴应高于其他信息,视觉上有阴影表现并加以圆角处理。而tile(或同类信息列表)则是(同类或相关)信息的模块展现,信息层级应较低,体现
在Z轴应略低于其他信息,视觉上应无阴影表现不加圆角处理。其结果是从视觉层面让产品对象更高效、更简单,同时也更具物理世界的“真实感”。
最近接手的项目是Gekeccom的全站改版。Gekec(革客)是Geek和Maker交集,喜欢革新,喜欢技术范儿、新潮的科技消费品,喜欢
自己动手创造产品,Gekeccom也就是这类人的聚集地,整个产品囊括电商、资讯(或h5宣传)、拆机、以及社区讨论等各种功能,改版前逻辑复杂,功
能繁多。改版开始之初,笔者了解到革客群体时,便认为理性加浓重Geek味道的Google风格或许是最适合Gekeccom的视觉体系,然而复杂的产
品逻辑不能给用户带来高效的交互体验和愉悦的使用感受,视觉上也并不能很好的通过Material
Design推演并且变化,所以梳理出清晰、轻量且方便视觉统一的产品逻辑成为第一任务。
Gekeccom的产品全功能在此并不赘述,Product Feature全部为达成宜家式的体验式设计,经过梳理可以归纳成三层,首层为体验层(多入口的首页封面)、第二层为货架层(包括商城模块、拆机模块、体验模块)、第三层为详细、 *** 作层;
如上图,轻量的产品结构即可方便设计的推演。例如其中第一层可以通过H5灵活排版做产品全方位体验,第二层与第三层的关系即可利用Material
Card和Tile表现。Card表达了全部信息的聚合和入口,tile则表现同类信息的罗列。从card跳转到最终页应有一种卡片展开的体验。
二、适宜UI推演的响应办法
在产品逻辑清晰简洁的基础上,一套适宜Material Design变化的全尺寸响应办法就成为复杂响应式网页设计的核心内容,响应办法能够直接决定功能模块的响应逻辑以及UI的变化。实际 *** 作中,响应办法的确定主要就是确定栅格和占比。
1)栅格
网页栅格系统是从平面栅格系统中发展而来。对于网页设计来说,栅格系统的使用,不仅可以让网页的信息呈现更加美观易读,更具可用性。而且,对于前端
开发来说,网页将更加的灵活与规范。栅格系统的具体含义以及使用方法在此不再赘述,感兴趣的朋友可以参考淘宝UED的一些文章:
网页栅格系统研究(1):960的秘密
网页栅格系统研究(2):蛋糕的切法
网页栅格系统研究(3):粒度问题
网页栅格系统研究(4):技术实现
在Gekeccom的项目中,经历产品功能模块的梳理,笔者使用了12栅格系统,目的是能够满足2、3、4、6的页面等分。注:具体栅格系统的建立应因产品和设计所决定,栅格系统并不是万能的,而确定的栅格系统可以为整个响应式设计做规范性参考。
2)占比
A占比
如上文说,12栅格约束网页的内容区,而网页的内容往往并不占据屏幕的全部宽度,而是在两侧留有间隙,营造空间感。由于屏幕的限制,这种空间感在移动端设备显得更加重要,如图,然而强加固定的margin pixel会使得12栅格占比不定,难以控制设计效果。
所以占比应是12栅格宽度对应屏幕的比值,即:
12栅格宽度X占比=屏幕宽(临界点)
优秀而巧妙的占比确定可以让网页设计呈现在各个主流屏幕上均是100%像素。
这里简单解释一下,若一个200px宽的元素在1200px宽的屏幕上,其占比为1667%,同样的逻辑,到1024px的屏幕上这个占比
1667%的元素即占据了17067px,这样的情况下,某一个物理像素无法占据100%,在完美主义的设计师眼里,是无法接受的事情。而巧妙的占
比,可以让元素在各个主流屏幕占据100%像素,完美展现设计意图。
B临界点
临界点(breakpoint)是指响应式网页发生布局变化的关键点,如“当屏幕宽度小于480px时加载样式,当宽度在480px-
600px之间时加载…样式”。响应式网页理论上有无数种尺寸,我们不可能也没有必要为每个尺寸都去做设计,需要做的是选定几个临界点做设计,在两个临界
点之间是延续上一个临界点的布局。
临界点确认总体目的就是为了保证页面在手机(屏幕很小)、平板(屏幕中等)、PC(屏幕大)上加载相应的样式,然而经验较少的设计师往往会苦恼一个
问题,那就是高像素的手机屏幕和低像素的平板屏幕应如何处理。例如设计师会担心1080p的手机加载大屏幕页面,或者720p的平板加载小屏幕页面。
但需要注意的是,响应式网页不同于APP的屏幕适配。网页是沉浸于浏览器的产品,浏览器所启动的屏幕像素才可以被认为是临界点的参考点,为此,笔者
做了一些测试,如下表,可以看出不少1080p手机在浏览器中仅启动360px,而神奇的ipad无论是不是retina屏幕,无论是不是mini,均显
示1024x768px 。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)