主頁 >  其他 > OpenFunction 應用系列之一: 以 Serverless 的方式實作 Kubernetes 日志告警

OpenFunction 應用系列之一: 以 Serverless 的方式實作 Kubernetes 日志告警

2021-08-31 21:14:38 其他

概述

當我們將容器的日志收集到訊息服務器之后,我們該如何處理這些日志?部署一個專用的日志處理作業負載可能會耗費多余的成本,而當日志體量驟增、驟降時亦難以評估日志處理作業負載的待機數量,本文提供了一種基于 Serverless 的日志處理思路,可以在降低該任務鏈路成本的同時提高其靈活性,

我們的大體設計是使用 Kafka 服務器作為日志的接收器,之后以輸入 Kafka 服務器的日志作為事件,驅動 Serverless 作業負載對日志進行處理,據此的大致步驟為:

  1. 搭建 Kafka 服務器作為 Kubernetes 集群的日志接收器
  2. 部署 OpenFunction 為日志處理作業負載提供 Serverless 能力
  3. 撰寫日志處理函式,抓取特定的日志生成告警訊息
  4. 配置 Notification Manager 將告警發送至 Slack

在這個場景中,我們會利用到 OpenFunction 帶來的 Serverless 能力,

OpenFunction 是 KubeSphere 社區開源的一個 FaaS(Serverless)專案,旨在讓用戶專注于他們的業務邏輯,而不必關心底層運行環境和基礎設施,該專案當前具備以下關鍵能力:

  • 支持通過 dockerfile 或 buildpacks 方式構建 OCI 鏡像
  • 支持使用 Knative Serving 或 OpenFunctionAsync ( KEDA + Dapr ) 作為 runtime 運行 Serverless 作業負載
  • 自帶事件驅動框架

使用 Kafka 作為日志接收器

首先,我們為 KubeSphere 平臺開啟 logging 組件(可以參考 啟用可插拔組件 獲取更多資訊),然后我們使用 strimzi-kafka-operator 搭建一個最小化的 Kafka 服務器,

  1. 在 default 命名空間中安裝 strimzi-kafka-operator :

    helm repo add strimzi https://strimzi.io/charts/
    helm install kafka-operator -n default strimzi/strimzi-kafka-operator
    
  2. 運行以下命令在 default 命名空間中創建 Kafka 集群和 Kafka Topic,該命令所創建的 Kafka 和 Zookeeper 集群的存盤型別為 ephemeral,使用 emptyDir 進行演示,

    注意,我們此時創建了一個名為 “logs” 的 topic,后續會用到它

    cat <<EOF | kubectl apply -f -
    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: kafka-logs-receiver
      namespace: default
    spec:
      kafka:
        version: 2.8.0
        replicas: 1
        listeners:
          - name: plain
            port: 9092
            type: internal
            tls: false
          - name: tls
            port: 9093
            type: internal
            tls: true
        config:
          offsets.topic.replication.factor: 1
          transaction.state.log.replication.factor: 1
          transaction.state.log.min.isr: 1
          log.message.format.version: '2.8'
          inter.broker.protocol.version: "2.8"
        storage:
          type: ephemeral
      zookeeper:
        replicas: 1
        storage:
          type: ephemeral
      entityOperator:
        topicOperator: {}
        userOperator: {}
    ---
    apiVersion: kafka.strimzi.io/v1beta1
    kind: KafkaTopic
    metadata:
      name: logs
      namespace: default
      labels:
        strimzi.io/cluster: kafka-logs-receiver
    spec:
      partitions: 10
      replicas: 3
      config:
        retention.ms: 7200000
        segment.bytes: 1073741824
    EOF
    
  3. 運行以下命令查看 Pod 狀態,并等待 Kafka 和 Zookeeper 運行并啟動,

    $ kubectl get po
    NAME                                                   READY   STATUS        RESTARTS   AGE
    kafka-logs-receiver-entity-operator-568957ff84-nmtlw   3/3     Running       0          8m42s
    kafka-logs-receiver-kafka-0                            1/1     Running       0          9m13s
    kafka-logs-receiver-zookeeper-0                        1/1     Running       0          9m46s
    strimzi-cluster-operator-687fdd6f77-cwmgm              1/1     Running       0          11m
    

    運行以下命令查看 Kafka 集群的元資料:

    # 啟動一個工具 pod
    $ kubectl run utils --image=arunvelsriram/utils -i --tty --rm
    # 查看 Kafka 集群的元資料
    $ kafkacat -L -b kafka-logs-receiver-kafka-brokers:9092
    

