那么你想学习微服务吗?
目录
做好准备,接下来是一大堆文字。微服务架构是一个永无止境的故事。我花了几年时间收集了这么多关于微服务的资源。现在将这些学习资源分享给你。你也可以在这里找到:https://kgoralski.gitbook.io/wiki/microservices
我接触这类架构越多,就越觉得它们更注重人,而非技术。实际上,“微服务解决了组织问题,却带来了技术问题”。它们当然不是免费的午餐。
我在大型组织中看到的不是局部现象,而是人与人之间互动的模式,因此也是系统之间互动的模式。人际沟通的边界就是系统边界。
所有荣誉均归于参考文献中的作者。
目录
- 定义
- 单体架构 vs 微服务架构
- 打破整体架构
- 模式
- 分布式计算的谬误
- 微服务关注点
- 微服务的十诫
- 微服务和团队
- 微服务应该围绕业务能力和领域进行组织
- 反应式编程和微服务
- 微服务解决了组织问题并引发了技术问题
- 内部沟通和 REST 与消息传递
- 微服务反模式和陷阱
- 微服务故事
- 参考
定义
Adrian Cockcroft (Amazon) 撰写的“由具有有界上下文的松散耦合元素组成的面向服务的架构”
康威定律指出,设计系统的组织必然会复制这些组织的沟通结构[...] 组织结构图最初反映的是第一个系统设计,而这几乎肯定不是正确的[...] 随着学习的深入,人们会改变设计[...]。管理结构也需要随着系统的变化而改变...]
必读:
- https://martinfowler.com/bliki/MicroservicePrerequisites.html
- https://martinfowler.com/articles/microservices.html
- https://martinfowler.com/microservices/
- https://martinfowler.com/articles/microservice-trade-offs.html
- https://martinfowler.com/articles/break-monolith-into-microservices.html
- https://martinfowler.com/bliki/MonolithFirst.html
- http://www.neverletdown.net/2015/05/introduction-to-microservices.html
- https://www.slideshare.net/adriancockcroft/dockercon-state-of-the-art-in-microservices
- https://github.com/mfornos/awesome-microservices#theory
- https://github.com/theanalyst/awesome-distributed-systems
- https://www.infoq.com/presentations/google-microservices
- 书籍:Martin Kleppmann,《设计数据密集型应用程序:可靠、可扩展和可维护系统背后的伟大理念》
单体架构 vs 微服务架构
整体式优势
- 单一(分层)架构
- 单一技术栈
- 由多个团队维护的单一代码库
捍卫巨石https://docs.google.com/spreadsheets/d/1vjnjAII_8TZBv2XhFHra7kEQzQpOHSZpFIWDjynYYf0/edit#gid=0
整体式架构的缺点
- 所有部分都是相互关联的
- 许多其他系统连接到您的系统
- 难以改变,难以维持
- 发布间隔较长,从而增加了风险
- 创新缓慢
- 难以转向新技术
- 扩展性不太好
微服务承诺
作者:“设计和构建微服务架构。通往天堂的阶梯还是通往地狱的高速公路?” - Sander Hoogendoorn
微服务。但是……
- 微服务到底是什么?
- 微服务有多小?https://youtu.be/YQp85GzoxqA?t =2m48s
- 微服务世界中的要求
- 组件或服务
- 谁拥有微服务?
- 您使用什么技术?
- 您应用什么协议?
- 如何定义消息
- 如何测试微服务
- 业务服务跨组件运行时如何协调?
- 如何构建部署管道?
参考:
- https://www.slideshare.net/aahoogendoorn/designing-and-building-a-microservices-architecture-stairway-to-heaven-or-a-highway-to-hell
- https://www.martinfowler.com/microservices/#when
- https://www.slideshare.net/aahoogendoorn/designing-and-building-a-microservices-architecture-stairway-to-heaven-or-a-highway-to-hell
- https://martinfowler.com/articles/microservice-trade-offs.html
- https://martinfowler.com/bliki/MicroservicePrerequisites.html
- https://martinfowler.com/bliki/MonolithFirst.html
- https://thenewstack.io/ten-commandments-microservices/
- https://threedots.tech/post/microservices-or-monolith-its-detail/
打破整体架构
可以帮助你做到这一点的模式(查看下一部分):API 网关、前端后端、Strangler、反腐败层、Sidecar、Ambassador
- https://martinfowler.com/articles/break-monolith-into-microservices.html
- https://www.nginx.com/blog/refactoring-a-monolith-into-microservices/
- https://www.dynatrace.com/news/blog/breaking-the-monolith-an-8-step-recipe/
- https://www.dynatrace.com/news/blog/fearless-monolith-to-microservices-migration-a-guided-journey/
- https://techbeacon.com/how-break-apart-monolith-without-destroying-your-team
- https://medium.com/weebly-engineering/how-to-organize-your-monolith-before-breaking-it-into-services-69cbdb9248b0
- https://www.appcelerator.com/blog/2018/01/5-strategies-for-making-the-switch-from-monolith-to-microservices/
- http://enos.itcollege.ee/~jpoial/allalaadimised/reading/microservicesguide-2017.pdf
模式
- https://docs.microsoft.com/en-us/azure/architecture/microservices/design/patterns
- https://microservices.io/patterns/index.html
- https://hackernoon.com/learning-these-5-microservice-patterns-will-make-you-a-better-engineer-52fc779c470a
- https://medium.com/@madhukaudantha/microservice-architecture-and-design-patterns-for-microservices-e0e5013fd58a
- https://docs.microsoft.com/en-us/dotnet/architecture/microservices/architect-microservice-container-applications/direct-client-to-microservice-communication-versus-the-api-gateway-pattern
分布式计算的谬误
分布式计算的谬论是 Sun Microsystems 的 L Peter Deutsch 和其他人的一组断言,描述了刚接触分布式应用程序的程序员不可避免地会做出的错误假设。
谬误
基本上每个人在首次构建分布式应用程序时,都会做出以下八个假设。从长远来看,这些假设都被证明是错误的,并且会带来巨大的麻烦和痛苦的学习经历。——Peter Deutsch
- 网络可靠。
- 延迟为零。
- 带宽是无限的。
- 网络是安全的。
- 拓扑结构没有改变。
- 有一名管理员。
- 运输成本为零。
- 网络是同质的。因此,如果忽略了其中一个方面,设计就会很糟糕。
谬误的影响
- 软件应用程序在编写时几乎没有针对网络错误的处理机制。在网络中断期间,此类应用程序可能会停滞或无限期地等待应答数据包,从而永久消耗内存或其他资源。当故障网络恢复正常时,这些应用程序也可能无法重试任何停滞的操作,或者需要(手动)重启。
- 由于忽视网络延迟及其可能导致的数据包丢失,导致应用程序和传输层开发人员允许无限制的流量,从而大大增加丢包率并浪费带宽。
- 流量发送方对带宽限制的忽视可能会导致瓶颈。
- 对网络安全的自满会导致恶意用户和不断适应安全措施的程序的欺骗。
- 网络拓扑的变化会对带宽和延迟问题产生影响,因此可能会出现类似的问题。
- 多个管理员,就像竞争对手公司的子网一样,可能会制定相互冲突的政策,网络流量的发送者必须了解这些政策才能完成其所需的路径。
- 建立和维护网络或子网的“隐性”成本是不可忽略的,因此必须在预算中注明,以避免出现巨大的缺口。
- 如果一个系统假设一个同质网络,那么它可能会导致与前三个谬误相同的问题。
参考:
- https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing
- http://principles-wiki.net/principles:fallacies_of_distributed_computing
- https://www.youtube.com/watch?v=yxZm0Fhn9Tk
微服务关注点
- 配置管理
- 服务发现和负载均衡
- 弹性和容错
- API管理
- 服务安全
- 集中式日志记录
- 分布式追踪
- 调度与部署
- 自动扩展和自我修复
- 服务网格
参考:
- https://developers.redhat.com/blog/2016/12/09/spring-cloud-for-microservices-compared-to-kubernetes/
- https://12factor.net
- https://dzone.com/articles/what-are-concerns-about-microservices
- https://martinfowler.com/articles/microservice-trade-offs.html
- https://www.martinfowler.com/microservices/#when
- https://www.slideshare.net/aahoogendoorn/designing-and-building-a-microservices-architecture-stairway-to-heaven-or-a-highway-to-hell
- https://martinfowler.com/articles/microservice-trade-offs.html
- https://martinfowler.com/bliki/MicroservicePrerequisites.html
- https://martinfowler.com/bliki/MonolithFirst.html
- https://dwmkerr.com/the-death-of-microservice-madness-in-2018/
- https://www.infoq.com/articles/seven-uservices-antipatterns
- https://stackify.com/communication-microservices-avoid-common-problems/
- https://www.oreilly.com/library/view/microservices-antipatterns-and/9781492042716/
- 使用 Kubernetes 和 Istio 在云端实现微服务(Google I/O '18)
- https://docs.microsoft.com/en-us/azure/architecture/guide/architecture-styles/microservices
微服务的十诫
- 无状态服务和有状态服务的清晰分离
- 不要共享库或 SDK(依赖关系会害死你)
- 避免主机亲和性
- 专注于服务,牢记一项任务
- 使用轻量级消息协议进行通信
- 设计明确的入口点和出口点
- 实施自我注册和发现机制
- 明确检查规则和约束
- 更喜欢多语言而不是单栈(我们真的需要吗?)
- 维护独立的修订和构建环境
https://thenewstack.io/ten-commandments-microservices/
微服务和团队
(再次)“康威定律指出,设计系统的组织受限于复制这些组织的沟通结构[...]组织结构图最初反映的是第一个系统设计,而这几乎肯定不是正确的[...]随着学习的深入,人们会改变设计[...]。管理结构也需要随着系统的变化而改变……”
“逆康威策略”建议改进你的团队和组织结构,以促进你期望的架构发展。理想情况下,你的技术架构应该与业务架构同构。https ://www.thoughtworks.com/radar/techniques/inverse-conway-maneuver
- https://martinfowler.com/articles/microservices.html#OrganizedAroundBusinessCapabilities
- https://www.nginx.com/blog/adopting-microservices-at-netflix-lessons-for-team-and-process-design/
- https://techbeacon.com/want-develop-great-microservices-reorganize-your-team
- https://dzone.com/articles/microservices-and-team-organization
- https://opensource.com/article/18/8/microservices-team-challenges
- https://www.slideshare.net/ConfluentInc/microservices-in-the-apache-kafka-ecosystem
微服务应该围绕业务能力和领域进行组织
- https://martinfowler.com/articles/microservices.html#OrganizedAroundBusinessCapabilities
- https://martinfowler.com/bliki/BoundedContext.html
- https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/microservice-ddd-cqrs-patterns/ddd-directional-microservice
- http://www.infoq.com/resource/minibooks/domain-driven-design-quickly/en/pdf/DomainDrivenDesignQuicklyOnline.pdf
- https://blog.pragmatists.com/refactoring-from-anemic-model-to-ddd-880d3dd3d45f
- https://jakubn.gitlab.io/keepitclean/#1
- http://tidyjava.com/hexagonal-architecture-powerful/
反应式编程和微服务
反应系统包括:
- 响应式
- 有弹性的
- 松紧带
- 消息驱动
驱动因素是高效的资源利用,换句话说,就是在服务器和数据中心上花费更少的钱。Reactive 的承诺是让你用更少的资源做更多的事情,具体来说,你可以用更少的线程处理更高的负载。这就是 Reactive 与非阻塞异步 I/O 的结合点所在。
Jonas Boner 认为:“微服务的响应式本质:异步通信、隔离性、自治性、单一职责、独占状态和移动性。这些是微服务的核心特征。”
- https://www.reactivemanifesto.org/
- http://heidloff.net/article/introduction-reactive-microservices
- https://www.oreilly.com/ideas/what-is-a-reactive-microservice
- https://gist.github.com/staltz/868e7e9bc2a7b8c1f754 - 你一直缺少的反应式编程简介
- https://spring.io/blog/2016/06/07/notes-on-reactive-programming-part-i-the-reactive-landscape
- http://rxmarbles.com/
- https://vimeo.com/233798451 - HTTP 客户端:分布式系统的无声英雄
- https://www.youtube.com/watch?v=QfpCF_Eo4V0 - 默认异步,必要时同步
- http://jonasboner.com/bla-bla-microservices-bla-bla/
微服务解决了组织问题并引发了技术问题
来自 Go + 微服务 = Go Kit [I] - Peter Bourgon,Go Kit
https://youtu.be/NX0sHF8ZZgw?t=729
解决的问题、引发的问题、吸取的教训
灵感来自“Peter Bourgon - Go + 微服务 = Go Kit” https://www.youtube.com/watch?v=JXEjAwNWays
问题解决
- 团队规模过大,无法在共享代码库上有效工作
- 团队被其他团队阻止 — 无法取得进展
- 通信开销太大
- 速度停滞
- 赋予技术更多自由和替换能力
- 不同时区的团队
- 可扩展性和一些技术问题
造成的问题
- 需要明确定义的业务领域才能提供稳定的 API
- 如何使其解耦?
- 不再共享数据库——分布式事务?
- 测试变得非常困难(有人会遇到混乱的猴子吗?)
- 需要开发/运维文化:开发人员部署并运维他们的工作
- 作业(服务)调度 — 手动工作,一段时间内……
- 可寻址性,即服务发现
- 监控和仪表 — tail -f?Nagios 和 New Relic?
- 分布式追踪?
- 您的 SLA?
- 审计?
- 生产数据库快照
- 代码重用
经验教训
- 分布式系统很难实现
- 进化架构!
- 微服务正在改变组织
- 需要 Devops/SysOps 技能,需要高水平自动化
- 只是另一个复杂程度
- 始终检查你的框架是否已经解决了你的问题
- 代码重用可能很难(或者你只是不想这样做)
- 异步通信/事件源可能有助于解耦
- 配置/发现应该从第一天就存在吗?
- 每个微服务一个团队?
- 进入 Micro 之前请三思
- 微服务解决了组织问题,却引发了技术问题
- 业务需求未知,Micro难以管理,正确的分割线在哪里?
- 使用开源软件是可行的方法吗?
- 先从微服务开始?先单体应用,再微服务
- 软件公司 - 不确定他们是否有可能做这样的事情 - 上市时间?
- 一个团队和微服务? - 不。
- 创建分布式单体应用很容易
- 默认情况下的“分布式”工具也很难
- 注定失败
通过错误的决策,你可以开发出:Kelsey Hightower 的“分布式单体应用程序:一个伪装成微服务集合的单体应用程序,使用 JSON 拼接在一起,同时写入单个数据库”
参考
内部沟通和 REST 与消息传递
微服务之间的通信需要基于异步消息传递(而每个微服务内部的逻辑则以同步方式执行)。如前所述,为了在时间上(允许并发)和空间上(允许分布和移动)解耦服务及其通信流,服务之间必须存在异步边界。如果没有这种解耦,就不可能达到隔离和弹性所需的隔离和包容级别。
异步非阻塞执行和IO通常通过更高效地利用资源来提高成本效益。它有助于最大限度地减少系统中共享资源的争用(拥塞),而争用(拥塞)是实现可扩展性、低延迟和高吞吐量的最大障碍之一。
Jonas Boner 认为,“同步 HTTP 被广泛视为首选的微服务通信协议,这很不幸。它的同步特性会导致服务间强耦合,使其成为非常糟糕的服务间通信默认协议。”
- https://dev.to/matteojoliveau/microservices-communications-why-you-should-switch-to-message-queues--48ia
- http://engineering.linkedin.com/distributed-systems/log-what-every-software-engineer-should-know-about-real-time-datas-unifying
- https://www.oreilly.com/ideas/what-is-a-reactive-microservice
- https://solace.com/blog/products-tech/experience-awesomeness-event-driven-microservices
- https://solace.com/blog/messaging-between-microservices
- https://www.slideshare.net/ewolff/rest-vs-messaging-for-microservices
- https://www.slideshare.net/ConfluentInc/microservices-in-the-apache-kafka-ecosystem
- https://techbeacon.com/what-apache-kafka-why-it-so-popular-should-you-use-it
- https://github.com/vaquarkhan/vaquarkhan/wiki/CQRS-and-Event-Sourcing-in-Java-with-Spring-Framework
- https://blog.codecentric.de/en/2016/04/event-driven-microservices-spring-cloud-stream/
- https://martinfowler.com/eaaDev/EventSourcing.html
- https://capgemini.github.io/architecture/is-rest-best-microservices/
- https://softwaremill.com/mqperf/
- https://softwareengineering.stackexchange.com/questions/339817/should-services-talk-directly-to-each-other-in-a-microservice-architecture
- https://container-solutions.com/argument-rest-microservices/
- http://jonasboner.com/bla-bla-microservices-bla-bla/
- https://medium.com/@diogo.lucas/communication-patterns-in-a-microservice-world-af07192b12d3
- https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/architect-microservice-container-applications/communication-in-microservice-architecture
- https://github.com/dotnet/docs/blob/master/docs/standard/microservices-architecture/architect-microservice-container-applications/communication-in-microservice-architecture.md
- https://www.infoq.com/news/2018/03/events-distributed-systems
- https://github.com/kgoralski/personal-wiki-and-learning-resources/blob/master/kafka.md#apache-kafka-and-microservices
- https://www.confluent.io/solutions/microservices/
- https://www.confluent.io/blog/building-a-microservices-ecosystem-with-kafka-streams-and-ksql/
微服务反模式和陷阱
微服务常见错误:
- 低估构建分布式系统的难度
- 错误的服务边界——不是基于业务领域
- 缺乏业务一致性——微服务需要提供明确的业务价值,因此我们需要与业务部门紧密合作
- 缺乏代码模块化(或缺乏通用闭包原则)
- 服务之间共享数据或共享数据库
- 共享“公共”依赖项——共享代码片段需要同时更新多个服务
- 忘记分布式计算的谬误
- 将服务视为编程语言级模块/时间耦合
- 忘记康威定律和缺乏明确的所有权
- 级联故障和缺乏针对故障的设计(断路器、重试等)以及错误淹没其他服务
- 一切都是 RESTful、聊天式微服务,并且缺乏异步通信
- 缺乏 API 兼容性/版本控制
- 缺乏基础设施/平台自动化、监控、跟踪和适当的日志记录
- 缺乏幂等性
- 缺乏服务发现、API 网关和编排
- 尝试用 ACID 代替 BASE 来做所有事情(CAP 定理)
- 不关心资源利用率
- 测试数量少,缺乏验收测试
- 试图同时做所有事情
- 以微服务为目标——它们是针对特定问题的解决方案,而不是目标。
-
炒作和过于乐观
-
http://highscalability.com/blog/2015/8/3/seven-of-the-nastiest-anti-patterns-in-microservices.html
-
https://container-solutions.com/the-seven-deadly-sins-of-microservices-redux/
-
https://opencredo.com/microservices-anti-patterns-its-all-about-the-people/
-
https://blog.appdynamics.com/engineering/how-to-avoid-antipatterns-with-microservices/
-
https://www.oreilly.com/library/view/microservices-antipatterns-and/9781492042716/
-
http://www.michaelnygard.com/blog/2017/12/the-entity-service-antipattern/
-
https://medium.com/walmartlabs/avoiding-pitfalls-in-microservice-architecture-ba038340f8c1
-
http://chrisrichardson.net/post/antipatterns/2019/01/28/melbourne-microservices.html
-
https://messente.com/blog/most-recent/5-mistakes-transition-to-microservices
-
https://walkingtree.tech/7-common-pitfalls-avoid-migrating-microservices/
-
Mateusz Gajewski 的陷阱https://www.youtube.com/watch?v=yxZm0Fhn9Tk
微服务故事
Netflix
- https://www.nginx.com/blog/adopting-microservices-at-netflix-lessons-for-team-and-process-design/
- https://medium.com/refraction-tech-everything/how-netflix-works-the-hugely-simplified-complex-stuff-that-happens-every-time-you-hit-play-3a40c9be254b
- https://www.infoq.com/news/2019/01/netflix-evolution-architecture/
亚马逊
https://www.slideshare.net/adriancockcroft/microservices-workshop-craft-conference
eBay 和 Google
- https://www.slideshare.net/RandyShoup/from-monolith-to-microservices-craftconf-2015 https://www.slideshare.net/kasun04/microservices-at-ebay
- http://highscalability.com/blog/2015/12/1/deep-lessons-from-google-and-ebay-on-building-ecosystems-of.html
- https://www.infoq.com/presentations/google-microservices/
领英
- https://www.infoq.com/presentations/linkedin-microservices-urn/
- https://www.slideshare.net/InfoQ/from-a-monolith-to-microservices-rest-the-evolution-of-linkedins-service-architecture
- https://engineering.linkedin.com/architecture/brief-history-scaling-linkedin
叽叽喳喳
- http://highscalability.com/blog/2013/7/8/the-architecture-twitter-uses-to-deal-with-150m-active-users.html
- https://www.infoq.com/articles/twitter-java-use/
- https://blog.twitter.com/engineering/en_us/topics/infrastructure/2017/the-infrastructure-behind-twitter-scale.html
- http://highscalability.com/scaling-twitter-making-twitter-10000-percent-faster
扎兰多
- https://jobs.zalando.com/tech/blog/jimmy-to-microservices-the-journey-one-year-later/?gh_src=4n3gxh1
- https://www.infoq.com/news/2016/02/Monolith-Microservices-Zalando/
Spotify https://www.kevingoldsmith.com/talks/microservices-at-spotify.html
百思买https://blog.runscope.com/posts/monolith-microservices-transforming-real-world-ecommerce-platform-using-strangler-pattern
Wix https://stackshare.io/wix/scaling-wix-to-60m-users-from-monolith-to-microservices
Airbnb https://thenewstack.io/airbnbs-10-takeaways-moving-microservices/
Tumblr http://highscalability.com/blog/2012/2/13/tumblr-architecture-15-billion-page-views-a-month-and-harder.html
沃尔玛https://www.slideshare.net/kvnwbbr/revitalizing-walmarts-aging-architecture-for-web-scale
参考
- https://www.martinfowler.com/microservices
- https://github.com/mfornos/awesome-microservices
- https://github.com/theanalyst/awesome-distributed-systems
- https://www.vinaysahni.com/best-practices-for-building-a-microservice-architecture
- https://github.com/katopz/best-practices/blob/master/best-practices-for-building-a-microservice-architecture.md
- https://youtu.be/YQp85GzoxqA?t=2m48s微服务——可维护性的赤裸真相
- https://www.slideshare.net/aahoogendoorn/designing-and-building-a-microservices-architecture-stairway-to-heaven-or-a-highway-to-hell
- http://www.infoq.com/resource/minibooks/domain-driven-design-quickly/en/pdf/DomainDrivenDesignQuicklyOnline.pdf
- https://martinfowler.com/articles/microservices.html
- https://martinfowler.com/articles/microservice-trade-offs.html
- https://www.youtube.com/watch?v=JXEjAwNWays Golang UK Conference 2016 - Peter Bourgon - Go + 微服务 = Go Kit
- https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing
- https://www.youtube.com/watch?v=yxZm0Fhn9Tk微服务架构陷阱
- https://martinfowler.com/bliki/MicroservicePrerequisites.html
- http://callistaenterprise.se/blogg/teknik/2015/05/20/blog-series-building-microservices/
- https://developers.redhat.com/blog/2016/12/09/spring-cloud-for-microservices-compared-to-kubernetes/
- https://12factor.net
- https://blog.codecentric.de/en/2016/04/event-driven-microservices-spring-cloud-stream/
- https://techbeacon.com/what-apache-kafka-why-it-so-popular-should-you-use-it
- https://github.com/vaquarkhan/vaquarkhan/wiki/CQRS-and-Event-Sourcing-in-Java-with-Spring-Framework
- https://gist.github.com/staltz/868e7e9bc2a7b8c1f754你一直错过的反应式编程简介
- https://www.youtube.com/watch?v=QfpCF_Eo4V0默认异步,必要时同步
- https://www.reactivemanifesto.org/
- https://thenewstack.io/succeed-failure-microservices/
- https://gist.github.com/chitchcock/1281611
- https://plus.google.com/+RipRowan/posts/eVeouesvaVX
- https://www.nginx.com/blog/service-discovery-in-a-microservices-architecture/
- http://opensourceconnections.com/blog/2015/06/25/why-cassandra/
- http://guide.couchdb.org/draft/consistency.html
- https://plus.google.com/+RipRowan/posts/eVeouesvaVX
- https://martinfowler.com/eaaDev/EventSourcing.html
- https://dzone.com/articles/failure-mongodb-bitcoin
- https://thehftguy.com/2016/11/01/docker-in-production-an-history-of-failure/
- https://thehftguy.com/2017/02/23/docker-in-production-an-update/
- https://blog.pragmatists.com/refactoring-from-anemic-model-to-ddd-880d3dd3d45f
- https://jakubn.gitlab.io/keepitclean/#1
- http://tidyjava.com/hexagonal-architecture-powerful/
- http://www.javapractices.com/topic/TopicAction.do?Id=205
- https://martinfowler.com/bliki/MonolithFirst.html
- http://microservices.io/patterns/apigateway.html
- https://vimeo.com/233798451 HTTP 客户端:分布式系统的无声英雄
- https://content.pivotal.io/blog/should-that-be-a-microservice-part-4-independent-scalability
- https://speakerdeck.com/wendigo/jdd-dlug-techniczny
- 微服务架构陷阱https://youtu.be/yxZm0Fhn9Tk (精讲)
- 4lata rewolucji mikrousługowej https://youtu.be/_X89vxbuExE(波兰语)
- 微服务https://youtu.be/GPj_KuWB7xA (波兰语)
- 使用 OSS 构建分布式系统https://youtu.be/_2VuUr-LgLw (波兰语)
- 在本地 DC 和云上扩展应用程序https://youtu.be/uSeaJcShLZk(波兰语)
- Java 中的功能性异常处理指南https://www.youtube.com/watch?v=Fxyezv_a0Fk (波兰语)
- https://allegro.tech/2016/03/Managing-Frontend-in-the-microservices-architecture.html
- https://www.mosaic9.org/
- https://www.slideshare.net/adriancockcroft/dockercon-state-of-the-art-in-microservices
- https://youtu.be/YQp85GzoxqA?t=2m48s
- https://www.slideshare.net/aahoogendoorn/designing-and-building-a-microservices-architecture-stairway-to-heaven-or-a-highway-to-hell
- http://www.infoq.com/resource/minibooks/domain-driven-design-quickly/en/pdf/DomainDrivenDesignQuicklyOnline.pdf
- https://martinfowler.com/articles/microservices.html- https://www.youtube.com/watch?v=JXEjAwNWays
- https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing
- https://www.youtube.com/watch?v=yxZm0Fhn9Tk
- https://martinfowler.com/bliki/MicroservicePrerequisites.html
- https://developers.redhat.com/blog/2016/12/09/spring-cloud-for-microservices-compared-to-kubernetes/
- https://12factor.net
- https://blog.codecentric.de/en/2016/04/event-driven-microservices-spring-cloud-stream/
- https://techbeacon.com/what-apache-kafka-why-it-so-popular-should-you-use-it
- https://github.com/vaquarkhan/vaquarkhan/wiki/CQRS-and-Event-Sourcing-in-Java-with-Spring-Framework
- https://gist.github.com/staltz/868e7e9bc2a7b8c1f754- https://www.youtube.com/watch?v=QfpCF_Eo4V0
- https://www.reactivemanifesto.org/
- https://thenewstack.io/succeed-failure-microservices/
- https://www.nginx.com/blog/service-discovery-in-a-microservices-architecture/
- http://opensourceconnections.com/blog/2015/06/25/why-cassandra/
- http://guide.couchdb.org/draft/consistency.html
- https://plus.google.com/+RipRowan/posts/eVeouesvaVX
- https://martinfowler.com/eaaDev/EventSourcing.html
- https://dzone.com/articles/failure-mongodb-bitcoin
- https://thehftguy.com/2016/11/01/docker-in-production-an-history-of-failure/
- https://thehftguy.com/2017/02/23/docker-in-production-an-update/
- https://blog.pragmatists.com/refactoring-from-anemic-model-to-ddd-880d3dd3d45f
- https://jakubn.gitlab.io/keepitclean/#1
- http://tidyjava.com/hexagonal-architecture-powerful/
- http://www.javapractices.com/topic/TopicAction.do?Id=205
- https://martinfowler.com/bliki/MonolithFirst.html
- http://microservices.io/patterns/apigateway.html
- https://vimeo.com/233798451https://speakerdeck.com/wendigo/jdd-dlug-techniczny
- https://threedots.tech/post/microservices-or-monolith-its-detail/
- http://www.dwmkerr.com/the-death-of-microservice-madness-in-2018/
- Stevey 的 Google 平台咆哮https://gist.github.com/chitchcock/1281611
- https://plus.google.com/+RipRowan/posts/eVeouesvaVX
- https://www.michaelnygard.com/blog/2018/01/coherence-penalty-for-humans/
- JOTB19 - 互动礼仪:一切都与礼貌有关,作者:马丁·汤普森https://youtu.be/A5ovSBt0-C0
- 何时不应使用微服务https://www.feval.ca/posts/microservices/
- 后备机制被高估了——构建弹性架构https://www.nurkiewicz.com/2019/07/fallbacks-are-overrated-architecting.html?m=1
- https://blog.overops.com/5-ways-to-not-f-up-your-microservices-in-production/
- https://techbeacon.com/app-dev-testing/forget-monoliths-vs-microservices-cognitive-load-what-matters
Docker 在生产环境中
- https://thehftguy.com/2016/11/01/docker-in-production-an-history-of-failure/
- https://thehftguy.com/2017/02/23/docker-in-production-an-update/