连接 Nacos
为什么是Nacos?
- Nacos真的不错,提供了易用的SDK;
- 很可能公司已经投资了大量的基于Spring Cloud的产品/实现,而Nacos是Spring Cloud里非常主流的一个服务注册/发现的实现;
- 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
:配置IDnacos.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"
}
2.0.6