如何使用 AKKA-HTTP、spray-json、oauth2 和 slick 优化 scala REST api?

     2023-04-12     52

关键词:

【中文标题】如何使用 AKKA-HTTP、spray-json、oauth2 和 slick 优化 scala REST api?【英文标题】:How to optimize scala REST api using AKKA-HTTP, spray-json, oauth2 and slick? 【发布时间】:2017-01-31 11:11:31 【问题描述】:

我使用AKKA-HTTPspray-jsonSlick 在scala 中创建了一个REST api。对于路由授权,我使用了oauth2

DAO 检索数据(使用普通 SQL):

def getAllNotes: Future[Seq[UserEntity]] = 
    implicit val getUserResult = GetResult(r => UserEntity(r.<<, r.<<, r.<<, r.<<, r.<<, r.<<))
    query(s"select id, email, password,created_at, updated_at, deleted_at from users", getUserResult)

DAO 检索数据(Slick Table):

def getAll(): Future[Seq[A]] = 
    db.run(tableQ.result)

下面是路由部分:

val route: Route = pathPrefix("auth") 
    get 
        path("tests") 
            complete(userDao.getAll.map(u => u.toList))
         ~
        path("test") 
            complete(userDao.getAllNotes.map(u => u.toList))
         ~
        path("testUsers") 
            baseApi(userDao.getAllNotes)
         ~
        path("users") 
            baseApi(userDao.getAll())
        
    


implicit def baseApi(f: ToResponseMarshallable): Route = 
    authenticateOAuth2Async[AuthInfo[OauthAccount]]("realm", oauth2Authenticator)  auth =>
        pathEndOrSingleSlash 
            complete(f)
        
    

从功能上讲,所有路由都按预期工作,但是当使用 OAUTH2 和 Slick Tables 获取数据时,性能似乎有所下降。

以上路线的各自结果:

1. "users"     => 10 request per second: OAUTH2: YES, Slick Table: YES
2. "testUsers" => 17 request per second: OAUTH2: YES, Slick Table: NO
3. "tests"     => 500 request per second: OAUTH2: NO, Slick Table: YES
4. "test"      => 5593 request per second: OAUTH2: NO, Slick Table: NO

我的问题

如何使用 OAUTH2 和 Slick Table 优化 REST 请求?

如果我在所有情况下都使用 PLAIN SQL 而不是 Slick 表和联接,这会是一种好习惯吗?

【问题讨论】:

【参考方案1】:

似乎启用 Oauth2 的影响最大,但是与在 oauth2Authenticator 上完成的网络/服务调用相比,akka http 增加的开销可以忽略不计。即使以异步方式完成,您仍然需要正确配置执行上下文(好读 Explaining AKKA Thread Pool Execturor Config parameters)。

关于 Slick 部分,您似乎在每个请求上声明了隐式行映射器(可以是类 val 属性)。 查看Compiled Queries 并确保在您的db 连接池配置中分配了足够的jdbc 连接。

无论如何,这个测试的整个概念似乎都不是很有用,应该有最低要求(例如:最少 100 个请求/秒),然后在此基础上开始构建。

【讨论】:

每个请求上的隐式行映射器,你的意思是userDao.getAll.map(u =&gt; u.toList)。任何示例或代码 sn-p 都足以进行分析。 :) 我在getAllNotes 方法中引用了implicit val getUserResult,可以改为在类级别声明。 我替换了隐式,我收到的成就是5926 rps。我如何在getNotes() 中使用编译?我试过 db.run(Compiled(tableQ)) 但这会产生错误 getAllNotes 中,您使用了一个带有字符串和行映射器的query 函数,我假设您在其中使用db.run(sql(plainQuery)) 之类的东西,因为您的查询没有参数,您可以还在类级别将其声明为 val notesQuery=Compile(sql"select .. from users")) 然后在 getAllNotes 中使用 db.run(notesQuery)... 你对Scala中的OAuth2有什么其他的实现思路【参考方案2】:

关于Slick 的部分已被多次回答。最新答案在这里:Cache Slick DBIO Actions

这应该会显着缩短普通 Slick 版本的响应时间。

虽然OAUTH2 无法帮助您:/

【讨论】:

使用 Spray-json 解析简单数组

】使用Spray-json解析简单数组【英文标题】:ParsingasimplearraywithSpray-json【发布时间】:2015-04-1606:55:16【问题描述】:我正在尝试(但失败了)了解spray-json如何将json提要转换为对象。如果我有一个简单的键->值json提要,那么它似... 查看详情

使用 akka-http 模板的新 sbt 应用程序,如何确定解析器并添加 maven Central?

】使用akka-http模板的新sbt应用程序,如何确定解析器并添加mavenCentral?【英文标题】:Newsbtapplicationusingtheakka-httptemplate,howtodetermineresolversandaddmavencentral?【发布时间】:2021-02-1209:32:12【问题描述】:我有一个使用akkahttpg8模板构建... 查看详情

如何将 Akka-HTTP 项目部署到 Ubuntu 服务器?

】如何将Akka-HTTP项目部署到Ubuntu服务器?【英文标题】:HowtodeployAkka-HTTPprojecttoUbuntuServer?【发布时间】:2018-11-2818:25:16【问题描述】:我正在使用sbt-native-packager。我在build.sbt中添加了以下代码enablePlugins(JavaAppPackaging)我在sbtshell... 查看详情

如何优雅地停止必须部署的 akka-http 服务器的参与者系统。

