golang是用GeoIP数据库解析IP到城市jsonRPC服务教程

简介: RESTful接口 请求URL: https://api.turboes.com/Tbsapi/v1/ip2addr?ip=219.140.227.235 请求方式: GET 参数: 参数名 类型 说明 ip url-qurey-string 可选 要查询的ip地址,如果不传这表示当前.

RESTful接口

请求URL:

  • https://api.mojotv.cn/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

第三方资源

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 main

import (
    "fmt"
    "github.com/oschwald/geoip2-golang"
    "net"
    "net/rpc"
    "net/rpc/jsonrpc"
    "os"
    "log"
)
//返回值结构体
//需要满足以上要求
type Response struct {
    Country   string
    Province  string
    City      string
    ISP       string
    Latitude  float64
    Longitude float64
    TimeZone  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)
        //调用开源geoIp 数据库查询ip地址
    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.Latitude
    res.Longitude = record.Location.Longitude
    res.TimeZone = record.Location.TimeZone
    return err
}

func main() {
         //加载geoIp数据库
    db, err := geoip2.Open("./GeoLite2-City.mmdb")
    if err != nil {
        log.Fatal(err)
    }
        //初始化jsonRPC
    ip2addr := &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连接失败!请联系";
            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 main

import (
    "fmt"
    "log"
    "net/rpc/jsonrpc"
)

type Response struct {
    Country   string
    Province  string
    City      string
    ISP       string
    Latitude  float64
    Longitude float64
    TimeZone  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 call
    var res Response
    err = 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

目录
相关文章
|
4月前
|
存储 关系型数据库 数据库
附部署代码|云数据库RDS 全托管 Supabase服务:小白轻松搞定开发AI应用
本文通过一个 Agentic RAG 应用的完整构建流程,展示了如何借助 RDS Supabase 快速搭建具备知识处理与智能决策能力的 AI 应用,展示从数据准备到应用部署的全流程,相较于传统开发模式效率大幅提升。
附部署代码|云数据库RDS 全托管 Supabase服务:小白轻松搞定开发AI应用
|
8月前
|
弹性计算 运维 安全
优化管理与服务:操作系统控制平台的订阅功能解析
本文介绍了如何通过操作系统控制平台提升系统效率,优化资源利用。首先,通过阿里云官方平台开通服务并安装SysOM组件,体验操作系统控制平台的功能。接着,详细讲解了订阅管理功能,包括创建订阅、查看和管理ECS实例的私有YUM仓库权限。订阅私有YUM仓库能够集中管理软件包版本、提升安全性,并提供灵活的配置选项。最后总结指出,使用阿里云的订阅和私有YUM仓库功能,可以提高系统可靠性和运维效率,确保业务顺畅运行。
|
4月前
|
JSON 人工智能 Go
在Golang中序列化JSON字符串的教程
在Golang中,使用`json.Marshal()`可将数据结构序列化为JSON格式。若直接对JSON字符串进行序列化,会因转义字符导致错误。解决方案包括使用`[]byte`或`json.RawMessage()`来避免双引号被转义,从而正确实现JSON的序列化与反序列化。
211 7
|
6月前
|
网络协议 安全 Devops
Infoblox DDI (NIOS) 9.0 - DNS、DHCP 和 IPAM (DDI) 核心网络服务管理
Infoblox DDI (NIOS) 9.0 - DNS、DHCP 和 IPAM (DDI) 核心网络服务管理
235 4
|
9月前
|
人工智能 Cloud Native 多模数据库
实力见证!数据管理服务DMS、云原生多模数据库Lindorm荣获“2024技术卓越奖”
实力见证!数据管理服务DMS、云原生多模数据库Lindorm荣获“2024技术卓越奖”
235 1
|
9月前
|
数据管理 关系型数据库 MySQL
数据管理服务DMS支持MySQL数据库的无锁结构变更
本文介绍了使用Sysbench准备2000万数据并进行全表字段更新的操作。通过DMS的无锁变更功能,可在不锁定表的情况下完成结构修改,避免了传统方法中可能产生的锁等待问题。具体步骤包括:准备数据、提交审批、执行变更及检查表结构,确保变更过程高效且不影响业务运行。
533 2
|
10月前
|
关系型数据库 OLAP API
非“典型”向量数据库AnalyticDB PostgreSQL及RAG服务实践
本文介绍了非“典型”向量数据库AnalyticDB PostgreSQL及其RAG(检索增强生成)服务的实践应用。 AnalyticDB PostgreSQL不仅具备强大的数据分析能力,还支持向量查询、全文检索和结构化查询的融合,帮助企业高效构建和管理知识库。
588 19
|
10月前
|
JavaScript NoSQL Java
基于SpringBoot+Vue实现的大学生就业服务平台设计与实现(系统源码+文档+数据库+部署等)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
|
10月前
|
存储 关系型数据库 数据库
RDS:稳定、安全、开放的新一代云数据库服务
RDS是阿里云提供的新一代云数据库服务,具备稳定、安全、开放的特点。本次分享由阿里云智能集团和平安科技专家共同介绍,涵盖RDS年度产品发布与最佳实践、金融场景下关系型数据库的要求。重点内容包括RDS通用云盘、RDS On OSS、RDS Custom等技术创新,以及在成本控制、性能优化、业务连续性、数据安全等方面的解决方案。通过实际案例展示了RDS在不同行业的应用,如汇联易、莉莉丝游戏、中免日上等,帮助客户实现高效、低成本的数据库管理。
567 2

推荐镜像

更多