微服务架构,这里的服务是指什么?

12

我正在阅读一些与微服务架构相关的文档(例如通过这个链接),我想知道在这种情况下什么是一个服务。

在IT中,任何东西都可以被称为服务: - 通过Java命令启动的SPRING REST应用程序,例如:

java -jar build/libs/gs-rest-service-0.1.0.jar

  • 它也可以是对应于DDD业务层的类
  • 它可以只是与研究领域有关的内容,如向某人提供某些东西
  • 还有其他许多...(例如Android后台运行服务等)

但在微服务中,这意味着什么?在Java EE堆栈中,有哪些技术/工具用于创建“自行运行的服务”?这仅与网络服务相关吗?


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Manjesh V
7个回答

1
我会从你最后一个问题开始回答 - 这只涉及到Web服务吗? 这是有争议的。我会说,不完全是。它与Web服务相关(但不仅限于此)。

Martin Fowler将微服务描述为SOA的小子集,毕竟微服务就是服务,而SOA是一个非常通用和广泛的术语。

以下是一些微服务的重要方面:

  1. 每个服务(或一组服务)应该有自己的数据存储。
  2. 服务围绕业务需求或功能进行组织。
  3. 每个服务都是独立的,因此可以使用任何语言实现。这导致了团队中的多语言编程文化。
  4. 服务可以从客户端或其他服务接收请求。
  5. 它们通常是事件驱动和异步的,因此扩展变得更容易。
  6. 服务很“笨拙”,因为它们只做一件事情(但它们应该足够自主地监控自己)。
  7. 它们可以在持续部署或交付方面非常有帮助,因为实施到部署周期非常短。
  8. 它们非常小,因此在部署它们时没有太多网络开销。因此,它们可以在几分钟内部署到节点集群中。

    此外,我想强调的是,以上内容不仅适用于微服务。像Google、Netflix和Amazon这样的公司早在术语被创造之前就一直在做类似的事情。


1

没错,这就是微服务模型的美妙之处!例如,当您设计您的maven多模块项目时,您可以开始考虑微服务。低耦合,关注点清晰,甚至可能采用异步通信。当您感到更加自信时,可以将它们提取到应用程序中并在一个主机上运行,下一步是在不同的主机上运行。如何部署它们完全由您决定,这与您想要实现的目标(容错性vs低延迟等)和DevOps资源有关(因为分离得越多,需要的维护就越多)。

关于Java EE堆栈-没有特定之处,只是使用java -jar或应用程序服务器(如Tomcat)运行的常规jar或war文件。

另一个方向是使用像Docker + CoreOs / kubernetes / ...,Mesos + Marathon等工具,但它们适用于微服务中的任何语言/框架。

编辑:

微服务可以使用同步协议(如REST、SOAP)和异步协议(如ActiveMQ、RabbitMQ等消息队列)的组合。如何组合取决于您。以下是我的示例:labs.bench.co/2014/12/10/microservices-at-bench-intro

我想表达的意思是:REST和SOAP是创建微服务的唯一方式吗? - mfrachet
通常情况下,您会同时使用同步协议(如REST、SOAP)和异步协议(如ActiveMQ、RabbitMQ等消息队列)。再次强调,如何组合它们取决于您。以下是我的示例:http://labs.bench.co/2014/12/10/microservices-at-bench-intro - sap1ens
这意味着如果我使用Java编码了两个微型REST服务,我必须创建两个不同的WAR文件放在我的Web服务器上吗?无状态身份验证怎么办?是否可以存在一个前端服务(身份验证管理),用于其他服务中? - mfrachet
是的,两个不同的war文件。关于无状态身份验证 - 这不是关于微服务的问题,而更多地涉及实现。Spring Security支持它,您可以使用类似Tomcat集群支持的东西来共享会话 - https://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html。 - sap1ens
另一种方法是将安全/身份验证中间件实现为库,并在所有微服务中使用它。 - sap1ens
您可以在任何允许数据传输的协议中实现微服务。例如,您可以使用Google协议缓冲区创建一个数据交换协议。通常使用REST和SOAP是因为开发人员可以利用工具的可用性。 - Namphibian

1

我的定义:

微服务是一个独立的、解耦的组件,处理单一的业务问题,并可被其他服务使用。

其他人可能同意或不同意,这个话题有很多有趣的讨论,使它成为软件工程师的一个重要学习点。