】如何优雅地停止必须部署的akka-http服务器的参与者系统。【英文标题】:Howtostopgracefullytheactorsystemforanakka-httpserverthatmustbedeployed.【发布时间】:2016-02-0213:05:03【问题描述】:我刚刚使用akka-http创建了我的第一个rest服务器。问... 查看详情

使用 Akka-Http 进行身份验证

】使用Akka-Http进行身份验证【英文标题】:AuthenticationwithAkka-Http【发布时间】:2016-05-1103:39:36【问题描述】:我们正在开发一个iOS应用,用户需要使用电子邮件+密码(或手机号码)进行身份验证。我们的后端由几个使用Akka-Http... 查看详情

如何在 spray-json 中表示可选字段?

】如何在spray-json中表示可选字段?【英文标题】:Howtorepresentoptionalfieldsinspray-json?【发布时间】:2012-06-0420:51:02【问题描述】:我的请求中有一个可选字段:caseclassSearchRequest(url:String,nextAt:Option[Date])我的协议是:objectSearchRequestJs... 查看详情

无法使用 spray-json 解组 json HttpEntity

】无法使用spray-json解组jsonHttpEntity【英文标题】:Can\'tunmarshalljsonHttpEntitywithspray-json【发布时间】:2015-09-2601:53:17【问题描述】:我正在尝试仅运行documentation中的简单示例而不进行任何更改:importspray.json.DefaultJsonProtocolimportspray.... 查看详情

使用 spray-json 处理默认值的好方法是啥

】使用spray-json处理默认值的好方法是啥【英文标题】:Whatisagoodwaytohandledefaultvalueswithspray-json使用spray-json处理默认值的好方法是什么【发布时间】:2013-03-2209:05:25【问题描述】:在某些情况下,默认值比案例类中的可选值更有意... 查看详情

当 json 元素不存在时,如何设置 spray-json 以设置 null?

】当json元素不存在时,如何设置spray-json以设置null?【英文标题】:Howsetupspray-jsontosetnullwhenjsonelementisnotpresent?【发布时间】:2015-03-1703:27:03【问题描述】:这里是spray-jsonexample。这是NullOptions特征。问题是当我声明一个案例类时... 查看详情

akka-http 分块响应连接

】akka-http分块响应连接【英文标题】:akka-httpchunkedresponseconcatenation【发布时间】:2016-01-2114:29:18【问题描述】:我正在使用akka-http向发送回分块响应的http服务发出请求。相关代码如下所示:valhttpRequest:HttpRequest=//buildtherequestvalre... 查看详情

Spray-json 和列表编组

】Spray-json和列表编组【英文标题】:spray-jsonandlistmarshalling【发布时间】:2013-07-1801:15:39【问题描述】:我正在使用spray-json将自定义对象列表编组为JSON。我有以下案例类及其JsonProtocol。caseclassElementResponse(name:String,symbol:String,code:... 查看详情

Akka-Http 中的实体是啥?

】Akka-Http中的实体是啥?【英文标题】:WhatisanentityinAkka-Http?Akka-Http中的实体是什么?【发布时间】:2017-02-0110:30:22【问题描述】:我是akka-http的新手,并在scala中构建了一个基本的服务器客户端应用程序。我查看的示例具有对... 查看详情

Spray-json反序列化嵌套对象

】Spray-json反序列化嵌套对象【英文标题】:Spray-jsondeserializingnestedobject【发布时间】:2014-03-0815:06:25【问题描述】:如何在spray-json中正确反序列化嵌套对象?importspray.json._caseclassPerson(name:String)caseclassColor(n:String,r:Int,g:Int,b:Int,p:Pe... 查看详情

spray-json

spray-json是一个轻量级的,简介的和高效的使用Scala实现的json它拥有以下特征:一个简单不可变的模型的json语言元素一个高效的json解析器可选择既紧凑又漂亮的json到string的打印(格式化输出)基于类的自定义对象的(反)序列化(没... 查看详情

akka-http 未在 NewRelic 中显示指标

】akka-http未在NewRelic中显示指标【英文标题】:akka-httpnotshowingmetricsinNewRelic【发布时间】:2016-06-2603:00:34【问题描述】:我正在尝试使用NewRelic监控我的akka-httpRest网络服务应用只有一个GETurl(用akka-http定义)我在plugins.sbt中有如... 查看详情

通过简单的 akka-http 路由测试与演员陷入无限循环

】通过简单的akka-http路由测试与演员陷入无限循环【英文标题】:Stuckininfiniteloopwithsimpleakka-httproutetestwithactors【发布时间】:2021-09-0902:15:03【问题描述】:我有一个简单的示例,其中我有一个调用演员的路由,但是它似乎陷入了... 查看详情

spray-json:序列化一个通用特征

】spray-json:序列化一个通用特征【英文标题】:spray-json:Serializeagenerictrait【发布时间】:2016-06-2220:23:09【问题描述】:spray-json依赖于在T的实例上调用toJson时存在的范围内隐式JsonWriter[T]。假设我有几个具体子类型的特征,每个... 查看详情

Scala,spray-json:通用枚举 json 格式

】Scala,spray-json:通用枚举json格式【英文标题】:Scala,spray-json:universalenumerationjsonformatting【发布时间】:2018-03-1815:22:36【问题描述】:我有这样的模型:两个枚举和一个案例类,其中包含这些枚举类型的两个字段://seelater,whyobj... 查看详情