golang高并发限流操作 ping / telnet

Golang 高并发限流操作 ping/telnet 的完整攻略

在分布式系统中,高并发请求是不可避免的问题,如何防止恶意攻击和拒绝服务攻击是一个必须解决的问题。Golang 作为一种高性能的编程语言,提供了良好的支持来解决这些问题。本文介绍如何使用 Golang 实现高并发的 ping / telnet 限流操作。

原理简介

在 Golang 中,我们可以使用 os/exec 模块的 Command 函数来执行系统命令。同时,time.Ticker 可以用于定时器触发。在定时器触发调用命令之前,可以将相关信息保存到一个临时 Map 中。在执行命令之后将 Map 中对应的信息删除。如果在一秒钟内有超过设定的阈值数量的请求,我们就认为这是一个恶意攻击或拒绝服务攻击,直接将其拒绝。

具体实现

我们首先需要定义一个结构体,用于保存每个请求的信息,如下所示:

type request struct {
  ip string
  cmd *exec.Cmd // 用于保存正在执行的命令
}

// 用于保存需要触发的命令和请求对象的 Map
var reqs = make(map[string]*request) 

然后我们需要实现一个函数,用于触发 ping / telnet 命令,并记录请求信息:

func processRequest(ip string) error {
  ipKey := strings.ReplaceAll(ip, ".", "_") // 将点分格式的 IP 转换为 Map 中的 Key
  if _, ok := reqs[ipKey]; ok {
    return errors.New("request already exists")
  }
  cmd := exec.Command("ping", "-c", fmt.Sprintf("%d", COUNT), "-w", fmt.Sprintf("%d", TIMEOUT), ip)
  if err := cmd.Start(); err != nil {
    return err
  }
  reqs[ipKey] = &request{ip: ip, cmd: cmd}
  return nil
}

我们在 processRequest 函数中触发一个 ping 命令,同时将请求信息保存到 Map 中。

接下来,我们需要使用定时器循环读取 Map 中的信息,判断是否超过了限流阈值。如果超过了阈值,则终止正在执行的命令,否则继续等待。

func checkLimit() {
  t := time.NewTicker(time.Second)
  for range t.C {
    for key, req := range reqs {
      if req.cmd.ProcessState == nil {
        // 如果命令没有执行完成,则继续等待
        continue
      }
      delete(reqs, key) // 从 Map 中删除请求信息
      if req.cmd.ProcessState.ExitCode() == 0 {
        continue
      }
      counter[req.ip] += 1 // 记录请求次数
      if counter[req.ip] > MAX_COUNT {
        req.cmd.Process.Kill() // 终止进程
        fmt.Printf("access from %s is blocked\n", req.ip)
      }
    }
  }
}

checkLimit 函数中,我们循环读取 Map 中的信息,判断是否超过了限流阈值。如果超过了阈值,则终止正在执行的命令并输出警告信息。

我们还需要定义一个全局变量,用于记录每个 IP 地址的请求次数:

var counter = make(map[string]int)

最后,我们需要调用 processRequest 函数来触发请求,并启动定时器。

func main() {
  for i := 0; i < MAX_COUNT*2; i++ {
    processRequest("1.1.1.1")
    processRequest("2.2.2.2")
    processRequest("3.3.3.3")
  }
  go checkLimit() // 启动定时器
}

示例说明

在上面的示例中,我们使用 processRequest 函数来触发 6 个 IP 地址的请求,并使用 checkLimit 函数来限流和阻止恶意请求。在一秒钟内,如果有超过 10 个的请求,则会被判断为恶意请求,并被直接拒绝。这样就可以有效地防止恶意攻击和拒绝服务攻击。

