3行代码,实现IP到地理位置的反查功能一.功能介绍通过传入的IP地址,返回IP所在的地理位置。如传入“58.16.209
3行代码,实现IP到地理位置的反查功能
一.功能介绍
通过传入的IP地址,返回IP所在的地理位置。如传入“58.16.209.19”,返回“贵州省六盘水市 ”。
返回的地理位置又分为3种精确度,程序可以按照自身需要选择。三种精确度分别为:地区(省直辖市级),城市(地市级),详细位置。例如对于“58.16.209.19”,三种精度的值为:
地区:贵州城市:贵州省六盘水市 详细地址:六枝特区腾龙网吧
二.3行代码实现地域查询//第1行,获取IP反查服务(JSP中写的)IPLocationService ipService = (IPLocationService) GuzzWebApplicationContextUtil.getGuzzContext(session.getServletContext()).getService("IPService") ;//第2行,执行查询。findLocation方法传入要查询的IP地址。LocationResult result = (LocationResult) ipService.findLocation("58.16.209.19").get() ;//第3行,按照精确度要求,读取地理位置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中增加此服务:
<service name="IPService" configName="fundIPServiceSocketClient" />
3. 配置服务参数(guzz的properties文件):
[fundIPServiceSocketClient]pool.maxActive=5host=services.guzz.orgport=11546
参数中包含连接池大小,服务地址和端口。
配置完服务以后,就可以按照上一节的方式进行IP反查了。如附件中的示例jsp实现。
五.LocationResult介绍 执行查询时,返回的是LocationResult对象,此对象有一些方法和变量按照不同精确度和用途存储地理信息。LocationResult介绍:
public class LocationResult implements Serializable {/**如:对于国外地区,值为“海外”;对于cityName中不包含省市信息的,如“清华大学”,值为地区名称,如“北京”*/public String cityMarker ;/**查询地市级名称,如:贵州省六盘水市*/public String cityName ;/**详细地址,如:六枝特区腾龙网吧*/public String detailLocation ;/**地区名称,精确到省;对于国外,统一为:海外*/public String areaName ;/** * 返回标记后的城市名称。此名称用于进行程序内的城市匹配,不用于对网友显示。 */public String getMarkedCityName(){if(cityMarker == null){return cityName ; }else{return cityMarker + cityName ;}}public String toString(){StringBuilder sb = new StringBuilder() ;sb.append("cityMarker:").append(cityMarker) .append("cityName:").append(cityName) .append("detailLocation:").append(detailLocation) .append("areaName:").append(areaName) ;return sb.toString() ;}}
六.我的查询请求不多,如何配置phprpc方式的查询(不需要保持socket连接池)?第1步:在系统中配置phprpc框架。详细请参看:http://phprpc.org
第2步:将刚才guzz.xml中IPService服务换成PHPRPC实现:
<service name="IPService" configName="fundIPServiceClient" />
第3步:配置服务参数(properties文件):
[fundIPServiceClient]rpc.protocol=phprpcrpc.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行代码即可。
<p><span style="font-family: arial,helvetica,sans-serif;"><a href="http://www.maxmind.com/app/geolitecity" target="_blank"><span style="font-size: large;">GeoLite City</span></a></span></p>
<p><span style="font-family: arial,helvetica,sans-serif;"><span target="_blank">APIs for GeoIP
Products</a></span></span></span></p>
<p>?</p>
<p>?</p> 10 楼 kongqz 2010-06-23 这个没啥意义吧
是想说guzz好还是想推广你那个外网的ip地址库?
就是一个封装的webservice而已
没看懂 11 楼 tedeyang 2010-06-23 封装ip反查功能应该不是guzz正确的方向。
应该只专注做一件事,并把它做好。
guzz只要做好shard就很了不起了,解决java在大规模互联网应用中的问题。
这足以使它成为非常受欢迎的开源项目。
12 楼 myreligion 2010-06-23 tedeyang 写道封装ip反查功能应该不是guzz正确的方向。
应该只专注做一件事,并把它做好。
guzz只要做好shard就很了不起了,解决java在大规模互联网应用中的问题。
这足以使它成为非常受欢迎的开源项目。
恩,谢谢您的建议,shard很重要。
不过在大规模应用中,多个项目之间会出现类似计算需求,通用计算在我们的项目实践中就有很高的价值,可以节省很多开发成本,让系统更快上线。
封装ip反查并不是guzz核心代码,不包含在发布包中。IP反查是guzz的一个通用计算服务实现。
计划上会再开一个项目,整理并沉淀常用的通用计算服务,以减少项目开发成本。主要包括:IP反查,身份证校验与检查(实名认证),任务调用,应用数据统计计算(如每秒钟通过应用接口读取一些数据,如帖子数,然后完成汇总和报表等,这类内容监控工具好像都没有覆盖到,为每个系统单独开发又犯不着),sql执行性能计算等等。
通用计算的另外一个用途是剥离功能,让业务系统的功能和代码量都降下来,对于大型系统,减少外围功能对于提高稳定性和维护性非常重要。这也是框架的设计目标之一。
欢迎继续这方面的讨论。 13 楼 mercyblitz 2010-06-23 myreligion 写道duronshi 写道如果客户电脑上不了网,还能起作用吗?
工作原理好像是,客户将ip送到services.guzz.org:11546,你们那再解析,最后将解析结果返送回来,
如果这样,觉着还是安装ocx好一点
services.guzz.org:11546只是一个服务端,在内网部署或者自己实现一个即可。
地址,端口,协议都是可以控制的。
意思是说,一个端口多种服务协议? 14 楼 cicl 2010-07-06 恩,支持单开个工程来做通用计算服务,并实现高度组件化,普及度可能更广,呵呵。
ps:IP反查是不是也需要包括过滤代理服务器地址以获取真实ip?感觉这个需求量还是还是有一部分的,响应国家号召,加强安全建设,呵呵 15 楼 bysshijiajia 2010-07-06 好东西啊,我们原先用QQWry.Dat,每隔一段时间都要下载一个新的QQWry.Dat文件
有了这个东西就好多了。多谢LZ!!!哈哈 16 楼 liliugen 2010-07-06 demo没有给全,不好。不利于初学者 17 楼 ago520 2010-07-06 这个做成网页的方式调用多方便啊
18 楼 myreligion 2010-07-07 ago520 写道这个做成网页的方式调用多方便啊
给程序用的,不是直接面向网友的。 19 楼 berlou 2010-07-07 噱头。。。
广告嫌疑。 20 楼 joknm 2010-07-20 好东西,收藏一下。
以前都找不到方法,呵呵。 21 楼 macleo 2010-07-29 http://comedsh.iteye.com/blog/707304
QQwry.Dat,这个也不错....好用 22 楼 wtslh 2012-03-22 这个已经不维护了吗?
刚才试了一下,我当前的IP,已经不能准确提供省份城市的反查了