如何使用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