【k8s】【ELK】【三】Sidecar容器运行日志Agent

news2024/11/17 1:56:03

1、日志收集场景分析与说明

对于那些能够将日志输出到本地文件的Pod,我们可以使用Sidecar模式方式运行一个日志采集Agent,对其进行单独收集日志

在这里插入图片描述

1、首先需要将Pod中的业务容器日志输出至本地文件,而后运行一个Filebeat边车容器,采集本地路径下的日志;
2、Filebeat容器需要传递如下变量;环境:了解Pod属于隶属于哪个环境;项目名称:为了后期能在单个索引中区分出不同的项目;
podip:为了让用户清楚该Pod属于哪个IP;
3、Logstash根据不同的环境,拉取不同的topic数据,然后将数据存储至ES对应的索引中;
4、Kibana添加不同环境的 index pattern,而后选择对应环境 不同的项目 进行日志探索与展示;

Sidecar部署思路

1、制作一个业务镜像,要求镜像输出日志至本地;
2、制作Filebeat镜像,配置Input、output等信息;
3、采用边车模式运行不同环境的Pod,确保日志信息能输出至Kafka集群;
4、准备不同环境下Logstash配置文件,而后读取数据写入ES集群;
5、使用kibana添加索引,进行日志探索与展示;

2、制作Tomcat业务镜像

下载tomcat包

wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.0.27/bin/apache-tomcat-10.0.27.tar.gz --no-check-certificate
#wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.8/bin/apache-tomcat-10.1.8.tar.gz --no-check-certificate

[root@master01 tomcatImage]# ls
apache-tomcat-10.0.27.tar.gz

编写Dockerfile

FROM openjdk:8-jre

RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo 'Asia/Shanghai' > /etc/timezone

ENV VERSION=10.1.8
ADD ./apache-tomcat-${VERSION}.tar.gz /app
RUN mv /app/apache-tomcat-${VERSION} /app/tomcat && \
    rm -f /app/apache-tomcat-${VERSION}.tar.gz 
    
ADD ./entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

EXPOSE 8080
CMD ["/bin/bash","-c","/entrypoint.sh"]

编写entrypoint.sh

# entrypoint.sh
# 启动tomcat方法,并且将日志打到对应的文件中
# 异常是多行的;  这里测试将tomcat jvm调整到20m  不断访问 就会抛出异常  OOM;
OPTS="-Xms${JVM_XMS:-25m} -Xmx${JVM_XMX:-25m} -XX:+UseConcMarkSweepGC"
sed -i "2a JAVA_OPTS=\"${OPTS}\"" /app/tomcat/bin/catalina.sh

cd /app/tomcat/bin && \
./catalina.sh  run &>>/app/tomcat/logs/stdout.log

编写entrypoint.sh

# 启动tomcat方法,并且将日志打到对应的文件中
# 异常是多行的;  这里测试将tomcat jvm调整到20m  不断访问 就会抛出异常  OOM;
OPTS="-Xms${JVM_XMS:-25m} -Xmx${JVM_XMX:-25m} -XX:+UseConcMarkSweepGC"
sed -i "2a JAVA_OPTS=\"${OPTS}\"" /app/tomcat/bin/catalina.sh

cd /app/tomcat/bin && \
./catalina.sh  run &>>/app/tomcat/logs/stdout.log

构建镜像并推送仓库

[root@master01 tomcatImage]# ls
apache-tomcat-10.1.8.tar.gz  Dockerfile  entrypoint.sh

docker build -t harbor.oldxu.net/base/tomcat:10.1.8_with_log .
docker push harbor.oldxu.net/base/tomcat:10.1.8_with_log

3.制作Filebeat镜像

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.17.6-x86_64.rpm

Dockerfile

FROM centos:7
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo 'Asia/Shanghai' > /etc/timezone
    
#拷贝filebeat 和 拷贝filebeat配置文件(核心)
ENV VERSION=7.17.6
ADD ./filebeat-${VERSION}-x86_64.rpm /
RUN rpm -ivh /filebeat-${VERSION}-x86_64.rpm && \
    rm -f /filebeat-${VERSION}-x86_64.rpm

ADD ./filebeat.yml /etc/filebeat/filebeat.yml

ADD ./entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

CMD ["/bin/bash","-c","/entrypoint.sh"]  

编写filebeat配置

