主頁 >  其他 > 從零搭建秒殺系統

從零搭建秒殺系統

2021-12-12 07:37:58 其他

前言

本文將從零開始搭建一個秒殺的后臺系統,整體思路如下圖所示

前置準備

  • 整體后端框架采用的是 SpringBoot + mybatis plus
  • 運用到 redis ,rabbitmq 等中間件
  • 性能測驗用到了 jmeter

正文

秒殺在生活中的應用場景還是挺多的,比如雙十一搶限購商品,12306搶座,大學搶課,搶門票等等,

這些場景下,就有可能帶出以下問題

  • 高并發
    • 極短的時間內,用戶請求量大
  • 超賣
    • 庫存 100 件,最終下單了 120 件
  • 惡意請求
    • 一些不壞好意的黑客,或者黃牛,通過腳本來模擬請求,如果是用來搶商品的,機器的請求肯定比人快,那頂多算欺負老實人;要是惡意偽造請求,造成快取穿透,處理不好整個服務都掛了,
  • 資料庫
    • 上萬甚至上百萬的 qps 打到資料庫,如果沒有做降級,限流,熔斷等處理,可能影響的就不是秒殺這一個業務了,

所以在我們設計的時候,就需要根據這些問題,對癥下藥,

1 普通下單

建立一個簡單的場景,資料庫中存有一個商品,庫存為 100,用戶通過下單介面來下單,不做任何限制,

public int createWrongOrder(int sid) throws Exception {
    //校驗庫存
    Stock stock = checkStock(sid);
    //扣庫存
    saleStock(stock);
    //創建訂單
    int id = createOrder(stock);
    return id;
}

通過 jmeter 進行性能測驗,設定執行緒數1000,模擬 1000 位用戶進行請求,觀察結果,

可以看到 http 請求全部正常回傳,銷量只賣出了 27 單,但是訂單表里添加了 1000 條記錄

這就是之前提出的超賣問題,

2 下單加鎖(樂觀鎖)

解決上述問題,我采用上鎖的方式,選擇的是樂觀鎖

樂觀鎖:總是假設最好的情況,每次去拿資料的時候都認為別人不會修改,所以不會上鎖,只在更新的時候會判斷一下在此期間別人有沒有去更新這個資料,

public int createOptimisticOrder(int sid) {
    //校驗庫存
    Stock stock = checkStock(sid);
    //樂觀鎖更新庫存
    boolean success = saleStockOptimistic(stock);
    if (!success) {
        throw new RuntimeException("過期庫存值,更新失敗");
    }
    //創建訂單
    int id = createOrder(stock);
    return stock.getCount() - stock.getSale();
}

代碼層面,就修改了一下更新庫存的 sql

public int updateStockByOptimistic(Stock stock) {
    UpdateWrapper<Stock> wrapper = new UpdateWrapper<>();
    wrapper.lambda().eq(Stock::getId, stock.getId()).eq(Stock::getVersion, stock.getVersion());
    stock.setSale(stock.getSale() + 1);
    stock.setVersion(stock.getVersion() + 1);
    return mapper.update(stock, wrapper);
}

翻譯成 sql 陳述句就是

UPDATE stock
SET sale = sale + 1,
 version = version + 1
WHERE
	id = 1
AND version = 0

繼續用 jmeter 進行測驗,日志中可以看到,存在大量購買失敗,銷售量為 47,但是訂單量也為 47,說明不存在超賣的情況,

3 下單介面限流

解決了超賣的問題,接下來需要解決高并發下帶來的壓力,

因此,我們需要選擇更優雅的方式來處理大量請求,

首先是前端,

  • 頁面靜態化
    • 可以對頁面進行靜態化處理,因為前端作為秒殺活動的入口,如果把入口限制住,就能很好的達到限流的效果,到了秒殺時間點,并且用戶主動點了秒殺按鈕,才會訪問服務端,
  • CDN 快取
    • 到了秒殺時間點,再更新秒殺按鈕,