我們將這個 Kafka 服務器添加為日志接收器,

  1. admin 身份登錄 KubeSphere 的 Web 控制臺,點擊左上角的平臺管理,然后選擇集群管理

    如果您啟用了多集群功能,您可以選擇一個集群,

  2. 集群管理頁面,選擇集群設定下的日志收集

  3. 點擊添加日志接收器并選擇 Kafka,輸入 Kafka 代理地址和埠資訊,然后點擊確定繼續,

  1. 運行以下命令驗證 Kafka 集群是否能從 Fluent Bit 接收日志:

    # 啟動一個工具 pod
    $ kubectl run utils --image=arunvelsriram/utils -i --tty --rm 
    # 檢查 logs topic 中的日志情況
    $ kafkacat -C -b kafka-logs-receiver-kafka-0.kafka-logs-receiver-kafka-brokers.default.svc:9092 -t logs
    

部署 OpenFunction

按照概述中的設計,我們需要先部署 OpenFunction,OpenFunction 專案參考了很多第三方的專案,如 Knative、Tekton、ShipWright、Dapr、KEDA 等,手動安裝較為繁瑣,推薦使用 Prerequisites 檔案 中的方法,一鍵部署 OpenFunction 的依賴組件,

其中 --with-shipwright 表示部署 shipwright 作為函式的構建驅動
--with-openFuncAsync 表示部署 OpenFuncAsync Runtime 作為函式的負載驅動
而當你的網路在訪問 Github 及 Google 受限時,可以加上 --poor-network 引數用于下載相關的組件

sh hack/deploy.sh --with-shipwright --with-openFuncAsync --poor-network

部署 OpenFunction:

此處選擇安裝最新的穩定版本,你也可以使用開發版本,參考 Install 檔案

為了可以正常使用 ShipWright ,我們提供了默認的構建策略,可以使用以下命令設定該策略:

kubectl apply -f https://raw.githubusercontent.com/OpenFunction/OpenFunction/main/config/strategy/openfunction.yaml
kubectl apply -f https://github.com/OpenFunction/OpenFunction/releases/download/v0.3.0/bundle.yaml

撰寫日志處理函式

我們以 創建并部署 WordPress 為例,搭建一個 WordPress 應用作為日志的生產者,該應用的作業負載所在的命名空間為 “demo-project”,Pod 名稱為 “wordpress-v1-f54f697c5-hdn2z”,

當請求結果為 404 時,我們收到的日志內容如下:

{"@timestamp":1629856477.226758,"log":"*.*.*.* - - [25/Aug/2021:01:54:36 +0000] \"GET /notfound HTTP/1.1\" 404 49923 \"-\" \"curl/7.58.0\"\n","time":"2021-08-25T01:54:37.226757612Z","kubernetes":{"pod_name":"wordpress-v1-f54f697c5-hdn2z","namespace_name":"demo-project","container_name":"container-nrdsp1","docker_id":"bb7b48e2883be0c05b22c04b1d1573729dd06223ae0b1676e33a4fac655958a5","container_image":"wordpress:4.8-apache"}}

我們的需求是:當一個請求結果為 404 時,發送一個告警通知給接收器(可以根據 配置 Slack 通知 配置一個 Slack 告警接收器),并記錄命名空間、Pod 名稱、請求路徑、請求方法等資訊,按照這個需求,我們撰寫一個簡單的處理函式:

你可以從 OpenFunction Context Spec 處了解 openfunction-context 的使用方法,這是 OpenFunction 提供給用戶撰寫函式的工具庫
你可以通過 OpenFunction Samples 了解更多的 OpenFunction 函式案例

