Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何为akka http引入端点版本控制_Scala_Refactoring_Versioning_Endpoint_Akka Http - Fatal编程技术网

Scala 如何为akka http引入端点版本控制

Scala 如何为akka http引入端点版本控制,scala,refactoring,versioning,endpoint,akka-http,Scala,Refactoring,Versioning,Endpoint,Akka Http,我在akka http中有5个控制器。每个端点有5个端点(路由)。现在,我需要为它们引入版本控制。所有端点都应以/version1作为前缀。 例如,如果有一个端点xyz,现在它应该是/version1/xyz。 其中一种方法是添加路径前缀,但需要将其添加到每个控制器。 是否有方法将其添加到公共位置,以便在所有端点上显示 我正在使用akka http和scala 您可以创建一个基本路由,它接受像/version1/…这样的路径,并引用没有路径前缀的内部路由 val version1Route =

我在akka http中有5个控制器。每个端点有5个端点(路由)。现在,我需要为它们引入版本控制。所有端点都应以
/version1
作为前缀。 例如,如果有一个端点
xyz
,现在它应该是
/version1/xyz
。 其中一种方法是添加
路径前缀
,但需要将其添加到每个控制器。 是否有方法将其添加到公共位置,以便在所有端点上显示


我正在使用akka http和scala

您可以创建一个基本路由,它接受像
/version1/…
这样的路径,并引用没有路径前缀的内部路由

val version1Route = path("xyz") {
   ...
}
val version2Route = path("xyz") {
   ...
}
val route = pathPrefix("version1") {
   version1Route
} ~ pathPrefix("version2") {
   version2Route
}

间接回答

Aleksey Isachenkov的答案是正确的直接解决方案

另一种方法是将版本控制放在
主机名中,而不是路径中。在源代码管理中获得
路由
值的“version1”后,您可以将签入标记为“version1”,将其部署到生产环境中,然后使用DNS条目将服务名称设置为
version1.myservice.com

然后,一旦需要更新的功能,就更新代码并在源代码管理中将其标记为“version2”。发布此更新版本并使用DNS将名称设置为
version2.myservice.com
,同时保持version1实例运行。这将导致两个活动服务独立运行

这种方法的好处是:

  • 随着新版本的发布,代码不会持续增长
  • 您可以使用日志记录来确定某个版本是否在很长时间内未被使用,然后只需杀死该服务的运行实例即可结束该版本的生命周期
  • 通过让
    production.myservice.com
    指向您想要的服务版本,您可以使用DNS来定义当前的“生产”版本。例如:一旦发布了
    version24.myservice.com
    并对其进行了一段时间的测试,您就可以将
    production.myservice.com
    指针从23更新到24。旧版本可以为任何不想升级的用户保持运行,但任何想要最新版本的用户都可以始终使用“production”