放翁(文初)的一畝三分地

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            210 隨筆 :: 1 文章 :: 320 評論 :: 0 Trackbacks

          #

           

          三.平臺跨的不容易

                 本來這部分內容應該作為很后面的內容,但是由于工作已經作了,也總結了,那么就先寫下來貼一下,也算是個分享吧,這部分內容在網上找了很久都沒有,所以也算是不錯的一個實踐。

                 ISV有幾家接了上來,有用PHP的,有.net的,這時候ASF框架的WebService繼功能測試,性能測試,安全性測試進入了一個新的測試階段,兼容性測試。由于ISV的技術力量參差不齊,所以我們需要包辦實現所有語言的客戶端調用Demo的工作,因此對我這個做ASF的人來說,又要懂得各個語言的客戶端調用以及配置,幸好還有一個ISV Support部門也做一些這樣的工作,但是由于都是新手,也沒有太多的指望。

                 WebService之所以能夠被認為是SOA最行之有效的技術手段,主要還是因為其通過wsdl規范以xml作為數據和操作請求描述的載體,基于SOAP協議在http或者smtp上傳輸,實現業務邏輯交互與實現語言及平臺的無關性,達到跨平臺交互的效果。然而作為協議,往往來說是制定了規范性的框架,但是框架內的細節實現,不同的廠商,平臺,開發語言,開源框架都會有不同的實現方式,因此也造成了WebService客戶端解析Soap數據包兼容性的問題。這個問題在普通的接口中不容易出現,只是在調用接口返回數據類型為對象數組的時候出現。

          首先出現在Java平臺的兩個比較通用的開源WebService框架上:axis2,xfire。(cxf暫時還沒有去做測試)?,F象:axis2xfire的兩種客戶端都無法正常解析ASF返回的數組對象。例如返回的是Account對象,Accountid,namevalue三個屬性。模擬返回2Account對象,結果axis2客戶端獲得一個數組,內部有一個Account對象,不過三個屬性都是沒有被初始化。xfire客戶端獲得一個數組,內部有兩個Account對象,同樣屬性都沒有被初始化。跟蹤兩個客戶端源碼并結合返回的Soap消息分析,得到了問題的原因。

                 SOAP返回的包體如下:

          <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

             <soapenv:Body>

                <_ns_:getUserAccountArr2Response xmlns:_ns_="http://webservice.asf.xplatform.alisoft.com">

                   <return xmlns="http://webservice.asf.xplatform.alisoft.com">

                      <Account xmlns=””>

                         <accountId>11</accountId>

                         <isDeleted>false</isDeleted>

                         <accountBalance>100.23</accountBalance>

                      </Account>

                      <Account xmlns=””>

                         <accountId>111</accountId>

                         <isDeleted>false</isDeleted>

                         <accountBalance>111.23</accountBalance>

                      </Account>

                   </return>

                </_ns_:getUserAccountArr2Response>

             </soapenv:Body>

          </soapenv:Envelope>

          先來解釋Axis2的問題,Axis2客戶端在解析此包體的時候,首先檢查return標簽,然后根據wsdl中的描述確認內部數組對象類型為Account,然后循環獲取結果集構造對象,但是按照axis2的內部邏輯處理正常的情況,應該沒有Account這層標簽,直接是多個結構體組裝而成,由于多了Account這層外圍標簽,導致解析第一個對象就出現問題,因此,就出現了上面描述的結果。此時有些懷疑是否是ASF框架在返回SOAP的時候沒有遵循WSDL的規范,但是沒有檢驗過xfire也不能確定是否是沒有符合規范而造成的。

          在來解釋一下XFire客戶端調用問題的原因。同樣跟蹤了XFire的客戶端代碼,發現問題主要是出在最后給對象獲取屬性值的操作上。首先XFire客戶端啟動時會根據本地的接口包或者對象包路徑來反轉成為namingspace然后和屬性名稱一起生成QName緩存在本地,作為屬性對象。然后當獲得了返回SOAP消息包體的時候,根據這些QName去獲取屬性的內容,但是可以從上面描述的SOAP返回的內容來看,Accountnamingspace丟失了,導致后面各個屬性的namingspace也都丟失了。看了一下ASF在返回SOAP的代碼,的卻在構造SOAP返回包的時候無法獲得對象的namingspace,只有它的上級return類型有namingspace,那么如何解決呢,轉念一想,其實這也是一種規范,wsdl的生成工具大部分都遵循這種包反轉作為namingspace的策略,因此在構造返回包體的時候采取了這個策略來填充SOAP包,XFire客戶端正常。(后話,萬一遇到一些和我一樣自己喜歡修改wsdl的人,那么xfire就未必能夠正常解析這類服務了)。從這兒也驗證了ASF對于WSDL的消息包返回規范是正確的,也就也證明了axis2客戶端的一個缺陷,因此在java平臺暫時不建議客戶使用axis2,同時axis2的客戶端友好度遠遠低于xfire,不過axis2的優勢在于配置靈活以及可插入性(這也是ASF為什么集成axis2作為默認的webservice發布框架的原因,后續blog會回顧其他幾個測試的歷程)

          這還是開始,由于都是開源框架,所以調試和檢測相對來說還比較方便。接著測試部就提出在用.net客戶端調用返回對象數組出現問題,問題和XFire最早一樣。當時我就很肯定地就是應該問題出在解析那些屬性上。說實話,第一次接觸.net,什么都不會,裝了個vs 2005就開始搗鼓,不過.net真是傻瓜工具,調用webservice相當簡單,就只需要建立一個web reference,其中web reference就指向一個wsdl地址,那么.net就自動替你動態生成好client了,然后就像普通的對象調用一樣,直接可以操作此服務(不過ASFwebservice的發布和引用也已經做的這么傻瓜了^_^)。簡單是把雙刃劍,容易上手,但是容易養成不求甚解的習慣,工作到現在,要不是開發框架,我根本不會去管wsdl中哪個元素是什么用處,工具生成好了,用就罷了,只要不出錯。懶倒還是一方面,最痛苦的莫過于沒有辦法看到源碼,只能黑盒測試以及猜測,這時候我覺得java真是好。還問了一個以前的高手朋友,他做了67年的java然后轉到.net上,我說怎么跟蹤.net的源碼,他和我說:“據說.net快要開放源碼了”。#_#|| 我回了一句:“我基本上等不到那天了。”言歸正傳,下面是如何分析.net問題的報告。

          Java&.Net WebService兼容問題

          Java發布的webservice .net客戶端調用的時,數組對象類型返回兼容問題。

          問題描述:

          Java發布的WebServiceJava客戶端調用下都是正常的,但是在.net的客戶端調用下,如果返回的類型是數組對象類型,那么就會發現得到了數組,并且數組內部對象生成,但是對象內部的屬性值無法獲得。

          問題分析:

          wsdl中定義數組對象類型返回有兩種方式:

          1    <xs:complexType name="Account">

                  <xs:sequence>

                      <xs:element minOccurs="0" name="accountBalance" type="xs:double"/>

                      <xs:element minOccurs="0" name="accountId" nillable="true" type="xs:string"/>

                      <xs:element minOccurs="0" name="isDeleted" nillable="true" type="xs:string"/>

                  </xs:sequence>

          </xs:complexType>

              <xs:element name="getUserAccountArrResponse">

                  <xs:complexType>

                      <xs:sequence>

                          <xs:element maxOccurs="unbounded" minOccurs="0" name="return" nillable="true" type="xsd:Account"/>

                      </xs:sequence>

                  </xs:complexType>

              </xs:element>

          2    <xs:element name="getUserAccountArr2Response">

                  <xs:complexType>

                      <xs:sequence>

                          <xs:element minOccurs="0" name="return" nillable="true" type="xsd:ArrayOfAccount"/>

                      </xs:sequence>

                  </xs:complexType>

              </xs:element>

              <xs:complexType name="Account">

                  <xs:sequence>

                      <xs:element minOccurs="0" name="accountBalance" type="xs:double"/>

                      <xs:element minOccurs="0" name="accountId" nillable="true" type="xs:string"/>

                      <xs:element minOccurs="0" name="isDeleted" nillable="true" type="xs:string"/>

                  </xs:sequence>

              </xs:complexType>

                      <xs:complexType name="ArrayOfAccount">

                          <xs:complexContent>

                              <xs:restriction base="soapenc:Array">

                                  <xs:attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:Account[]"></xs:attribute>

                              </xs:restriction>

                          </xs:complexContent>

                      </xs:complexType>   

          配置一的情況:

          有兩種場景出現:

          場景一:

          public interface IAccountService2

          {

                 public Account checkUserAccount(String accountId);

                 public Account[] getUserAccountList(String accountIdBeg,String accountIdEnd);

                 public Account[] getUserAccountArr(String accountIdBeg);

                 public Account[] getUserAccountArr2(String accountIdBeg);

                 public double payForAppOrder(Account account,double fee);

                 public void delAccount(Account account,String name);

                 public int checkUser(String accountId,String accountId1);

          }

          其中接口中所有的返回或者參數對象都和接口定義在同一個包體內,這樣生成wsdl的時候xsdschema就只有一份,那么.net的客戶端數組對象返回問題不存在。

          場景二:

          public interface IAccountService

          {

                 public AccountBean checkUserAccount(String accountId) throws InvocationTargetException;

                 public AccountBean[] getUserAccountList(String accountIdBeg,String accountIdEnd);

                 public AccountBean[] getUserAccountArr(String accountIdBeg);

                 public Account[] getUserAccountArr2(String accountIdBeg);

                 public double payForAppOrder(AccountBean account,double fee);

                 public void delAccount(AccountBean account,String name);

                 public int checkUser(String accountId,String accountId1);

          }

          接口中的返回對象和接口不在一個包內,那么生成的xsdschema就有多個,那么.net的客戶端調用java發布的webservice就存在前面描述的問題。

          因此用同樣的wsdl分別用.netjava發布,通過.net客戶端去調用,前者不存在問題,后者有問題,截獲soap相應報文如下:

          java 返回的soap包:

          <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

             <soapenv:Body>

                <_ns_:getUserAccountArr2Response xmlns:_ns_="http://webservice.asf.xplatform.alisoft.com">

                   <return xmlns="http://webservice.asf.xplatform.alisoft.com">

                      <Account>

                         <accountId>11</accountId>

                         <isDeleted>false</isDeleted>

                         <accountBalance>100.23</accountBalance>

                      </Account>

                      <Account>

                         <accountId>111</accountId>

                         <isDeleted>false</isDeleted>

                         <accountBalance>111.23</accountBalance>

                      </Account>

                   </return>

                </_ns_:getUserAccountArr2Response>

             </soapenv:Body>

          </soapenv:Envelope>

          .net返回的soap包:

          <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

             <soap:Body>

                <getUserAccountArr2Response xmlns="http://webservice.asf.xplatform.alisoft.com">

                   <return>

                      <accountBalance>12.12</accountBalance>

                      <accountId>11</accountId>

                      <isDeleted xsi:nil="true"/>

                   </return>

                   <return>

                      <accountBalance>12.12</accountBalance>

                      <accountId>11</accountId>

                      <isDeleted xsi:nil="true"/>

                   </return>

                </getUserAccountArr2Response>

             </soap:Body>

          </soap:Envelope>

          但就作為wsdl中定義的話,return只有一個內容就是Account數組,java的定義應該比較符合定義內容。

          部分結論:

          也就是說在第一種配置情況下,wsdl中包含一個xsdschema,.net客戶端不存在任何問題。wsdl中存在多個schema的情況下,數組對象無法構造成功,但是對于單個對象返回可以正常解析

          解決方案:

          1.修改服務框架服務端代碼適應.net客戶端(不可行,會導致java的出現問題)

          2.將這種特殊接口的schema中定義的類都放在一個包里(覺得不是很合適)

          3.把對象都序列化然后作為結果返回,個人感覺性能比較低,不過可以真的減小跨平臺的問題。

          配置二的情況:

                 不存在客戶端調用的構造問題,不過需要改造客戶端代碼(其實就是獲得了xml的數據片斷,自己去解析xml的數據來構造客戶端對象)。此類方法在網上也很通用,可以參看www.salesforce.com提供給第三方的API接口介紹,就是類似的。

          C# Example

          private void querySample() 

          {

           QueryResult qr = null;

           binding.QueryOptionsValue = new sforce.QueryOptions();

           binding.QueryOptionsValue.batchSize = 250;

           binding.QueryOptionsValue.batchSizeSpecified = true;

           qr = binding.query("select FirstName, LastName from Contact");

           bool bContinue = true;

           int loopCounter = 0;

           while (bContinue) 

           {

              Console.WriteLine(""nResults Set " + Convert.ToString(loopCounter++) + " - ");

              //process the query results

              for (int i=0;i<qr.records.Length;i++)

              {

              sforce.sObject con = qr.records[i];

              string fName = con.Any[0].InnerText;

              string lName = con.Any[1].InnerText;

              if (fName == null)

                Console.WriteLine("Contact " + (i + 1) + ": " + lName);

              else

                Console.WriteLine("Contact " + (i + 1) + ": " + fName + " " + lName);

              }

              //handle the loop + 1 problem by checking to see if the most recent queryResult

              if (qr.done) 

                bContinue = false;

              else

                qr = binding.queryMore(qr.queryLocator);

              }

              Console.WriteLine(""nQuery succesfully executed.");

              Console.Write(""nHit return to continue...");

              Console.ReadLine();

           } 

          }

          此時,我們的客戶端代碼修改成為:

          原來的代碼:

          jdk2Service.AccountService service5 = new jdk2Service.AccountService();

          jdk2Service.Account[] re = service5.getUserAccountArr("demo");

          jdk2Service.Account re2 = service5.checkUserAccount("test");

          現在的代碼:

          jdkService.AccountService service3 = new jdkService.AccountService();

          jdkService.ArrayOfAccountBean res = service3.getUserAccountArr("tea");

          string name = res.Any[0].FirstChild.InnerText;//獲取了第一個返回對象的第一個屬性值。

          這種模式比較通用在現在的跨平臺的客戶端調用webservice。

          因此考慮AEP接口改造成為這種方式,同時可以給客戶封裝類似的構造函數庫提供給客戶使用。

          結束語:

                 這個報告發給了我們的架構師們以及相關人員,晚上下班到家,收到了老大的郵件,讓我們總架構師向微軟提出這個問題,看是否真的是這樣的情況,能否有好的方法解決。這讓我想起了前一陣子誰說的一句話:“有多少人打過微軟的客戶服務電話反映過情況”。赫赫,我們這就算是反映了,效果么……,覺得求人不如求己,開源好啊^_^

          更多的內容請訪問我的bloghttp://blog.csdn.net/cenwenchu79

          posted @ 2007-11-21 22:16 岑文初 閱讀(1727) | 評論 (2)編輯 收藏

           在路上---基于SCA規范的應用服務框架成長記(二)(連載中...)    文章指數:0  CSDN Blog推出文章指數概念,文章指數是對Blog文章綜合評分后推算出的,綜合評分項分別是該文章的點擊量,回復次數,被網摘收錄數量,文章長度和文章類型;滿分100,每月更新一次。
           二.背上鋪蓋帶上干糧SCA服務框架之路啟程

          記得我在推廣SCA規范的時候,常常和Spring作比較,Spring廣為流傳很大的一點就是在于它的IOC理念,SCA中也很徹底貫徹了這點(這點應該是個趨勢,包括OSGI等等開源框架),但是也正是這個理念,在實際運用當中會帶來困擾。當開發系統越來越大,一個工廠里面的bean組裝復雜度不斷增加,龐大的spring bean factory就好比一個大鍋子,越來越多配置交織在一起,最終模塊與模塊之間無法分割,架構師雖然規劃了很好的目錄結構以及配置文件,但是在運行期的結構依然是耦合性極強,難以分割的業務模塊邏輯團。這樣的系統所面臨的問題就像當初OO要解決的問題一樣,只是上升到了業務級別:業務耦合性強,需求變更適應能力弱,維護成本高,無法剝離較為獨立的業務組件提供復用,模塊與模塊之間牽制性強等。

          SCA規范中描述的元數據就是CompositeComponent,在代碼級別的概念中Component就是Springbean,Composite可以看作Spring bean factory(其實使用Spring也可以實現SCA,只是如果使用factory來作為composite那么可能在性能上和可擴展性上還有一些問題)。在業務級別的設計中Composite就是業務模塊,Component就是業務內部的業務實現邏輯單元,同時引入了ServiceReference的概念,將服務和引用單獨作為內部邏輯單元,同時定義了ServiceReference的兩種級別(CompositeComponent),達到了業務實現作用域的控制,真正做到了業務組件級別的封裝。

          應該來說,除了開放性的特質以外,業務模塊封裝的特質是SCA的模塊化最突出的優勢,也是解決系統日益龐大情況下,如何降低維護成本,如何適應需求變更,如何提高開發效率的有效手段。但就是規范中的這一點,Tuscany的實現,不得不讓我由原來的基于Tuscany架構二次擴展開發的想法做了轉變,同時在后面對于服務框架的需求不斷發展的情況下,對于Tuscany在服務框架中的定位不斷的作著改變。

          Tuscany在業務模塊封裝上面究竟有什么問題呢?在Tuscany中提供給第三方嵌入的SCA容器EmbeddedSCADomain結構如下:

                                                                                       

          EmbeddedSCADomain運行期結構圖

                 上面的圖展示了EmbeddedSCADomain如何載入外部的Composite到容器中,這里所用的一個技巧,就是includeComposite可以include多個Composite。下圖是一個很簡陋的活動圖,主要就是大致描述了EmbeddedSCADomain是如何加載所有的Composites的。這里面省略了Tuscany對于插件擴展的載入以及一些細節方面的處理。

          EmbeddedSCADomain啟動活動圖

                 根據上面兩個圖就出現了兩個比較大的問題:

          1.       首先EmbeddedSCADomain所有的Composite和資源都是根據固定的URI載入,但是這個或者是目錄或者是jar,但是如果是目錄中的jar將不會去解析,那么對于我們業務模塊當前的開發要求,各個業務開發組會把不同的Composite最后打包到各個業務模塊的jar中,這樣就沒有辦法通過一個EmbeddedSCADomain去裝載,互通就更加說不上了。不過這個問題不是根本性的問題。而后面2的問題是根本性的原則問題。

          2.       Tuscany讓所有的Composite互通,是將所有的composite通過include到一個domainComposite中,在build的過程中將所有的Composite的內部components克隆到了domainComposite中,這樣其實所有的Component就在一個Composite中,也就很方便的互通了。這樣SCA框架的業務模型封裝形同虛設,和spring一樣一個大的factory沒有什么區別,丟失了最大的一個優勢。同時serivcereference都沒有兩種級別之分,業務模塊化就無法實現和控制。

          就這樣兩個問題,讓我需要考慮重新基于Tuscany的部分內核機制來重新構建容器裝載,解析,組裝機制。下圖是ASF(Application Service FrameWork)的運行期結構設計圖

          ASF(Application Service FrameWork)的運行期結構設計圖

          問題一的解決方案:

          ASF中定義了真正包容所有CompositeService Container,創建的過程中,通過搜索Classpath中所有的有composite-load-config.xml文件的jar,composite-load-config.xml定義了需要裝載的Composite,然后resolve這些jar的所有的resource,根據定義要加載的內容動態加載所有需要加載的composite。

          問題二的解決方案:

                 基于問題一的解決,然后在Container中記錄各個composite的必要信息和狀態,然后按照不同級別的servicereference組裝所有的composite,最后激活所有的composite。

          這兩個問題的解決,也標志著ASF的基礎框架形成,后續的戰斗真正開始。

          更多內容可訪問我的blog:http://blog.csdn.net/cenwenchu79

          posted @ 2007-11-21 08:03 岑文初 閱讀(1240) | 評論 (1)編輯 收藏

           

                 每個人在人生的不同階段都在成長,父母們為自己記錄了過去的成長歷程,自己也在成年以后記錄著自己的成長歷程。程序員或者架構師都有著自己的“孩子”,不論自己的孩子是好是壞,都為自己的孩子有一點成績而激動不已。現在的我也正在培育著一個自己的“孩子”,雖然在它成長過程中我要付出很多,但是看著它的成長,讓我覺得所有的付出都是值得的。因此通過這種方式,記錄下它的成長,記錄下遇到的種種困難和解決之道,為自己也為其他程序員架構師在培育“孩子”的過程中提供可能有幫助的一些信息。

          一.初涉SCA

                 阿里新子公司成立,我也從業務開發組調動到了平臺架構組,平臺架構組當時的職責就是完善XPlatform來支持多個業務產品線部門的業務開發,XPlatform是基于MDA理念的快速開發平臺。但隨著業務部門開發靈活性要求的日益增加,XPlatform在可定制化,模塊化就日漸暴露出了不足。在4月份的技術戰略調整以后,開始了翻天覆地的XPlatform重構計劃,而我就被分配負責考慮底層架構重構以及服務框架的設計。

                 當時首先考慮模塊化重構底層的時候,感覺OSGI是一個很好的方向,因此在重構服務框架前期的Cache模塊時候采用了OSGI策略,可以動態替換Cache,但是在使用的過程中發現,此模塊化并非我們所需的模塊化。OSGI的模塊化比較徹底,就連每個Bundledependency都是自己維護和管理,這樣對于動態載入和卸載提供了堅實的基礎,但同時也為它提供了最難處理的一個問題:復雜的ClassLoader機制。而回顧當前的業務開發場景,是否真的有這樣強模塊隔離的需求,回答往往是否定的。而作為動態的載入和卸載,的確是很好的一種特性,但是作為商業化的產品,特別是現在的互聯網應用,機群中部署的應用模塊往往來說并不需要單獨裝載和部署。另一方面來看OSGI面向的主要是對于單機服務開發模塊化的解決方案,并非SOA的解決方案,而當前互聯網應用在很大程度上需要互聯互通,模塊化是基礎,但是并非最終的解決手段。

                 這時候開始關注與SCA,對于SOA具體實施的一種實踐性的規范,規范本身的模塊化可擴展性給我留下了很深的印象。SCAOSGI在模塊化思想上有很多類似的地方,在SCAComposite就是Bundle虛擬體,而SCA的優點就在于它只是規范,只是一種設計思想,不約束實現語言,平臺以及其它細節,這也是互聯網應用的一種趨勢。信息共享達到信息價值最大化,這是企業應用的目標,在實現這個目標的時候需要拋開實現過程中的細節。就好比程序員往往關注的是使用什么好的技術能夠開發出最炫的應用,而老板關注的是如何在最短最快的情況下滿足用戶需求,兩者之間如何能達成雙贏,那么就是架構師的職責了。

                 既然認定了SCA這條路,那么就開始走吧,第一步當然是看規范,OSOA上關于SCA的規范十分詳盡。SCA規范雖然已經有些年頭了,但是正式納入OSOA并且成為一個較為廣泛認可的規范其實時間并不長,國外Sun,Bea都用一些類似的產品,但也沒有大規模推廣,而在Apache的孵化項目中TuscanySCA最出名的實踐開源項目,對于我來說當然是加入開源大家庭。我在接觸Tuscany的時候,它還是0.9之前的milestone2,但到現在為止,短短的幾個月,已經發布到了v1版本了,可見發展迅速。對于Tuscany的關注,我看見現在國內也越來越多,Tuscany最大的特點就是它的架構可擴展性很強,這也是SCA規范所需要的架構體系,要做到SCA的模塊化和擴展性,必須有靈活的基礎架構作為支撐。

                 三下五除二,用Tuscany搭建了SCA規范中描述的幾個通用場景,簡單的java beanspring的集成,異步回調,rmi遠程調用等等,當然遇到了不少問題,由于Tuscany本身也是孵化過程中,最大的問題就是相應的文檔少,作為一個初學者,只能通過Demo了解大致的使用方式,遇到問題也就通過跟蹤它的代碼來學習,不過這個過程,讓我也對整個框架的體系架構有所了解,就如大牛所說,真正的體系架構是一個運行期的概念,而非設計期的,設計期其實就是SCA規范本身,而運行期的部分才是真正的體系架構。

                 預研終究是在做實驗性的工作,是否能夠產品化,還需要實踐來檢驗。XPlatform的重構正式啟動了,平臺架構師們組織了一次內部重構技術方案討論會,我將前期的研究結果以及SCA的思想和實現都作了展示,同時結合我們重構的目標作了技術實施可行性介紹。與會的另外一個架構師提出了使用Spring實現SOAESB模式的解決方案,經過比較和討論最后我的計劃方案得到了肯定,但是我自己心里其實也沒有底,畢竟如果真的在XPlatform的體系架構中實施SCA,那么將會波及各個產品線的底層架構,如果后續出現無法修復的問題,那么這個責任可不小。同時在過去的那些年頭,EJB就是一個很好的反面例子,一個規范理念是重要的,但是實施環境是否合適也會決定成敗,SCA是否適合未來的阿里軟件技術方向,當時的我沒有把握。最后我主動提出降低風險的設計方案,平臺底層分成兩部分:基礎服務框架(BSF)和應用服務框架(ASF),前者主要應用于XPlatform內部核心組件的插拔交互,后者應用于上層應用的組裝,發布,交互。

          Alisoft-xplatform-core-service-framework這個就是服務框架項目的子工程目錄名,也是我的SCA之路的第一步。當走出這第一步以后,就再也不能回頭了,常用老馬的一句話來激勵自己:我可能不是最聰明的人,也不是最努力的人,但是堅持可能就讓我比別人成功。Tuscany為我開啟了SCA的實踐之路,但Tuscany并不是像看起來那么美,要走適合服務框架的SCA之路,難題才剛剛開始。

          posted @ 2007-11-15 17:01 岑文初 閱讀(1354) | 評論 (1)編輯 收藏

          僅列出標題
          共12頁: First 上一頁 4 5 6 7 8 9 10 11 12 
          主站蜘蛛池模板: 荥经县| 威远县| 衡阳县| 思茅市| 钟祥市| 阳曲县| 凤台县| 濮阳县| 陇川县| 平乡县| 进贤县| 内黄县| 汝南县| 获嘉县| 个旧市| 商南县| 富平县| 大港区| 香格里拉县| 金塔县| 连南| 巴塘县| 武穴市| 靖江市| 和林格尔县| 页游| 宝丰县| 凉山| 名山县| 泰来县| 宜州市| 舞阳县| 扬中市| 泸定县| 通河县| 龙州县| 林芝县| 莆田市| 莒南县| 柞水县| 措美县|