package logshandler

import (
	"encoding/json"
	"fmt"
	"log"
	"regexp"
	"time"

	ofctx "github.com/OpenFunction/functions-framework-go/openfunction-context"
	alert "github.com/prometheus/alertmanager/template"
)

const (
	HTTPCodeNotFound = "404"
	Namespace        = "demo-project"
	PodName          = "wordpress-v1-[A-Za-z0-9]{9}-[A-Za-z0-9]{5}"
	AlertName        = "404 Request"
	Severity         = "warning"
)

// LogsHandler ctx 引數提供了用戶函式在集群語境中的背景關系句柄,如 ctx.SendTo 用于將資料發送至指定的目的地
// LogsHandler in 引數用于將輸入源中的資料(如有)以 bytes 的方式傳遞給函式
func LogsHandler(ctx *ofctx.OpenFunctionContext, in []byte) int {
	content := string(in)
	// 這里我們設定了三個正則運算式,分別用于匹配 HTTP 回傳碼、資源命名空間、資源 Pod 名稱
	matchHTTPCode, _ := regexp.MatchString(fmt.Sprintf(" %s ", HTTPCodeNotFound), content)
	matchNamespace, _ := regexp.MatchString(fmt.Sprintf("namespace_name\":\"%s", Namespace), content)
	matchPodName := regexp.MustCompile(fmt.Sprintf(`(%s)`, PodName)).FindStringSubmatch(content)

	if matchHTTPCode && matchNamespace && matchPodName != nil {
		log.Printf("Match log - Content: %s", content)

		// 如果上述三個正則運算式同時命中,那么我們需要提取日志內容中的一些資訊,用于填充至告警資訊中
		// 這些資訊為:404 請求的請求方式(HTTP Method)、請求路徑(HTTP Path)以及 Pod 名稱
		match := regexp.MustCompile(`([A-Z]+) (/\S*) HTTP`).FindStringSubmatch(content)
		if match == nil {
			return 500
		}
		path := match[len(match)-1]
		method := match[len(match)-2]
		podName := matchPodName[len(matchPodName)-1]

		// 收集到關鍵資訊后,我們使用 altermanager 的 Data 結構體組裝告警資訊
		notify := &alert.Data{
			Receiver:          "notification_manager",
			Status:            "firing",
			Alerts:            alert.Alerts{},
			GroupLabels:       alert.KV{"alertname": AlertName, "namespace": Namespace},
			CommonLabels:      alert.KV{"alertname": AlertName, "namespace": Namespace, "severity": Severity},
			CommonAnnotations: alert.KV{},
			ExternalURL:       "",
		}
		alt := alert.Alert{
			Status: "firing",
			Labels: alert.KV{
				"alertname": AlertName,
				"namespace": Namespace,
				"severity":  Severity,
				"pod":       podName,
				"path":      path,
				"method":    method,
			},
			Annotations:  alert.KV{},
			StartsAt:     time.Now(),
			EndsAt:       time.Time{},
			GeneratorURL: "",
			Fingerprint:  "",
		}
		notify.Alerts = append(notify.Alerts, alt)
		notifyBytes, _ := json.Marshal(notify)

		// 使用 ctx.SendTo 將內容發送給名為 "notification-manager" 的輸出端(你可以在之后的函式配置 logs-handler-function.yaml 中找到它的定義)
		if err := ctx.SendTo(notifyBytes, "notification-manager"); err != nil {
			panic(err)
		}
		log.Printf("Send log to notification manager.")
	}
	return 200
}

我們將這個函式上傳到代碼倉庫中,記錄代碼倉庫的地址以及代碼在倉庫中的目錄路徑,在下面的創建函式步驟中我們將使用到這兩個值,

你可以在 OpenFunction Samples 中找到這個案例,

創建函式

接下來我們將使用 OpenFunction 構建上述的函式,首先設定一個用于訪問鏡像倉庫的秘鑰檔案 push-secret(在使用代碼構建出 OCI 鏡像后,OpenFunction 會將該鏡像上傳到用戶的鏡像倉庫中,用于后續的負載啟動):

