谷歌的soa架构 - 聚合谷歌的网络用户界面的内容

时间:2012-07-16 19:47:12

标签: javascript design-patterns architecture soa

登录Google后,Google主页会链接到其他多项服务(例如Gmail,Play,Drive)。

Q1)是否有SOA模式描述了他们为每个服务松散地耦合UI的方式,但同时还提供了标准菜单栏,标准外观和单个登录应用程序?

Q2)是否有可用的文档描述了用于链接UI内容的架构?

修改

我已经看过Firebug,看起来菜单栏和应用程序之间存在双向关系。菜单栏有每个应用程序的链接,但每个应用程序也包含菜单栏。

我可以将它与eclipse UI相关联,其中应用程序可以为应用程序菜单做出贡献,但每个菜单都存在于eclipse应用程序的上下文中,该应用程序聚合了所有单独的UI插件。

那么Google如何在用户界面中执行此操作?看起来有一些javascript魔法正在进行,菜单栏被注入每个应用程序。

3 个答案:

答案 0 :(得分:3)

Google使用自己的Closure Library作为UI部分:

  

什么是Closure库?

     

Closure Library是一个广泛的,经过良好测试的模块化版本   跨浏览器的JavaScript库。你可以提供你需要的东西   大量可重用的UI小部件和控件,以及较低级别的小部件和控件   用于DOM操作,服务器通信,动画,数据的实用程序   结构,单元测试,富文本编辑等。

     

[...]

     

谁使用Closure Library?

     

搜索,Gmail,地图,文档,网站,图书,   读者,Blogger,日历,Google +,照片

https://developers.google.com/closure/library/?hl=en

答案 1 :(得分:3)

hawt.io项目有一个有趣的方法:

  

hawtio是高度模块化的,因此它可以准确地发现JVM中的服务,并动态更新控制台以为它们提供接口。

链接为here

答案 2 :(得分:1)

我无法讲述谷歌,但我曾经在做类似事情的网站上工作过。在一个示例中,它是一个大型房地产代理商的网站,在世界各地设有办事处,主页(和其他页面)包括显示特定于该国家/地区的内容的轮播,所有办公室使用相同CMS的不同实例管理自己的内容。

CMS(基于.NET)使用自定义和用户控件(.ascx)文件来呈现最终的aspx页面。这些ascx文件(用于页眉,页脚和轮播),与这些文件相关的所有样式和javascript(根据我们的惯例放入无法操作的文件夹,称为_CSS和_JS)将集中维护,然后复制到所有本地网站

CMS实例 - 特定于一个国家办事处 - 然后将创建自己的页面,但它们都使用中央应用程序提供的这些公共页眉和页脚。

图片的最后一部分是保持所有这些同步,您需要某种代理或服务将这些常见组件传播到所有服务器和CMS实例,以确保它们都使用相同的控件,样式和JavaScript(样式和JavaScript可以集中引用,但自定义用户控件需要在特定CMS的应用程序域中生存,至少对于.NET)。我们使用Repliweb执行此类任务,但我对其细节并不十分熟悉。

从架构的角度来看,我将其视为UI的某种插件架构,因此您将它与Eclipse架构联系起来是正确的。中央CMS是一种抽象类型,提供特定站点实例必须遵守并实现它的接口。

abstract class GoogleSite
{
    Control Header { get; set; }
    Control Footer { get; set; }

    public string Title { get { return "Default title"; } }

    public abstract void ProvideContents();
}

class Gmail: GoogleSite
{
    //still using same header and footer but Title is different
    override public string Title { get { return "Gmail"; } }

    public override void ProvideContents()
    {

    }
}


class GPlus: CentralCMS
{
    //Another CMS not overriding the title but Providing different contents
    public override void ProvideContents()
    {

    }
}