Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks
          一.功能介紹 ?

          通過傳入的IP地址,返回IP所在的地理位置。如傳入“58.16.209.19”,返回“貴州省六盤水市 ”。?

          返回的地理位置又分為3種精確度,程序可以按照自身需要選擇。三種精確度分別為:地區(省直轄市級),城市(地市級),詳細位置。例如對于“58.16.209.19”,三種精度的值為:?

          Java代碼?
          1. 地區:貴州?????
          2. 城市:貴州省六盤水市????
          3. 詳細地址:六枝特區騰龍網吧??

          二.3行代碼實現地域查詢?

          Java代碼?
          1. //第1行,獲取IP反查服務(JSP中寫的)??
          2. IPLocationService?ipService?=?(IPLocationService)?GuzzWebApplicationContextUtil.getGuzzContext(session.getServletContext()).getService("IPService")?;??
          3. ??
          4. //第2行,執行查詢。findLocation方法傳入要查詢的IP地址。??
          5. LocationResult?result?=?(LocationResult)?ipService.findLocation("58.16.209.19").get()?;??
          6. ??
          7. //第3行,按照精確度要求,讀取地理位置??
          8. System.out.println("城市:"?+?result.cityName)?;??

          三.性能如何??

          上面的第1步需要獲取IP反查服務,此服務有3個實現客戶端,一個為遠程方法調用(phprpc協議實現,類似hessian的一個協議),一個是socket長連接,一個nio。?

          針對這兩種實現,在內網下進行性能測試。測試方法:單線程,串行執行查詢請求。查詢IP:59.66.106.0,返回地理位置:清華大學。?

          性能測試結果:?

          PHPRPC實現:執行1000次查詢,耗時1339ms。?

          Socket實現:執行1000次查詢,耗時84ms;執行10000次查詢,耗時843ms。?

          NIO socket實現:執行1000次查詢,耗時115ms;執行10000次查詢,耗時1247ms。?

          Socket長連接模式為連接池實現,可以配置多個socket并行計算。對于絕大部分的應用,應該都能滿足要求。PHPRPC為短連接,每次查詢都建立一個http連接進行查詢。?

          四.如何配置到我的系統中??

          上面的IP反查為guzz的服務,因此需要應用程序首先將guzz框架配置進去。Guzz框架不具有應用侵入性,不會影響現有系統運轉。配置方法:http://code.google.com/p/guzz/wiki/TutorialConfig?

          Guzz框架整合完畢后,只需要將IP反查服務在guzz中聲明即可。聲明包含3步(以socket的IP服務為例):?

          1. 將IP反查的實現jar包放到項目lib中。Jar包在附件中,包含源代碼。?

          2. 在guzz.xml中增加此服務:?
          Xml代碼?
          1. <service?name="IPService"?configName="fundIPServiceSocketClient"?class="org.guzz.service.dir.impl.socket.IPLocationServiceSocketClientImpl"?/>??

          3. 配置服務參數(guzz的properties文件):?
          Properties代碼?
          1. [fundIPServiceSocketClient]??
          2. pool.maxActive=5??
          3. host=services.guzz.org??
          4. port=11546??

          參數中包含連接池大小,服務地址和端口。?

          配置完服務以后,就可以按照上一節的方式進行IP反查了。如附件中的示例jsp實現。?

          五.LocationResult介紹?

          執行查詢時,返回的是LocationResult對象,此對象有一些方法和變量按照不同精確度和用途存儲地理信息。LocationResult介紹:?
          Java代碼?
          1. ??????
          2. public?class?LocationResult?implements?Serializable?{??
          3. ??????
          4. ????/**如:對于國外地區,值為“海外”;對于cityName中不包含省市信息的,如“清華大學”,值為地區名稱,如“北京”*/??
          5. ????public?String?cityMarker?;??
          6. ??
          7. ????/**查詢地市級名稱,如:貴州省六盤水市*/??
          8. ????public?String?cityName?;??
          9. ??????
          10. ????/**詳細地址,如:六枝特區騰龍網吧*/??
          11. ????public?String?detailLocation?;??
          12. ??????
          13. ????/**地區名稱,精確到省;對于國外,統一為:海外*/??
          14. ????public?String?areaName?;??
          15. ??????
          16. ????/**?
          17. ?????*?返回標記后的城市名稱。此名稱用于進行程序內的城市匹配,不用于對網友顯示。?
          18. ?????*/??
          19. ????public?String?getMarkedCityName(){??
          20. ????????if(cityMarker?==?null){??
          21. ????????????return?cityName?;???
          22. ????????}else{??
          23. ????????????return?cityMarker?+?cityName?;??
          24. ????????}??
          25. ????}??
          26. ??????
          27. ????public?String?toString(){??
          28. ????????StringBuilder?sb?=?new?StringBuilder()?;??
          29. ????????sb.append("cityMarker:").append(cityMarker)??
          30. ??????????.append("cityName:").append(cityName)??
          31. ??????????.append("detailLocation:").append(detailLocation)??
          32. ??????????.append("areaName:").append(areaName)?;??
          33. ??????????
          34. ????????return?sb.toString()?;??
          35. ????}??
          36. ??????
          37. ????}??

          六.我的查詢請求不多,如何配置phprpc方式的查詢(不需要保持socket連接池)??

          第1步:在系統中配置phprpc框架。詳細請參看:http://phprpc.org?

          第2步:將剛才guzz.xml中IPService服務換成PHPRPC實現:?
          Java代碼?
          1. <service?name="IPService"?configName="fundIPServiceClient"?class="org.guzz.service.dir.impl.IPLocationServiceClientImpl"?/>??

          第3步:配置服務參數(properties文件):?
          Properties代碼?
          1. [fundIPServiceClient]??
          2. rpc.protocol=phprpc??
          3. rpc.serviceURL=http://services.guzz.org/service/IPService??

          七.其他:?

          1.?JDK1.6+。如果使用JDK1.5,將源代碼在1.5下編譯即可。?

          2.?沒看明白如何配置服務? 看這里:http://code.google.com/p/guzz/wiki/TutorialService?

          3.?IP反查可不可以異步執行? 可以。ipService.findLocation(ip)返回的就是異步接口,在需要的時候調用get()即可;異步方法也支持超時,調用getOrCancel(5L, TimeUnit.SECONDS)可以讓接口最多等待5秒,隨后超時返回null。如果服務端故障,ipService.findLocation(ip)返回null。?

          4.?為什么會返回null? 沒有查詢到就返回null,null也很有用,如網易評論中的“火星網友”。?

          5.?支持spring IOC嗎??支持。如果使用spring,IPService可以通過spring bean配置并進行注入。這樣只需要2行代碼即可。?

          posted on 2010-11-17 22:29 禮物 閱讀(483) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。

          網站導航:
           
          主站蜘蛛池模板: 云霄县| 无极县| 桃园县| 上虞市| 满洲里市| 独山县| 武宁县| 平罗县| 普陀区| 唐河县| 博白县| 红原县| 余江县| 龙泉市| 城步| 永德县| 应城市| 广德县| 阿图什市| 鲜城| 金阳县| 天台县| 镇康县| 苍南县| 霍城县| 洛宁县| 河津市| 宾阳县| 保德县| 东平县| 巴里| 于都县| 玛沁县| 泰兴市| 梓潼县| 得荣县| 旬阳县| 瑞丽市| 拉萨市| 柳州市| 南召县|