微服务中的设计模式

说到设计模式,大家一般会想到,工厂、单例等24种基本设计模式,当然也会想到并发型模式,生产-消费者模式,线程池模式等,但是微服务中用到什么设计模式了?前两篇介绍了,挎斗模式和代表模式,当然这一类设计模式属于云设计模式。AzureCAT模式和实践团队在Azure架构中心发布了九种新的设计模式。在设计和实现微服务时,这九种模式特别有用。微服务越来越变的流行是记录这些模式的动机。

下图说明了如何在微服务架构中使用这些模式:

对于每种模式,我们都会描述问题,解决方案,何时使用模式以及实现注意事项。

  • Ambassador(代表模式) 可用于以一种与语言无关的方式卸载常见客户端连接任务,如监视、记录、路由、安全(如 TLS)。
  • Anti-corruption layer (防损层模式) 实现了新旧应用程序之间的外观,以确保新应用程序的设计不受遗留系统依赖性的限制。使用此模式可确保应用程序的设计不受限于对外部子系统的依赖。 此模式最先由 Eric Evans 在 Domain-Driven Design(域驱动的设计)中描述。
  • Backends for Frontends (用于前端的后端模式) 创建单独的后端服务,供特定的前端应用程序或接口使用。 要避免为多个接口自定义一个后端时,此模式十分有用。后端为不同类型的客户端(如桌面和移动设备)创建单独的后端服务。这样,单个后端服务不需要处理各种客户端类型的冲突要求。通过分离客户特定的问题,这种模式可以帮助保持每个微服务的简单性。
  • Bulkhead(隔舱模式)之所以称为“隔舱”(Bulkhead),是因为它类似于船体的分段区。 如果船体受到破坏,只有受损的分段才会进水,从而可以防止船只下沉。为每个工作负载或服务隔离关键资源,例如连接池,内存和CPU。通过使用隔板,单个工作负载(或服务)无法消耗所有资源,使其他资源匮乏。此模式通过防止由一个服务引起的级联故障来提高系统的弹性。
  • Gateway Aggregation(网关聚合模式)使用网关可将多个单独请求聚合成一个请求。 当客户端必须向不同的后端系统发出多个调用来执行某项操作时,此模式非常有用使用网关可将多个单独请求聚合成一个请求。 当客户端必须向不同的后端系统发出多个调用来执行某项操作时,此模式非常有用。
  • Gateway Offloading(网关卸载方式)将共享或专用服务功能卸载到网关代理。 此模式可以通过将共享服务功能(如 SSL 证书的使用)从应用程序的其他部分移动到网关,简化应用程序开发。
  • Gateway Routing(网关路由模式)使用单个终结点将请求路由到多个服务。 如果希望在单个终结点上公开多个服务,并根据请求路由到适当的服务,则此模式非常有用。
  • Sidecar(挎斗模式 )将应用程序的帮助程序组件部署为单独的容器或进程,以提供隔离和封装。使用此模式还可以使用异构组件和技术来构建应用程序。
  • Strangler(绞杀者模式)通过将特定的功能片断逐渐取代为新的应用程序和服务,逐步迁移旧系统。 随着旧系统的功能被替换,新系统最终将取代旧系统的所有功能,抑制旧系统并使其停用。通过逐步用新服务替换特定功能来支持增量迁移。

微服务的目标是通过将应用程序分解为可以独立部署的小型自治服务来提高应用程序版本的速度。微服务架构也带来了一些挑战,这些模式可以帮助缓解这些挑战。设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。当然微服务中的云设计模式也是对微服务中普遍存在的问题,所提出的解决方案。我们是工程师,不是码农,所以小伙伴们,学习一个东西一定要深入一点,勿在浮沙筑高层,共勉!

引用:https://azure.microsoft.com/zh-cn/blog/design-patterns-for-microservices/

原文地址:https://www.cnblogs.com/viaiu/p/10011376.html

时间: 2024-08-28 09:19:37

微服务中的设计模式的相关文章

微服务架构的设计模式(转载)

转载:原文链接 前不久,Java Code Geeks发表了一篇文章,分析单体应用与微服务的优缺点.近日,该网站又发表了一篇文章,提供了六种微服务架构的设计模式. 聚合器微服务设计模式 这是一种最常用也最简单的设计模式,如下图所示: 聚合器调用多个服务实现应用程序所需的功能.它可以是一个简单的Web页面,将检索到的数据进行处理展示.它也可以是一个更高层次的组合微服务,对 检索到的数据增加业务逻辑后进一步发布成一个新的微服务,这符合DRY原则.另外,每个服务都有自己的缓存和数据库.如果聚合器是一个

六种微服务架构的设计模式(转)

