脱胎于历经阿里巴巴 10 年生产验证的内部产品,支持具有数百万服务的大规模场景,Nacos 作为高性能的动态服务发现、配置管理和服务管理平台从 2018 年开源以来,版本迭代速度很快,已经发布到 1.2.1,已支持企业使用 Nacos 生产高可用。Nacos 社区一直持续投入多语言建设,目前支持主流微服务开发语言及主流服务框架和配置管理框架。
本文作者是 Nacos contributor 杨景,他在 2019 对公司产品进行微服务改造时选择了 Nacos,独立开发了 Nacos SDK for Scala。
欢迎各位感兴趣的开发者参与 Nacos 社区共建:
GitHub:https://github.com/alibaba/nacos
概述: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 的微服务架构概图)
对于很多 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 生态支持。大家可以在我的个人博客或知乎专栏上与我交流: