类似SpringCloud的vlingo平台是一套事件驱动的微服务工具


使用开源(OSS)vlingo/platform实现分布式,并发,被动,事件驱动和微服务架构的简化。与领域驱动设计一起,这是商业战略和现代技术相遇的十字路口。这意味着当您构建有界上下文时,vlingo/platform不会妨碍您。相反,vlingo/platform有助于您的核心业务模型的明确和流畅的语言表达。结合简化的多核支持,您的团队将获得一个功能强大的工具箱,其中包含支持创新的多功能组件。

vlingo/actors
1973年,Carl Hewitt博士及其同事制定了Actor模型。近年来,面向对象的发明者Alan Kay表示,Actor模型更多地保留了他认为的重要对象思想。
vlingo/actors工具包是Actor模型的实现。Actor模型背后的思想是强大的。该工具包在设计上是类型安全的,并且服务于特定于领域的接口定义和实现:

工作原理:

  • actor在其邮箱中接收消息,并在线程可用时处理一条消息。
  • 从根本上说,actor是非阻挡的,与外界没有任何可变的状态,甚至与其他actor也没有。
  • actor使用可用的线程,并且您不能同时运行比可用核心更多的线程,例如Runtime.getRuntime().availableProcessors()
  • 计算的基本单位通过actor表达。Actor异步发送和接收消息。
  • 当对象创建其他对象时,actor可以创建其他actor。
  • 每个actor都可以指定它将为其接收的下一条消息展示的行为。使用vlingo / actors,这可以通过实现多个类型安全的域特定接口的actor来完成。

vlingo/cluster
vlingo / cluster是一个关键组件,位于vlingo / actors之上,支持可伸缩和容错工具和应用程序的开发。构建vlingo /平台的其他工具几乎总是构建在vlingo / cluster之上。此外,您将在群集中实施和部署服务/应用程序。
除了可扩展的容错之外,vlingo / cluster还提供了群集范围的同步属性。这使群集能够在所有节点之间共享实时和变异操作状态。
如果三个节点中的一个丢失,群集仍将保持法定人数并保持健康。但是,如果两个节点丢失且只有一个节点仍处于运行状态,则仲裁将丢失,并且群集将被视为运行状况不佳。在那种情况下,剩余的一个节点将进入空闲状态并等待一个或多个其他节点返回到活动操作。当发生这种情况时,群集将再次构成法定人数并达到健康状态。虽然许多服务/应用程序集群只需要三个节点以实现最佳使用,但集群可以支持远超过三个节点。然而,由于我们平台的性能和效率,您可能很少需要很多节点。由于我们的效率标准,即使是9节点,21节点或49节点集群也可能被认为是相当大的。

vlingo/http
vlingo / http组件支持在vlingo / cluster和vlingo / actors上运行的反应性,可伸缩和弹性HTTP服务器以及RESTful服务。因此,该组件不是独立运行的,而是在基于微服务的Bounded Context中提供非常轻量级和高性能的HTTP支持。
虽然这并不表明您的服务应该主要基于REST,但用户界面甚至事件流的分发基于REST是很常见的。vlingo / http组件可以快速,简单地将您带到那里。只需浏览一下REST请求映射到Java对象即可理解这一点。
只需几行请求映射和目标处理程序源代码,您就可以完全基于DDD泛在语言获得高性能的RESTful服务设计。

action.user.register.method = POST
action.user.register.uri = /users
action.user.register.to = register(body:sample.user.UserData userData)

action.user.contact.method = PATCH
action.user.contact.uri = /users/{userId}/contact
action.user.contact.to = changeContact(String userId, body:sample.user.ContactData contactData)

代码:

public class UserResource extends ResourceHandler {
  public void register(final UserData userData) {
    final User user =
            User.from(
                    Name.from(userData.nameData.given, userData.nameData.family),
                    Contact.from(userData.contactData.emailAddress, userData.contactData.telephoneNumber));

    repository.save(user);
    
    completes().with(Response.of(Created, headers(of(Location, userLocation(user.id))), serialized(UserData.from(user))));
  }

  public void changeContact(final String userId, final ContactData contactData) {
    final User user = repository.userOf(userId);
    if (user.doesNotExist()) {
      completes().with(Response.of(NotFound, userLocation(userId)));
      return;
    }
   
    final User changedUser = user.withContact(new Contact(contactData.emailAddress, contactData.telephoneNumber));
    
    repository.save(changedUser);
   
    completes().with(Response.of(Ok, serialized(UserData.from(changedUser))));
  }
}

vlingo/directory
件支持服务注册和发现。当一个新的Bounded Context(作为微服务实现)启动时,它会将自己注册到vlingo/directory。
因此,其他有界上下文将发现他们必须与之合作的服务。当vlingo/directory在企业周围广播注册详细信息(包括主机和端口)时,会发生这种情况。

vlingo/auth
为vlingo / platform的各种组件提供安全性。
它支持以下身份验证和授权概念:租户,具有Profiles的用户,组,具有权限和约束的角色。也可能由您创建的任何服务/应用程序使用,但您的组织并不要求将其用作安全标准。

点击标题进入Github