類似SpringCloud的vlingo平臺是一套事件驅動的微服務工具

banq發表於2019-01-05

使用開源(OSS)vlingo/platform實現分散式,併發,被動,事件驅動和微服務架構的簡化。與領域驅動設計一起,這是商業戰略和現代技術相遇的十字路口。這意味著當您構建有界上下文時,vlingo/platform不會妨礙您。相反,vlingo/platform有助於您的核心業務模型的明確和流暢的語言表達。結合簡化的多核支援,您的團隊將獲得一個功能強大的工具箱,其中包含支援創新的多功能元件。

vlingo/actors
1973年,Carl Hewitt博士及其同事制定了Actor模型。近年來,物件導向的發明者Alan Kay表示,Actor模型更多地保留了他認為的重要物件思想。
vlingo/actors工具包是Actor模型的實現。Actor模型背後的思想是強大的。該工具包在設計上是型別安全的,並且服務於特定於領域的介面定義和實現:

類似SpringCloud的vlingo平臺是一套事件驅動的微服務工具

工作原理:

  • 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

相關文章