{ENV} :用于定义环境的变量;
{PROJECT_NAME} :用于定义项目名称的变量;
{MULTILINE} :用于定义多行合并的正则变量;
{KAFKA_HOSTS} :用于定义KAFKA集群地址的变量;
{PodIP} :用于获取该Pod地址的变量;
{Node} :用于获取该Pod所处的节点;

filebeat.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /logu/*.log
    - /logu/*/*.log
  tags: ["logu"]
  fields:
    topic: {PROJECT_NAME}
    podip: {PodIP}
    node: {Node}
  fields_under_root: true               # 增加的所有字段都为顶级字段


- type: log
  enabled: true
  paths:
    - /logm/*.log
    - /logm/*/*.log
  tags: ["logm"]
  fields:
    topic: {PROJECT_NAME}
    podip: {PodIP}
    node: {Node}
  fields_under_root: true               # 增加的所有字段都为顶级字段
  multiline.pattern: '{MULTILINE}'      
  multiline.negate: true
  multiline.match: after
  multiline.max_lines: 10000    #默认最大合并行为500,可根据实际情况调整。

output.kafka:
  hosts: [{KAFKA_HOSTS}]
  topic: app-{ENV}-%{[topic]}
  required_acks: 1              # 保证消息可靠,0不保证,1等待写入主分区(默认),-1等待写入副本分区
  compression: gzip             # 压缩
  max_message_bytes: 1000000    # 每条消息最大的长度,多余的被删除

entrypoint.sh

#1、替换filbeat配置文件中的内容
Beat_Conf=/etc/filebeat/filebeat.yml
sed -i s@{ENV}@${ENV:-test}@g ${Beat_Conf}
sed -i s@{PodIP}@${PodIP:-"no-ip"}@g ${Beat_Conf}
sed -i s@{Node}@${Node:-"none"}@g ${Beat_Conf}

sed -i s@{PROJECT_NAME}@${PROJECT_NAME:-"no-define"}@g ${Beat_Conf}
sed -i s@{MULTILINE}@${MULTILINE:-"^\\\d{2}"}@g ${Beat_Conf}  # \\用来转义
sed -i s@{KAFKA_HOSTS}@${KAFKA_HOSTS}@g ${Beat_Conf}

# 运行filebeat
filebeat -e -c /etc/filebeat/filebeat.yml

制作镜像&推送

[root@master01 filebeatImage]# ls
Dockerfile  entrypoint.sh  filebeat-7.17.6-x86_64.rpm  filebeat.yml
docker build -t harbor.oldxu.net/base/filebeat_sidecar:7.17.6 .
docker push harbor.oldxu.net/base/filebeat_sidecar:7.17.6

排错:漏写冒号

[root@master01 tomcat-test]# kubectl logs -n test demo-auth-f89d7ccb6-x4ftp -c filebeat 
Exiting: error loading config file: yaml: line 2: mapping values are not allowed in this context

在这里插入图片描述

4.以边车模式运行Pod

4.1 运行测试环境Pod

4.1.1 创建namespace 和 Secrets

kubectl create namespace test

kubectl create secret docker-registry harbor-admin \
--docker-username=admin \
--docker-password=Harbor12345
--docker-server=harbor.oldxu.net -n test

4.1.2 创建tomcat deployment

demo-auth-test.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-auth
  namespace: test
spec:
  replicas: 2
  selector:
    matchLabels:
      app: auth
  template:
    metadata:
      labels:
        app: auth
    spec:
      imagePullSecrets:
      - name: harbor-admin

      volumes:
      - name: log
        emptyDir: {}

      containers:
      - name: auth
        image: harbor.oldxu.net/base/tomcat:10.0.27_with_log
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
        volumeMounts:
        - name: log
          mountPath: /app/tomcat/logs
        livenessProbe:                  # 存活探针
          httpGet:
            path: '/index.jsp'
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 10
        readinessProbe:                 # 就绪探针
          httpGet:
            path: '/index.jsp'
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 10

      - name: filebeat
        image: harbor.oldxu.net/base/filebeat_sidecar:7.17.6 
        imagePullPolicy: Always
        volumeMounts:
        - name: log
          mountPath: /logm
        env:
        - name: ENV
          value: "test"                         # 也可以使用metadata.namespace 具体看业务如何规划
        - name: PodIP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        - name: Node
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: PROJECT_NAME
          value: "demo-auth"
        - name: KAFKA_HOSTS
          value: '"kafka-0.kafka-svc.logging:9092","kafka-1.kafka-svc.logging:9092","kafka-2.kafka-svc.logging:9092"'

