如果我使用Java进行编码,我可以在我的REST API中使用JaxRS,并在服务器到服务器之间进行简单的RPC设置。
我可以(大致)做到以下几点:
创建界面:
public interface UsersApi {
@Path("/users")
@GET
public List<User> getUsers();
}
创建该接口的具体实现,将其添加为我的服务器代码中的路由。
对于服务器端客户端,我可以创建一个JaxRS客户端,只知道我需要连接的接口/模型和端点:
UsersApi usersApi = JAXRSClientFactory.create("localhost:8080", UsersApi.class)
图书馆代码将为我完成所有连接并返回UsersApi
的代理,我可以在其上调用getUsers()
方法。
我希望在Scala中具有相同的简单性。由于Scala是一种JVM语言,我可以使用JaxRS,但是序列化程序提供程序是基于运行时的,它与Scala编译时类型不兼容。我可以对我使用的类型以及如何使用它们做出让步 - 我不是用Java,所以我不想在Scala中使用。
我可以使用不同的序列化技术,但这意味着我的非服务器端客户端会很困难。
最终,我的问题是,我如何获得我在上面用Java for Scala的REST API的相同设置,最小的样板...库是否已经存在 - 或者我是否必须自己创建一个?
答案 0 :(得分:1)
想到两个候选系统:
“借助gRPC,mu可以在Scala程序中组合RPC协议,服务和客户端。”
“ Autowire是一对宏,允许您在Scala系统之间执行类型安全,无反射的RPC。Autowire允许您编写类型安全的Ajax / RPC调用……”
答案 1 :(得分:0)
很抱歉延迟了,但是,我将回答这个问题,以帮助那些同样知道的人。 ;)
用于Scala的HTTP服务器数量很少,但模板很少,但是大多数与Java HTTP服务器(例如JAX-RS)有很大的不同,并且大多数使用的代码甚至比Java少。我要在这里列出其中一些。
基于Akka Streams,Akka HTTP提供了一个简单的DSL来创建REST端点:
def route =
pathPrefix("users") {
get {
def eventualUsers: Future[List[User]] = _
onSuccess(eventualUsers) { users =>
complete(users)
}
}
}
由于Akka HTTP是基于Akka流构建的,因此它需要非阻塞调用才能不阻塞默认调度程序。
受Sinatra的启发,Finatra是由Twitter创建的HTTP和Thrift服务器。它建立在Finagle(也是一个Twitter库)的顶部。
我认为这是从Scala开始的好方法。由于它是一种“类似于Java”的库,因此在生产之前不需要高级FP概念。
class ExampleController @Inject()(exampleService: ExampleService) extends Controller {
get("/users") { request: Request =>
def eventualUsers: Future[List[User]] = _
eventualUsers
}
由于Finatra是基于Finagle构建的,因此它也需要无阻塞调用,并希望您返回Future
。
Http4s也是一个很棒的库,它建立在fs2上并使用cats。这是一个纯功能性的HTTP库:
val userService = HttpService[IO] {
case GET -> Root / "users" =>
def eventualUsers: IO[List[User]] = _
Ok(eventualUsers)
}
尽管它使用纯FP概念,但是即使您是初学者,它的DSL也非常令人愉快。它还需要非阻塞调用。
Finch也是一个Twitter库,也是基于Finagle构建的,它使用纯FP概念来帮助您使用其DSL构建简单的REST api:
def hello: Endpoint[Message] = get("users") {
def eventualUsers: Future[List[User]] = _
eventualUsers.map(Ok)
}
这里也是一样,Finch是基于Finagle构建的,因此需要无阻塞调用。
我认为由您决定。它们都是创建REST api的出色且非常成熟的工具,因此,请阅读每个文档,然后看看您更喜欢哪一个。 ;)
[]的