微服务是一种小型自治服务,可以协同工作。
微服务架构,或简称微服务,是开发软件系统的独特方法,试图专注于构建具有良好定义的接口和操作的单功能模块。近年来,随着企业变得更加敏捷并朝着DevOps和持续测试迈进,这一趋势越来越受欢迎。微服务可以帮助创建可扩展,可测试的软件,可以每周而不是每年交付。
微服务架构(也称云应用程序架构指南)
Sam Newman:“微服务是一种小型,自主的服务,可以协同工作。”
Frye:微服务的想法是专注于构建能够做到一件事情的个人服务。
Retriever Communications首席技术官Nic Grange说:“微服务是一种设计软件系统的方法,这些软件系统由小型独立服务组成,每个服务都有特定用途。”
Flux7首席技术官Ali Hussain说:“微服务是解决大型或大型服务的一种方法 使用一组更小,更简单的服务协同工作的复杂业务问题; 微服务运行自己独特的流程,有助于实现总体业务目标。“
ShieldX Networks创始人兼首席执行官Ratinder Ahuja博士说:”微服务是一种应用程序开发方法,其中大型应用程序是作为一套模块化服务构建的。每个模块都支持一个特定的业务目标,并使用一个简单明确的界面与其他服务集进行通信。“
Dest Horning,Zesty.io的解决方案工程师:”微服务用于软件工厂的制造。而不是让一个人[或]机器建造一辆整车,每个区域都专门完成它的任务:这个锤子铆钉,这个涂漆。“和”微服务将一个大的物镜分解成它的部件,并且这些部件是 独立完成。“
Justin Bingham,Janeiro Digital的首席技术官:”微服务是一个应用程序或更广泛的生态系统的组件,可以独立运行 - 每个都负责一个特定的业务
Chef营销总监Michael Ducy表示:“它正在将应用程序的开发和发布分解为更小的工作。”
SolarWinds的负责人Kong Yang说:“微服务是开发软件应用程序的一种方法。由可独立部署的模块化服务组成。每个微服务都运行一个独特的流程,并通过一个明确定义的轻量级机制(如容器)进行通信,以实现业务目标。
“微服务允许组织减少依赖性,更快地开发和扩展.- Aviran Mordo
微服务定义:Lewis / Fowler:
“微服务之所以重要,仅仅是因为它们以简化系统复杂性的方式增加了独特的价值。通过将系统或应用程序拆分为许多较小的部分,您可以展示减少重复,增加内聚力和降低部件之间耦合的方法,从而使整个系统部件更易于理解,更具可扩展性,更易于更改。分布式系统的缺点是从系统角度来看总是更复杂。要管理的许多小型服务的开销是另一个需要考虑的因素。“ - 卢卡斯克劳斯,
微服务方法是将您的系统(“一堆代码”)分解为许多小型服务,每个服务通常都有自己的:
考虑这种架构风格:
需要高发布速度的大型应用。
需要高度可扩展的复杂应用程序。
具有丰富域或多个子域的应用程序。
由小型开发团队组成的组织。
微服务设计的Sam Newman列举了微服务的主要优点如下:
技术异质性
通过由多个协作服务组成的系统,我们可以决定在每个服务中使用不同的技术。这使我们能够为每项工作选择合适的工具,而不必选择更标准化,一刀切的方法,这种方法通常最终成为最低标准。
弹性
弹性工程的一个关键概念是隔板。如果系统的一个组件发生故障,但该故障没有级联,则可以隔离问题,系统的其余部分可以继续工作。服务边界成为您明显的舱壁。在单一服务中,如果服务失败,一切都会停止工作。使用单片系统,我们可以在多台机器上运行以减少故障机率,但是通过微服务,我们可以构建处理服务完全故障并相应降低功能的系统。
缩放
通过大型的单片服务,我们必须将所有内容扩展到一起。我们整个系统的一小部分在性能方面受到限制,但如果这种行为被锁定在一个巨大的单片应用程序中,我们必须处理所有内容。通过较小的服务,我们可以扩展那些需要扩展的服务,允许我们在更小,功能更少的硬件上运行系统的其他部分。
易于部署
对百万行单片应用程序进行单行更改需要部署整个应用程序才能发布更改。这可能是一次影响很大,风险很高的部署。在实践中,由于这种影响,高风险部署会被限制发生。
通过微服务,我们可以对单个服务进行更改,并独立于系统的其余部分进行部署。这使我们能够更快地部署代码。如果确实出现问题,可以将其快速隔离到单个服务,从而轻松实现快速回滚。
组织协调
微服务使我们能够更好地将我们的架构与我们的组织保持一致,从而帮助我们最大限度地减少在任何一个代码库上工作的人数,从而达到团队规模和生产力的最佳点。我们还可以在团队之间转移服务的所有权,以试图让人们在一个服务上进行并置。
组合性
分布式系统和面向服务的体系结构的关键承诺之一是我们为重用功能开辟了机会。通过微服务,我们允许以不同方式为不同目的使用我们的功能。当我们考虑消费者如何使用我们的软件时,这一点尤为重要。
优化可替换性
如果你在一个中等规模或更大的组织工作,你很可能会意识到坐在角落里的一些大而讨厌的遗留系统。没有人想触摸的那个。对您的公司如何运行至关重要的那个,但恰好用一些奇怪的Fortran变体编写,并且仅在25年前达到使用寿命的硬件上运行。为什么没有被替换?你知道为什么:工作太大而且冒险。
由于我们的个性化服务规模较小,因此使用更好的实施方案替换它们,甚至完全删除它们的成本更容易管理。
团队沟通开销 -
微服务架构降低了团队管理的复杂性,但无法减少团队沟通的需要。他们需要确保一个服务中的更新不会破坏其他功能。我们也可以在整体架构应用程序中找到这个问题。
非统一技术栈 -
我们可以为不同的组件(多语言)选择不同的技术堆栈。它导致应用程序设计和架构不一致的问题。从长远来看,它可能会增加维护成本。
Dev Ops复杂性 -
我们需要一个成熟的Dev Ops团队来处理维护基于微服务的应用程序所涉及的复杂性。由于应用程序的几个移动部分,它变得复杂并且需要高水平的专业知识。增加资源使用 - 运行这些应用程序的初始投资很高,因为所有独立运行的组件都需要拥有更多内存和CPU的自己的运行时容器。
增加网络通信 -
独立运行的组件通过网络相互交互。这种系统需要可靠和快速的网络连接。编组和解编组 - 当一个组件需要来自另一个组件的数据时,发送方从其内部表示中对一些标准中的数据进行编组,而接收方在使用之前将数据解组为其自己的表示。与传统应用程序架构相比,这肯定需要更多处理。
网络安全 -
需要保护内部服务通信以避免任何内部通信安全漏洞。由于有几个移动部件,这些应用程序更容易出现安全漏洞。
测试 -
与整体应用相比,此类应用的测试肯定更难。
生产监控 -
无法使用正确的工具也是一个需要考虑的问题。
日志分析 -
需要日志分析工具进行日志分析,Splunk或ELK堆栈
微服务 - 不是免费午餐! http://highscalability.com/blog/2014/4/8/microservices-not-a-free-lunch.html
维持多个微服务非常难以提高复杂性。
找到以正确方式创建微服务架构的优秀架构师是极其困难的。
架构原理
核心模式
部署模式
服务发现
Service Mesh(服务网格)
实现应用于微服务的七个设计指南的策略和模式(sei.cmu.edu)
标准化服务合同。策略包括:
服务松耦合。策略包括:
服务可重用性。策略包括:
服务自治。策略包括:
服务无状态。策略包括:
服务可发现性。策略包括:
服务可部署性。策略包括:
白宫Web API的指南和示例,鼓励跨应用程序的一致性,可维护性和最佳实践。白宫API旨在平衡真正的RESTful API接口和积极的开发者体验(DX)。
该文件大量借鉴:
在确定应用程序中的微服务后,请根据以下条件验证您的设计:
重用仍然是微服务设计的原则。但是,重用范围已缩减为业务中的特定域。设计这种重用的努力在SOA的早期阶段包括在设计企业范围的规范模型方面的浪费,因为它过于雄心勃勃而没有结果。但是,必须注意的是,在其限制范围内的规范模型可能是有益的。与其促进的重用一致,其范围已经减少。通过“基于优点的重用”方法,新兴模型优于预定模型。团队可以就通信模型达成一致,以决定微服务如何在其设计环境之外进行调整以供使用。如果现有的微服务API不适合您的域或“业务组”,那么构建另一个微服务可能会更好。
-Alison Jarris
Scale Cube,由Martin L. Abbott和Michael T. Fisher定义。该模型解释了如何通过实施三维方法实现无限扩展。
“可伸缩性艺术”一书描述了三维可伸缩性模型:比例立方体。微服务架构是在比例立方体上应用Y轴缩放。
• 水平复制和克隆(X轴)
• 功能分解和分割 - 微服务(Y轴)
• 水平数据分区 - 碎片(Z轴)
Scale Cube(图片提供:microservices.io)
API是标准化的包装器,它创建了一个接口,微服务可以通过该接口进行打包和浮出水面。这使得API成为微服务架构(如安全性,治理和重用)关键问题的逻辑执行点。因为API能够容纳这些问题,所以它们被认为是微服务架构(mulesoft)的基础组件。微服务设计为在内部使用,而API则用于向外界公开功能。
Miniservices被称为实用的微服务。您可以更快地开始使用它们,并选择对您的团队有意义的部分。
“[miniservice]就像一组微服务在一个小模式中聚集在一起。” — Ross Garrett
每个微服务必须处理自己的数据,miniservices可以共享数据。“ — Arnaud Lauret
不要将架构优雅性与商业价值混为一谈。“ — Ross Garrett
利用对我有意义并获得大部分功能优势的实践,“ says Ross Garrett.
Nanoservice是一种反模式,其服务太细粒度。nanoservice是一种服务,其开销(通信,维护等)超过其效用。
DDD通过将大型模型划分为不同的有界上下文并明确其相互关系来处理大型模型。 Martin fowler
微服务应该有多大:它应该有一个明确定义的有界上下文,使我们能够在不必考虑或交换上下文的情况下工作。
如何识别界限上下文?
所有参与服务之间的关系由单个端点描述
服务编排是参与服务的全局描述,其通过消息交换,交互规则和两个或多个端点之间的协议来定义。编舞采用分散的方法进行服务组合。
来自stack的andrei
“我们通过使用控制业务逻辑的上帝服务(具有全局视角)或微服务基本上传递消息的编排方法来解决我们的微服务问题。在微服务架构中,编排比编舞更受欢迎。”
如果您创建自己的业务流程,请记住:
您是一名协调员,数据和职能的协调员。你不是改变着,请不要介入业务规则,避免搞乱其他人的架构。
推荐的包括Saga模式,路由单和状态工作流。每种模式都具有一定程度的复杂性。研究并将正确的模式与您的业务流程相匹配。
https://medium.com/capital-one-tech/microservices-when-to-react-vs-orchestrate-c6b18308a14c
No | about | url |
---|---|---|
1 | What are the Advantages of Microservices? - Sam Newman | - https://www.youtube.com/watch?v=KV3j3MZTXgk |
2 | Design Microservice Architectures the Right Way | - https://www.youtube.com/watch?v=j6ow-UemzBc |
3 | Mastering Chaos - A Netflix Guide to Microservices | - https://www.youtube.com/watch?v=CZ3wIuvmHeM |
4 | API Academy Microservices Boot Camp @ CA World: Designing a Microservices Architecture | -https://www.youtube.com/watch?v=iZNSPKxAd5w |
5 | Data Strategies for Microservice Architectures | - https://www.youtube.com/watch?v=n_V8hBRoshY |
6 | Refactor your Java EE application using Microservices and Containers by Arun Gupta | -https://www.youtube.com/watch?v=iJVW7v8O9BU |
7 | Principles Of Microservices by Sam Newman s | -https://www.youtube.com/watch?v=PFQnNFe27kU |
8 | PGOTO 2016 • Appsec and Microservices • Sam Newman | - https://www.youtube.com/watch?v=wlt7nCRWx_w |
9 | Avoiding Microservice Megadisasters - Jimmy Bogard | - https://www.youtube.com/watch?v=gfh-VCTwMw8 |
10 | 10 Tips for failing badly at Microservices by David Schmitz | - https://www.youtube.com/watch?v=X0tjziAQfNQ |
11 | Lessons from the Birth of Microservices at Google | - https://www.youtube.com/watch?v=Fz1PoXqxAZc |
12 | Event Sourcing You are doing it wrong by David Schmitz | - https://www.youtube.com/watch?v=GzrZworHpIk |
13 | The hardest part of microservices is your data | - https://www.youtube.com/watch?v=MrV0DqTqpFU |
14 | Data Design and Modeling for Microservices | - https://www.youtube.com/watch?v=KPtLbSEFe6c |
15 | The Art of Discovering Bounded Contexts by Nick Tune | - https://www.youtube.com/watch?v=ez9GWESKG4I |
16 | The challenges of migrating 150+ microservices to Kubernetes -Sarah Wells (Financial Times) | - https://www.youtube.com/watch?v=fgI3cOdv87I&feature=youtu.be |
17 | Revitalizing Aging Architectures with Microservices | - https://www.youtube.com/watch?v=SPGCdziXlHU |
No | about | url |
---|---|---|
1 | Developing Microservices with Aggregates Chris Richardson | - https://www.infoq.com/presentations/aggregates-modular-microservices |
2 | Top 5+ Microservices Architecture and Design Best Practices Ajitesh Kumar | - https://dzone.com/articles/top-5-microservices-architecture-and-design-best-p |
3 | Microservices: Patterns and Practices Panel C. Richardson, R. Shoup, L. Ryan, R. Tangirala, and R. Schloming participate in a discussion on microservices and the challenges faced at scale, the strategies to use and more. | -https://www.infoq.com/presentations/microservices-patterns-practices-panel |
4 | Microservices Patterns Red Hat Videos | - https://www.youtube.com/watch?v=_YzzxrSIQGw |
5 | 7 Microservice Patterns Explained (Ivar Grimstad) | - https://www.youtube.com/watch?v=4IFVBfLBl1Y |
6 | Three Microservice Patterns to Tear Down Your Monoliths | - https://www.youtube.com/watch?v=84W9iY3CwdQ |
7 | 14 Architectural patterns for microservice development | - https://www.youtube.com/watch?v=yVZS1HZrlEw |
8 | Reducing Microservices Architecture Complexity with Istio and Kubernetes | - https://www.youtube.com/watch?v=k42jqkjtYKY |
9 | Developing Microservices with Aggregates | - https://www.infoq.com/presentations/aggregates-modular-microservices |
10 | The Seven Deadly Sins of Microservices by Daniel Bryant | - https://www.youtube.com/watch?v=Jw6TYEb1Opw |
11 | Microservices Anti-Patterns | - https://www.youtube.com/watch?v=I56HzTKvZKc |
No | url |
---|---|
1 | - https://github.com/vaquarkhan/microservice-poc |
2 | - https://github.com/vaquarkhan/robot-shop |
3 | - https://github.com/vaquarkhan/awesome-microservices |
4 | - https://github.com/vaquarkhan/microservice-docker-project |
5 | - https://github.com/vaquarkhan/flowing-retail-microservice-kafka |
6 | - https://github.com/vaquarkhan/spring-boot-microservices-series |
7 | - https://github.com/vaquarkhan/A-curated-list-of-Microservice |
8 | - https://github.com/vaquarkhan/sample-spring-microservices |
9 | - https://github.com/vaquarkhan/microservice-kafka |
10 | - https://github.com/vaquarkhan/oreilly-building-microservices-training |
11 | - https://github.com/vaquarkhan/micromono |
12 | - https://github.com/vaquarkhan/spring-cloud-microservice-example |
13 | - https://github.com/vaquarkhan/jwt-microservices-JavaRoadStorm2016 |
14 | - https://github.com/vaquarkhan/micro |
15 | - https://github.com/vaquarkhan/microservices-centralized-configuration |
16 | - https://github.com/vaquarkhan/micro-company |
17 | - https://github.com/vaquarkhan/PiggyMetrics-microservice-poc |
18 | - https://github.com/vaquarkhan/spring-cloud-microservice |
19 | - https://github.com/vaquarkhan/CQRS-microservice-sampler |
20 | - https://github.com/vaquarkhan/Microservices-Deployment-Cookbook |
21 | - https://github.com/vaquarkhan/storyteller-microservices |
22 | - https://github.com/vaquarkhan/microservice-security |
23 | - https://github.com/vaquarkhan/microservices-demo |
24 | - https://github.com/vaquarkhan/spring-cloud-microservices-ELKStack |
25 | - https://github.com/vaquarkhan/event-stream-processing-microservices |
26 | - https://github.com/vaquarkhan/FraudDetection-Microservices-gemfire |
27 | - https://github.com/vaquarkhan/microservice-sampler |
28 | - https://github.com/vaquarkhan/microserviceApplication |
29 | - https://github.com/vaquarkhan/Microservices-With-Spring-Student-Files |
30 | - https://github.com/vaquarkhan/spring-boot-netflix-microservice-demo |
31 | - https://github.com/vaquarkhan/spring-netflix-oss-microservices |
32 | - https://github.com/vaquarkhan/rest-microservices |
33 | - https://github.com/vaquarkhan/cloud-native-microservice-strangler-example |
34 | - https://github.com/vaquarkhan/microservices-SpringCloud-netflix |
35 | - https://github.com/vaquarkhan/knowledge-driven-microservice |
36 | - https://github.com/vaquarkhan/event-driven-microservices-platform |
37 | - https://github.com/vaquarkhan/devnexus-microservice-sample |
38 | - https://github.com/vaquarkhan/microservices |
39 | - https://github.com/vaquarkhan/Spring-Microservices |
40 | - https://github.com/vaquarkhan/bootiful-microservices |
41 | - https://github.com/vaquarkhan/vk-microservices-with-spring-cloud |
42 | - https://github.com/vaquarkhan/cf-SpringBootTrader-microservice |
43 | - https://github.com/vaquarkhan/Refactor-monolith-to-microservices |
44 | - https://github.com/vaquarkhan/microservices-dashboard |
45 | - https://github.com/vaquarkhan/microservice-camel-in-action |
46 | - https://github.com/vaquarkhan/cloud-native-app-microservice-labs |
47 | - https://github.com/vaquarkhan/spring-boot-8-microservices |
48 | - https://github.com/vaquarkhan/building-microservices |
49 | - https://github.com/vaquarkhan/spring-doge-microservice |
50 | - https://github.com/vaquarkhan/microservice-service-registration-and-discovery |
51 | - https://github.com/ewolff/microservice |
52 | - https://github.com/semplify/Reactive-Microservice-Training |
53 | - https://gitlab.com/training-microservices-2018-06 |
54 | - https://github.com/vaquarkhan/train-ticket |
55 | - https://github.com/cer/event-sourcing-examples |
56 | - https://github.com/finn-no/Docker-and-Microservices |
57 | - https://github.com/nielskrijger/auth-server |
58 | - https://developer.github.com/v3/repos/ |
59 | - https://github.com/vaquarkhan/ftgo-application |
60 | - https://github.com/IBM/GameOn-Java-Microservices-on-Kubernetes |
No | about | url |
---|---|---|
1 | Don’t Build a Distributed Monolith | - https://www.microservices.com/talks/dont-build-a-distributed-monolith/ |
2 | In this talk from the API360 Microservices Summit in New York, June 2016, Vijay Alagarasan of Asurion explores lessons learned and anti-patterns to avoid when implementing microservices. | - https://www.apiacademy.co/resources/videos/api360-microservices-summit-microservices-anti-patterns |
3 | Microservices Anti-Patterns | - https://vimeo.com/198927025 |
4 | Microservices Anti-Patterns | - https://vimeo.com/118020043 |
5 | API360 Microservices Summit – Microservices Antipatterns – Vijay Alagarasan, Asurion | - https://www.youtube.com/watch?v=uTGIrzzmcv8 |
6 | Stefan Tilkov - Microservices Patterns and Anti-patterns | - https://www.youtube.com/watch?v=VaYmRe104HU |
7 | 10 Tips for failing badly at Microservices by David Schmitz | - https://www.youtube.com/watch?v=X0tjziAQfNQ |
8 | 10 Tips for failing badly at Microservices by David Schmitz | -https://www.oreilly.com/library/view/microservices-antipatterns-and/9781491963937/video255789.html |
No | about | url |
---|---|---|
1 | - https://developer.twitter.com/en/docs | |
2 | - https://developer.twitter.com/en/docs | |
3 | - https://www.linkedin.com/developers# | |
4 | - https://developers.google.com/+/web/api/rest/latest/activities/list | |
8 | Microservices in Practice - Key Architectural Concepts of an MSA | - https://wso2.com/whitepapers/microservices-in-practice-key-architectural-concepts-of-an-msa/ |
9 | Guidelines for Designing Microservices | - https://medium.com/@WSO2/guidelines-for-designing-microservices-71ee1997776c |
10 | Microservices Resource Guide | - https://www.martinfowler.com/microservices/ |
10 | 5 guiding principles you should know before you design a microservice | - https://opensource.com/article/18/4/guide-design-microservices |
11 | Pattern: Microservice Architecture | - https://microservices.io/patterns/microservices.html |
12 | Scaling Uber from 1 to 100s of Services | - https://www.microservices.com/talks/scaling-uber-from-1-to-100s-of-services/ |
13 | tagged by: domain driven design | - https://martinfowler.com/tags/domain%20driven%20design.html |
14 | DDD - The Bounded Context Explained | - http://blog.sapiensworks.com/post/2012/04/17/DDD-The-Bounded-Context-Explained.aspx |
15 | MicroservicePrerequisites | - https://martinfowler.com/bliki/MicroservicePrerequisites.html |
16 | DevOpsCulture | - https://martinfowler.com/bliki/DevOpsCulture.html |
17 | What are Cloud-Native Applications? | - https://pivotal.io/cloud-native |
18 | JSONP | - https://stackoverflow.com/questions/2067472/what-is-jsonp-all-about |
19 | Microservices architecture style | - https://docs.microsoft.com/en-us/azure/architecture/guide/architecture-styles/microservices |
20 | Microservices architecture | - https://samnewman.io/talks/principles-of-microservices/ |
21 | Designing microservices: Identifying microservice boundaries | - https://docs.microsoft.com/en-us/azure/architecture/microservices/microservice-boundaries |
22 | DDD Strategic Patterns: How to Define Bounded Contexts | - https://dzone.com/articles/ddd-strategic-patterns-how-to-define-bounded-conte |
23 | Microservices | - https://martinfowler.com/articles/microservices.html |
24 | Daniel Jacobson on Ephemeral APIs and Continuous Innovation at Netflix | - https://www.infoq.com/news/2015/11/daniel-jacobson-ephemeral-apis |
25 | Versioning | - https://cloud.google.com/apis/design/versioning |
26 | Semantic Versioning 2.0.0 | -https://semver.org/ |
27 | RESTful API Design. Best Practices in a Nutshell. | - https://blog.philipphauer.de/restful-api-design-best-practices/ |
28 | Rest API Tutorial | - https://restfulapi.net/resource-naming/ |
29 | REST API Design - Resource Modeling | -https://www.thoughtworks.com/insights/blog/rest-api-design-resource-modeling |
30 | Improve time to market with microservices | -https://www.ibm.com/cloud/garage/architectures/microservices?cm_sp=Blog-_-blogcta-_-ArchCenter |
31 | Digital Applications using a Microservice Architecture | -https://github.com/ibm-cloud-architecture/refarch-cloudnative |
No | about | url |
---|---|---|
1 | Seven Microservices Anti-patterns | - https://www.infoq.com/articles/seven-uservices-antipatterns |
2 | Microservices Anti-patterns: It’s All About the People | - https://opencredo.com/blogs/microservices-anti-patterns-its-all-about-the-people/ |
3 | The 7 Deadly Sins of Microservices | - https://opencredo.com/blogs/7-deadly-sins-of-microservices/ |
4 | Microservices? Please, Don't | - https://dzone.com/articles/microservices-please-dont |
5 | How Anti-Patterns Can Stifle Microservices Adoption in the Enterprise | - https://blog.appdynamics.com/engineering/how-to-avoid-antipatterns-with-microservices/ |
针对与微服务基础设施相关的公共失败的故事汇编列表。
TBD
在考虑消费者的情况下构建API - 作为产品本身。
使用Collection Metaphor。
使用名词作为资源名称(例如,不要在URL中使用动词)。
使资源表示有意义。
支持对集合进行过滤,排序和分页。
支持链接扩展关系。允许客户端通过包含其他表示而不是链接或扩展链接来扩展响应中包含的数据。
支持对资源的实地剪裁。允许客户端减少响应中返回的字段数。
使用HTTP方法名称来表示某些内容:
使用有意义的HTTP状态代码。
将ISO 8601时间点格式用于表示中的日期。
通过利用链接策略来考虑连通性。一些流行的例子是:
使用 OAuth2 保护您的API。
使用Content-Type协商来描述传入的请求有效负载。
例如,假设您正在评级,包括竖起大拇指缩小和五星评级。您有一条路线可以创建评级: POST /ratings
区分传入数据和服务,以便确定它是哪种评级类型:竖起大拇指还是五星级?
为每种评级类型创建一条路线: POST /ratings/five_star and POST /ratings/thumbs_up
但是,通过使用Content-Type协商,我们可以对两种类型使用相同的POST /评级路由。通过将请求上的Content-Type标头设置为Content-Type:application / vnd.company.rating.thumbsup或Content-Type:application / vnd.company.rating.fivestar,服务器可以确定如何处理传入的评级数据。
版本化的演变。但是,如果是版本控制,请使用Accept标头而不是URL中的版本控制。
考虑缓存能力。至少应使用以下响应标头:
确保您的GET,PUT和DELETE操作都是 幂等. 操作不应产生不良副作用。
这些指南旨在支持真正的RESTful API。以下是一些例外情况:
RESTful URL的一般准则
好的URL示例
错误的URL示例
HTTP动词
应使用HTTP谓词或方法,以符合HTTP / 1.1标准下的定义。对表示采取的行动将与正在处理的媒体类型及其当前状态有关。以下是HTTP谓词如何映射到特定上下文中的创建,读取,更新,删除操作的示例:
HTTP METHOD | POST | GET | PUT | DELETE |
---|---|---|---|---|
CRUD OP | CREATE | READ | UPDATE | DELETE |
/dogs | Create new dogs | List dogs | Bulk update | Delete all dogs |
/dogs/1234 | Error | Show Bo | If exists, update Bo; If not, error | Delete Bo |
(Web应用程序设计示例,作者:Brian Mulloy,Apigee。)
响应
好的例子
键中没有值:
"tags": [
{"id": "125", "name": "Environment"},
{"id": "834", "name": "Water Quality"}
],
坏的例子
键中的值:
"tags": [
{"125": "Environment"},
{"834": "Water Quality"}
],
错误处理
错误响应应包括常见的HTTP状态代码,开发人员的消息,最终用户的消息(适当时),内部错误代码(对应于某些特定的内部确定的ID),开发人员可以找到更多信息的链接。例如:
{
"status" : 400,
"developerMessage" : "Verbose, plain language description of the problem. Provide developers
suggestions about how to solve their problems here",
"userMessage" : "This is a message that can be passed along to end-users, if needed.",
"errorCode" : "444444",
"moreInfo" : "http://www.example.gov/developer/path/to/help/for/444444,
http://drupal.org/node/444444",
}
使用三个简单的常见响应代码,表示(1)成功,(2)由于客户端问题导致的故障,(3)由于服务器端问题导致的故障:
版本化
记录限制
有关记录限制和总可用计数的信息也应包含在响应中。例:
{
"metadata": {
"resultset": {
"count": 227,
"offset": 25,
"limit": 25
}
},
"results": []
}
API资源
例子: http://example.gov/api/v1/magazines.json
响应体:
{
"metadata": {
"resultset": {
"count": 123,
"offset": 0,
"limit": 10
}
},
"results": [
{
"id": "1234",
"type": "magazine",
"title": "Public Water Systems",
"tags": [
{"id": "125", "name": "Environment"},
{"id": "834", "name": "Water Quality"}
],
"created": "1231621302"
},
{
"id": 2351,
"type": "magazine",
"title": "Public Schools",
"tags": [
{"id": "125", "name": "Elementary"},
{"id": "834", "name": "Charter Schools"}
],
"created": "126251302"
}
{
"id": 2351,
"type": "magazine",
"title": "Public Schools",
"tags": [
{"id": "125", "name": "Pre-school"},
],
"created": "126251302"
}
]
}
GET /magazines/[id]
例子: http://example.gov/api/v1/magazines/[id].json
响应体:
{
"id": "1234",
"type": "magazine",
"title": "Public Water Systems",
"tags": [
{"id": "125", "name": "Environment"},
{"id": "834", "name": "Water Quality"}
],
"created": "1231621302"
}
POST /magazines/[id]/articles
例子: Create – POST http://example.gov/api/v1/magazines/[id]/articles
响应体:
[
{
"title": "Raising Revenue",
"author_first_name": "Jane",
"author_last_name": "Smith",
"author_email": "[email protected]",
"year": "2012",
"month": "August",
"day": "18",
"text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam eget ante ut augue scelerisque ornare. Aliquam tempus rhoncus quam vel luctus. Sed scelerisque fermentum fringilla. Suspendisse tincidunt nisl a metus feugiat vitae vestibulum enim vulputate. Quisque vehicula dictum elit, vitae cursus libero auctor sed. Vestibulum fermentum elementum nunc. Proin aliquam erat in turpis vehicula sit amet tristique lorem blandit. Nam augue est, bibendum et ultrices non, interdum in est. Quisque gravida orci lobortis... "
}
]
TBD
Spring Cloud为开发人员提供了工具,可以快速构建分布式系统中的一些常见模式,例如配置管理,服务发现,断路器,路由等。它构建于用Java开发人员编写的基于Java的Netflix OSS库之上(现在还有ali oss)。
Spring Platform自身提供的统一编程模型和Spring Boot的快速应用程序创建功能为开发人员提供了良好的微服务开发体验。例如,只需很少注释,您就可以创建一个配置服务器,只需要几个注释,就可以获得客户端库来配置您的服务。
有大量的库可以解决大多数运行时问题。由于所有库都是用Java编写的,因此它提供了多种功能,更好的控制和微调选项。
不同的Spring Cloud库彼此很好地集成在一起。例如,Feign客户端还将使用Hystrix进行电路中断,使用Ribbon进行负载均衡请求。一切都是注释驱动,使Java开发人员易于开发。
Spring Cloud的一个主要优点也是它的缺点 - 它仅限于Java。MSA的一个强大动机是能够在需要时交换技术堆栈,库甚至语言。Spring Cloud无法做到这一点。如果您想要使用Spring Cloud / Netflix OSS基础结构服务,例如配置管理,服务发现或负载平衡,那么解决方案并不优雅。Netflix Prana项目实现了边车模式,以通过HTTP公开基于Java的客户端库,使得以非JVM语言编写的应用程序可以存在于NetflixOSS生态系统中,但它并不是非常优雅。
Java开发人员需要关心和处理Java应用程序的责任。每个微服务都需要运行各种客户端以进行配置检索,服务发现和负载平衡。设置它们很容易,但这并不会隐藏构建时和运行时对环境的依赖性。例如,开发人员可以使用@EnableConfigServer创建一个配置服务器,但这只是一个快速的路径。每次开发人员想要运行单个微服务时,他们都需要启动并运行Config Server。对于受控环境,开发人员必须考虑使Config Server具有高可用性,并且由于它可以由Git或Svn支持,因此它们需要一个共享文件系统。同样,对于服务发现,开发人员需要首先启动Eureka服务器。对于受控环境,他们需要在每个AZ等上集中多个实例。感觉就像Java开发人员除了实现所有功能服务之外还必须构建和管理非平凡的微服务平台。
单独的Spring Cloud在微服务之旅中的范围较短,开发人员还需要考虑自动部署,调度,资源管理,进程隔离,自我修复,构建管道等,以获得完整的微服务体验。对于这一点,我认为将Spring Cloud单独与Kubernetes进行比较是不公平的,Spring Cloud + Cloud Foundry(或Docker Swarm)和Kubernetes之间的比较更公平。但这也意味着,对于完整的端到端微服务体验,Spring Cloud必须补充一个像Kubernetes本身这样的应用平台。
Kubernetes是一个开源系统,用于自动化容器化应用程序的部署,扩展和管理。它是多语言,提供配置,运行,扩展和管理分布式系统的原语。
Kubernetes是一个多语言和语言无关的容器管理平台,能够运行云原生和传统的容器化应用程序。它提供的服务(例如配置管理,服务发现,负载平衡,度量收集和日志聚合)可以通过各种语言使用。这允许组织中的一个平台可供多个团队(包括使用Spring的Java开发人员)使用并用于多种目的:应用程序开发,测试环境,构建环境(运行源代码控制系统,构建服务器,工件存储库)等。
与Spring Cloud相比,Kubernetes解决了更广泛的MSA问题。除了提供运行时服务之外,Kubernetes还允许您配置环境,设置资源约束,RBAC,管理应用程序生命周期,启用自动扩展和自我修复(Kubernetes行为几乎就像一个可以抵御混乱的自愈平台)。
Kubernetes技术基于Google 15年的研发和管理容器的经验。此外,有近1000个提交者,它是Github上最活跃的开源社区之一。
Kubernetes是多语言,因此,它的服务和原语是通用的,并没有针对不同的平台进行优化,例如Spring Cloud for JVM。例如,配置作为环境变量或已安装的文件系统传递给应用程序。它没有Spring Cloud Config提供的精美配置更新功能。
Kubernetes不是一个专注于开发人员的平台。它旨在供具有DevOps意识的IT人员使用。因此,Java开发人员需要学习一些新概念,并乐于学习解决问题的新方法。尽管使用MiniKube启动Kubernetes的开发人员实例非常容易,但是手动安装高可用性Kubernetes集群会产生大量的操作开销。
Kubernetes仍然是一个相对较新的平台(2年),它仍在积极开发和发展。因此,每个版本都添加了许多可能难以跟上的新功能。好消息是已经设想了这个,并且API是可扩展和向后兼容的。
From Bilgin Ibryam Article
建议每个资源在测试服务器上接受'mock'参数。传递此参数应返回模拟数据响应(绕过后端)。
在开发早期实现此功能可确保API表现出一致的行为,支持测试驱动的开发方法。
注意:如果mock参数包含在对生产环境的请求中,则应引发错误。
“任何设计系统的组织,必然会产生以下设计结果:即其结构就是该组织沟通结构的写照。” - Melvin Conway(1967)。
康威定律断言,组织不得不制作应用程序设计,这些应用程序设计是其通信结构的副本。这通常会导致意外的摩擦点。
“逆向康威机动”建议改进您的团队和组织结构,以促进您所需的架构。理想情况下,您的技术架构将与您的业务架构显示同构。
“微服务”: - “微服务我们主要遵循域驱动的方法,我们的想法是建立一个跨职能的团队。”
灵感来自于 coming soon....
此浏览器不支持PDF。请下载微服务IBM红皮书PDF以查看它:Download PDF.