REGISTRY_SERVER=https://index.docker.io/v1/ REGISTRY_USER=<your username> REGISTRY_PASSWORD=<your password>
kubectl create secret docker-registry push-secret \
    --docker-server=$REGISTRY_SERVER \
    --docker-username=$REGISTRY_USER \
    --docker-password=$REGISTRY_PASSWORD

應用函式 logs-handler-function.yaml

函式定義中包含了對兩個關鍵組件的使用:

Dapr 對應用程式屏蔽了復雜的中間件,使得 logs-handler 可以非常容易地處理 Kafka 中的事件

KEDA 通過監控訊息服務器中的事件流量來驅動 logs-handler 函式的啟動,并且根據 Kafka 中訊息的消費延時動態擴展 logs-handler 實體

apiVersion: core.openfunction.io/v1alpha1
kind: Function
metadata:
  name: logs-handler
spec:
  version: "v1.0.0"
  # 這里定義了構建后的鏡像的上傳路徑
  image: openfunctiondev/logs-async-handler:v1
  imageCredentials:
    name: push-secret
  build:
    builder: openfunctiondev/go115-builder:v0.2.0
    env:
      FUNC_NAME: "LogsHandler"
    # 這里定義了源代碼的路徑
    # url 為上面提到的代碼倉庫地址
    # sourceSubPath 為代碼在倉庫中的目錄路徑
    srcRepo:
      url: "https://github.com/OpenFunction/samples.git"
      sourceSubPath: "functions/OpenFuncAsync/logs-handler-function/"
  serving:
    # OpenFuncAsync 是 OpenFunction 通過 KEDA+Dapr 實作的一種由事件驅動的異步函式運行時
    runtime: "OpenFuncAsync"
    openFuncAsync:
      # 此處定義了函式的輸入(kafka-receiver)和輸出(notification-manager),與下面 components 中的定義對應關聯
      dapr:
        inputs:
          - name: kafka-receiver
            type: bindings
        outputs:
          - name: notification-manager
            type: bindings
            params:
              operation: "post"
              type: "bindings"
        annotations:
          dapr.io/log-level: "debug"
        # 這里完成了上述輸入端和輸出端的具體定義(即 Dapr Components)
        components:
          - name: kafka-receiver
            type: bindings.kafka
            version: v1
            metadata:
              - name: brokers
                value: "kafka-logs-receiver-kafka-brokers:9092"
              - name: authRequired
                value: "false"
              - name: publishTopic
                value: "logs"
              - name: topics
                value: "logs"
              - name: consumerGroup
                value: "logs-handler"
          # 此處為 KubeSphere 的 notification-manager 地址
          - name: notification-manager
            type: bindings.http
            version: v1
            metadata:
              - name: url
                value: http://notification-manager-svc.kubesphere-monitoring-system.svc.cluster.local:19093/api/v2/alerts
      keda:
        scaledObject:
          pollingInterval: 15
          minReplicaCount: 0
          maxReplicaCount: 10
          cooldownPeriod: 30
          # 這里定義了函式的觸發器,即 Kafka 服務器的 “logs” topic
          # 同時定義了訊息堆積閾值(此處為 10),即當訊息堆積量超過 10,logs-handler 實體個數就會自動擴展
          triggers:
            - type: kafka
              metadata:
                topic: logs
                bootstrapServers: kafka-logs-receiver-kafka-brokers.default.svc.cluster.local:9092
                consumerGroup: logs-handler
                lagThreshold: "10"

結果演示

我們先關閉 Kafka 日志接收器:在日志收集頁面,點擊進入 Kafka 日志接收器詳情頁面,然后點擊更多操作并選擇更改狀態,將其設定為關閉

停用后一段時間,我們可以觀察到 logs-handler 函式實體已經收縮到 0 了,

再將 Kafka 日志接收器激活,logs-handler 隨之啟動,

