使用Kotlin语言写LeanCloud云后台服务

最近在玩微信小程序,有一部分业务需要部署后端,为了省事我选择了LeanCloud。它有多种语言支持,文档也很完善,能快速搭建服务,正好合适。其后端云引擎支持Node.js、Python、Java、Php四种语言,因为我近来写Android多一些,所以采用了更熟悉的Java。

下载了SDK来一看,是基于maven构建,用法挺简单。但我的云服务需要用到的一个算法是我以前在Android上用Kotlin写的,为了避免重新翻译,我尝试将Kotlin也引入云引擎项目,果然可行。在这记录分享一下。

整个修改分为三步

1. pom配置

增加kotlin的依赖与maven-plugin的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<dependencies>
...
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.0.5</version>
</dependency>
...
</dependencies>

<build>
<plugins>
...
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>1.0.5</version>
<executions>
<execution>
<id>compile</id>
<goals> <goal>compile</goal> </goals>
<configuration>
<sourceDirs>
<sourceDir>${project.basedir}/src/main/kotlin</sourceDir>
</sourceDirs>
</configuration>
</execution>
<execution>
<id>test-compile</id>
<goals> <goal>test-compile</goal> </goals>
<configuration>
<sourceDirs>
<sourceDir>${project.basedir}/src/test/kotlin</sourceDir>
</sourceDirs>
</configuration>
</execution>
</executions>
</plugin>
...
</plugins>
</build>
</project>

所以工程的文件结构是这样的

2. 翻译AppInitListener类为Kotlin语言版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package com.cpiz.loanassistant.cloud

import cn.LeanCloud.LeanEngine
import com.avos.avoscloud.AVOSCloud
import com.avos.avoscloud.internal.impl.JavaRequestSignImplementation
import org.apache.logging.log4j.LogManager
import javax.servlet.ServletContextEvent
import javax.servlet.ServletContextListener
import javax.servlet.annotation.WebListener

@WebListener
class AppInitListener : ServletContextListener {

private val appId = System.getenv("LeanCloud_APP_ID")
private val appKey = System.getenv("LeanCloud_APP_KEY")
private val appMasterKey = System.getenv("LeanCloud_APP_MASTER_KEY")

override fun contextDestroyed(arg0: ServletContextEvent) {
}

override fun contextInitialized(arg0: ServletContextEvent) {
logger.info("LeanEngine app init.")
logger.info("Environment: ${System.getenv("LeanCloud_APP_ENV")}")

// 初始化AVOSCloud,请保证在整个项目中间只初始化一次
LeanEngine.initialize(appId, appKey, appMasterKey)

// 在请求签名中使用masterKey以激活云代码的最高权限
JavaRequestSignImplementation.instance().setUseMasterKey(true)

// 向云引擎注册云函数
// com.cpiz.loanassistant.cloud.CloudKt即为云函数的实现
LeanEngine.register(Class.forName("com.cpiz.loanassistant.cloud.CloudKt"))

if (System.getenv("LeanCloud_APP_ENV") == "development") {
// 打开 debug 日志
AVOSCloud.setDebugLogEnabled(true)

// 如果是开发环境,则设置 AVCloud.callFunction 和 AVCloud.rpcFunction 调用本地云函数实现
// 如果需要本地开发时调用云端云函数实现,则注释掉下面语句。
LeanEngine.setLocalEngineCallEnabled(true)
}
}

companion object {
private val logger = LogManager.getLogger(AppInitListener::class.java)
}
}

3. 开始使用Kotlin写云函数

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.cpiz.loanassistant.cloud

import cn.LeanCloud.EngineFunction
import cn.LeanCloud.EngineFunctionParam
import ......

/**
* 测试云函数
*/
@EngineFunction
fun hello(): String {
return "Hello world!"
}

至此结束,原本的目的只是想让算法那部分直接用Kotlin的实现,但最终做到了使用Kotlin编写整个项目,开发效率可比Java高多了。