美文网首页Kotlin后端开发
利用Ktor+KMongo打造全栈异步非阻塞后端架构

利用Ktor+KMongo打造全栈异步非阻塞后端架构

作者: 蓝不蓝编程 | 来源:发表于2019-04-03 16:43 被阅读0次

    简要介绍

    2017年Spring推出了WebFlux,填补了Java世界没有异步非阻塞架构的尴尬(nodejs正式靠着这个起家的),同时联合响应式数据库(MongoDB、Redis、Apache Cassandra、CouchDB)可以打造后端全栈异步非阻塞架构,其中采用Reactor作为异步执行基础.但是把玩了一段时候后,发现响应式的程序真是让人废啊.如果没有接触的可以看看《响应式编程(Reactive Programming)介绍》. 前一段时间在开发安卓应用时,厌倦了RxJava(类似Reactor)之流的基于数据流的异步操作,忽然发现Kotlin里有协程,这个东东用起来就很顺手了,不用特别把业务处理变成数据流了.
    再往后深入研究,发现Kotlin的后端开发有类似于springboot的Ktor,还有连接mongo数据库的响应式框架Kmongo,这就完美了,哈哈.

    简要代码(详见Demo源代码)

    fun Route.userRoutes() {
    
        val logger: Logger = LoggerFactory.getLogger("UserController")
        val client: CoroutineClient by inject()
    
        val dbName = "demo"
        val collectionName = "users"
    
        route("/users") {
    
            get("/list") {
                val users = client.getDatabase(dbName)
                    .getCollection<User>(collectionName)
                    .find()
                    .toList()
                call.respond(HttpStatusCode.OK, users)
            }
    
            post<CreateUserRequest>("/add") {request ->
                val user = User(userName = request.userName,
                    password = request.password,
                    email = request.email)
                client.getDatabase(dbName)
                    .getCollection<User>(collectionName)
                    .insertOne(user)
                call.respond(HttpStatusCode.OK)
            }
        }
    }
    

    Demo源代码

    https://github.com/cxyzy1/ktor-kmongo-sample

    Demo使用说明

    1. 本地要启动mongo数据库,如果端口不是默认的27017,则需要修改Application.kt中"mongodb://127.0.0.1:27017"的端口
    2. 使用的数据库是demo,集合是users,如果和本地mongo数据库不一致,请修改UserController.kt中定义.
    3. 插入数据
      采用PostMan等工具发送POST请求
      a) 请求地址: http://localhost:8080/users/add
      b) 数据样例:
    {
      "userName" : "jerry",
      "password" : "123456",
      "email" : "test2@gmail.com"
    }
    

    c) 请求头类型为json



    1. 查询数据(类型为GET)
      请求地址: http://localhost:8080/users/list
    2. 对于插入数据和查询数据,也可以直接通过代码中的ApplicationTest的testAddData和testList完成.
    class ApplicationTest {
    
        @Test
        fun testAddData() {
            withTestApplication({ module(testing = true) }) {
                handleRequest(HttpMethod.Post, "/users/add")
                {
                    addHeader(HttpHeaders.ContentType, ContentType.Application.Json.toString())
                    setBody(
                        mapOf(
                            "userName" to "jerry5",
                            "password" to "123456",
                            "email" to "test@gmail.com"
                        ).json
                    )
                }.apply {
                    assertEquals(HttpStatusCode.OK, response.status())
                }
            }
        }
    
        @Test
        fun testList() {
            withTestApplication({ module(testing = true) }) {
                handleRequest(HttpMethod.Get, "/users/list").apply {
                    assertEquals(HttpStatusCode.OK, response.status())
                    System.out.println(response.content)
                }
            }
        }
    }
    

    点击关注专辑,查看最新技术分享
    更多技术总结好文,请关注:「程序园中猿」

    相关文章

      网友评论

        本文标题:利用Ktor+KMongo打造全栈异步非阻塞后端架构

        本文链接:https://www.haomeiwen.com/subject/qzdzbqtx.html