龙空技术网

Ktor 一个用Kotlin编写的微服务异步框架

GitHub精选 927

前言:

今天你们对“nettyjetty对比”大致比较注意,各位老铁们都想要剖析一些“nettyjetty对比”的相关资讯。那么小编同时在网摘上搜集了一些有关“nettyjetty对比””的相关知识,希望姐妹们能喜欢,大家快快来了解一下吧!

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

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

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

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

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

Ktor客户端

创建客户端应用程序

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

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

单击新建项目。否则,从主菜单中选择File | NewProject。在New Project向导中,从左侧列表中选择Kotlin Multiplatform 。在右窗格中,指定以下设置: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. 要共享配置,可以创建一个客户端包装类,该类将引擎作为构造函数参数并包含客户端配置。

@Serializabledata class IpResponse(val ip: String)class ApiClient(engine: HttpClientEngine) {    private val httpClient = HttpClient(engine) {        install(ContentNegotiation) {            json()        }    }    suspend fun getIp(): IpResponse = httpClient.get(";).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

开源地址:

标签: #nettyjetty对比