Java架构架构社区分布式&高可用

这是我看过关于微服务架构最好的一篇文章,没有之一

2018-07-23  本文已影响167人  Java架构

原文转自一线互联网资深架构师,微服务布道师小马哥的原创文章

微服务是什么?

微服务是一种细粒度(Fine-Grain)的SOA

或许在座的高朋了解过其概念。个人认为,与其说微服务是一种技术,不如将其定义为一种架构,而架构则是“技”的实现与“术”的策略相辅相成。“术”的策略需要分析使用场景,进行合理地划分业务边界,实现“业以类聚”,然而“技”的实现则通过特定的技术在实现业务逻辑之时,更多的考虑实现过程中的效率性、测试的便利性、维护的可持续性,达到“技以群分”的目的。

由此而论,我个人偏好将其定义为:“微服务是一种细粒度的SOA”。

这样定义的好处在于,没必要去重复地“抹黑”“单体应用”(Monolithic,也有人翻译成“巨石应用”),缘于SOA技术的衍化过程中早已提及。那么,细粒度更多的体现在“取其精华,去其糟粕”。

SOA又是什么?

**SOA = Service-Oriented Architecture**

SOA 中文定义是面向服务架构,它并非是今日的重点,请原谅我不能花大篇幅来加以阐述。我用“点到为止”的方式描述SOA具备哪些特征,以及相关的技术。

SOA有什么?

特征

技术

SOA不是什么?

SOA ≠ Monolithic

SOA 不但不是Monolithic,而且是要解决Monolithic,Monolithic 个人偏好翻译成“单体应用”,也被翻译成“巨石应用”。

Monolithic是什么?