4.1.3 创建tomcat svc

apiVersion: v1
kind: Service
metadata:
  name: tomcat-svc
  namespace: test
spec:
  selector:
    #app: tomcat
    app: auth
  ports:
  - port: 8080
    targetPort: 8080

在这里插入图片描述

特别说明

这里一个pod运行两个容器,名称分别为: auth和filebeat 。
kubectl logs xxxPodName -n test -c auth 
此时是一点日志都没有的。auth的日志在/app/tomcat/logs/stdout.log .

所以要换成看filebeat的logs
kubectl logs xxxPodName -n test -c filebeat

如果启动的pod,状态出现1/2 CrashLoopBackOff  ,则去到filebeat容器里面 /logm/查看日志 排查。
#可进入filebeat容器,查看内容是否替换成功。
cat /etc/filebeat/filebeat.yml

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4.1.4 进行压力测试

 ab -n 10000 -c 500 10.102.112.251:8080/index.jsp

在这里插入图片描述

4.1.5 检查KafkaTopic

在这里插入图片描述
点击“preview” ,查看最近的日志
在这里插入图片描述

4.1.6 demo-system-test-dp.yaml

在namespace test,创个新的 demo-system ,看看efak 有没有创建对应的topics

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-system
  namespace: test
spec:
  replicas: 2
  selector:
    matchLabels:
      app: system
  template:
    metadata:
      labels:
        app: system
    spec:
      imagePullSecrets:
      - name: harbor-admin

      volumes:
      - name: log
        emptyDir: {}

      containers:
      - name: system
        image: harbor.oldxu.net/base/tomcat:10.0.27_with_log
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
        volumeMounts:
        - name: log
          mountPath: /app/tomcat/logs
        livenessProbe:                  # 存活探针
          httpGet:
            path: '/index.jsp'
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 10
        readinessProbe:                 # 就绪探针
          httpGet:
            path: '/index.jsp'
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 10

      - name: filebeat
        image: harbor.oldxu.net/base/filebeat_sidecar:7.17.6 
        imagePullPolicy: Always
        volumeMounts:
        - name: log
          mountPath: /logm
        env:
        - name: ENV
          value: "test"                         # 也可以使用metadata.namespace 具体看业务如何规划
        - name: PodIP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        - name: Node
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: PROJECT_NAME
          value: "demo-system"
        - name: KAFKA_HOSTS
          value: '"kafka-0.kafka-svc.logging:9092","kafka-1.kafka-svc.logging:9092","kafka-2.kafka-svc.logging:9092"'

在这里插入图片描述
在这里插入图片描述

压测这个demo-system

在这里插入图片描述

分割线

4.2 运行生产环境Pod (prod)

4.2.1 创建namespace和 Secrets

kubectl create namespace prod

kubectl create secret docker-registry harbor-admin --docker-username=admin --docker-password=Harbor12345 --docker-server=harbor.oldxu.net -n prod

4.2.2 创建tomcat deployment (prod)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-auth
  namespace: prod
spec:
  replicas: 1
  selector:
    matchLabels:
      app: auth
  template:
    metadata:
      labels:
        app: auth
    spec:  
      imagePullSecrets:
      - name: harbor-admin
      
      volumes:
      - name: log
        emptyDir: {}
      
      containers:
      - name: auth
        image: harbor.oldxu.net/base/tomcat:10.0.27_with_log
        imagePullPolicy: Always 
        ports:
        - containerPort: 8080
        volumeMounts:
        - name: log
          mountPath: /app/tomcat/logs
        livenessProbe:
          httpGet:
            path: '/index.jsp'
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 10
        readinessProbe:
          httpGet:
            path: '/index.jsp'
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 10            
        
      - name: filebeat
        image: harbor.oldxu.net/base/filebeat_sidecar:7.17.6 
        imagePullPolicy: Always
        volumeMounts:
        - name: log
          mountPath: /logm
          
        env:
        - name: ENV
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: PodIP
          valueFrom:
             fieldRef:
               fieldPath: status.podIP
        - name: Node
          valueFrom:
             fieldRef:
               fieldPath: spec.nodeName
        - name: PROJECT_NAME
          value: "demo-auth"
        - name: KAFKA_HOSTS
          value: '"kafka-0.kafka-svc.logging:9092","kafka-1.kafka-svc.logging:9092","kafka-2.kafka-svc.logging:9092"' 

