代码之家  ›  专栏  ›  技术社区  ›  Slavo

限制RESTful应用程序中的服务调用数

  •  1
  • Slavo  · 技术社区  · 15 年前

    想象一下某种银行应用程序,它有一个创建帐户的屏幕。各 账户 有一个 货币 还有一个 银行 作为财产, 货币 作为一个独立的班级,以及 银行 . 代码可能如下所示:

    public class Account
    {
        public Currency Currency { get; set; }
        public Bank Bank { get; set; }
    }
    
    public class Currency
    {
        public string Code { get; set; }
        public string Name { get; set; }
    }
    
    public class Bank
    {
        public string Name { get; set; }
        public string Country { get; set; }
    }
    

    根据其余的设计原则,应用程序中的每个资源都应该有自己的服务,并且每个服务都应该有能够很好地映射到HTTP谓词的方法。所以在我们的例子中,我们有一个 会计服务 , 通用服务 银行业务 .

    在创建账户的屏幕中,我们有一些界面可以从银行列表中选择银行,并从货币列表中选择货币。假设它是一个Web应用程序,这些列表是下拉列表。这意味着从currencyservice和bankservice分别填充一个下拉列表。这意味着当我们打开创建帐户的屏幕时,我们需要 两个服务电话 两种不同的服务。如果屏幕本身不在页面上,则可能存在 来自同一页的更多服务调用,影响性能 . 在这种应用中,这是正常的吗?如果不是,怎么能避免呢?如何在不休息的情况下修改设计?

    4 回复  |  直到 15 年前
        1
  •  2
  •   Dan Puzey    15 年前

    这是一个体系结构决策,您应该基于系统的大小和复杂性。您的系统越大/越复杂,越有可能受益于不断增加的分离/封装级别(例如,您可能会发现BankService需要比CurrencyService更积极地扩展,单独运行这些服务将允许您这样做)。

    不过,在回答你的问题时,我要指出的是,你应该考虑 高速缓存 这些服务调用并重用结果的结果,而不是为每个页面加载重新调用服务。如果(顾名思义)currencyservice和bankservice的结果不太可能经常更改,您可以一次将它们缓存几分钟或几小时,而不必重复进行这些调用。

    如果您的应用程序很忙(即,如果您认为是每秒点击数而不是每小时点击数),那么这可以在运行时为您节省内存,因为单个服务调用的结果在多个页面请求之间共享(而不是需要单独获取结果集的每个页面)。

        2
  •  2
  •   TomTom    15 年前

    这是正常的,是不可避免的… …除非您创建一个特定的服务,该服务在一次运行中返回特定屏幕的所有数据。

    这是REST方法的缺点之一——基本上,如果您处理对象查询,并且需要X对象的列表,那么就需要X调用。点。

    这意味着其余的设计在这个层次上的可伸缩性有限。

    同样,在一开始,您可以让一个特定的服务在一次调用中返回复杂表单上所需的所有数据。

        3
  •  1
  •   Dwight Gunning    15 年前

    等等,剩下的就是表示资源。

    我认为你不应该对以下内容过于严格:

    根据其余的设计原则,应用程序中的每个资源都应该有自己的服务,并且每个服务都应该有能够很好地映射到HTTP谓词的方法。

    您在浏览器中表示的资源是一个“表单”并包含所有相关信息,这应该是非常好的。

    在定义URL结构时,只需考虑正确的抽象程度。

        4
  •  0
  •   Jan Algermissen    15 年前

    斯拉夫,

    不需要为不同的资源提供不同的服务。一般来说,您只需提供帮助客户实现其目标的视图。如果其中一个观点是综合的“大”观点(资源),包括所有的银行和货币,那就好了。您仍然可以为创作和编辑银行和货币提供细粒度视图(资源)。

    如果银行和货币恰好是由不同的Web应用程序提供的,并且您需要客户机来解析这些引用,那么请记住,HTML页面总是使用内联图像来完成这些操作。在这种情况下,缓存可以大大减少网络调用的数量(银行和货币的列表似乎不太稳定)。

    (见 http://www.nordsc.com/blog/?p=152 )

    例子:

    
    GET /service/account-management
    
    200 Ok
    Content-Type: application/vnd.my.accounting
    <page>
    ...
    <banklist href="http://other.org/service/banklist" type="application/atom+xml" />
    <currencylist href="http://standard.org/currencies" type="application/rss+xml" />
    ...
    </page>
    
    

    对banklist和currencylist的子请求大多数时候都应该从客户机的私有缓存中提供。