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

如何使用AKKA-HTTP、spray json、oauth2和slick优化scala REST api?,scala,rest,akka-http,slick-3.0,Scala,Rest,Akka Http,Slick 3.0,我使用AKKA-HTTP、spray-json和Slick在scala中创建了一个RESTAPI。对于路由授权,我使用了oauth2 要检索数据的DAO(使用普通SQL): 以下是路由的一部分: val route: Route = pathPrefix("auth") { get { path("tests") { complete(userDao.getAll.map(u => u.toList)) } ~

我使用
AKKA-HTTP
spray-json
Slick
在scala中创建了一个RESTAPI。对于路由授权,我使用了
oauth2

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

以下是路由的一部分:

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表用于获取数据时,性能似乎有所下降

上述路线的结果如下:

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表优化REST请求


如果我在所有情况下都使用普通SQL而不是光滑的表和联接,这是否是一种好的做法?

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

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


在任何情况下,这个测试的整个概念似乎都不是很有用,一个人应该有最低的要求(例如:最小100个请求/秒),然后开始在上面构建

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

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


在任何情况下,这个测试的整个概念似乎都不是很有用,一个人应该有最低的要求(例如:最小100个请求/秒),然后开始在上面构建

关于
Slick
的部分已回答多次。最近的答案如下:

这将大大提高普通
Slick
版本的响应时间


我无法帮助您使用
OAUTH2
,但是://

关于
Slick
的部分已经回答了多次。最近的答案如下:

这将大大提高普通
Slick
版本的响应时间


我无法帮助您使用
OAUTH2
但是:/

在每个请求上使用隐式行映射器,您的意思是
userDao.getAll.map(u=>u.toList)
。任何示例或代码片段都足以进行分析。:)我引用了
getAllNotes
方法中的
implicit val getUserResult
,该方法可以在类级别声明。我替换了implicit,我获得的成绩是
5926 rps
。我如何使用编译的
getNotes()
?我尝试了db.run(Compiled(tableQ)),但在
getAllNotes
中生成了错误。如果使用
query
函数,该函数接受字符串和行映射器,我假设在该函数中使用类似
db.run(sql(plainQuery))
,由于您的查询没有参数,您也可以在类级别将其声明为val notesQuery=Compile(sql“select..from users”)),然后在
getAllNotes
中使用
db.run(notesQuery)
…在每个请求上,您是否有任何其他在ScalaBy中使用隐式行映射器实现OAuth2的想法,您的意思是
userDao.getAll.map(u=>u.toList)
。任何示例或代码片段都足以进行分析。:)我指的是
getAllNotes
中的
implicit val getUserResult
方法,该方法可以在类级别声明。我替换了implicit,得到的结果是
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还有其他实现方法吗
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)
        }
    }
}
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