在这里插入图片描述

4.2.3 创建service (prod)

apiVersion: v1
kind: Service
metadata:
  name: tomcat-svc
  namespace: prod
spec:
  selector:
    app: auth
  ports:
  - port: 8080
    targetPort: 8080

4.2.4 进行压力测试 (prod)


不懂跟不跟压测tomcat有关,压测完后efak也寄了 ,出现nginx 502

4.2.5 检查KafkaTopic (prod)

在这里插入图片描述

5.交付测试环境Logstash

5.1 测试环境Logstash配置

1、编写logstash配置

input{
    kafka{
        bootstrap_servers => "kafka-0.kafka-svc:9092,kafka-1.kafka-svc:9092,kafka-2:kafka-svc:9092"
        group_id => "logstash-test" #消费者组名称
        consumer_threads => "3"
        topics_pattern => "app-test-.*" #通过正则表达式匹配要订阅的主题
    }
}

filter {
    json {
        source => "message"
    }
}

output {
    stdout{
        codec => rubydebug
    }
    elasticsearch{
        hosts => ["es-data-0.es-svc:9200","es-data-1.es-svc:9200"]
        index => "app-test-%{+YYYY.MM.dd}"  #输出的显示
        template_overwrite => true
    }
}

5.2 创建测试环境configmap

mkdir conf
kubectl create configmap logstash-test-conf \
--from-file=logstash.conf=conf/logstash-test.conf -n logging

5.3 运行测试环境Logstash (03-logstash-test-sts.yaml)

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: logstash-test
  namespace: logging
spec:
  serviceName: "logstash-svc"
  replicas: 1
  selector: 
    matchLabels:
      app: logstash
      env: test
  template:
    metadata:
      labels:
        app: logstash
        env: test
    spec:
      imagePullSecrets:
      - name: harbor-admin
      containers:
      - name: logstash
        image: harbor.oldxu.net/base/logstash-oss:7.17.6
        args: ["-f","config/logstash.conf"]
        resources:
          limits:
            memory: 512Mi
        env:
        - name: PIPELINE_WORKERS
          value: "2"
        - name: PIPELINE_BATCH_SIZE
          value: "10000"
        lifecycle:
          postStart:
            exec:
              command:
              - "/bin/bash"
              - "-c"
              - "sed -i -e '/^-Xms/c-Xms512m' -e '/^-Xmx/c-Xmx512m' /usr/share/logstash/config/jvm.options"
        volumeMounts:
        - name: data
          mountPath: /usr/share/logstash/data
        - name: conf
          mountPath: /usr/share/logstash/config/logstash.conf
          subPath: logstash.conf
      volumes:
      - name: conf
        configMap:
          name: logstash-test-conf
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteMany"]
      storageClassName: "nfs"
      resources:
        requests:
          storage: 20Gi          

5.4 检查ES测试环境索引

在这里插入图片描述

6.交付生产环境Logstash

6.1 生产环境Logstash配置

2、准备 logstash 读取kafka生成环境配置

input {
    kafka {
        bootstrap_servers => "kafka-0.kafka-svc:9092,kafka-1.kafka-svc:9092,kafka-2.kafka-svc:9092"
        group_id => "logstash-prod"      # 消费者组名称
        consumer_threads => "3"          # 理想情况下,配置与分区数一样多的线程,实现均衡
        topics_pattern => "app-prod-.*"  # 通过正则表达式匹配要订阅的主题
    }
}

filter {
	json {
		source => "message"
	}
}

output {
    stdout {
        codec => rubydebug
    }
    elasticsearch {
        hosts => ["es-data-0.es-svc:9200","es-data-1.es-svc:9200"]
        index => "app-prod-%{+YYYY.MM.dd}"
        template_overwrite => true
    }
}

6.2 创建生产环境configmap

kubectl create
configmap logstash-prod-conf \
--from-file=logstash.conf=conf/logstash-prod.conf -n logging

6.3 运行生产环境Logstash ((03-logstash-prod-sts.yaml))

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: logstash-prod
  namespace: logging
