告警中心消息转发系统PrometheusAlert

news2024/11/17 19:37:11

告警中心消息转发系统(PrometheusAlert)

官方站点:Prometheus Alert是开源的运维告警中心消息转发系统

手册:README - PrometheusAlert (gitbook.io)

为什么要用PrometheusAlert?

背景

  • 通过configmap配置文件维护告警媒介辨析度低
  • 部分快消息告警媒介需要额外部署webhook做转发
  • alertmanager web UI 较简单,不足以展示更多的数据信息

架构原理

Exports –> Prometheus –> Prometheus Rules –> Alertmanager –> webhook –> PrometheusAlert –> Routes –> 企微/钉钉/飞书…

在这里插入图片描述

PrometheusAlert优点

配置灵活:通过web UI界面配置操作,相较于configmap较灵活。

功能强大:支持在线修改告警模版,告警路由,告警记录,测试等。

  1. 针对Prometheus增加了告警级别,并且支持按照不同级别发送消息到不同目标对象。
  2. 简化Prometheus分组配置,支持按照具体消息发送到单个或多个接收方。
  3. 增加Dashboard,提供配置测试,告警消息模版自定义,告警模版测试等功能

自定义强度高:通过路由匹配规则触发更多的告警媒介(企微,钉钉,飞书,公有云电话/短消息接口)。

  1. 增加手机号码配置项和号码自动轮询配置,可固定发送给单一个人告警信息,也可以通过自动轮询的方式发送到多个人员且支持按照不同日期发送到不同人员。

开源免费:PrometheusAlert 是一款完全开源的软件,可以免费使用和定制,而且有广泛的社区支持。

prometheusAlert部署配置

在kubernetes中运行

#Kubernetes中运行可以直接执行以下命令行即可(注意默认的部署模版中未挂载模版数据库文件 db/PrometheusAlertDB.db,为防止模版数据丢失,请自行增加挂载配置 )
$ kubectl apply -n monitor -f https://files.m.daocloud.io/raw.githubusercontent.com/feiyu563/PrometheusAlert/master/example/kubernetes/PrometheusAlert-Deployment.yaml

#启动后可使用浏览器打开以下地址查看:http://[YOUR-PrometheusAlert-URL]:8080
#默认登录帐号和密码在app.conf中有配置

使用helm部署

#clone项目源代码
$ git clone https://github.com/feiyu563/PrometheusAlert.git
$ cd PrometheusAlert/example/helm

#如需修改配置文件,请更新config中的app.conf
#helm部署模版支持配置Ingress域名,可在values.yaml中进行配置
#配置修改完成后,通过以下命令启动即可(注意默认的部署模版中未挂载模版数据库文件 db/PrometheusAlertDB.db,为防止模版数据丢失,请自行增加挂载配置 )
$ helm upgrade --install monitor prometheusalert -n monitor

#启动后可使用浏览器打开以下地址查看: http://[Ingress_url]:[Ingress_port]
#默认登录帐号和密码在app.conf中有配置

使用控制器文件部署

为防止模版数据丢失,增加挂载配置

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: prome-alert-data-pvc
  namespace: monitor
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: "nfs-storage"
  resources:
    requests:
      storage: 5Gi

下载官方配置文件

$ wget https://files.m.daocloud.io/raw.githubusercontent.com/feiyu563/PrometheusAlert/master/example/kubernetes/PrometheusAlert-Deployment.yaml

修改配置文件

app.conf: |
    #---------------------↓全局配置-----------------------
    appname = PrometheusAlert
    #登录用户名
    login_user=admin
    #登录密码
    login_password=admin123
    #监听地址
    httpaddr = "0.0.0.0"
    #监听端口
    httpport = 8080
...
    #数据库驱动,支持sqlite3,mysql,postgres如使用mysql或postgres,请开启db_host,db_port,db_user,db_password,db_name的注释
    db_driver=mysql
    db_host=11.0.1.52
    db_port=3306
    db_user=root
    db_password=XXXXXXXXXXX
    db_name=prometheusalert
