该办公室的一个团队正在开发旨在支持销售网站和移动应用程序的网络微服务,每月总订单数少于100 K(不确定其数量低于10 K,但超过10 K)。
他们正在使用NodeJS,Docker和AWS。他们的想法是,每个服务将只有一个或两个端点和自己的DB。
例如,将有一个Tax
服务只获取为Order
对象计算的税款,然后另一个PlaceOrder
服务接收带有Order
对象的POST,可能另一个CheckStatus
服务将返回Order
对象或ID等的当前状态。
这些服务实际上是一个完全独立的NodeJS项目,托管在单独的repo中,由单独的Jenkins项目编译并放入自己的Docker容器中,然后将其部署到自己的服务器(Bean秸秆)上。
然后,每个服务器都为其部署阶段(DEV、QA、INT、STAGE、PROD)获取一个域名,因此对于示例中的两个服务,有10个域名:PHASE.taxService.api.company.com
和PHASE.orderService.api.company.com
。
问题是:这是一种正常的做法吗,你认为这个方案有好处还是有问题。是否有理由选择dev.taxService.api.company.com
或dev.company.com/api/taxService
?
发布于 2017-12-28 10:23:07
更新:这是一个旧的答案,暗示HTTP/1.1。对于HTTP/2,逻辑大致相同,但多路复用除外,如果两端都支持,则允许每个主机拥有一个TCP连接。
这是一个有趣而重要的问题,我很惊讶它没有得到太多的关注。
除了@thexacre的响应之外,您还需要考虑客户端的行为以及它如何选择重用连接。从客户端的角度来看,主机是一个单独的实体,可以向一个HTTP连接( Keep-alive
特性)内的不同路径提供请求。例如,保持活动超时可以是一分钟,但可以在客户端进行配置,并与服务器进行协商。第二个因素是客户端的最大同时连接数,也是可配置的,但通常限制在节省资源上。
尽管如此,您需要查看客户端调用每个端点的频率,以及客户机是否将受益于HTTP连接重用。从客户端的角度来看,单主机+多路径策略似乎更方便,因为它可能选择同时发送多个请求,或者根据是否要节省本地资源(内存和CPU)或尽可能快地检索数据而序列化它们。
另一方面,如果客户端必须处理多个主机名,这意味着它将与每个主机创建单独的HTTP连接;连接重用将是不可能的。
然后是服务器端。如果您正在运行一个微服务体系结构,这意味着您需要一个请求路由器,这是一个潜在的瓶颈。从服务器的角度来看,为逻辑上隔离的端点组设置单独的主机名更为方便:您可以灵活地选择体系结构(microservice与单块)、稍后更改体系结构、迁移(如另一个答案中提到的那样)、可能不需要路由器等等。
总之,我要说的是,如果客户机可以在有限的时间内提出大量请求,而且如果在客户端有效地处理它们是很重要的,那么客户机将受益于较少的主机名,最好只是一个。但是,如果客户机一次只发出几个请求,那么请考虑什么是对您的服务最好的,这更可能是多个主机名。
发布于 2015-03-22 01:39:18
是否有理由选择dev.taxService.api.company.com或dev.company.com/api/taxService?
似乎基本上你的问题归结为是使用子域还是子目录来分离服务比较好。
例如,篱笆两边似乎都有很多人:
Google似乎更喜欢子目录,以下是两个不同服务的例子:
例如,亚马逊似乎更喜欢子域名:
就我个人而言,我更喜欢子域,因为:
https://softwareengineering.stackexchange.com/questions/276906
复制相似问题