使用 MicroProfile 开发微服务

Eclipse MicroProfile 定义了在 Enterprise Java™ 环境中开发微服务应用程序的编程模型。 它是 Eclipse 基金会下的一个开源项目,旨在将微服务引入企业 Java 社区。 MicroProfile 得到了自由的支持。

MicroProfile 定义了一系列规范,用于构建弹性、安全和易于监控的微服务。 更多信息,请参阅 MicroProfile Liberty 功能

限制

  • CDI 在 MicroProfile API 中得到广泛应用,但在打包到企业捆绑存档(EBA)中的 OSGi 网络应用程序中,Liberty 不支持 CDI。 相反,将使用 MicroProfile 的应用程序打包到网络应用程序存档(WAR)或企业应用程序存档(EAR)中。
  • MicroProfile 容错 旨在管理对其他服务的调用。 1.0 它并非旨在管理事务上下文中资源的更新。 CICS® 不应在注释为,,, 或 的方法中更新资源。 @Bulkhead @CircuitBreaker @Fallback @Timeout @Retry CICS 即使使用了 JTA,也不能保证在出现异常时恢复这些更新。
  • 在 Liberty JVM 服务器的 server.xml 中启用功能部件 mpJwt-1.0 时,必须使用 JWT 不记名令牌来完成所有认证。 要使用任何其他形式的认证,必须使用单独的 Liberty JVM 服务器。

CICS Liberty JVM 服务器中的服务体系结构

整体式架构

整体式体系结构在单个单元中实现应用程序。 在内部,逻辑可以是模块化的,但在外部,应用程序要么完全可用,要么根本不可用。 与微服务相比, Monoliths 表现出色,在管理安全性和事务上下文时不太复杂。 缩放单数涉及添加整个应用程序的实例,无法缩放单个部件。
图 1。 整体式架构
整体式体系结构在单个单元中实现应用程序。 在内部,逻辑可以是模块化的,但在外部,应用程序要么完全可用,要么根本不可用。

支持服务

支持服务允许后端数据和程序与主应用程序分离。 通过将数据和程序分离为单独的应用程序,使用平台无关的通信方法(例如 HTTP、套接字、消息队列等)来调用它们。 将一些责任交给这些服务,而不是包含与这些源进行通信的所有逻辑的主应用程序。

在 CICS中, z/OS® Connect 用于通过 REST API 将 CICS 程序公开为支持服务。 在此示例中,应用程序使用 JDBC 与数据库进行通信。 SMTP用于发送电子邮件, HTTP 用于通过 z/OS 调用 CICS。

图 2。 支持服务
支持服务允许在应用程序与应用程序资源之间进行分隔。 可以公开服务,以便轻松访问内部和外部服务,而不是将所有应用程序逻辑包含在单个单元中

托管服务

服务在 CICS 中托管,以进一步将主应用程序与各种组件分离。 与支持服务类似,更多功能通过 CICS Web Service 在 CICS 中公开,或者在使用 servlet , JAX-RS 和 JAX-WS 等技术的应用程序的 CICS Liberty 中公开。

JAX-RS 是用于创建 RESTful Web Service 的常用技术, JAX-WS 用于创建面向远程过程调用 (RPC) 的 Web Service。
图 3。 托管服务
托管服务在中央核心中具有应用程序的多个部分,这意味着它们由自己的可调用服务控制。
注: 对于微服务中的通信, REST 和 RPC 都是同等有效的选项。 REST 专注于资源管理。 RPC 专注于操作。 微服务体系结构不要求 REST , RPC 或任何其他技术。

微服务

完整的微服务架构是一个相互连接的隔离服务网络,没有单一的中心点,不过可以有专用的入口点。 服务可以根据需要相互通信。 缩放微服务涉及添加需要缩放的部件的实例。 微服务比单一服务更能抵御故障。
图 4: 微服务
完整的微服务架构是一个相互连接的隔离服务网络,没有单一的中心点,不过可以有专用的入口点。

在 CICS 中缩放服务

根据区域拓扑和设置,可以在 CICS中以多种方式扩展服务。 微服务通常隔离在单个容器中。 在 CICS中,可以在区域或 JVM 服务器中隔离服务或服务集。 可通过运行多个托管同一服务或一组服务的 CICS 区域来实现缩放。 您还可以通过增加线程数来扩展 JVM 服务器。

保护微服务

在可能的情况下,应使微服务脱离公共网络。 API 网关可用于提供对微服务的受控访问。 MicroProfile 提供了一种使用基于开放 ID 连接(OIDC)的 JSON Web 标记(JWT)的方法,用于微服务端点的基于角色的访问控制(RBAC)。 安全性令牌提供用户身份在不同服务之间的轻量级可互操作传播。

MicroProfile JWT 身份验证 提供基于 JWT 承载令牌的用户身份验证和授权功能。 1.0 可以将令牌注入到服务代码中,并用于在微服务网络中传播身份。 可以手动传播 JWT,方法是在向外请求的授权 HTTP 标头中加入 JWT 作为承载令牌。 或者,Liberty 可以通过在 server.xml 中配置 webTarget 元素,例如配置 authnToken 来自动传播 JWT:
<webTarget uri="http://microservice.example.ibm.com/protected/*" authnToken="mpjwt" />
重要信息: JWT 身份不会自动映射到用户注册表,并且不会传播到 CICS 任务用户标识。 要启用身份映射,请将 mapToUserRegistry=”true” 配置属性添加到 server.xml中的 <mpJwt> 元素。
有关在 Liberty 中配置 MicroProfile JWT 身份验证的更多信息,请参阅。

微服务中的数据一致性

微服务无法轻松利用分布式事务。 而是使用备用事务策略,例如 saga 模式,在此模式中,在服务中更新后发布事件。 例如,如果服务 A 和服务 B 都具有应该同时发生的更新,那么将发生以下顺序:
  1. 处于暂挂状态的更新
  2. A 向 B 发送消息
  3. B 更新进入完整状态
  4. B 向 A 发送消息
  5. 进入完整状态的更新

何时使用微服务

在可以将应用程序解构为更小,隔离的服务的情况下,最好应用微服务。 微服务支持受控扩展,独立部署和更自主的开发。 微服务的架构会产生额外的复杂性,尤其是在部署和数据一致性方面。 与在内存中调用相比, HTTP进行通信需要更高的性能成本。 通过允许组件单独扩展,可以提高组件对故障的弹性。 在管理微服务架构时,监控解决方案对于帮助诊断不健康服务变得更为重要。