~# kubectl get po --watch
NAME                                                     READY   STATUS        RESTARTS   AGE
kafka-logs-receiver-entity-operator-568957ff84-tdrrx     3/3     Running       0          7m27s
kafka-logs-receiver-kafka-0                              1/1     Running       0          7m48s
kafka-logs-receiver-zookeeper-0                          1/1     Running       0          8m12s
logs-handler-serving-kpngc-v100-zcj4q-5f46996f8c-b9d6f   2/2     Terminating   0          34s
strimzi-cluster-operator-687fdd6f77-kc8cv                1/1     Running       0          10m
logs-handler-serving-kpngc-v100-zcj4q-5f46996f8c-b9d6f   2/2     Terminating   0          36s
logs-handler-serving-kpngc-v100-zcj4q-5f46996f8c-b9d6f   0/2     Terminating   0          37s
logs-handler-serving-kpngc-v100-zcj4q-5f46996f8c-b9d6f   0/2     Terminating   0          38s
logs-handler-serving-kpngc-v100-zcj4q-5f46996f8c-b9d6f   0/2     Terminating   0          38s
logs-handler-serving-kpngc-v100-zcj4q-5f46996f8c-9kj2c   0/2     Pending       0          0s
logs-handler-serving-kpngc-v100-zcj4q-5f46996f8c-9kj2c   0/2     Pending       0          0s
logs-handler-serving-kpngc-v100-zcj4q-5f46996f8c-9kj2c   0/2     ContainerCreating   0          0s
logs-handler-serving-kpngc-v100-zcj4q-5f46996f8c-9kj2c   0/2     ContainerCreating   0          2s
logs-handler-serving-kpngc-v100-zcj4q-5f46996f8c-9kj2c   1/2     Running             0          4s
logs-handler-serving-kpngc-v100-zcj4q-5f46996f8c-9kj2c   2/2     Running             0          11s

接著我們向 WordPress 應用一個不存在的路徑發起請求:

curl http://<wp-svc-address>/notfound

可以看到 Slack 中已經收到了這條訊息(與之對比的是,當我們正常訪問該 WordPress 站點時, Slack 中并不會收到告警訊息):

進一步探索

  • 同步函式的解決方案

    為了可以正常使用 Knative Serving ,我們需要設定其網關的負載均衡器地址,(你可以使用本機地址作為 workaround)

    將下面的 "1.2.3.4" 替換為實際場景中的地址,

    kubectl patch svc -n kourier-system kourier \
    -p '{"spec": {"type": "LoadBalancer", "externalIPs": ["1.2.3.4"]}}'
    
    kubectl patch configmap/config-domain -n knative-serving \
    --type merge --patch '{"data":{"1.2.3.4.sslip.io":""}}'
    

    除了直接由 Kafka 服務器驅動函式運作(異步方式),OpenFunction 還支持使用自帶的事件框架對接 Kafka 服務器,之后以 Sink 的方式驅動 Knative 函式運作,可以參考 OpenFunction Samples 中的案例,

    在該方案中,同步函式的處理速度較之異步函式有所降低,當然我們同樣可以借助 KEDA 來觸發 Knative Serving 的 concurrency 機制,但總體而言缺乏異步函式的便捷性,(后續的階段中我們會優化 OpenFunction 的事件框架來解決同步函式這方面的缺陷)

    由此可見,不同型別的 Serverless 函式有其擅長的任務場景,如一個有序的控制流函式就需要由同步函式而非異步函式來處理,

綜述

Serverless 帶來了我們所期望的對業務場景快速拆解重構的能力,

如本案例所示,OpenFunction 不但以 Serverless 的方式提升了日志處理、告警通知鏈路的靈活度,還通過函式框架將通常對接 Kafka 時復雜的配置步驟簡化為語意明確的代碼邏輯,同時,我們也在不斷演進 OpenFunction,將在之后版本中實作由自身的 Serverless 能力驅動自身的組件運作,

本文由博客一文多發平臺 OpenWrite 發布!

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

標籤:其他

上一篇:Clusternet - 新一代開源多集群管理與應用治理專案

下一篇:如何通過api設定和參考token值

標籤雲
其他(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