从技术角度来看: 你可以在几乎任何技术中创建微服务:Java EE、Java + Spring、Python、Rails、Grails、Node.js等。从我所见,它似乎最常应用于Web应用程序和后端面向服务的生态系统领域。在你引用的文章中,NetFlix模型是一个非常有趣的研究对象,因为你可以深入了解微服务架构的所有元素:服务发现、断路器、监控、动态配置等等。

如果你是Java导向的,你可能想检查一些东西:

Spring Cloud允许你使用一些相同的NetFlix组件,最少的手工编码:http://cloud.spring.io/spring-cloud-netflix/

一个在Github上的实际操作示例(不是我的,但我在学习这个主题时使用过它):https://github.com/ewolff/microservice

从概念角度来看,你的问题暗示了一个臭名昭著的微服务设计困境。对于微服务来说,并没有必然的“正确”粒度级别。关键在于选择一个在业务域内有意义的粒度级别。如果你将微服务实现在非常低的粒度级别上(例如CRUD级别),那么你几乎肯定会得到非常啰嗦的服务,并且你可能需要在其上构建更有意义的组合服务。如果你选择的粒度级别太高,你可能会得到一个更加单块化的应用程序,这可能需要在以后重构为微服务大小的部分。


1
组件的组合怎么样?比如用户管理和账单管理?它们彼此相关,但服务必须解耦。在这种情况下,如何将代码拆分为可行的微服务,以尊重微服务的概念? - mfrachet
1
正如弗朗索瓦链接中提到的,一种技术是实现用户管理和计费管理服务,然后用另一个服务来前置它们的行为以根据需要聚合。 在某种程度上,关于什么是/不是服务的决策取决于应用程序使用情况和个体问题的完整性之间的权衡。这是微服务设计固有的挑战。 - icey502

1
前面的回答都很好。微服务架构只是一种功能分解设计。
我建议您阅读这篇博客文章: 微服务设计模式 从技术角度来看,有很多工具可以使用,例如Docker(将每个微服务作为Linux容器运行)和Kubernetes(用于编排它们作为服务),这里有一个Kubernetes示例

0

微服务是一种软件架构风格,需要对应用程序进行功能分解。

通常情况下,它将一个单块应用程序拆分成多个较小的服务,每个服务都部署在自己的存档中,然后使用标准轻量级通信(例如REST over HTTP或某些异步通信)组合为单个应用程序(当然,在某些时候,微服务是从头开始编写的)。

“微”服务中的“微”并不表示服务中的代码行数,它只表示范围仅限于单个功能

每个服务都是完全自治和全栈的。因此,更改服务实现对其他服务没有影响,因为它们使用定义良好的接口进行通信。这种应用程序有几个优点,但它不是免费的午餐,并需要在NoOps方面付出重大努力。

重要的是要专注于每个服务必须具有以下属性

  • 单一职责 — 每个服务应专注于一个单一的目的,并做到最好。
  • 松耦合 — 服务之间互相了解很少。对一个服务的更改不应要求更改其他服务。服务之间的通信应仅通过公共服务接口进行。
  • 高内聚 — 每个服务将所有相关行为和数据封装在一起。如果我们需要构建一个新功能,所有更改都应局限于一个单一的服务中。

0

服务于微服务就像Java与JavaScript一样。不要这样想。相反,可以将微服务视为以下内容:

  1. 一个小问题域。
  2. 独立构建和部署。
  3. 在自己的进程中运行。
  4. 通过公认的接口进行集成。
  5. 拥有自己的数据存储。

0

微服务基本上是一个自包含的进程,提供独特且单一的业务能力。我们不创建Web微服务、业务逻辑微服务或数据库微服务。

为什么使用微服务?

  • 微服务使我们的系统松耦合,即如果我们需要更新、修复或替换微服务,我们不需要重建整个应用程序,只需更换需要更新的部分。
  • 每个微服务可以使用不同的语言和工具进行构建。微服务通过定义良好的接口进行通信。
  • 通信应该是无状态的,以实现可扩展性(复制微服务)和可靠性(一个副本失败,其他副本可以提供服务)。微服务之间最常见的通信方法是HTTP和消息传递。
  • 每个微服务都应该有自己的数据存储。
  • 小团队能够在设计、Web开发、编码、数据库管理和运营方面进行工作。

来源


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接