原文地址:http://my.oschina.net/sourcecoding/blog/496068 前不久,Java Code Geeks发表了一篇文章,分析单体应用与微服务的优缺点.近日,该网站又发表了一篇文章,提供了六种微服务架构的设计模式. 聚合器微服务设计模式 这是一种最常用也最简单的设计模式,如下图所示: 聚合器调用多个服务实现应用程序所需的功能.它可以是一个简单的Web页面,将检索到的数据进行处理展示.它也可以是一个更高层次的组合微服务,对检索到的数据增加业务逻辑后进一步发布成一

谈谈微服务中的 API 网关(API Gateway)

转载至:http://www.cnblogs.com/savorboard/p/api-gateway.html 背景 我们知道在微服务架构风格中,一个大应用被拆分成为了多个小的服务系统提供出来,这些小的系统他们可以自成体系,也就是说这些小系统可以拥有自己的数据库,框架甚至语言等,这些小系统通常以提供 Rest Api 风格的接口来被 H5, Android, IOS 以及第三方应用程序调用. 但是在UI上进行展示的时候,我们通常需要在一个界面上展示很多数据,这些数据可能来自于不同的微服务中,举

Spring Cloud微服务中网关服务是如何实现的?(Zuul篇)

导读 我们知道在基于Spring Cloud的微服务体系中,各个微服务除了在内部提供服务外,有些服务接口还需要直接提供给客户端,如Andirod.IOS.H5等等. 而一个很尴尬的境地是,如果直接将提供外部接口的微服务暴露给公网,那么意味着为了增强这个微服务的安全性,需要做很多额外的安全性措施,如报文数字签名.加密等:而大部分场景下,微服务本身又是提供给内部其他微服务调用的,即便所有的微服务都会不同程度地直接面向App客户端提供公网服务,那么为了这确保这些微服务的安全性,涉及的微服务也都需要实现

Service Mesh——微服务中的流量管理中间件

Service Mesh——微服务中的流量管理中间件 摘自-https://zhuanlan.zhihu.com/p/28794062 Service mesh 与 Cloud Native Kubernetes 设计之初就是按照 Cloud Native 的理念设计的,Cloud Native 中有个重要概念就是微服务的架构设计,当将单体应用拆分微服务后, 随着服务数量的增多,如何微服务进行管理以保证服务的 SLA 呢?为了从架构层面上解决这个问题,解放程序员的创造性,避免繁琐的服务发现.监控

六种微服务架构的设计模式

聚合器微服务设计模式 这是一种最常用也最简单的设计模式,如下图所示: 聚合器调用多个服务实现应用程序所需的功能.它可以是一个简单的Web页面,将检索到的数据进行处理展示.它也可以是一个更高层次的组合微服务,对检索到的数据增加业务逻辑后进一步发布成一个新的微服务,这符合DRY原则.另外,每个服务都有自己的缓存和数据库.如果聚合器是一个组合服务,那么它也有自己的缓存和数据库.聚合器可以沿X轴和Z轴独立扩展. 代理微服务设计模式 这是聚合器模式的一个变种,如下图所示: 在这种情况下,客户端并不聚合数据

Spring Cloud 微服务中搭建 OAuth2.0 认证授权服务

在使用 Spring Cloud 体系来构建微服务的过程中,用户请求是通过网关(ZUUL 或 Spring APIGateway)以 HTTP 协议来传输信息,API 网关将自己注册为 Eureka 服务治理下的应用,同时也从 Eureka 服务中获取所有其他微服务的实例信息.搭建 OAuth2 认证授权服务,并不是给每个微服务调用,而是通过 API 网关进行统一调用来对网关后的微服务做前置过滤,所有的请求都必须先通过 API 网关,API 网关在进行路由转发之前对该请求进行前置校验,实现对微服

微服务中基于Spring Boot的maven分布式项目框架的搭建

项目介绍 这里搭建的是基于 maven 的分布式工程,因为在一个项目中,多个微服务是属于同一个工程,只不过是提供不同的服务而已,再加上 IDEA 是默认一个窗口打开一个项目工程(这点和 eclipse 不同),如果项目大,不用 maven 聚合工程的话,那估计会打开十几个窗口--会崩溃--而且在架构上,也应该使用 maven 分布式工程来搭建微服务架构.这里手把手教大家在 IDEA 中搭建基于 maven 分布式的 Spring Cloud 微服务工程架构. maven分布式工程架构首先来看一下

微服务中使用 OpenJ9 JVM内存占用降低60%!

随着微服务的普及,许多企业踏上微服务之旅. 微服务化后,应用数量可能高一个数量级.一般企业,以前三五个应用能支撑业务,微服务化之后应用数量可能多达几十个.每个微服务往往独立部署,内存的消耗自然也高居不下,以前两台8核16G机器指不定就能跑起来,现两台16核64G还不一定够用,同时由于多套环境的存在加上容器编排工具(如K8s)所需的资源,硬件资源的投入自然是成倍增加. 在 Web 应用开发中,为了降低内存消耗,你是否尝试过: 去除不必要的组件,减少代码体积 更换 Web 容器,如将 Tomcat