而作為一名后端開發,本文的重點更多的在于后端的限流,

  • 單獨部署
    • 一種最常見的方式,就是單獨部署,以免秒殺業務崩潰而影響其他業務系統,
  • 快取
    • 添加快取可以避免請求直接打到資料庫,具體程序如下:根據商品id,先從快取中查詢商品,如果商品存在,則參與秒殺,如果不存在,則需要從資料庫中查詢商品,如果存在,則將商品資訊放入快取,然后參與秒殺,如果商品不存在,則直接提示失敗,
    • 這也會引發其他問題
      • 快取擊穿
        • 比如某一時刻快取失效,大量請求還是會直接打到資料庫,此時可以根據實際情況,將快取的有效期設定為不失效,并在秒殺活動開始前,對快取進行預熱,同時對資料庫查詢加鎖
        • 快取穿透
          • 商品id可能非法,也會導致直接訪問資料庫的情況,加鎖可以較好的緩解這一情況,同時,我們可以使用布隆過濾器,也能很好的解決這個問題,

  • 介面限流
    • 這邊以令牌桶限流演算法為例
    • 代碼層面,使用Guava的RateLimiter實作令牌桶限流介面
    • // 每秒放行10個請求
      private RateLimiter rateLimiter = RateLimiter.create(10);
      
      @GetMapping("/createOptimisticOrder/{sid}")
      public String createOptimisticOrder(@PathVariable int sid) {
          // 1. 阻塞式獲取令牌
          log.info("等待時間" + rateLimiter.acquire());
          // 2. 非阻塞式獲取令牌
          // if (!rateLimiter.tryAcquire(1000, TimeUnit.MILLISECONDS)) {
          //     log.warn("你被限流了,真不幸,直接回傳失敗");
          //     return "你被限流了,真不幸,直接回傳失敗";
          // }
          int id;
          try {
              id = stockOrderService.createOptimisticOrder(sid);
              log.info("購買成功,剩余庫存為: [{}]", id);
          } catch (Exception e) {
              log.error("購買失敗:[{}]", e.getMessage());
              return "購買失敗,庫存不足";
          }
          return String.format("購買成功,剩余庫存為:%d", id);
      }
    • 兩種方式獲取令牌
      • 非阻塞式獲取令牌:請求進來后,若令牌桶里沒有足夠的令牌,會嘗試等待設定好的時間(這里寫了1000ms),其會自動判斷在1000ms后,這個請求能不能拿到令牌,如果不能拿到,直接回傳搶購失敗,如果timeout設定為0,則等于阻塞時獲取令牌,
      • 阻塞式獲取令牌:請求進來后,若令牌桶里沒有足夠的令牌,就在這里阻塞住,等待令牌的發放,

    jmeter 測驗,采用阻塞式獲取令牌,可以看到吞吐量為 10

再看訂單情況,售出了 100 個,訂單也有 100 條

4 下單介面加鹽

我們的介面可以通過抓包輕易獲取到,這會給一些不法分子可乘之機,

一個簡單的做法就是給我們的介面地址加鹽,即動態的生成下單地址,

獲取鹽值介面

@GetMapping(value = "/getVerifyHash")
public String getVerifyHash(@RequestParam(value = "sid") Integer sid,
                            @RequestParam(value = "userId") Integer userId) {
    String hash;
    try {
        hash = userService.getVerifyHash(sid, userId);
    } catch (Exception e) {
        log.error("獲取驗證hash失敗,原因:[{}]", e.getMessage());
        return "獲取驗證hash失敗";
    }
    return String.format("請求搶購驗證hash值為:%s", hash);
}

加鹽下單介面

@GetMapping(value = "/createOrderWithVerifiedUrl")
public String createOrderWithVerifiedUrl(@RequestParam(value = "sid") Integer sid,
                                         @RequestParam(value = "userId") Integer userId,
                                         @RequestParam(value = "verifyHash") String verifyHash) {
    int stockLeft;
    try {
        stockLeft = stockOrderService.createVerifiedOrder(sid, userId, verifyHash);
        log.info("購買成功,剩余庫存為: [{}]", stockLeft);
    } catch (Exception e) {
        log.error("購買失敗:[{}]", e.getMessage());
        return e.getMessage();
    }
    return String.format("購買成功,剩余庫存為:%d", stockLeft);
}