spec:
  serviceName: "logstash-svc"           # 使用此前创建的svc,则无需重复创建
  replicas: 2
  selector:
    matchLabels:
      app: logstash
      env: prod
  template:
    metadata:
      labels:
        app: logstash
        env: prod
    spec:
      imagePullSecrets:
      - name: harbor-admin
      containers:
      - name: logstash
        image: harbor.oldxu.net/base/logstash-oss:7.17.6
        args: ["-f","config/logstash.conf"]                     # 启动时指定加载的配置文件
        resources:
          limits:
            memory: 512Mi
        env:
        - name: PIPELINE_WORKERS
          value: "2"
        - name: PIPELINE_BATCH_SIZE
          value: "10000"
        lifecycle:
          postStart:                                            # 设定JVM
            exec:
              command:
              - "/bin/bash"
              - "-c"
              - "sed -i -e '/^-Xms/c-Xms512m' -e '/^-Xmx/c-Xmx512m' /usr/share/logstash/config/jvm.options"
        volumeMounts:
        - name: data                                            # 持久化数据目录
          mountPath: /usr/share/logstash/data
        - name: conf
          mountPath: /usr/share/logstash/config/logstash.conf
          subPath: logstash.conf

      volumes:
      - name: conf
        configMap:
          name: logstash-prod-conf
          
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteMany"]
      storageClassName: "nfs"
      resources:
        requests:
          storage: 22Gi

6.4 检查ES测试环境索引

推荐使用ab压测 namespace prod的podIP 。  使用手动curl几十次后,这个podIP ,竟然kibana没数据!?

在这里插入图片描述

7.Kibana数据展示

7.1 添加索引

1、添加测试环境索引
在这里插入图片描述

2、添加生产环境索引
在这里插入图片描述

7.2 查看测试环境数据

1、点击测试环境索引
2、选择需要查看的字段
3、进行filter筛选项目
4、选择对应时间段
在这里插入图片描述

7.3 查看生产环境数据

1、点击测试环境索引
2、选择需要查看的字段
3、进行filter筛选项目
4、选择对应时间段
在这里插入图片描述

2023年5月18日11:27:56
END

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

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

相关文章

chatgpt赋能Python-python3_绝对值

Python3中的绝对值 在本文中,我们将深入了解Python3中的绝对值(Absolute Value)以及如何在Python3中使用它。 我将介绍Python3的abs函数,它是一个内置函数,用于计算数字的绝对值。 什么是绝对值? 在数学…

详解MySQL主从复制

目录 1.概述 2.配置使用 2.1.master配置 2.2.slave配置 2.3.认主 2.4.确认认主结果 3.请求分发 3.1.概述 3.2.手动分发 3.2.1.原生JDBC 3.2.2.数据源 3.2.3.中间件 1.概述 在实际的数据密集型应用中,数据库层面往往呈现两个特点: 单点数据…

VONR排查指导分享

不能注册或呼叫到SIP服务器端30秒挂断呼叫的黄金法则咬线或摘机状态单通或无语音收到400 bad request收到413,513 Request Entity Too Large或Message Too Large消息收到408, 480或者487 消息483 - Too Many Hops488 – Not Acceptable Here语音质量和思…

chatgpt赋能Python-python3_9怎么安装

Python 3.9:安装指南 如果你正在学习编程或者已经是一名程序员,那么一定会了解到Python这个编程语言。Python是一种高级编程语言,其强大的设计特点和易于操作的特性使其成为了开发人员的首选。Python 3.9已经发布了,它虽然不是Py…

CSDN官方创作助手InsCode AI 教你分分钟搞定一篇好文章

CSDN官方推出创作助手InsCode AI很多天了,有心人都能发现,在写作界面的右上角多了一个创作助手的浮动按钮,点击后出现如下界面: 现阶段是“限免”状态,不好好利用它来创作,就有点辜负CSDN官方大佬们的良苦用…

【王道·计算机网络】第五章 传输层【未完】

