golang解析IP到城市jsonRPC服务教程
RESTful接口
请求URL:
https://api.xxx.com/Tbsapi/v1/ip2addr?ip=219.140.227.235
请求方式:
- GET
参数:
参数名 | 类型 | 说明 |
---|---|---|
ip | url-qurey-string |
可选 要查询的ip地址,如果不传这表示当前的ip
|
返回示例
{"code": 1,"data": {"Country": "中国","Province": "湖北省","City": "武汉","ISP": "","Latitude": 30.5801,"Longitude": 114.2734,"TimeZone": "Asia/Shanghai"},"ip": "219.140.227.235"
}
json_rpc
tcp
地址:121.40.238.123
(IP地址更快)api.turboes.com
端口:3344
第三方资源
- GeoIP2 Reader for Go
- GeoLite2 开源数据库
go标准库jsonRPC服务端
Go官方提供了一个RPC库: net/rpc。包rpc提供了通过网络访问一个对象的方法的能力。服务器需要注册对象, 通过对象的类型名暴露这个服务。注册后这个对象的输出方法就可以远程调用,这个库封装了底层传输的细节,包括序列化。服务器可以注册多个不同类型的对象,但是注册相同类型的多个对象的时候回出错。
- 方法的类型是可输出的 (the method's type is exported)
- 方法本身也是可输出的 (the method is exported)
- 方法必须由两个参数,必须是输出类型或者是内建类型 (the method has two arguments, both exported or builtin types)
- 方法的第二个参数是指针类型 (the method's second argument is a pointer)
- 方法返回类型为 error (the method has return type error)
package mainimport ("fmt""github.com/oschwald/geoip2-golang""net""net/rpc""net/rpc/jsonrpc""os""log"
)
//返回值结构体
//需要满足以上要求
type Response struct {Country stringProvince stringCity stringISP stringLatitude float64Longitude float64TimeZone string
}type Ip2addr struct {db *geoip2.Reader
}
//参数结构体
//需要满足以上要求
type Agrs struct {IpString string
}
//json rpc 处理请求
//需要满足以上要求
func (t *Ip2addr) Address(agr *Agrs, res *Response) error {netIp := net.ParseIP(agr.IpString)record, err := t.db.City(netIp)res.City = record.City.Names["zh-CN"]res.Province = record.Subdivisions[0].Names["zh-CN"]res.Country = record.Country.Names["zh-CN"]res.Latitude = record.Location.Latituderes.Longitude = record.Location.Longituderes.TimeZone = record.Location.TimeZonereturn err
}func main() {//加载geoIp数据库db, err := geoip2.Open("./GeoLite2-City.mmdb")if err != nil {log.Fatal(err)}//初始化jsonRPCip2addr := &Ip2addr{db}//注册rpc.Register(ip2addr)//绑定端口address := ":3344"tcpAddr, err := net.ResolveTCPAddr("tcp", address)checkError(err)listener, err := net.ListenTCP("tcp", tcpAddr)checkError(err)log.Println("json rpc is listening",tcpAddr)for {conn, err := listener.Accept()if err != nil {continue}jsonrpc.ServeConn(conn)}}func checkError(err error) {if err != nil {fmt.Println("Fatal error ", err.Error())os.Exit(1)}
}
PHP-jsonRPC客户端
class JsonRPC
{public $conn;function __construct($host, $port){$this->conn = fsockopen($host, $port, $errno, $errstr, 3);if (!$this->conn) {return false;}}public function Call($method, $params){$obj = new stdClass();$obj->code = 0;if (!$this->conn) {$obj->info = "jsonRPC连接失败!请联系qzhou@turboes.com";return $obj;}$err = fwrite($this->conn, json_encode(array('method' => $method,'params' => array($params),'id' => 0,)) . "\n");if ($err === false) {fclose($this->conn);$obj->info = "jsonRPC发送参数失败!请检查自己的rpc-client代码";return $obj;}stream_set_timeout($this->conn, 0, 3000);$line = fgets($this->conn);fclose($this->conn);if ($line === false) {$obj->info = "jsonRPC返回消息为空!请检查自己的rpc-client代码";return $obj;}$temp = json_decode($line);$obj->code = $temp->error == null ? 1 : 0;$obj->data = $temp->result;return $obj;}
}function json_rpc_ip_address($ipString)
{$client = new JsonRPC("127.0.0.1", 3344);$obj = $client->Call("Ip2addr.Address", ['IpString' => $ipString]);return $obj;
}
go语言jsonRPC客户端
package mainimport ("fmt""log""net/rpc/jsonrpc"
)type Response struct {Country stringProvince stringCity stringISP stringLatitude float64Longitude float64TimeZone string
}
type Agrs struct {IpString string
}
func main() {client, err := jsonrpc.Dial("tcp", "121.40.238.123:3344")if err != nil {log.Fatal("dialing:", err)}// Synchronous callvar res Responseerr = client.Call("Ip2addr.Address", Agrs{"219.140.227.235"}, &res)if err != nil {log.Fatal("ip2addr error:", err)}fmt.Println(res)}
欢迎pr/star golang-captcha
golang解析IP到城市jsonRPC服务教程相关推荐
- geoip mysql_使用geoIP数据库解析IP到城市jsonRPC服务教程
### RESTful接口 **请求URL:** - ` https://api.turboes.com/Tbsapi/v1/ip2addr?ip=219.140.227.235` **请求方式:** ...
- Golang 微服务教程
本节对 gRPC 的使用浅尝辄止,更多可参考:gRPC 中 Client 与 Server 数据交互的 4 种模式 前言 系列概览 <Golang 微服务教程>分为 10 篇,总结微服务开 ...
- Golang微服务教程
转自:https://segmentfault.com/a/1190000015135650?utm_campaign=studygolang.com&utm_medium=studygola ...
- 解析ip到对应城市:ipdatabase
一.实现目的 在解析网络访问日志的时候,ip是不可避免地分析KPI.而有时候需要把访问ip直接转换为对应城市,这样如果自己编写程序,就会浪费很多时间,在此介绍一个有效地开源github项目,可以实现i ...
- Logstash数据处理服务的过滤插件GeoIP解析IP地址的地理位置
Logstash数据处理服务的过滤插件GeoIP解析IP地址的地理位置 文章目录 Logstash数据处理服务的过滤插件GeoIP解析IP地址的地理位置 1.GeoIP解析IP地址的地理位置 2.安装 ...
- python 通过ip获取城市_python中通过客户端IP拿到所在城市和当地天气信息—附带项目案例...
首先,需求分析: 1.拿到客户端IP 2.通过IP拿到客户端所在地区 3.通过地区拿到当地天气 4.整合功能,展示给用户 第一步,如何拿到用户IP 我们以Django环境为例 # 客户端的请求,IP信 ...
- 微服务教程--什么是 Nacos
微服务教程--什么是 Nacos 概览 欢迎来到 Nacos 的世界! Nacos 致力于帮助您发现.配置和管理微服务.Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置.服 ...
- 折腾Transmission实现固定IP服务器BT做种教程
title: 折腾Transmission实现固定IP服务器BT做种完美 通过网络分享资源,是为了让人下载,但由于种种原因,放到商业网盘的资源经常会被删除,于是我只好自建简易的http文件下载服务,比 ...
- 获取外网IP,再根据IP定位城市
根据ip定位城市对外开放的接口,有些接口不能直接用了,比如说淘宝接口.这里我用的是一个不知名的接口. 1.AddressUtil工具类 package cn.ztjz.module.audit.uti ...
最新文章
- VMware14安装CentOS7的详细教程
- ASP.NET MVC请求处理管道生命周期的19个关键环节(1-6)
- Bad version number in .class file
- 企业联合体的形式_联合体如何联合?——总包新政下,联合体如何联合?系列三...
- java国家电网面试试题_国家电网笔试面试相关
- java找_Java基础之:查找
- 第一次当项目经理压力大_项目经理不想被甩锅,你要这样做进度管理
- c语言写的心理测试,写了个心理测试的c程序(*^__^*) 嘻嘻……
- 一个逐页抓取网站小说的爬虫
- http 标准超时时间_Go 中 http 超时问题的排查
- LeetCode 623. Add One Row to Tree
- POJ 3668 枚举?
- 截止11月5日,30日内累计跌幅最大的200只股票
- Thinkpad SL400开启蓝牙
- PMP项目管理是什么意思?
- 编写程序,求出几何形状(长方形、正方形、圆形)的周长和面积
- Jetson tx2 使用 jetpack 4.3刷机全过程
- 高级端点保护 (AEP) 简介
- 【pymysql模块】
- 亚马逊、eBay、敦煌、wish、Lazada、阿里国际卖家有一套自养号测评技术多重要