...
    #是否开启告警记录定时删除 0为关闭,1为开启
    RecordLive=1
    #告警记录定时删除周期,单位天
    RecordLiveDay=7
...
    #是否开启微信告警通道,可同时开始多个通道0为关闭,1为开启
    open-weixin=1
    #默认企业微信机器人地址
    wxurl=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=b3738de5-9f00-45de-9e3d-45e6309bc54c
...
        - name: prometheus-alert-db
          mountPath: /app/db

      - name: prometheus-alert-db
        persistentVolumeClaim:
          claimName: prome-alert-data-pvc

配置Ingress路由

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: prometheus-alert-ing
  namespace: monitor
  annotations:
    prometheus.io/http_probe: "true"
spec:
  ingressClassName: nginx
  rules:
    - host: prometheusalert.kubernets.cn
      http:
        paths:
          - pathType: Prefix
            backend:
              service:
                name: prometheus-alert-center
                port:
                  number: 8080
            path: /

配置PrometheusAlert使用mysql作为后端数据存储

部署mysql到Kubernetes集群

## 创建秘钥
kubectl create secret generic mysql-root-password --from-literal=password=mysqlpwd123

## 创建pvc
cat > mysql-k8s.yaml << eof
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  storageClassName: nfs-storage
  
## 创建mysql控制器
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: mysql
  name: mysql
  namespace: monitor
spec:
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: docker.m.daocloud.io/mysql:5.7
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-root-password
              key: password
          # 如果你不想使用secret对象保存mysql登录密码,可以直接使用下面的方式指定,简单粗暴未尝不可
          #value: "123456"
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: mysqlvolume
          mountPath: /var/lib/mysql
      volumes:
      - name: mysqlvolume
        # 使用pvc
        persistentVolumeClaim:
          claimName: mysql-pvc
---
#定义mysql的Service
apiVersion: v1
kind: Service
metadata:
  labels:
    app: svc-mysql
  name: svc-mysql
  namespace: monitor
spec:
  selector:
    app: mysql
  type: ClusterIP
  ports:
  - port: 3306
    protocol: TCP
    targetPort: 3306
eof   
    

PrometheusAlert默认使用sqlite3作为后端自定义模板的存储,这种方式适合于单机部署,满足绝大部分生产场景使用。

考虑到部分企业对于服务的高可用要求较高,同时也为了让PrometheusAlert更易于横向扩展,用户可以更改PrometheusAlert的默认存储为mysql。

推荐使用mysql 5.7及以上版本

创建数据库

# 获取 mysql pod
$ kubectl get pod -n monitor|grep mysql
# 进入 mysql pod
$ kubectl exec -it mysql-6785bdcf-wsxhn -n monitor /bin/bash
# 在 mysql pod 容器内执行
# 登录 mysql
$ mysql -uroot -p
# 创建数据库 prometheusalert
$ CREATE DATABASE prometheusalert CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

获取 prometheusalert.sql

# 获取pod
$ kubectl get pod -n monitor|grep prometheus
# 进入pod
$ kubectl exec -it prometheus-alert-center-5d7dfb8c99-h78z4 -n monitor /bin/sh
# 拷贝文件
$ kubectl cp monitor/prometheus-alert-center-5d7dfb8c99-l48gw:/app/db/prometheusalert.sql 

导入sql

# 进入 mysql pod
kubectl exec -it mysql-6785bdcf-wsxhn -n monitor /bin/bash
# 在 mysql pod 容器内执行
# 切换到 mysql 数据目录下
cd /var/lib/mysql
# 登录 mysql
mysql -uroot -p
use prometheusalert
source prometheusalert.sql

prometheusAlerti配置管理

编辑自定义模版

模板内容

