【问题标题】:What is a Java MicroService什么是 Java 微服务
【发布时间】:2016-02-14 07:29:03
【问题描述】:

我一直在网上搜索,但我对 Java 微服务到底是什么有点困惑。我的意思是我知道什么是 Web 服务,并且我告诉我每个 wiki 都有以下微服务:

在计算领域,微服务是一种软件架构风格,其中复杂的应用程序由小型、独立的进程组成,这些进程使用与语言无关的 API 相互通信。

微服务的属性是:

微服务架构的属性:

这是一种架构服务易于替换服务 围绕能力进行组织,例如用户界面前端, 推荐、物流、计费等服务可落地 使用不同的编程语言、数据库、硬件和 软件环境,取决于最适合的架构是 对称而非分层(生产者 - 消费者)

但我需要一个具体的 Java 示例来了解如何制作微服务。有没有人可以提供一个例子?

【问题讨论】:

  • 试着想象一下 Unix 操作系统是如何工作的。有一个内核是控制一切的主要进程。但是使操作系统真正做任何事情的一切都是构成系统的所有小程序。有一个单独的小程序,运行系统的各个方面。
  • 这是一个很好的类比,但在 java web 代码中,你会说微服务可以是 api 调用吗?假设我有一个 Web 服务来获取用户帐户,然后我有另一个“微服务”Web api 来获取用户帐户的地址和电话号码并将其返回给第一个呼叫,这算作微服务吗?跨度>
  • 我会这么说。任何在后台等待给予指示的东西,否则保持安静,将符合条件。只要不是主线程的一部分,不用的时候就占用内存。

标签: java microservices


【解决方案1】:

微服务就像它的名字所暗示的那样。这是一个执行非常简单功能的小型服务。

所以是的,就代码而言,您可能正在查看 REST 服务。请注意,任何其他 API 样式都可以使用。它不一定是 REST,但它必须是语言无关才能让您获得所有好处。

但想法远不止于此。它背后的想法是它们非常专业,并且没有附加的大型业务工作流程。例如,如果您有一项服务可以处理付款,然后写入审核日志,然后通知客户。我不会把它算作微服务。编写审计日志,这可能是一个微服务,也通知客户,处理信用卡。您的系统将通过调用 3 个必要的微服务来协调该业务工作流程(上述 3 个步骤)。所以你的系统是一个协调器,你不用担心实现业务功能。

微服务不会想太多,他们只是按照他们说的去做,但他们做的很快。

简而言之。拿一个很简单的业务功能,前面放一个REST API。你有一个微服务。

微服务有几个有趣的属性

  1. 它们可以独立部署。这很好,因为您可以部署应用的各个部分,而无需一次性关闭所有内容。
  2. 他们可以在自己的筒仓中运行。因此,如果您有一个非常需要内存的微服务,则可以将其部署在单独的服务器上,这样就不会影响系统的其余部分。
  3. 他们可以使用不同的技术。你可能有 Java 中的微服务,有些在 .Net 上
  4. 他们检查依赖关系。当开发人员一起生活时,他们倾向于将依赖关系从一个组件转移到下一个组件。在这里你不能。

但您也应该考虑一些缺点

  1. 在所有这些调用中保持一致的事务要困难得多。如果需要回滚,则需要 JTA 来回滚所有 REST 调用。根据我的经验,这可能会很痛苦并且表现不佳。

  2. 如果您没有一致的日志记录和一致的事务 ID,则通过系统跟踪事务以进行故障排除可能非常困难

  3. 如果由于部署可能产生副作用而导致地面不断变化,则可能很难找到引入缺陷的位置。

  4. 显然,所有这些 REST 调用叠加起来会非常昂贵。我不一定要谈论传输,因为您的所有微服务很可能都位于同一个数据中心。但是每次通过网络拨打电话时,您都必须对数据进行编组/解组,这可能会很快导致 CPU 成本高昂。

【讨论】:

  • @Gimby 够公平的。尽管“微”确实意味着较小的服务(从功能的角度来看,而不是代码中的实际大小),但这就是我试图提出的观点。除了提到一个典型的实现是使用 REST 之外,我没有说它与 REST 相关联。这得到了martinfowler.com/articles/microservices.html 第二段的支持。这不是一个约束,只是一个典型的使用。
  • 添加了更明确的细节
【解决方案2】:

你可以检查这个: https://spring.io/blog/2015/01/20/microservice-registration-and-discovery-with-spring-cloud-and-netflix-s-eureka

此示例基于以下服务:

Netflix 尤里卡:

Eureka 是一种基于 REST(代表性状态传输)的服务,主要用于 AWS 云中,用于定位服务,以实现中间层服务器的负载平衡和故障转移。

Eureka 只是一个服务注册中心,包含所有已启动的服务实例服务器名和端口详细信息。

Netflix Zuul:

Zuul 是一种边缘服务,可提供动态路由、监控、弹性、安全性等。

它是微服务客户端的端点。所有其他服务实例都被保护在安全盒中,而 Zuul 暴露给拦截所有客户端请求的客户端。

Netflix 功能区:

Ribbon 是一个带有内置软件负载平衡器的进程间通信(远程过程调用)库。主要使用模型涉及具有各种序列化方案支持的 REST 调用。

Ribbon 与 Zuul 协同工作,在 N 个微服务实例运行时,使用大量算法来选出性能最佳的服务节点来处理请求。

简单来说,Zuul 拦截客户端请求,并根据请求 URL Zuul 通过使用 Eureka 服务发现找到微服务实例的 ip 和端口。 Ribbon 选出最好的服务节点来服务请求,然后从 Zuul 请求被路由到各自的微服务实例。

从我的项目角度来看的优势:

我们可以根据网络流量添加或删除“N”个服务节点。

【讨论】:

    【解决方案3】:

    以下是一些用 Java 编写的微服务的具体示例。这些微服务在设计上具有教育意义,因此希望这意味着您应该能够跟进。

    不建议从头开始编写 Java 微服务,因为有很多框架可以加速您的开发。用于微服务开发的两个最流行的 Java 框架是 Spring Boot 和 Dropwizard。

    feed3 project 使用 Dropwizard 实现了一个基本的多语言持久新闻提要微服务。

    feed8 project 使用 Spring Boot 实现相同功能的相同微服务。

    甚至还有一个Spring Boot vs Dropwizard article 可以分析差异。

    【讨论】:

      猜你喜欢
      • 2016-04-26
      • 2020-08-24
      • 2021-03-18
      • 2015-06-17
      • 1970-01-01
      • 2019-03-28
      • 2018-01-09
      • 2019-07-16
      • 2016-11-25
      相关资源
      最近更新 更多