[![这是我](https://img.haomeiwen.com/i9005929/f856b463b08051ed?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)](http://mmbiz.qpic.cn/mmbiz_png/rVKYDsmJuM0ia58YDDa9DT2KwDsM06Crx7WBicY9RmJaV7oW4dBtviaj4XiaRamnLCmlUUibMZ52zRms9lRaM5ricy8w/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1) 

故宫

朋友可能觉得奇怪,故宫与“单体应用”有什么关系?故宫是帝王居住和办公的场所,她象征着“最高权利”和“中央集权”。华夏民族,自秦朝的“三公九卿制”,还是隋朝的“三省六部制”,以及明清的“内阁制度”,无一例外地致力于巩固“中央集权”。

近两千年来,虽然王朝不断更迭,这个制度一直被沿用,并且没有出现大的诟病。可是,1793年,英国勋爵马戛尔尼出使中国,代表英皇为乾隆皇帝祝寿,也负有促成中英通商的使命。虽然当时的中国笼罩在“乾隆盛世”的光环下,不过在马戛尔尼看来中国无论从科技还是社会制度上,均处于相对落后的阶段。《左传》有言:“民之多幸,国之不幸”,当时的大多数国民视英国为“蛮夷”,不与商贸往来。五十年后,中英鸦片战争爆发,1840年,中华帝国第一个不平等条约《南京条约》被迫签订,它不但打击中华名族,而且“打醒”了大和民族。明治维新后的日本,屡屡挑战中国的东亚地位,直到中日甲午战争失利。1895年《马关条约》签订,割台湾,赔巨款。但仍有康有为等不愿放弃,联名千人“公车上书”,认为“中央集权”并不是问题所在。“中央集权”职责臃肿,行政不力,中央政策想要对地方面面俱到是不可能的,无法做到“因地制宜”。

我想说的是,单体应用不正像一个“中央集权”的政府吗?而微服务应用则更像“多权分立”的“自治”政府,各个“自治”政府之间在“联邦”的架构下“分工”和“协作”。 

Why?

“学而不思则罔”

为什么要微服务?

为什么不必微服务?

论语有言:“子绝四:‘毋意、毋必、毋固、毋我’。”,简单地说,不要臆断,不要固执,不要自我感觉良好,也有什么是必定的。那么,在微服务实践过程中,哪些因素可以不必微服务呢?请注意用词,这里说的是“不必”,不是“不要”。 

进阶阅读

网络

http://microservices.io/

http://martinfowler.com/articles/microservices.html

书籍

《Microservice Architecture》, Irakli Nadareishvili

文稿

《2016.11.19 微服务实践之路(厦门) 演讲稿》 , 小马哥 (本微信公众号内)

以上推荐的网络资源以及书籍可能大家已阅,不过我主要是推荐我上月去厦门的演讲稿,之所以把它放在最后,目的确实想突出,“后其身而身先”(老子)嘛。: D

How

前面提到的部分是“What”和“Why”,接下来,进入“How”的部分,顾名思义,就是怎么做,如何做的意思。

“多见阙殆,慎行其余”

以上两句处于孔子的学生子张请教孔子关于如何干好工,孔子的回答是:“多闻阙疑,慎言其余,则寡尤。多见阙殆,慎行其余,则寡悔。言寡尤,行寡悔,禄在其中矣”。儒家经典总在告诫我们,言行需谨慎,如临深渊、如履薄冰,战战兢兢。个人认为将此等思想放诸四海而皆准,在微服务的实践过程中,同样需要谨慎因应。

怎么实现微服务

怎么样实现微服务,我想从以下三个方面来说明:

心态

**技术 **

技术上,在阿里微服务的实践过程中也不能免俗,基本上也是以下三个套路:

Docker

在阿里巴巴集团技术体系中,自行研发与Docker兼容的AliDocker,并且提供了一些其他能力和辅助工具。本人相对这块不是特别熟悉,与我的同事一同讨论和交流,这里只能做一些简单地介绍。

如何一起学习,有没有免费资料?

对Java技术,架构技术感兴趣的同学,欢迎加QQ群619881427,一起学习,相互讨论。

群内已经有小伙伴将知识体系整理好(源码,笔记,PPT,学习视频),欢迎加群免费领取。

分享给喜欢Java,喜欢编程,有梦想成为架构师的程序员们,希望能够帮助到你们。

不是Java程序员也没关系,帮忙转发给更多朋友!谢谢。

DDD

DDD是Domain Driven Design(领域驱动设计)的简写,该技术源于Eric Evans 在其名著《Domain Driven Design》。从年代来看,已是相当老的设计方法论了。它作为微服务重要的理论依据,如今又如“凤凰涅槃”一般,重新进入软件领域的视野。DDD的三大实施策略在具体微服务实践过程中,取二舍一。当然,整个DDD的理论并不限于此,个人理解,DDD好像是一个传说,大家都听说过,但是谁也没有见到过。而是实现这种理想就如同乌托邦式的“共产主义”,目前仍未到时候。

Middleware

中间件是微服务实施过程中不可或缺的一个环节,实现中间件的编程语言可以任意,不过目前市场上最为流行还属Java。经刚才粗略的统计,在座的朋友们从事Java居多,本人恰好也相对熟悉这个领域。接下来,我们一同来探讨,Java 中间件在微服务实践过程中的措施。由于时间的关系,无法做到一一列举,因此,以下每个小节均有实例说明。

Spring

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

Annotation驱动方式

在Spring 3.1 以及更好的版本中,提供了大量的Annotation作为XML配置的替代一下方式(现场统计,基本上没有人知道这种方式):

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

XML配置方式

工程人员相对XML的方式更为熟悉,以上XML配置了是Spring WebMVC的一些组件Bean。实际上,除了@EnableWebMvc以外,还提供了很多@EnableXXX的替代方式,例如@EnableAsync、@EnableAspectJAutoProxy等。在实施过程中,很多开发人员错误的认为这些是Spring Boot的带来的便利,其实不然。

Spring Boot

在Spring Boot 推广实施过程中,除了以上Annotation重构方式以外,我想在前端渲染引擎选型评估方面谈谈自己的心得和体会,建议大家时刻保持怀疑的态度,一家之言,仅供参考。

Thymeleaf(Spring 推荐)

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

Thymeleaf 模板页面

Velocity(广泛应用)

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

常规Velocity模板

Velocity宏(Marco)

Velocity 指令(Directive)

** JSP(Java EE标准)**

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1 Spring Boot 官方文档说明
Spring Boot 部分点到为止,会后可以进一步交流,接下来,进入Spring Cloud的部分。

Spring Cloud

Spring Cloud 官方提供了基本功能描述,其中包括:分布式/版本化配置(Distributed/versioned configuration)、注册与发现(Registry and Discovery)、路由(Routing)、服务调用(Service-to-service calls)、负载均衡(Load balancing)、短路( Circuit Break )以及分布式消息(Distributed messaging)。技术点不少,这里我选取了分布式配置为例。详细描述,我已在《2016.11.19 微服务实践之路(厦门) 演讲稿》(本微信公众号内)中提到,请大家会后参考。 

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

部分实现逻辑

具体使用则是通过@Value的方式获取配置内容中的Property,将其关联到对象字段中,如下图:

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1 字段与配置项映射代码
在ArchimedesProperties上方,有一个@RefreshScope的注解,这个注解的用途是通知 Spring Cloud,如果配置项发生变更后,变更后的属性值将会同步到对象的字段值上。

下一张图所示,配置内容监听器的实现,符合现代Annotation 驱动的方式,将配置项的内容转化成需要的类型:

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

监听配置内容类型装换

Spring Cloud 部分完结,下一个环节进入 Spring Cloud Stream。

Spring Cloud Stream

在Martin Fowler的名著《Enterprise Integration Patterns》(企业整合模式 )中提到过(Channel)的概念,Spring Cloud Stream 付诸于实践,提供抽象实现。这种抽象实现的好处在于对应用透明,应用不再强制绑定在某种具体技术上,对它而言,Spring Cloud Stream 为其建立管道(Channel),其中有两个概念被涉及:Source(发送端)和Sink(接收端)。

类似于 Kafka 消息中间件,Alibaba 也自主研发了一套Message Queue,名叫 MetaQ ,早一阵子提交到开源社区 Apache 上,与 Kalfa 为同级的项目,很了不起。无论是 Kafka 还是 MetaQ 都有自带的API,为了增加应用依赖透明性,针对 MetaQ 做了Spring Cloud Stream 的适配,如下图所示:

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

Source(发送端)发送消息实例代码

Source(发送端)发送消息实例代码:

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

Sink(接收器)消费消息实例代码

以上代码相当简单,与JMS中的消息订阅模式类似。

前面三小节均为实现部分,最后一个技术小节,继续讨论一下针对 Spring Boot 的 DevOps。

Spring Boot DevOps

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

Archimedes整体架构图

每个微服务应用均有一个应用名,通过接入 Eureka Client ,向注册中心 Eureka Server 注册。Eureka Server保存所有注册应用的信息,这些信息被 Archimedes 通过Eureka Client 提供 REST 接口获取,将获取的应用列表并发地获取他们的Endpoint 和 Metrics信息。同时 Archimedes 也提供了REST API 接口,暴露应用元信息给 Archimedes Dashboard 提供页面展示。将需要的Metrics信息存放时序数据库,比如OpenTSDB。再通过OpenTSDB的HTTP API进行查询,最后将查询结果显示在监控页面中。

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

单实例线程总数时序图

下图所示,其功能类似于JStack,将具体线程运行的状态以及堆栈详细列出:

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

活动线程堆栈信息

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

整体内存使用情况以及垃圾回收

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

垃圾回收前后对比

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

内存池使用详情

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

log4j 日志调控

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

Logback 日志调控

Archimedes 中会自动识别应用所使用的日志框架,虽然不推荐一个应用中使用多套日志框架,可是现实情况不得不一并思考,比如有些二方jar包中存在的独立的日志处理。

思想

聊完了技术,下面来谈谈思想方面的实现,我总结为三大点:

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1

朋友们,你们怎么看?
如何一起学习,有没有免费资料?

对Java技术,架构技术感兴趣的同学,欢迎加QQ群619881427,一起学习,相互讨论。

群内已经有小伙伴将知识体系整理好(源码,笔记,PPT,学习视频),欢迎加群免费领取。

分享给喜欢Java,喜欢编程,有梦想成为架构师的程序员们,希望能够帮助到你们。

不是Java程序员也没关系,帮忙转发给更多朋友!谢谢。

上一篇 下一篇

猜你喜欢

热点阅读