kotlin与java混合编程(一个用Kotlin编写的微服务异步框架)

《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐是Ktor 是一个用于创建微服务、Web 应用程序等的异步框架。

kotlin与java混合编程(一个用Kotlin编写的微服务异步框架)(1)

Ktor 是一个框架,可以轻松构建连接的应用程序——Web 应用程序、HTTP 服务、移动和浏览器应用程序。现代连接的应用程序需要异步才能为用户提供最佳体验,而 Kotlin 协程提供了非常棒的设施,可以以简单直接的方式完成。Ktor 的目标是为连接的应用程序提供端到端的多平台框架。

原则

无限制

Ktor 框架并没有对项目将要使用的技术施加很多限制——日志记录、模板、消息传递、持久性、序列化、依赖注入等。有时可能需要实现一个简单的接口,但通常它是编写转换或拦截函数的问题。使用允许构建任意管道的统一拦截机制将功能安装到应用程序中。

Ktor 应用程序可以托管在任何支持 Servlet 3.0 API 的 servlet 容器中,例如 Tomcat,或者使用 Netty 或 Jetty 独立运行。可以通过统一的托管 API 添加对其他主机的支持。

Ktor API 主要是使用 lambda 的函数调用。由于 Kotlin DSL 功能,代码看起来是声明性的。应用程序组合完全取决于开发人员的选择——使用函数或类,使用依赖注入框架或在主函数中手动完成。

异步

Ktor 管道机制和 API 正在利用 Kotlin 协程提供易于使用的异步编程模型,而不会使其过于繁琐。所有主机实现都使用异步 I/O 工具来避免线程阻塞。

可测试

Ktor 应用程序可以托管在一个特殊的测试环境中,它在一定程度上模拟了一个 Web 服务器,而无需实际进行任何联网。它提供了一种简单的方法来测试应用程序而无需模拟太多东西,并且在验证应用程序调用时仍然可以获得良好的性能。当然,也可以使用真正的嵌入式 Web 服务器运行集成测试。

Ktor服务端

创建一个新的 Ktor 项目

  • 单击新建项目。否则,从主菜单中选择File | NewProject。
  • 在New Project向导中,从左侧的列表中选择Ktor 。
  • 在右侧窗格中,您可以指定以下设置:

kotlin与java混合编程(一个用Kotlin编写的微服务异步框架)(2)

  • Name:指定项目名称。
  • Location:为您的项目指定一个目录。
  • Build System:选择所需的构建系统。这可以是带有 Kotlin 或 Groovy DSL 或Maven的Gradle
  • Website:指定用于生成包名称的域。
  • Artifact:此字段显示生成的工件名称。
  • Ktor 版本:选择所需的 Ktor 版本。
  • Engine:选择用于运行服务器的引擎。
  • Configuration in: 选择是在代码中还是在 HOCON 文件中指定服务器参数。
  • Add sample code:启用此选项可为下一页添加的插件添加示例代码。

在下一页上,您可以选择一组插件- 提供 Ktor 应用程序常用功能的构建块,例如身份验证、序列化和内容编码、压缩、cookie 支持等。

kotlin与java混合编程(一个用Kotlin编写的微服务异步框架)(3)

现在,让我们只安装路由插件来处理传入的请求。开始在左上角的搜索框中输入routing ,在列表中找到Routing,然后单击Add。

kotlin与java混合编程(一个用Kotlin编写的微服务异步框架)(4)

单击创建并等待 IntelliJ IDEA 生成项目并安装依赖项。

Ktor客户端

创建客户端应用程序

Ktor 包含一个多平台异步 HTTP 客户端,它允许您发出请求和处理响应,使用插件扩展其功能,例如身份验证、json 序列化等。在本教程中,我们将创建一个简单的客户端应用程序来发送请求和接收响应。

为了试用 Ktor 客户端,我们将创建一个 Kotlin/JVM 项目。打开 IntelliJ IDEA,然后按照以下步骤操作:

  • 单击新建项目。否则,从主菜单中选择File | NewProject。
  • 在New Project向导中,从左侧列表中选择Kotlin Multiplatform 。
  • 在右窗格中,指定以下设置:

kotlin与java混合编程(一个用Kotlin编写的微服务异步框架)(5)

  • Name:指定项目名称。
  • Location:为您的项目指定一个目录。
  • Project Template:在JVM组中选择控制台应用程序。
  • Build System:确保选择了Gradle Kotlin。

在下一页上,将Test framework更改为None,单击Finish并等待 IntelliJ IDEA 生成项目并安装依赖项。

测试

添加依赖项

testImplementation("io.ktor:ktor-client-mock:$ktor_version")

用法

共享客户端配置

  • CIO 引擎用于发出请求。
  • 安装Json插件以反序列化传入的 JSON 数据。

要测试这个客户端,它的配置需要与一个测试客户端共享,它使用MockEngine. 要共享配置,可以创建一个客户端包装类,该类将引擎作为构造函数参数并包含客户端配置。

@Serializable data class IpResponse(val ip: String) class ApiClient(engine: HttpClientEngine) { private val httpClient = HttpClient(engine) { install(ContentNegotiation) { json() } } suspend fun getIp(): IpResponse = httpClient.get("https://api.ipify.org/?format=json").body() }

然后可以使用ApiClient如下方式使用CIO引擎创建 HTTP 客户端并发出请求。

fun main() { runBlocking { val client = ApiClient(CIO.create()) val response = client.getIp() println(response.ip) } }

测试客户端

要测试客户端,需要创建一个带有处理程序的MockEngine实例,该处理程序可以检查请求参数并以所需内容(在我们的示例中为 JSON 对象)进行响应。

val mockEngine = MockEngine { request -> respond( content = ByteReadChannel("""{"ip":"127.0.0.1"}"""), status = HttpStatusCode.OK, headers = headersOf(HttpHeaders.ContentType, "application/json") ) }

然后,可以通过 createdMockEngine来初始化ApiClient并做出所需的断言。

class ApiClientTest { @Test fun sampleClientTest() { runBlocking { val mockEngine = MockEngine { request -> respond( content = ByteReadChannel("""{"ip":"127.0.0.1"}"""), status = HttpStatusCode.OK, headers = headersOf(HttpHeaders.ContentType, "application/json") ) } val apiClient = ApiClient(mockEngine) Assert.assertEquals("127.0.0.1", apiClient.getIp().ip) } } }

—END—

开源协议:Apache-2.0 license

开源地址:https://github.com/ktorio/ktor

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页