一、传输层概述 传输层为应用层提供通信服务,使用网络层服务传输层的功能: 提供进程和进程之间的逻辑通信(网络层提供主机之间的逻辑通信)复用(发送发不同的应用进程)和分用(接收方正确的数据传…

Primer C++(第三章)

补码、原码和反码 正数的原码、反码、补码都相同 负数的补码:1、正数的原码符号位由0变1 (负数的原码) 2、对负数的原码除符号位外每位取反 (负数的反码) 3、对负数的反码末尾1 (负数的补码) …

众位力量汇集《永恒之塔私服》新版龙战前传

盛大游戏《永恒之塔》从万众翘首企盼中登陆国服到现在,已经过去了一年有余。在前不久前更新的周年庆版本“云上的召唤”中,精灵星的宝宝终于可以和精灵星一起翱翔在天际了…… “云上的召唤”我们还没有体验够,全新版本“龙战前传”已然于7月…

【观察】从业界首款“空间穿越屏”,看华为全屋智能的进化与重构

这个时代,“家”的构成不再是简单的一家三口,客厅、厨房、卧室也不再只是承担某个单一功能或场景的空间。 无数身在异乡打拼的青年,开始向往一个专属的独立空间;那些奔波劳碌的中年夫妻,在为家人创造更好生活环境的同时…

RabbitMQ_面试题01

文章目录 1.RabbitMQ如何防止消息堆积2.RabbitMQ如何保证消息顺序消费3.RabbitMQ如何防止消息重复消费4.RabbitMQ如何保证消息可靠性4.1 消息持久化4.2 生产者确认2.2.1 application.yml2.2.2 Config2.2.3 Test 4.3 消费者确认4.3.1 application.yml4.3.2 Test 1.RabbitMQ如何防…

OPT (奥普特)锂电池视觉检测技术精彩亮相CIBF

5月16~18日,第十五届中国国际电池技术展览会在深圳举办,全球2500多家优秀电池企业参展。 OPT(奥普特)作为锂电行业机器视觉核心供应商,携3D、深度学习、分频技术等视觉检测技术亮相,并展示了上…

chatgpt赋能Python-python3免费吗

Python3免费吗? Python3到底免费还是收费呢?这是一个被许多人关注和疑惑的问题。本文将从不同方面解答这个问题,希望能给你提供一个清晰的认识。 什么是Python3? Python3是一种通用、高级、解释型的编程语言。它是由Guido van …

【Linux初阶】fork进程创建 进程终止 进程等待

🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【Linux初阶】 ✒️✒️本篇内容:fork进程创建,理解fork返回值和常规用法,进程终止(退出码、退出场景、退出…

第08章_聚合函数

第08章_聚合函数 我们上一章讲到了 SQL 单行函数。实际上 SQL 函数还有一类,叫做聚合(或聚集、分组)函数,它是对一组数据进行汇总的函数,输入的是一组数据的集合,输出的是单个值。 1. 聚合函数介绍 什么是…

【sentinel】Sentinel工作主流程以流控规则源码分析

Sentinel工作主流程 在Sentinel里面,所有的资源都对应一个资源名称(resourceName),每次资源调用都会创建一个Entry对象。Entry可以通过对主流框架的适配自动创建,也可以通过注解的方式或调用SphU API显式创建。Entry创…

跨境seo引流的13种方法

跨境SEO引流是一种通过搜索引擎优化来吸引国际目标受众并增加网站流量的策略。以下是一些跨境SEO引流的关键步骤和技巧: 目标受众研究:了解你的目标市场和受众群体。了解他们的需求、喜好、购买习惯以及使用的搜索引擎和关键词。这将帮助你确定你的跨境S…

chatgpt赋能Python-python3怎么合并列表

Python3:合并列表的不同方法 如果你正在使用Python 3,那么你很可能会面对合并列表的问题。合并列表(也称为连接列表或串联列表)是将两个或多个列表组合成一个列表的过程,这是在编程中很常见的任务。在这篇文章里&…

Python并发编程:异步编程和多线程技术的应用和效率优化

第一章:介绍 在当今的软件开发领域,高效的并发编程对于处理大规模数据和提升系统性能至关重要。Python作为一种简洁、易读且功能强大的编程语言,提供了多种并发编程的技术和工具。本文将深入探讨Python中的异步编程和多线程技术,…

chatgpt赋能Python-python3如何画图

Python3如何画图? Python是一种高级编程语言,它有着多种用途,包括数据分析和可视化。Python3是Python的最新版本,它具有更好的性能和易用性。在这篇文章中,我们将介绍如何使用Python3来画图,并探讨其优势和…

KingbaseES 逻辑读与物理读

oracle数据库中逻辑读,物理读 数据访问方式:数据库少不了和操作系统进行数据交互,表数据最好的方式是从数据库共享池中访问到,避免发生磁盘IO,当然如果共享池中没有访问到数据就难免发生磁盘IO。 物理读:从…