使用 MicroProfile 开发微服务

Eclipse MicroProfile 定义用于在 Enterprise Java™ 环境中开发微服务应用程序的编程模型。 它是 Eclipse Foundation 下的一个开放式源代码项目,用于将微服务引入 Enterprise Java 社区。 MicroProfile 受 Liberty 支持。

MicroProfile 定义了许多用于构建具有弹性,安全且易于监视的微服务的规范。
表 1. 包含在 Eclipse MicroProfile 1.2 中
规范 描述
JSR 346: Contexts and Dependency Injection for Java EE 1.1 CDI 定义一组服务,用于管理 Enterprise Java 运行时中对象的注入和生命周期。
JSR 339: JAX-RS 2.0: The Java API for RESTful Web Services JAX-RS 是用于 RESTful Web Service 的 Java API。
JSR 353: Java API for JSON Processing JSON-P 是用于处理 JSON 的 Java API。
Eclipse MicroProfile Config 1.1 Config 是用于管理应用程序配置的 Java API 和 SPI。
Eclipse MicroProfile Fault Tolerance 1.0 容错提供了在调用外部服务时应对故障的策略。
Eclipse MicroProfile Health Check 1.0 运行状况检查允许组件向更广泛的系统报告其喜好。
Eclipse MicroProfile Health Metrics 1.0 "运行状况度量" 为应用程序提供了统一的方法来公开监视数据。
Eclipse MicroProfile JWT Propagation 1.0 JWT 传播允许 JSON Web 令牌 (JWT) 用于 Java EE 基于角色的访问控制 (RBAC) 的认证和授权。

限制

  • CDI 在 MicroProfile API 中广泛使用,但是 Liberty 在打包在企业捆绑软件归档 (EBA) 中的 OSGi Web 应用程序中不支持 CDI。 而是将在 Web 应用程序归档 (WAR) 或企业应用程序归档 (EAR) 中使用 MicroProfile 的应用程序打包。
  • MicroProfile Fault Tolerance 1.0 旨在管理对其他服务发出的调用。 它并非旨在管理事务上下文中资源的更新。 不应在注释 @Bulkhead@CircuitBreaker@Fallback@Timeout@Retry的方法中更新 CICS® 资源。 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 提供了一种方法,用于将基于 Open ID Connect (OIDC) 的 JSON Web 令牌 (JWT) 用于微服务端点的基于角色的访问控制 (RBAC)。 安全性令牌提供用户身份在不同服务之间的轻量级可互操作传播。

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

微服务中的数据一致性

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

何时使用微服务

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