另外,可以限制用戶下單的頻率,

@GetMapping(value = "/createOrderWithVerifiedUrl")
public String createOrderWithVerifiedUrl(@RequestParam(value = "sid") Integer sid,
                                         @RequestParam(value = "userId") Integer userId,
                                         @RequestParam(value = "verifyHash") String verifyHash) {
    int stockLeft;
    try {
        int count = userService.addUserCount(userId);
        log.info("用戶截至該次的訪問次數為: [{}]", count);
        boolean isBanned = userService.getUserIsBanned(userId);
        if (isBanned) {
            return "購買失敗,超過頻率限制";
        }
        stockLeft = stockOrderService.createVerifiedOrder(sid, userId, verifyHash);
        log.info("購買成功,剩余庫存為: [{}]", stockLeft);
    } catch (Exception e) {
        log.error("購買失敗:[{}]", e.getMessage());
        return e.getMessage();
    }
    return String.format("購買成功,剩余庫存為:%d", stockLeft);
}

用戶訪問頻率可以放在快取 redis 或者 memcached 中,限制了單個用戶最多搶5單,(注意是搶5單,而不是限購5單),最終發現搶到了2單(這邊搶到的單數屬于隨機事件)

5 保證 Redis 和 資料庫 資料的一致性

對于訪問量很大的“熱點”資料,尤其是一些讀取量遠大于寫入量的資料,更應該被快取,而不應該讓請求打到資料庫上,

快取的優點

  • 能夠縮短服務的回應時間,給用戶帶來更好的體驗,
  • 能夠增大系統的吞吐量,依然能夠提升用戶體驗,
  • 減輕資料庫的壓力,防止高峰期資料庫被壓垮,導致整個線上服務掛掉,

快取的問題

  • 快取有多種選型,你是否都熟悉,如果不熟悉,無疑增加了維護的難度,
  • 快取系統也要考慮分布式,無疑增加了系統的復雜性,
  • 如果對快取的準確性有非常高的要求,就必須考慮「快取和資料庫的一致性問題」,

接下來重點討論快取和資料庫一致性的問題

5.1 不使用更新快取而是洗掉快取

大部分觀點認為,做快取不應該是去更新快取,而是應該洗掉快取,然后由下個請求去去快取,發現不存在后再讀取資料庫,寫入快取,

其實如果業務非常簡單,只是去資料庫拿一個值,寫入快取,那么更新快取也是可以的,但是,淘汰快取操作簡單,并且帶來的副作用只是增加了一次cache miss,建議作為通用的處理方式,

5.2 先洗掉快取,還是先操作資料庫?

方案一 先刪快取,再更新資料庫

該方案會導致請求資料不一致

同時有一個請求A進行更新操作,另一個請求B進行查詢操作,那么會出現如下情形:

(1)請求A進行寫操作,洗掉快取

(2)請求B查詢發現快取不存在

(3)請求B去資料庫查詢得到舊值

(4)請求B將舊值寫入快取

(5)請求A將新值寫入資料庫

上述情況就會導致不一致的情形出現,而且,如果不采用給快取設定過期時間策略,該資料永遠都是臟資料,

方案二 先更新資料庫,再刪快取

假設這會有兩個請求,一個請求A做查詢操作,一個請求B做更新操作,那么會有如下情形產生

(1)快取剛好失效

(2)請求A查詢資料庫,得一個舊值

(3)請求B將新值寫入資料庫

(4)請求B洗掉快取

(5)請求A將查到的舊值寫入快取

如果發生上述情況,確實是會發生臟資料,

發生上述情況有一個先天性條件,就是步驟(3)的寫資料庫操作比步驟(2)的讀資料庫操作耗時更短,才有可能使得步驟(4)先于步驟(5),可是,大家想想,「資料庫的讀操作的速度遠快于寫操作的(不然做讀寫分離干嘛,做讀寫分離的意義就是因為讀操作比較快,耗資源少),因此步驟(3)耗時比步驟(2)更短,這一情形很難出現,

