【问题标题】:Routing in microservices - stuck with basics微服务中的路由 - 坚持基础
【发布时间】:2015-09-06 23:27:01
【问题描述】:

我正在使用 akka-http 构建一个简单的 RESTful 微服务,将数据存储在 cassandra 中。我有 cassandra 部分工作,大部分服务部分除了无法弄清楚路由部分。我理解这个概念,但停留在细节上。这是我无法编译的服务代码。

val routes = {

  pathPrefix("users") {

    get {
      // GET /users
      path(Rest) {
        // Push handling to another context to avoid blocking
        complete {
          val f: Future[List[Users]] = service.getAllUsers()

          f onComplete  {
            case Success(list: List[Users]) => {
              list.toJson()
            }
          f onFailure() => {

            }
          }
        }
      }
    } ~
      // GET /users/{email}
    path(Rest) { email: String =>
      val found: Future[Option[Users]] = service.getByUsersEmail(email)

      complete {
        found onComplete {
          case Success(user: Users) => {
            user.toJson()
          }
        }
      }
    }

UsersService 是 cassandra 的数据服务,所有方法都返回期货。我确实希望所有响应都是 JSON,我认为可以使用喷雾(implicit val jsonFormatUsers = jsonFormat5(Users) 或我拥有的自定义 PersonJsonProtocol)处理,但不确定如何在路由代码中使用它。

在此先感谢,我知道这对你们中的许多人来说相当简单:)

【问题讨论】:

  • 类型不匹配,预期:ToResponseMarshallable,实际单位;但是我确信代码块是不完整的。我需要做什么才能将响应转换为 JSON 并成功完成请求 - 因为我不确定 list.toJason() 是否可以工作。

标签: scala spray akka-http


【解决方案1】:

您实际上并没有在您的完整指令中返回用户列表,而是重新调整单元。 Future 的 onComplete 方法返回 Unit。您说您在范围内定义了 json 格式化程序,我猜您已经在 SprayJsonProtocol 中混合,并且您在范围内有隐式执行上下文。如果是,那么你可以写

complete {
    service.getAllUsers()
}

所有的魔法都会完成。

【讨论】:

  • 希望魔法已经完成,但还没有:(我有隐式 val jsonFormatUsers = jsonFormat5(Users) 在范围内,会这样做吗?我也有一个 PersonJsonProtocol 类,但不确定它是如何实现的使用了。另外,未来的onComplete返回结果是什么,应该是什么类型?抱歉新手问题。
  • trait Service 使用 UsersService 扩展 CassandraSpec { 隐式 val 系统:ActorSystem 隐式 def 执行器:ExecutionContextExecutor 隐式 val jsonFormatUsers = jsonFormat5(Users) val routes = { pathPrefix("users") { get { path(Rest) { 完成 { val f: Future[List[Users]] = service.getAllUsers() f onComplete { case Success(list: List[Users]) => { list.toJson() } f onFailure() => { } } }
  • 我确实有对象 PersonJsonProtocol extends DefaultJsonProtocol {} 具有读写方法,并且它在 Service 类的范围内。但我不确定它是如何应用于用户列表的——它会隐式发生还是我也需要为 List[Users] 提供编组/解组。
  • 你的方法不会返回未来的列表,而是未来的单位。您应该在完整指令中返回 Future[List[User]]。
  • 我的方法确实返回 Future[List[Users]] 和 Future[Option[Users]] 所以这不应该是一个问题。我仍然认为它没有选择 json 编组代码,因为所有喷雾和自定义 json 导入在 Intellij 中都是灰色的,这意味着它们没有被使用。 ` def getAllUsers(): Future[List[Users]] = { usersModel.model.select.where(_ => usersModel.model.email eqs "*").fetch() } def getByUsersEmail(email: String): Future [选项[用户]] = { usersModel.model.select.where(_ => usersModel.model.email eqs email).one() }`
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 1970-01-01
  • 2023-02-03
  • 2021-08-02
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多