用 golang 封裝了一個 ip 地址庫

最近在做一個 p2p 應用,有一個需求是想根據 peer 的物理距離選擇最佳路由,貌似 ip 和距離沒什麼太直接的關係,搜索了一圈提供這種服務的大多是在線的 rpc ,又慢又有次數和頻率限制,更過分的是還有收費的,哎!

苦惱了一下午終於發現了救星 《geoip2-golang》 ,他們維護了一套ip地址庫並且提供了模糊的座標信息,經過一番簡單的封裝,可以在 golang 程序中非常容易的使用這些信息,我已經在生產環境中使用了這個庫,迫不及待分享給有需要的夥伴們。

go-geoip2-db

原碼(求星):https://github.com/cc14514/go-geoip2-db

安裝

go get https://github.com/cc14514/go-geoip2-db

使用

package geoip2db

import (
    "encoding/json"
    "fmt"
    "net"
    "testing"
)

func TestNewGeoipDbByStatik(t *testing.T) {
    db, _ := NewGeoipDbByStatik()
    defer db.Close()
    record, _ := db.City(net.ParseIP("115.35.95.90"))
    fmt.Printf("Portuguese (BR) city name: %v\n", record.City.Names["pt-BR"])
    fmt.Printf("English subdivision name: %v\n", record.Subdivisions[0].Names["en"])
    fmt.Printf("Russian country name: %v\n", record.Country.Names["ru"])
    fmt.Printf("ISO country code: %v\n", record.Country.IsoCode)
    fmt.Printf("Time zone: %v\n", record.Location.TimeZone)
    fmt.Printf("Coordinates: %v, %v\n", record.Location.Latitude, record.Location.Longitude)

}

上面單元測試中得到的 record 結構如下,包含了你想要的全部信息

{
  "City": {
    "GeoNameID": 0,
    "Names": null
  },
  "Continent": {
    "Code": "AS",
    "GeoNameID": 6255147,
    "Names": {
      "de": "Asien",
      "en": "Asia",
      "es": "Asia",
      "fr": "Asie",
      "ja": "アジア",
      "pt-BR": "Ásia",
      "ru": "Азия",
      "zh-CN": "亞洲"
    }
  },
  "Country": {
    "GeoNameID": 1814991,
    "IsInEuropeanUnion": false,
    "IsoCode": "CN",
    "Names": {
      "de": "China",
      "en": "China",
      "es": "China",
      "fr": "Chine",
      "ja": "中國",
      "pt-BR": "China",
      "ru": "Китай",
      "zh-CN": "中國"
    }
  },
  "Location": {
    "AccuracyRadius": 50,
    "Latitude": 39.9289,
    "Longitude": 116.3883,
    "MetroCode": 0,
    "TimeZone": "Asia/Shanghai"
  },
  "Postal": {
    "Code": ""
  },
  "RegisteredCountry": {
    "GeoNameID": 1814991,
    "IsInEuropeanUnion": false,
    "IsoCode": "CN",
    "Names": {
      "de": "China",
      "en": "China",
      "es": "China",
      "fr": "Chine",
      "ja": "中國",
      "pt-BR": "China",
      "ru": "Китай",
      "zh-CN": "中國"
    }
  },
  "RepresentedCountry": {
    "GeoNameID": 0,
    "IsInEuropeanUnion": false,
    "IsoCode": "",
    "Names": null,
    "Type": ""
  },
  "Subdivisions": [
    {
      "GeoNameID": 2038349,
      "IsoCode": "BJ",
      "Names": {
        "en": "Beijing",
        "fr": "Municipalité de Pékin",
        "zh-CN": "北京市"
      }
    }
  ],
  "Traits": {
    "IsAnonymousProxy": false,
    "IsSatelliteProvider": false
  }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章