{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}{{if eq $v.status "resolved"}}[PROMETHEUS-恢复信息]({{$v.generatorURL}})
> **[{{$v.labels.alertname}}]({{$var}})**✅
> <font color="info">告警级别:</font> {{$v.labels.severity}}
> <font color="info">开始时间:</font> {{GetCSTtime $v.startsAt}}
> <font color="info">结束时间:</font> {{GetCSTtime $v.endsAt}}
> <font color="info">命名空间:</font> {{$v.labels.namespace}}
> <font color="info">实例名称:</font> {{$v.labels.pod}}
> <font color="info">实例地址:</font> {{$v.labels.instance}}
> <font color="info">**{{$v.annotations.description}}**</font>{{else}}[PROMETHEUS-告警信息]({{$v.generatorURL}})
> **[{{$v.labels.alertname}}]({{$var}})**🔥
> <font color="#FF0000">告警级别:</font> {{$v.labels.severity}}
> <font color="#FF0000">开始时间:</font> {{GetCSTtime $v.startsAt}}
> <font color="#FF0000">命名空间:</font> {{$v.labels.namespace}}
> <font color="#FF0000">实例名称:</font> {{$v.labels.pod}}
> <font color="#FF0000">实例地址:</font> {{$v.labels.instance}}
> <font color="#FF0000">**{{$v.annotations.description}}**</font>{{end}}{{ end }}
{{ $urimsg:=""}}{{ range $key,$value:=.commonLabels }}{{$urimsg =  print $urimsg $key "%3D%22" $value "%22%2C" }}{{end}}[✍点我屏蔽该告警](http://alertmanager.kubernets.cn/#/silences/new?filter=%7B{{SplitString $urimsg 0 -3}}%7D)

新增自定义模版

模板内容

{{ $var := .externalURL}}{{ range $k,$v:=.alerts }}{{if eq $v.status "resolved"}}[PROMETHEUS-恢复信息]({{$v.generatorURL}})
> **[{{$v.labels.alertname}}]({{$var}})**✅
> <font color="info">告警级别:</font> {{$v.labels.severity}}
> <font color="info">当前状态:</font> **<font color="#67C23A">已恢复</font>**
> <font color="info">开始时间:</font> {{GetCSTtime $v.startsAt}}
> <font color="info">结束时间:</font> {{GetCSTtime $v.endsAt}}
> <font color="info">实例地址:</font> {{$v.labels.instance}}
> <font color="info">**{{$v.annotations.description}}**</font>{{else}}[PROMETHEUS-告警信息]({{$v.generatorURL}})
> **[{{$v.labels.alertname}}]({{$var}})**🔥
> <font color="#FF0000">告警级别:</font> {{$v.labels.severity}}
> <font color="#FF0000">当前状态:</font> **<font color="#E6A23C">需要处理</font>**
> <font color="#FF0000">开始时间:</font> {{GetCSTtime $v.startsAt}}
> <font color="#FF0000">实例地址:</font> {{$v.labels.instance}}
> <font color="#FF0000">**{{$v.annotations.description}}**</font>{{end}}{{ end }}
{{ $urimsg:=""}}{{ range $key,$value:=.commonLabels }}{{$urimsg =  print $urimsg $key "%3D%22" $value "%22%2C" }}{{end}}[✍点我屏蔽该告警](http://alertmanager.kubernets.cn/#/silences/new?filter=%7B{{SplitString $urimsg 0 -3}}%7D)

告警测试

告警管理 --> 告警测试 --> 企业微信 --> 企业微信查看测试消息

告警路由

在这里插入图片描述

配置Alertmanager接入PrometheusAlert

更新alertmanager配置,将所有的告警均指向告警分发平台

apiVersion: v1
kind: ConfigMap
metadata:
  name: alertmanager-config
  namespace: monitor
data:
  alertmanager.yml: |-
    global:
      resolve_timeout: 1m
      smtp_smarthost: 'smtp.exmail.qq.com:465'     # 邮箱服务器的SMTP主机配置
      smtp_from: 'zhdya@zhdya.cn'    # 发送邮件主题
      smtp_auth_username: 'zhdya@zhdya.cn'      # 登录用户名
      smtp_auth_password: 'yfXBXXXXX3DwYTjn'    # 此处的auth password是邮箱的第三方登录授权密码,而非用户密码
      smtp_require_tls: false           # 有些邮箱需要开启此配置,这里使用的是企微邮箱,仅做测试,不需要开启此功能。

    templates:
      - '/etc/alertmanager/*.tmpl'
    route:
      group_by: ['env','instance','type','group','job','alertname','cluster']
      group_wait: 10s
      group_interval: 2m
      repeat_interval: 10m
      receiver: 'webhook'

    receivers:
    - name: 'webhook'
      webhook_configs:
      - url: 'http://prometheus-alert-center.monitor.svc:8080/prometheusalert?type=wx&tpl=prometheus-wx&wxurqq.com/cgi-bin/webhook/send?key=71c0a6f0-43a0-4ecf-b8c9-52aff88f3b68&at=ZhangDaDan,ZHDYA'
        send_resolved: true

    inhibit_rules:
      - source_match:
          severity: 'critical'
        target_match:
          severity: 'warning'
        equal: ['alertname', 'dev', 'instance']

  wechat.tmpl: |-
    {{ define "wechat.default.message" }}
    {{- if gt (len .Alerts.Firing) 0 -}}
    {{- range $index, $alert := .Alerts -}}
    {{- if eq $index 0 }}
    ========= 监控报警 =========
    告警状态:{{   .Status }}
    告警级别:{{ .Labels.severity }}
    告警类型:{{ $alert.Labels.alertname }}
    故障主机: {{ $alert.Labels.instance }}
    告警主题: {{ $alert.Annotations.summary }}
    告警详情: {{ $alert.Annotations.message }}{{ $alert.Annotations.description}};
    触发阀值:{{ .Annotations.value }}
    故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
    ========= = end =  =========
    {{- end }}
    {{- end }}
    {{- end }}
    {{- if gt (len .Alerts.Resolved) 0 -}}
    {{- range $index, $alert := .Alerts -}}
    {{- if eq $index 0 }}
    ========= 告警恢复 =========
    告警类型:{{ .Labels.alertname }}
    告警状态:{{   .Status }}
    告警主题: {{ $alert.Annotations.summary }}
    告警详情: {{ $alert.Annotations.message }}{{ $alert.Annotations.description}};
    故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
    恢复时间: {{ ($alert.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
    {{- if gt (len $alert.Labels.instance) 0 }}
    实例信息: {{ $alert.Labels.instance }}
    {{- end }}
    ========= = end =  =========
    {{- end }}
    {{- end }}
    {{- end }}
    {{- end }}

  email.tmpl: |-
    {{ define "email.from" }}xxx.com{{ end }}
    {{ define "email.to" }}xxx.com{{ end }}
    {{ define "email.to.html" }}
    {{- if gt (len .Alerts.Firing) 0 -}}
    {{ range .Alerts }}
    ========= 监控报警 =========<br>
    告警程序: prometheus_alert <br>
    告警级别: {{ .Labels.severity }} <br>
    告警类型: {{ .Labels.alertname }} <br>
    告警主机: {{ .Labels.instance }} <br>
    告警主题: {{ .Annotations.summary }}  <br>
    告警详情: {{ .Annotations.description }} <br>
    触发时间: {{ .StartsAt.Format "2006-01-02 15:04:05" }} <br>
    ========= = end =  =========<br>
    {{ end }}{{ end -}}

    {{- if gt (len .Alerts.Resolved) 0 -}}
    {{ range .Alerts }}
    ========= 告警恢复 =========<br>
    告警程序: prometheus_alert <br>
    告警级别: {{ .Labels.severity }} <br>
    告警类型: {{ .Labels.alertname }} <br>
    告警主机: {{ .Labels.instance }} <br>
    告警主题: {{ .Annotations.summary }} <br>
    告警详情: {{ .Annotations.description }} <br>
    触发时间: {{ .StartsAt.Format "2006-01-02 15:04:05" }} <br>
    恢复时间: {{ .EndsAt.Format "2006-01-02 15:04:05" }} <br>
    ========= = end =  =========<br>
    {{ end }}{{ end -}}
    {{- end }}

接口说明

    receivers:
    - name: 'webhook'
      webhook_configs:
      - url: 'http://prometheus-alert-center.monitor.svc:8080/prometheusalert?type=wx&tpl=prometheus-wx&wxurqq.com/cgi-bin/webhook/send?key=71c0a6f0-43a0-4ecf-b8c9-52aff88f3b68&at=ZhangDaDan,ZHDYA'

## 接口说明:
/prometheusalert   #自定义模版接口,可通过Dashboard自定义模版后,支持任意WebHook接入
type=?:指定消息转发的目标类型,如钉钉、企业微信、飞书等;该参数为必选参数
目前支持的值:
dd 钉钉
wx 企业微信
workwechat 企业微信应用
fs 飞书
webhook WebHook
txdx 腾讯云短信
txdh 腾讯云电话
alydx 阿里云短信
alydh 阿里云电话
hwdx 华为云短信
bddx 百度云短信
rlydh 容联云电话
7moordx 七陌短信
7moordh 七陌语音电话
email Email
tg Telegram
rl 百度Hi(如流)

tpl=?: 指定消息所使用的模版,如prometheus-dd(Prometheus针对钉钉的模板);模版可以去PrometheusAlert 页面的模版管理-->自定义模板页面查看或新建;该参数为必选参数
ddurl=?:指定PrometheusAlert发送消息的钉钉机器人地址,如需要多个地址可以通过,分割,该参数需要配合type=dd的模版使用;该参数为可选参数,如未填写,则默认从app.conf中获取默认配置
wxurl=?:指定PrometheusAlert发送消息的企业微信机器人地址,如需要多个地址可以通过,分割,该参数需要配合type=wx的模版使用;该参数为可选参数,如未填写,则默认从app.conf中获取默认配置
fsurl=?:指定PrometheusAlert发送消息的飞书机器人地址,如需要多个地址可以通过,分割,该参数需要配合type=fs的模版使用;该参数为可选参数,如未填写,则默认从app.conf中获取默认配置
phone=?:指定PrometheusAlert发送消息的手机号,如需要多个号码可以通过,分割,该参数需要配合type=txdx | hwdx | bddx | alydx | txdh | alydh | rlydh | 7moordx | 7moordh的模版使用;该参数为可选参数,如未填写,则默认从app.conf中获取默认配置
email=?:指定PrometheusAlert发送消息的email地址,如需要多个email可以通过,分割,该参数需要配合type=email的模版使用;该参数为可选参数,如未填写,则默认从app.conf中获取默认配置
groupid=?:指定PrometheusAlert发送消息的groupid,该参数需要配合type=rl的模版使用;该参数为可选参数,如未填写,则默认从app.conf中获取默认配置
webhook=?:指定PrometheusAlert发送消息的webhook,该参数需要配合type=webhook的模版使用;该参数为可选参数
at=?:钉钉机器人、企业微信机器人开启@某人的功能,如需添加多个@目标,用,号分割即可。此处需注意:钉钉@使用的是手机号码,企业微信机器人@使用的是用户帐号。;该参数为可选参数
rr=?:该参数为开启随机轮询,目前仅针对ddurl,fsurl,wxurl有效,默认情况下如果上述Url配置的是多个地址,则多个地址全部发送,如开启该选项,则从多个地址中随机取一个地址发送,主要是为了避免消息发送频率过高导致触发部分机器人拦截消息。;该参数为可选参数
split=?:该参数仅针对Prometheus告警消息有效,作用是将Prometheus分组消息拆分成单条发送。默认开启,如果Prometheus一次告警附带的同分组的告警消息条数过多,可能会导致告警消息体过大。如需关闭请在url中加入split=false;该参数为可选参数
注意:此参数如设置为split=false,则PrometheusAlert web页面的路由和告警记录等功能将自动关闭,请谨慎。

热加载alertmanager服务

$ curl -XPOST http://alertmanager.kubernets.cn/-/reload

测试验证

验证所有的告警是否发送到指定的群组

## 默认标签走默认路由
$ curl -XPOST -H 'Content-Type: application/json' http://alertmanager.kubernets.cn/api/v1/alerts -d '[{"labels":{"hostname":"zhdya"},"annotations":{"summary":"This is a test alert"}}]'

验证指定标签告警到指定的群组

## 默认将告警分发到指定的告警组,并也需要在DEVOPS群组中展示
$ curl -XPOST -H 'Content-Type: application/json' http://alertmanager.kubernets.cn/api/v1/alerts -d '[{"labels":{"hostname":"hello"},"annotations":{"summary":"This is a test alert"}}]'

总结

  • 支持任意包含WebHook接口系统的消息作为消息来源,常见的如Prometheus,Zabbix,Grafana等。
  • 支持多种类型的发送目标,支持钉钉,企业微信,email,飞书,公有云短信/电话等。
  • 支持按照不同级别发送消息到不同目标对象。
  • 简化Prometheus分组配置,支持按照具体消息发送到单个或多个接收方。
  • 可按照企业中的排班制,通过自动轮询的方式发送到多个人员且支持按照不同日期发送到不同人员。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2066396.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Canvas与艺术】环状合掌纹

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>环形合掌纹</title><style type"text/css">.…

45.5【C语言】typedef

目录&#xff1a; *全称 *格式 一般指针 数组指针 函数指针 *细节 *全称 type define 类型&#xff08;重新&#xff09;定义&#xff08;或命名&#xff09;&#xff0c;可简化输入 *格式 1.非指针类型: typedef 类型 简化名称 typedef signed long long k; signed long …

SOMEIP_ETS_059: ResetInterface_wrong_Fire_and_forget_package_get_No_Error_back

测试目的&#xff1a; 验证设备&#xff08;DUT&#xff09;在接收到一个错误的Fire&Forget消息时&#xff0c;不会做出响应或发送错误消息。 描述 本测试用例旨在检查DUT在接收到使用无效接口版本的方法resetInterface的Fire&Forget消息时&#xff0c;是否不会回应…

四川财谷通信息技术有限公司抖音小店,打造新生态

在当今这个数字化浪潮汹涌的时代&#xff0c;电商行业以其独特的魅力和无限潜力&#xff0c;成为了推动经济发展的重要力量。抖音&#xff0c;作为短视频领域的佼佼者&#xff0c;其抖音小店功能的推出&#xff0c;更是为众多商家开辟了一条全新的销售渠道。四川财谷通信息技术…

【计算机操作系统】虚拟内存的基本概念

文章目录 虚拟内存的基本概念传统存储管理方式的特征&缺点局部性原理虚拟内存的定义和特征虚拟内存的定义虚拟内存的特征 虚拟内存技术的实现 虚拟内存的基本概念 前面已经介绍过内存管理相关的重点&#xff0c;传统存储管理方式、覆盖与交换技术、地址转换和存储保护在之…

企业监控大盘Grafana

企业监控大盘Grafana Grafana简述 Grafana 是一个开源的度量分析与可视化工具。提供查询、可视化、报警和指标展示等功能&#xff0c;能灵活创建图表、仪表盘等可视化界面 主要功能&#xff1a; 可视化: 提供多种可选择的不同类型的图形&#xff0c;能够灵活绘制不同样式&…

css 宫格样式内容上下结构

结构 <div class"sc-content-group"><div class"sc-content-item"><div class"sc-item-img"><el-image :src"src" :preview-src-list"[src]"></el-image></div><div class"s…

放弃你的 KPI。改用这种方法

如果您和我一样&#xff0c;那么大约十二年前&#xff0c;您就因为 Eric Ries 而加入了 MVP/精益创业潮流。谁不想“利用持续创新打造出极为成功的企业”呢&#xff1f; 但当你读到这句话时&#xff0c;你可能会注意到一些事情。精益求精并专注于最低限度的可行性是给初创公司的…

深入了解Elasticsearch集群:Elasticsearch集群的工作原理与优化策略

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 ELasticsearch作为一个分布式搜索引擎&#xff0c;能够出色地支持集群模式、动态水平扩容、故障转移等分布式系统特性&…

第二证券:什么是股票打板?怎么打板?

打板&#xff0c;指的是在股价即将涨停或许涨停之后再进行挂单介入&#xff0c;不涨停不进入&#xff0c;股票打板寻求的是出资更大的确认性。 打板的步骤&#xff1a; 1、复盘并对下一个交易日行情进行判别 出资者能够把其时交易日的商场条理树立清楚&#xff0c;找出主线板…

PWM驱动电机系列——PID控制 (各电机设备之间的驱动差异及区别)自动控制系统的性能指标

电机驱动 直流电机&#xff1a;类似于驱动LED亮灭一样&#xff0c;根据电机的电路原理图判断是什么数字电平有效。 步进电机&#xff1a;类似于驱动LED的周期翻转一样&#xff0c;在一个周期里面进行对步进电机的IO电平的自动翻转&#xff0c;LED!LED 。(1)使用的定时器方式&…

C#/WinForm实现炸弹人游戏

游戏类设计 代码地址&#xff08;gitee&#xff09;&#xff1a;炸弹人游戏: WinForm实现炸弹人游戏

开源大屏设计工具DataRoom

DataRoom是一个开源项目&#xff0c;主要作为一个数据共享与协作平台&#xff0c;同时也具备大屏可视化设计器的功能。 开源地址&#xff1a;DataRoom: &#x1f525;基于Vue的大屏可视化设计器&#xff0c;前后端一体化解决方案&#xff0c;几十种炫酷图表&#xff0c;支持多种…

曝光无线领夹麦克风选购五大陷阱:选麦克风谨防音质粗劣夸大宣传

在移动录制与现场直播日益普及的时代背景下&#xff0c;无线领夹麦克风成为了众多专业人士与爱好者的首选装备。但在这个看似大热的市场背后&#xff0c;却隐藏着不少消费者难以察觉的“坑”。部分品牌为了抢占市场份额&#xff0c;不惜以牺牲品质为代价&#xff0c;通过夸大宣…

如何使用cornerstone3D渲染3D影像

&#x1f353; 前言 在日常开发中经常会遇到除了渲染MPR视图外&#xff0c;还需要渲染3D扫描影像&#xff0c;本文从具体的实现、viewport type解读、场景预设等方面来介绍3D具体的实现及涉及到的相关概念。 &#x1f951; 效果演示 点击查看完整代码 &#x1f352; 实现及概…

ArcMap教程(01):制作人口专题图

文章目录 01、ArcGIS专题图制作第一步:插入数据框第一步:加载人口分级地图第二步:添加范围指示器第三步:修改样式1、添加标题2、添加比例尺3、添加指北针4、插入图例01、ArcGIS专题图制作 第一步:插入数据框 1、工具栏【插入】–>【数据库】 2、选中图层下的【宜昌市…

Python酷库之旅-第三方库Pandas(092)

目录 一、用法精讲 391、pandas.Series.hist方法 391-1、语法 391-2、参数 391-3、功能 391-4、返回值 391-5、说明 391-6、用法 391-6-1、数据准备 391-6-2、代码示例 391-6-3、结果输出 392、pandas.Series.to_pickle方法 392-1、语法 392-2、参数 392-3、功能…

token令牌,过滤器,JWT,拦截器

令牌(token)技术 不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了 1.基本流程 用户使用用户名密码来请求服务器 服务器进行验证用户的信息 服务器通过验证发送给用户一个token 客户端存储token&#…

大模型学习笔记 - LLM 之 LLaMA系列(待更新)

LLaMA 系列 LLaMA 概述 LLaMA-1LLaMA-2LLaMA-3 LLaMA 概述 LLaMA: Open and Efficient Foundation Language Models Llama 2: Open Foundation and Fine-Tuned Chat Models (LLama2 & LLama2-Chat) LLama 3 | LLama 3.1 LLaMA-1 涉及到的基础知识点: pre-normalizat…

Leetcode面试经典150题-25.K个一组反转链表

解法都在代码里&#xff0c;不懂就留言或者私信 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val …