十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
负载均衡里设置。
成都创新互联公司-专业网站定制、快速模板网站建设、高性价比荔城网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式荔城网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖荔城地区。费用合理售后完善,10余年实体公司更值得信赖。
高恪多播有时候会提示网络不稳,网络会一直变化,所以要去负载均衡里设置。
获取本机ip的方法:
//获取ip
func externalIP() (net.IP, error) {
ifaces, err := net.Interfaces()
if err != nil {
return nil, err
}
for _, iface := range ifaces {
if iface.Flagsnet.FlagUp == 0 {
continue // interface down
}
if iface.Flagsnet.FlagLoopback != 0 {
continue // loopback interface
}
addrs, err := iface.Addrs()
if err != nil {
return nil, err
}
for _, addr := range addrs {
ip := getIpFromAddr(addr)
if ip == nil {
continue
}
return ip, nil
}
}
return nil, errors.New("connected to the network?")
}
//获取ip
func getIpFromAddr(addr net.Addr) net.IP {
var ip net.IP
switch v := addr.(type) {
case *net.IPNet:
ip = v.IP
case *net.IPAddr:
ip = v.IP
}
if ip == nil || ip.IsLoopback() {
return nil
}
ip = ip.To4()
if ip == nil {
return nil // not an ipv4 address
}
return ip
}
调用:
func main() {
ip, err := externalIP()
if err != nil {
fmt.Println(err)
}
fmt.Printf(ip.String())
}
结果:
导致获取出来的IP可能不一定是想要的。需要通过判断net.FlagUp标志进行确... 才能调用stop接口,不然有几率崩溃,asio的关闭流程的线程安全性,貌似需要使...
实际业务:go 二进制文件在私有化部署中,需要对客户的服务器mac和ip进行绑定,系统只能运行在绑定的服务器上。把mac和ip地址配置到config中。
运行效果:系统可正常编译,正常访问,在用户Auth接口进行核对。
//检验Mac和内网IP,测试环境不做校验
func (c *CommonBase)CheckMacAndIp()error {
ipCfg :=g.Cfg().GetString("machine.Ipaddr")
macCfg :=g.Cfg().GetString("machine.Macip")
if ipCfg =="127.0.0.1" {
return nil
}
macArray,_ :=gipv4.GetMacArray()
if len(macArray) ==0 {
return gerror.New("mac地址获取失败")
}
if garray.NewStrArrayFrom(macArray).Contains(macCfg) ==false {
return gerror.New("示授权的应用MAC,请联系")
}
ipArray,_ :=gipv4.GetIpArray()
ipIntranetArray,_ :=gipv4.GetIntranetIpArray()
if len(ipArray) ==0 len(ipIntranetArray) ==0 {
return gerror.New("ip地址获取失败")
}
if garray.NewStrArrayFrom(ipArray).Merge(ipIntranetArray).Contains(ipCfg) ==false {
return gerror.New("示授权的应用IP,请联系")
}
return nil
}
项目使用GoFrame框架1.6。考虑到客户可能会对内存数据做分析破解,可以把mac和ip地址做AES加密。
在项目中遇到服务器有两个IP(一个真实IP一个VIP),然后出口IP必须为VIP的情况。
针对这样的需求有2种解决方案。
1、修改 ip route
通过systemd的方式在开机的时候执行脚本来修改ip route
a、先查看现有的ip route
执行 ip route,然后可以看到类似的结果:
default via 10.100.103.1 dev ens18 proto static metric 100
10.100.103.0/24 dev ens18 proto kernel scope link src 10.100.103.222 metric 100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
b、根据获取到的信息编写执行脚本,可以把脚本放到/home目录下
脚本完整路径:
/home/network.sh
脚本内容(其中10.101.19.1要改为上一步中获取到的网关地址):
ip route replace default via 10.101.19.1 dev ens192 src 10.101.19.104
c、给脚本可执行权限
d、添加一个systemd服务
服务完整路径:
/etc/systemd/system/network-trans.service
服务内容:
e、启用脚本
systemctl enable network-trans.service
systemctl start network-trans.service
f、检查运行结果
如果是loaded状态说明执行成功,然后看一下ip route,会多出一行类似的,如果有就可以了。
default via 10.101.19.1 dev ens192 src 10.101.19.104
2、增加iptables规则
这个方案需要已经安装了iptables服务,并且需要关闭firewalld服务,具体看你那边的情况是否允许,具体步骤如下:
a、启动iptables服务,并设置为开机启动
b、把firewalld禁用
c、添加规则并持久化保存
d、查看 /etc/sysconfig/iptables,确认上面的规则已经添加成功