连接 Nacos

为什么是Nacos?

  1. Nacos真的不错,提供了易用的SDK;
  2. 很可能公司已经投资了大量的基于Spring Cloud的产品/实现,而Nacos是Spring Cloud里非常主流的一个服务注册/发现的实现;
  3. Akka的扩展性很好,可非常容易的接入Nacos。

依赖

要使用Fusion提供到服务发现、注册客户端功能,需添加以下依赖:

sbt
libraryDependencies += "com.helloscala.fusion" %% "fusion-discovery-client" % "2.0.6"
Maven
<dependency>
  <groupId>com.helloscala.fusion</groupId>
  <artifactId>fusion-discovery-client_2.12</artifactId>
  <version>2.0.6</version>
</dependency>
Gradle
dependencies {
  compile group: 'com.helloscala.fusion', name: 'fusion-discovery-client_2.12', version: '2.0.6'
}

开始使用

application.conf配置文件中添加以下配置指定Nacos服务端:

fusion.discovery {
  enable = true
  nacos {
    serverAddr = "10.0.5.36:8849"
    namespace = "7bf36554-e291-4789-b5fb-9e515ca58ba0"
    namespace = "fusion.file.app"
    group = "DEFAULT_GROUP"
    timeoutMs = 3000
    serviceName = "fusion-file-app"
  }
}

各配置荐含义为:

  • enable:启用Fusion Discovery功能,默认值为false
  • nacos.serverAddr:Nacos服务地址
  • nacos.namespace:Nacos服务命名空间(可选)
  • nacos.namespace:配置ID
  • nacos.group:配置分组
  • nacos.timeoutMs:获取注册配置时的超时时间(单位:毫秒),默认值为3000
  • nacos.serviceName:注册到Nacos时的服务端,不指定则使用fusion.name配置

获取配置

添加以上配置以后,通常我们可以使用Configuration.fromDiscovery()来自动从Nacos服务获取配置信息。当未启用fusion-discovery或Nacos连接失败时将使用本地配置。

注册服务到Nacos

Fusion提供了Akka扩展:FusionNacos自动实现注册服务到Nacos。使用ActorSystem的实例调用FusionNacos即可,FusionNacos(system)。代码示例如下:

val configuration = Configuration.fromDiscovery()
val system = ActorSystem("name", configuration.underlying)
FusionNacos(system)

更多示例

  test("通过serverAddr地址和namespace直接访问") {
    val configService = NacosServiceFactory.configService("localhost:8848", "5b764784-f457-46fb-96c6-4f086d5d0ce1")
    val confStr = configService.getConfig("fusion.file.app", NacosConstants.DEFAULT_GROUP, 3000)
    confStr should not be empty
    val config = ConfigFactory.parseString(confStr).resolve()
    config.getString("fusion.name") shouldBe "file-local"
  }

  test("通过Properties访问") {
    val props = new Properties()
    props.put("serverAddr", "localhost:8848")
    props.put("namespace", "5b764784-f457-46fb-96c6-4f086d5d0ce1")

    val configService = NacosServiceFactory.configService(props)
    val confStr = configService.getConfig("fusion.file.app", NacosConstants.DEFAULT_GROUP, 3000)
    confStr should not be empty
    ConfigFactory.invalidateCaches()
    val config = ConfigFactory.parseString(confStr).resolve()
    config.getString("fusion.name") shouldBe "file-local"
  }

  test("尝试发现配置,失败读本地配置") {
    val props = sys.props
    props.put("fusion.discovery.enable", "true")
    props.put("fusion.discovery.nacos.serverAddr", "123.206.9.104:8849")
    props.put("fusion.discovery.nacos.namespace", "7bf36554-e291-4789-b5fb-9e515ca58ba0")
    props.put("fusion.discovery.nacos.dataId", "fusion.file.app")
//    props.put("fusion.discovery.nacos.group", NacosConstants.DEFAULT_GROUP)
    val configuration = Configuration.fromDiscovery()
    configuration.getString("fusion.name") shouldBe "file-app"
  }

代码见: NacosServiceFactoryTest.scala