Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

终于发现用Go扩展的ip2region了,能不能增加三个小功能呢 #1

Open
coloraven opened this issue Mar 12, 2022 · 3 comments

Comments

@coloraven
Copy link

coloraven commented Mar 12, 2022

1、前端支持多个IP....可以无上限。
2、利用GO语言对前端请求的多个IP进行并行查询,节省查询时间。
3、支持更新数据库,目前是首次运行会下载最新数据库,但是服务器部署后,需要命令行支持更新数据库。
比如./goip2region update

我会基于此项目制作一个Docker镜像,方便一键部署。

BTW,我刚刚接触GO,还在学习当中,所以不会弄。
这是我写的,试图并发查询的代码,结果运行时报错(signal: killed):

package main

import (
	"bufio"
	"fmt"
	"os"

	"github.com/lionsoul2014/ip2region/binding/golang/ip2region"
)

func main() {
	result := make(chan ip2region.IpInfo)
	region, err := ip2region.New("ip2region.db")

	if err != nil {
		fmt.Println(err)
		return
	}
	defer region.Close()
	ips := findLines()
	for _, ip := range ips {
		go func(ip string) {
			r, _ := region.MemorySearch(ip)
			fmt.Println(r)
			result <- r
		}(ip)
	}
	for i := range result {
		fmt.Println(i)
	}
}

func findLines() []string {
	filePath := "./ips.txt"  //里面有1.7W个IP

	file, err := os.Open(filePath)
	if err != nil {
		fmt.Println(err)
	}
	defer file.Close()

	fd := bufio.NewReader(file)
	var tempArray []string
	for {
		lData, err := fd.ReadString('\n')
		if err != nil {
			break
		}
		tempArray = append(tempArray, lData)
	}

	return tempArray
}
@coloraven coloraven changed the title 终于发现用Go扩展的ip2region了,能不能增加两个小功能呢 终于发现用Go扩展的ip2region了,能不能增加三个小功能呢 Mar 12, 2022
@coloraven
Copy link
Author

1、前端支持多个IP....可以无上限。 2、利用GO语言对前端请求的多个IP进行并行查询,节省查询时间。 3、支持更新数据库,目前是首次运行会下载最新数据库,但是服务器部署后,需要命令行支持更新数据库。 比如./goip2region update

我会基于此项目制作一个Docker镜像,方便一键部署。

BTW,我刚刚接触GO,还在学习当中,所以不会弄。 这是我写的,试图并发查询的代码,结果运行时报错(signal: killed):

package main

import (
	"bufio"
	"fmt"
	"os"

	"github.com/lionsoul2014/ip2region/binding/golang/ip2region"
)

func main() {
	result := make(chan ip2region.IpInfo)
	region, err := ip2region.New("ip2region.db")

	if err != nil {
		fmt.Println(err)
		return
	}
	defer region.Close()
	ips := findLines()
	for _, ip := range ips {
		go func(ip string) {
			r, _ := region.MemorySearch(ip)
			fmt.Println(r)
			result <- r
		}(ip)
	}
	for i := range result {
		fmt.Println(i)
	}
}

func findLines() []string {
	filePath := "./ips.txt"  //里面有1.7W个IP

	file, err := os.Open(filePath)
	if err != nil {
		fmt.Println(err)
	}
	defer file.Close()

	fd := bufio.NewReader(file)
	var tempArray []string
	for {
		lData, err := fd.ReadString('\n')
		if err != nil {
			break
		}
		tempArray = append(tempArray, lData)
	}

	return tempArray
}

1、支持多个IP已在此项目基础上实现,同时用docker构建使用,
2、增加编码,解决前端不能正确解码中文的问题。

@hezhizheng
Copy link
Owner

1、前端支持多个IP....可以无上限。 2、利用GO语言对前端请求的多个IP进行并行查询,节省查询时间。 3、支持更新数据库,目前是首次运行会下载最新数据库,但是服务器部署后,需要命令行支持更新数据库。 比如./goip2region update
我会基于此项目制作一个Docker镜像,方便一键部署。
BTW,我刚刚接触GO,还在学习当中,所以不会弄。 这是我写的,试图并发查询的代码,结果运行时报错(signal: killed):

package main

import (
	"bufio"
	"fmt"
	"os"

	"github.com/lionsoul2014/ip2region/binding/golang/ip2region"
)

func main() {
	result := make(chan ip2region.IpInfo)
	region, err := ip2region.New("ip2region.db")

	if err != nil {
		fmt.Println(err)
		return
	}
	defer region.Close()
	ips := findLines()
	for _, ip := range ips {
		go func(ip string) {
			r, _ := region.MemorySearch(ip)
			fmt.Println(r)
			result <- r
		}(ip)
	}
	for i := range result {
		fmt.Println(i)
	}
}

func findLines() []string {
	filePath := "./ips.txt"  //里面有1.7W个IP

	file, err := os.Open(filePath)
	if err != nil {
		fmt.Println(err)
	}
	defer file.Close()

	fd := bufio.NewReader(file)
	var tempArray []string
	for {
		lData, err := fd.ReadString('\n')
		if err != nil {
			break
		}
		tempArray = append(tempArray, lData)
	}

	return tempArray
}

1、支持多个IP已在此项目基础上实现,同时用docker构建使用, 2、增加编码,解决前端不能正确解码中文的问题。

1 、2、前端支持多个IP....可以无上限。多个IP进行并行查询

  • 支持多个IP“无上限” 这个功能就算实现也会存在性能问题,单次查询量过多响应时间也会随之变长,后面可能考虑支持自定义可查询的IP数量上限。

3、支持更新数据库

  • 现版本是有命令行模式支持更新IP地址库的 ./go-ip2region_windows_amd64.exe -d 2
    PS:近期可能先修复IP地址库下载地址错误的问题,其他需求如果你已经实现,也欢迎提PR。👋 @sirliu

@coloraven
Copy link
Author

................................

1、支持多个IP已在此项目基础上实现,同时用docker构建使用, 2、增加编码,解决前端不能正确解码中文的问题。

1 、2、前端支持多个IP....可以无上限。多个IP进行并行查询

  • 支持多个IP“无上限” 这个功能就算实现也会存在性能问题,单次查询量过多响应时间也会随之变长,后面可能考虑支持自定义可查询的IP数量上限。

3、支持更新数据库

  • 现版本是有命令行模式支持更新IP地址库的 ./go-ip2region_windows_amd64.exe -d 2
    PS:近期可能先修复IP地址库下载地址错误的问题,其他需求如果你已经实现,也欢迎提PR。👋 @sirliu

目前我已修改支持多个IP(使用逗号分割)查询,测试了全球攻击俄罗斯的IP(1.7+W IP),局域网环境0.349999秒返回结果……还是单goroutine的。多goroutine速度至少应该能翻几倍吧,当然,为了不被DDOS攻击,如需无上限,可以增加token检验,通过检验就无上限。
另外我准备支持post文本文件进行查询😀,
当然还有并发需要支持和结果筛选等等……

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants