gin项目获取IP的地理位置信息
github:https://github.com/shanhubei/tools_go
是基于
Gin 是一个用 Go (Golang) 编写的 Web 框架,小巧、性能优越。
主要为了 学习和测试用。
示例:
1、获取ip的地理位置信息
http://xxxx.xxxx.xxxx/tools/get_geoip
无参数是获取请求端IP的位置信息
1、git clone 地址
2、需要下载geoip数据库
https://dev.maxmind.com/geoip/geolite2-free-geolocation-data
修改位置在代码: geoip2.Open
3、go run main.go
4、交叉编译到服务器docker
4.1、Window下编译可执行程序
GOARCH:编译目标平台的硬件体系架构(amd64, 386, arm, ppc64等)。
GOOS:编译目标平台上的操作系统(darwin, freebsd, linux, windows)。
CGO_ENABLED:代表是否开启CGO,1表示开启,0表示禁用。由于CGO不能支持交叉编译,所以需要禁用。
4.2、生成docker的相关命令
构建最小镜像:由于官方的golang镜像太大了,720多M,所以为了最小化我们的应用,我们采取了alpine镜像,大小连4MB都不到。
#编写Dockerfile
DockerFile如下:
FROM alpine
MAINTAINER Aze
WORKDIR /go/src/
COPY . .
EXPOSE 8777
ENTRYPOINT ["./app/main"]
#构建镜像
docker build -t goenv:v1 .
#运行程序
docker run --name golanggeoip -v /mydata/data/geoip:/go/src -p 8608:9090 -it --privileged -u root --entrypoint /bin/sh goenv:v1
#进入容器
./main &
4.3、配置nginx反代理和proxy_pass转发。 就可以愉快的使用了
搭建过程
1、初始化项目,切换到项目根目录
# 1 go mod init "tools_go" # tools_go项目名称
# 创建main.go文件
# 2 进入tools_go/router目录,初始化模块
go mod init router
# 下载依赖包,router需要gin依赖
go get -u github.com/gin-gonic/gin
# 3 进入tools_go/service目录,初始化模块
go mod init service
# 4 初始化工作区
go work init ./router ./service
ps:
如果下载超时,换成国内可访问的地址,设置GOPROXY代理:
go env -w GOPROXY=https://goproxy.cn,direct
go env -w GOSUMDB=off (关闭包的有效性验证)
go env -w GOSUMDB=“sum.golang.google.cn” (也可设置国内提供的sum 验证服务)
2、编写相关的业务代码
todo
补充
go.work 文件中总共支持三个指令。
go:声明 go 版本号,主要用于后续新语义的版本控制。
use:声明应用程序所依赖的模块的特定文件路径。该路径可以是绝对的或相对的,并且可以在应用程序的命运目录之外。
replace:声明模块依赖的导入路径被替换,优先于 go.mod 中的 replace 指令。
附录
1、可以在https://dev.maxmind.com/geoip/geolite2-free-geolocation-data 上注册账号 申请key 自动更新,是免费的。
通过注册引导页面,点击“Generate a License Key”
https://github.com/maxmind/geoipupdate 这里有详细的安安装及配置说明
运行geoipupdate命令并加入定时任务
2、python代码:
安装:
pip install geoip2
vim web.py
from flask import Flask import geoip2.database
app = Flask(name) reader=geoip2.database.Reader('/home/geoipupdate_4.8.0_linux_amd64/GeoLite2-City.mmdb') @app.route("/") def index():
ip_addr = request.remote_addr
return "Hello World!"
@app.route("/getip/<ip>") def getip(ip): ipinfo=reader.city(ip) ipinfo_json={'country':ipinfo.country.name,'city':ipinfo.city.name,'location':[ipinfo.location.longitude,ipinfo.location.latitude]} return ipinfo_json
if name == "main": app.run(host='0.0.0.0',port=8090)
访问链接 http://192.168.1.166:8090/getip/113.97.30.189
参考
2、 https://github.com/gin-gonic/gin