天天看點

Nacos SDK for Scala 釋出

脫胎于曆經阿裡巴巴10年生産驗證的内部産品,支援具有數百萬服務的大規模場景,Nacos作為高性能的動态服務發現、配置管理和服務管理平台從2018年開源以來,版本疊代速度很快,已經釋出到1.2.1,已支援企業使用Nacos生産高可用。Nacos社群一直持續投入多語言建設,目前支援主流微服務開發語言及主流服務架構和配置管理架構。

Nacos SDK for Scala 釋出

本文作者是Nacos contributor楊景,他在 2019 對公司産品進行微服務改造時選擇了 Nacos,獨立開發了Nacos SDK for Scala。

歡迎各位感興趣的開發者參與Nacos社群共建:

GitHub:

https://github.com/alibaba/nacos 官網: https://nacos.io

概述:Nacos SDK for Scala

Nacos SDK for Scala 是基于 Nacos Java SDK 的封裝,使得在 Scala 下更易使用。 支援使用 HOCON 做為配置檔案,支援 Akka Discovery 和 Play-WS 。

Nacos SDK for Scala 既可以 将 Nacos 引入 Scala 生态環境,作為微服務應用裡的配置管理和服務發現機制。同時,也可以 将 Scala/Akka/Play 引入 Java 以及 Spring 微服務環境,可以讓你在微服務開發中混合使用 Java/Spring Cloud、Scala 應用、 Akka 應用和 Play 應用。它們都通過 Nacos 作為統一的配置管理和服務發現機制。

HOCON:使用 HOCON 檔案格式的 JVM 語言配置庫。

Akka:一個用于建構高并發、分布式和彈性消息驅動的 Java 和 Scala 應用程式的工具包。可以更輕松地建構強大的反應式、并發和分布式應用程式。

Akka Discovery:可以使用不同技術提供的服務發現。它允許委托端點查找,這樣可以根據環境的不同,通過配置檔案以外的其他方式來配置服務。

Play:基于一個輕量級、無狀态、Web友好的架構,以便使用 Java 和 Scala 輕松建構Web應用程式。Play 基于 Akka 建構,為高可擴充的應用程式提供了可預測和最小的資源消耗(CPU、記憶體、線程)。

Play-WS:Play 架構實作的異步 HTTP 用戶端。

背景

作者是一個 12 年的開發老兵,從 2012 年開始接觸并在工作中使用 Scala。經曆過純 Scala 的業務開發,也經曆過純 Java/Spring 的業務開發, 也用 Scala 寫過 Spring 應用。使用 Scala 寫 Spring 有些問題,在單個服務裡混用 Java 和 Scala 兩種語言造成不懂 Scala 的開發人員難以接手維護, 而且也造成代碼了解和維護困難……。後來,随着微服務的興起,各服務之間通過接口調用,服務内部實作細節被隐藏起來。作者就在思考是否可以将某些服務使用 Scala 開發并和 Java/Spring 的服務互相配合。

再後來在網上發現了阿裡開發的 Nacos,對其作了短暫調研後将其引入作為我們的配置管理和服務發現機制。Nacos 的如下優點很吸引我們:

  • 中文社群:學習和問題解決更友善
  • 可單獨使用:純 Scala 應用也可以使用
  • 支援 Spring Cloud:團隊裡大部分成員都有 Spring 開發經驗

這樣,在 2019 對公司産品進行微服務改造時就選擇了 Nacos,并将消息、任務排程、檔案、日志等工具性質的服務使用 Scala/Akka 實作,其餘業務服務繼續 使用 Spring。Spring 與 Scala 服務之間通過 gRPC 互相調用,檔案服務因需要向公網提供接口,使用 Akka HTTP 提供了 RESTful 服務 (有興趣的讀者可以參閱作者翻譯的

Akka HTTP 中文文檔

)。

Nacos SDK for Scala 釋出

使用了 Nacos 的微服務架構概圖

對于很多 Scala 愛好者,若公司主要使用 Spring 進行業務開發,恰好又使用 Nacos 作為配置管理與服務發現工具。那你可以使用此 SDK 将使用 Scala 實作的服務接入公司的 Spring 生态裡。

快速上手

依賴

要在項目中使用,請添加以下依賴:

libraryDependencies += "me.yangbajing.nacos4s" %% "nacos-client-scala" % "1.2.1"
           

并添加以下依賴源:

resolvers += Resolver.bintrayRepo("helloscala", "maven")           

程式設計使用

Nacos4sNamingService
import yangbajing.nacos4s.client.naming.Nacos4sNamingService
import yangbajing.nacos4s.client.util.Nacos4s
object NamingDemo extends App {
  val namingService: Nacos4sNamingService = Nacos4s.namingService("127.0.0.0:8848", "")
  val status = namingService.getServerStatus
  assert(status == "UP")
}
Nacos4sConfigService
import yangbajing.nacos4s.client.config.Nacos4sConfigService
import yangbajing.nacos4s.client.util.Nacos4s
object ConfigDemo extends App {
  val configService: Nacos4sConfigService = Nacos4s.configService("127.0.0.0:8848", "")
  val status = configService.getServerStatus
  assert(status == "UP")
}           

HOCON 配置

Nacos4s 支援使用 HOCON 作為配置檔案。application.conf :

nacos4s.client {
  naming {
    serverAddr = "127.0.0.1:8848"
    namespace = ""
    autoRegisterInstance = on # true
    serviceName = "me.yangbajing.nacos4s"
    ip = "127.0.0.1"
    port = 9999
  }
  config {
    serverAddr = "127.0.0.1:8848"
    namespace = ""
  }
}           

代碼

val configService = Nacos4s.configService(ConfigFactory.load().getConfig("nacos4s.client.config"))
val namingService = Nacos4s.namingService(ConfigFactory.load().getConfig("nacos4s.client.config"))           

服務自動注冊

在使用配置初始化 Nacos4sNamingService 時設定 autoRegisterInstance = on 可自動将服務注冊到 Nacos。

完整文檔請通路:Nacos SDK for Scala

源碼在:

https://github.com/yangbajing/nacos-sdk-scala

作者資訊

楊景,熟悉Java、Scala/Akka,熟悉并發程式設計,了解Spring應用架構,擅長分布式軟體和大資料應用開發,對領域驅動設計與反應式系統設計有一定認識。在公司産品進行微服務改造過程中選用了 Nacos 并向社群貢獻 nacos-sdk-scala 用戶端以便提供 Scala 生态支援。大家可以在我的個人部落格或知乎專欄上與我交流:

人個首頁:

https://www.yangbajing.me

知乎專欄:

https://zhuanlan.zhihu.com/yangbajing