所以,如果你想實作基礎的快取資料庫雙寫一致的邏輯,那么在大多數情況下,在不想做過多設計,增加太大作業量的情況下,請 先更新資料庫,再刪快取!

方案三 先刪快取,再更新資料庫,過一段時間,再同步/異步 刪一次快取

(1)先淘汰快取

(2)再寫資料庫(這兩步和原來一樣)

(3)休眠1秒,再次淘汰緩存

這么做,可以將1秒內所造成的快取臟資料,再次洗掉,

6 下單異步處理

實際秒殺程序可以分為 秒殺 - 下單 - 支付 三個步驟,大部分的流量壓力是在秒殺這一步,之后的步驟完全可以異步完成,

這時候就可以用到 rabbitmq 的流量削峰的功能了,

代碼層面也簡單,新增一個 controller 介面

/**
 * 下單介面:異步處理訂單
 */
@GetMapping(value = "/createUserOrderWithMq")
public String createUserOrderWithMq(@RequestParam(value = "sid") Integer sid,
                                    @RequestParam(value = "userId") Integer userId) {
    try {
        // 檢查快取中該用戶是否已經下單過
        Boolean hasOrder = stockOrderService.checkUserOrderInfoInCache(sid, userId);
        if (hasOrder != null && hasOrder) {
            log.info("該用戶已經搶購過");
            return "你已經搶購過了,不要太貪心.....";
        }
        // 沒有下單過,檢查快取中商品是否還有庫存
        log.info("沒有搶購過,檢查快取中商品是否還有庫存");
        Integer count = stockService.getStockCount(sid);
        if (count == 0) {
            return "秒殺請求失敗,庫存不足.....";
        }

        // 有庫存,則將用戶id和商品id封裝為訊息體傳給訊息佇列處理
        // 注意這里的有庫存和已經下單都是快取中的結論,存在不可靠性,在訊息佇列中會查表再次驗證
        log.info("有庫存:[{}]", count);
        RabbitOrderDTO dto = new RabbitOrderDTO();
        dto.setSid(sid);
        dto.setUserId(userId);
        sendToOrderQueue(JSONObject.toJSONString(dto));
        return "秒殺請求提交成功";
    } catch (Exception e) {
        log.error("下單介面:異步處理訂單例外:", e);
        return "秒殺請求失敗,服務器正忙.....";
    }
}

再配置一個消費者

@Component
@RabbitListener(queues = "orderQueue")
@Slf4j
public class OrderMqListener {

    @Autowired
    private StockOrderService orderService;

    @RabbitHandler
    public void process(String message) {
        log.info("OrderMqReceiver收到訊息開始用戶下單流程: " + message);
        try {
            RabbitOrderDTO dto = JSONObject.parseObject(message, RabbitOrderDTO.class);
            orderService.createOrderByMq(dto.getSid(), dto.getUserId());
        } catch (Exception e) {
            log.error("訊息處理例外:", e);
        }
    }
}

異步與非異步性能對比

非異步下單(添加樂觀鎖,不限流,不限購)下單成功 54 單,吞吐量大約為 145

異步下單 100單全部賣出,吞吐量達 448

由此可以明顯感受到異步下單的優越性的

總結

至此,我們從超賣,高并發,快取,限流,超鏈接加鹽等多個角度簡單設計了一個秒殺系統,但是實際生產運用程序中,要考慮的東西遠不止這些,像快取擊穿,快取穿透,分布式鎖的設計,mq佇列訊息丟失,或者重復消費的問題,都是需要根據實際情況具體問題具體分析的,實踐出真知,希望有朝一日能真正運用到生產中吧,

原始碼地址

https://github.com/kid626/seckill

參考

【秒殺系統】從零打造秒殺系統(一):防止超賣

面試必考:秒殺系統如何設計? - 云+社區 - 騰訊云

《進大廠系列》系列-秒殺系統設計 - 知乎

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/379433.html

標籤:其他

上一篇:大資料之Kafka看這一篇就夠了

下一篇:【hadoop】mysql安裝

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more