多少个 GWT 服务
Posted
技术标签:
【中文标题】多少个 GWT 服务【英文标题】:How many GWT services 【发布时间】:2012-05-09 00:03:12 【问题描述】:开始一个新的 GWT 应用程序并想知道是否可以从某人的经验中获得一些建议。
我需要通过 RPC 服务获得大量服务器端功能……但我想知道在哪里划清界限。
我可以为每个小调用提供服务,或者我可以提供更少的服务来处理更多的操作。
假设我有客户、供应商和管理服务。我可以为每个类别中的每个功能制作 3 项服务或一项服务。
我注意到许多服务实现不提供编译时帮助,有时很难启动,但它提供了良好的模块化。当我有一个更大的服务时,我没有我所描述的模块化,但我不必解决服务创建问题并减少我的 web.xml 文件中的条目。
使用大量服务是否存在资源问题?确定使用何种粒度级别的最佳实践是什么?
【问题讨论】:
任何评论为什么有人认为这是一个坏问题? 因为你在征求意见;没有完美的答案(每个人都会不同意)。 “使用大量服务是否存在资源问题?”是一个很好的回答问题。但问题的设计模式部分可能更适合programmers.stackexchange.com。 【参考方案1】:在我看来,您应该为“合乎逻辑”的事物创建 rpc 服务。 在你的例子中:
一个用于客户,另一个用于供应商,第三个用于管理员
这样,您可以将多个服务按含义分组,并且您将在 web.xml 文件中维护几行代码(这是一个好消息 :-)
更严重的是,rpc 服务通常是调用数据库内容的包装器,因此,您甚至可以使用单个 web.xml 条目和数千个操作创建单个“MagicBlackBoxRpc”!
但是像你建议的那样为管理操作创建一个单独的 rpc 似乎是件好事。
【讨论】:
这就是我想做的事……但开始对违反最佳实践设计规则感到内疚。我喜欢使用 is-a, has-a 关系,但你需要小心泛化。例如,汽车是物理物体,汽车是金属物体,汽车是交通工具等。一切都是正确的,但是,您将(有时)为错误的决定付出高昂的代价。我很喜欢你的回复。 我很可能会接受您的回复作为我自己的确认,然后继续前进。我会等待更多的先插话。我希望有人会说……“你最好这样做,否则那将会发生”,或者“XYZ 是最不痛苦的道路”【参考方案2】:阅读关于“班级应该有多大?”的一般建议,任何一本不错的软件工程书籍都提供了这些建议。
在我看来:
一个 class= 一个主题(即相关的一组功能或行为)
一个课程不应该处理多个主题。例如:
类 PersonDao -> 主题:数据库和 Java 代码之间的接口。
它不会: - 缓存人员实例 - 自动更新字段(例如,更新字段“lastModified”) - 查找数据库
为什么?
因为所有这些其他事情,都会有其他课程在做!分别: - PersonDao 周围的缓存与信息的有效存储有关,以避免不必要地频繁访问数据库 - 使用 DAO 的服务类负责修改任何需要自动修改的内容。 - 查找数据库是 DataSource 的责任(通常是 Spring 等框架的一部分),您的 Dao 不应该担心这一点。这不是它的主题的一部分。
TDD 就是答案
当您进行 TDD(测试驱动开发)时,对这种分离的需求变得非常清楚。尝试对单个类执行各种操作的不良代码进行 TDD!你甚至不能从一个单元测试开始!所以这是我最后的提示:使用 TDD,它会告诉你一个类应该有多大。
【讨论】:
我非常喜欢您的回复......但是,您确认了我的难题的一部分。我受训使一个对象成为单个名词。我的挑战是定义一个名词的定义有多大。如果我将类定义为细粒度的......我最终会得到很多服务。您帮助我更好地思考了我的问题。感谢您的意见。 我想到了一些可以让我的回答更清楚的事情。对象可以有很大的层次关系......并且 RPC 调用实际上就像在这种关系中的某个地方调用一样。我的问题源于,我是在服务器端创建一个“更高”的层次结构,还是更短。我希望我描述自己没问题。 感谢您的 cmets。根据我的经验,你绝不能把属于不同上下文的东西混在一起。这是因为随着程序的增长,程序会迅速变得复杂,因此您应该使程序的每个单元尽可能简单,同时尽量减少依赖关系。回到 PersonDao ......如果您可能只考虑与一个人相关的其他对象,例如学生数据库中的“注册”对象,那么让这个注册对象只能通过一个人访问是有意义的对象......所以你不会有一个道为每个...... ...单个对象...并且相同的概念适用于任何地方。但是,当您尝试编写单元测试时,您会发现很难编写代码来单独测试对象,这意味着您可能在一个类中承担了太多职责。希望这是有道理的。 但要更具体地了解 GWT 服务(或任何类型的服务),我通常发现根据 UI 的设计将功能组合在一起是有意义的。我发现很多时候,一个屏幕需要加载很多不同的东西来显示给用户,如果你不需要调用很多不同的服务来获取你需要的所有数据,这会容易得多。因此,您可能需要稍作妥协并在单个服务中提供多个功能,以改进客户端代码设计和效率。但这仍然遵循一科一课的原则。【参考方案3】:我认为优化的事情是您可以在一次往返服务器的过程中完成一个结果。我在我的服务对象上有一个特别的方法集合,用于客户端在必须完成某事时发现自己所处的每种情况。您不希望客户端在用户坐在那里等待时连续多次 RPC 到服务器。
REST 使事物正交,但正交性是有代价的:语言中经常使用的动词是不规则的,这是有原因的。在为您的应用程序维护干净的正交结构方面,请确保您的架构设计良好。这就是每个类应该具有与其他类的语义正交的语义。当每个 RPC 调用的语义可以在模式中清晰地表述时,就不会混淆它们的含义,即使它们不是 REST 完全理想的。
【讨论】:
以上是关于多少个 GWT 服务的主要内容,如果未能解决你的问题,请参考以下文章
RabbitMQ - RabbitMQ 可以在单个服务器上处理多少个队列?