另外一个示例,我们可以针对 telnet 进行限流,具体可以参考上面的示例代码进行调整。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:golang高并发限流操作 ping / telnet - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • Java多线程状态及方法实例解析

    Java多线程状态及方法实例解析 前言 多线程是Java开发中一个重要的概念,也是面试中的必备知识点,因此这里将会详细讲解Java多线程状态以及方法的使用,方便大家对这个重要的概念进行深入学习。 什么是多线程 进程是计算机中正在执行的程序,每个进程都有自己的内存空间、指令指针、系统栈和寄存器等资源。而线程就是在进程内部运行的子任务,一个进程可以包含多个线程。…

    多线程 2023年5月17日
    00
  • C++ 对多线程/并发的支持(上)

    C++ 对多线程/并发的支持 多线程/并发编程是现代应用程序的必备特性,它能够显著地提高程序的性能和响应能力。C++是一种支持多线程/并发编程的高级编程语言,它提供了一套完整的多线程/并发编程库和标准库,包括线程、互斥锁、条件变量、原子操作、线程局部储存、异步编程等重要的特性。 线程 线程是C++的核心多线程/并发编程构件,它可以在同一个进程中运行多个并发的…

    多线程 2023年5月16日
    00
  • Python多线程正确用法实例解析

    Python多线程正确用法实例解析 Python中的多线程可以提高程序的性能,但是在使用多线程时需要注意一些细节问题,避免出现错误。本篇文章将讲解Python多线程的正确用法,并给出两个示例来说明多线程的应用。 多线程简介 线程是程序执行的最小单元,多线程指的是程序同时执行多个线程来完成任务,可以提高程序执行效率。Python中的_thread模块和thre…

    多线程 2023年5月17日
    00
  • 浅谈Java并发中的内存模型

    浅谈Java并发中的内存模型 在Java并发编程中,了解Java内存模型(Java Memory Model,简称JMM)是非常必要的。因为JMM规定了不同线程之间访问共享变量的规则,影响了程序在并发执行时的正确性和性能。下面我们就来详细讲解一下Java并发中的内存模型。 Java内存模型简介 Java内存模型是在JDK 1.2中引入的,它描述了Java虚拟…

    多线程 2023年5月16日
    00
  • 了解Java多线程的可见性与有序性

    了解Java多线程的可见性与有序性 可见性 在Java多线程中,可见性问题是指当多个线程访问共享数据时,其中一个线程对数据进行了修改,导致其他线程无法立即看到这个修改的结果。 原因 可见性问题的产生是因为java内存模型中存在主内存和工作内存的缓存机制,不同的线程可能会将共享数据拷贝到自己的工作内存中进行修改,修改后的结果,在没有及时写回主内存的情况下,其他…

    多线程 2023年5月17日
    00
  • java多线程累加计数的实现方法

    实现多线程累加计数的效果涉及到线程安全、竞态条件、原子性等问题,下面就java多线程累加计数的实现方法提供一些攻略。 方案一:使用synchronized同步方法 synchronized同步方法是保证线程安全的常用手段之一,在多线程环境下可以确保只有一个线程在执行某个同步方法时获得对象锁,其他线程处于等待状态。 要实现多线程累加计数,可以使用synchro…

    多线程 2023年5月17日
    00
  • Java并发计数器的深入理解

    Java并发计数器的深入理解 什么是Java并发计数器 Java并发计数器是一项重要的多线程技术,它可以在多线程环境下高效地实现数据的计数。 Java并发计数器的本质是使用CAS原子操作实现的,CAS的全称是Compare and Swap,即“比较并交换”,CAS提供了一种无锁化的解决方案,让多线程同时更新同一个数据变得更加高效。 实现原理 在并发计数器的…

    多线程 2023年5月16日
    00
  • Java常见面试题之多线程和高并发详解

    Java常见面试题之多线程和高并发详解 简介 在Java的面试中,多线程和高并发是一个经常被问到的话题。因此,对于这个话题,我们必须掌握一些基本概念和技术来进行面试表现。 多线程和高并发的概念 多线程:在同一个程序中,多个线程能够共享同一个地址空间和文件描述符等类似的全局变量,允许并行运行多个线程。 高并发:指在同一时间内,有很多用户同时访问同一个资源,例如…

    多线程 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部