skywalking java agent集成

news2025/2/25 5:55:47

目录

概述

裸机集成

docker集成

k8s集成

高级特性

Trace api

Logback traceId协同

跨线程trace

附录

Agent参数

本地缓存队列参数

是否显示Sql参数

其他参数


概述

java 应用skywalking集成主要以java agent形式接入。

官方详细文档点击skywalking-java集成查看。

java agent 环境限制 JDK 8 - 17。

注意!!!spring-gateway 不同版本间存在兼容问题,agent包中提供了2.0.x,2.1.x,3.x 几个版本插件。基于公司现状和业务稳定性考虑,agent包中默认只加载2.1.x的gateway版本,即spring-gateway版本在[2.1.x-3.x)之间的gateway监控支持,如果要支持其他版本,需特殊处理。

裸机集成

本地开发引入java agent,按以下3步集成

1.agent包下载地址:

点击skywalking-agent-8.8.1.tar下载

2.配置参数修改:

下载agent 包 config/agent.config修改配置参数(也可不改,通过后面启动参数方式覆盖):

agent.service_name 监控应用名.

collector.backend_service skywalking oap server地址,默认 127.0.0.1:11800,测试环境 10.157.4.91:31590

3.启动agent参数设置:

应用启动java命令中添加 -javaagent:/path/to/skywalking-package/agent/skywalking-agent.jar 参数.

说明:第2步中的参数配置也可以通过jvm参数动态覆盖,格式:-Dskywalking.{具体参数名}

-javaagent:C:/workspace/tools/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar
-Dskywalking.agent.service_name=dev_adminApp
-Dskywalking.collector.backend_service=10.157.4.91:31590

更多agent参数配置请点击agent参数配置查看。

idea启动配置添加

 

应用启动完成,访问某个接口。刷新skywalking ui查看

 

Skywalking实现了大量中间件、通用组件插件,以下地址可参考详细列表

https://skywalking.apache.org/docs/skywalking-java/latest/en/setup/service-agent/java-agent/supported-list/

docker集成

纯docker部署,主要应用客户现场部署(非k8s环境),也需要集成skywalking的场景。

项目工程中Dockerfile文件加入以下指令片段

#FROM apache/skywalking-java-agent:8.7.0-alpine AS skywalking_agent_build
FROM harbor.sxftwork.com/arch_common_module/skywalking-java-agent:8.8.1-alpine AS skywalking_agent_build
FROM openjdk:8-jre-alpine
# 复制agent 到应用目录。
# 注意:/skywalking/agent/目录默认为root访问权限,若打docker镜像时为非root用户,请做相应调整。
# 如work用户,对应工作目录调整 COPY --chown=work:work --from=skywalking_agent_build /skywalking/agent/ /home/work/skywalking/agent/
#  agent参数调整 -javaagent:/home/work/skywalking/agent/skywalking-agent.jar
COPY --from=skywalking_agent_build /skywalking/agent/ /skywalking/agent/
# 对应pom.xml文件中的dockerfile-maven-plugin插件buildArgs配置项JAR_FILE的值
ARG JAR_FILE
WORKDIR /app
COPY ${JAR_FILE} app.jar
EXPOSE 8080
RUN echo "Asia/Shanghai" > /etc/timezone
ENTRYPOINT ["java","-javaagent:/skywalking/agent/skywalking-agent.jar","-jar","/app/app.jar"]

说明:

  • harbor.sxftwork.com/arch_common_module/skywalking-java-agent:8.8.1-alpine为skywalking agent定制化调整后的私有镜像
  • ${JAR_FILE} 为应用打包后部署jar文件路径

docker启动

docker run  -p 8080:8080 \
 -e TZ="Asia/Shanghai" \
 -e SW_AGENT_NAME=appname \
 -e SW_AGENT_COLLECTOR_BACKEND_SERVICES="127.0.0.1:11800" \
 --name appname --restart always -d appimagename:v1.0.0 

说明:SW_AGENT_NAME值替换为应用名,SW_AGENT_COLLECTOR_BACKEND_SERVICES值替换为oap server地址,测试环境oap地址:10.157.4.91:31590

注意环境变量取值为agent安装包/config目录agent.config文件中属性名对应的环境变量,而不是键值。

 

k8s集成

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: arch-skywalking-demo
    release: v1.0.0
  name: arch-skywalking-demo
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: arch-skywalking-demo
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: arch-skywalking-demo
        release: v1.0.0
    spec:
      restartPolicy: Always
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - podAffinityTerm:
                labelSelector:
                  matchLabels:
                    app: arch-skywalking-demo
                topologyKey: kubernetes.io/hostname
              weight: 1
      volumes:
        - name: skywalking-agent
          emptyDir: { }
      initContainers:
        - name: agent-container
          image: harbor.sxftwork.com/arch_common_module/skywalking-java-agent:8.8.1-alpine
          volumeMounts:
            - name: skywalking-agent
              mountPath: /agent
          command: [ "/bin/sh" ]
          args: [ "-c", "cp -R /skywalking/agent /agent/" ]
      containers:
        - env:
            - name: JAVA_TOOL_OPTIONS
              value: "-javaagent:/skywalking/agent/skywalking-agent.jar"
            - name: SW_AGENT_NAME
              value: "dev_arch-skywalking-demo"
            - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
              value: "10.157.4.91:31590"
          volumeMounts:
            - name: skywalking-agent
              mountPath: /skywalking
          image: 'harbor.sxftwork.com/arch_common_module/arch_skywalking_demo:v1.0.0'
          imagePullPolicy: IfNotPresent
          name: arch-skywalking-demo
          ports:
            - containerPort: 8080
              name: app
              protocol: TCP

说明:

  • 应用yml文件Deployment对象,spec.template.spec元素添加图示35-56 配置。
  • initContainers步骤,初始化java skywalking agent到容器目录。JAVA_TOOL_OPTIONS参数动态注入agent到jvm。
  • 调整环境变量对应值。
    SW_AGENT_NAME:集成应用服务名,格式[环境前缀]_[应用名]。如用户系统,应用名user,开发环境SW_AGENT_NAME=dev_user,测试环境SW_AGENT_NAME=sit_user

       SW_AGENT_COLLECTOR_BACKEND_SERVICES:埋点数据上报oap server地址,测试环境aop server地址(前置代理)10.157.4.91:31590

注意:

如果部署应用非root账户,k8s yaml文件需添加以下配置项,否则启动时会出现权限访问报错,因为skywalking agent 镜像默认以root作为操作账户。

#copy到yaml请手动删除对应注释
securityContext: # 与deployment对象,containers节点同级。
   fsGroup: 1000  # 文件卷操作用户。1000为启动应用的userid。不同环境做相应调整
   runAsGroup: 1000  # 以1000的userid用户组运行程序进程
   runAsNonRoot: true  # 非root账户启动应用
   runAsUser: 1000 # 以1000的userid用户运行程序进程

详细应用k8s配置可参考以下文件:

附件 (1)上传文件

arch-skywalking-demo.yml

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: arch-skywalking-demo
    release: v1.0.0
  name: arch-skywalking-demo
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: arch-skywalking-demo
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: arch-skywalking-demo
        release: v1.0.0
    spec:
      restartPolicy: Always
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - podAffinityTerm:
                labelSelector:
                  matchLabels:
                    app: arch-skywalking-demo
                topologyKey: kubernetes.io/hostname
              weight: 1
      volumes:
        - name: skywalking-agent
          emptyDir: { }
      initContainers:
        - name: agent-container
          image: harbor.sxftwork.com/arch_common_module/skywalking-java-agent:8.8.1-alpine
          volumeMounts:
            - name: skywalking-agent
              mountPath: /agent
          command: [ "/bin/sh" ]
          args: [ "-c", "cp -R /skywalking/agent /agent/" ]
      containers:
        - env:
            - name: JAVA_TOOL_OPTIONS
              value: "-javaagent:/skywalking/agent/skywalking-agent.jar"
            - name: SW_AGENT_NAME
              value: "arch-skywalking-demo"
            - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
              value: "skywalking-oap:11800"
          image: 'harbor.sxftwork.com/arch_common_module/arch_skywalking_demo:v1.0.0'
          imagePullPolicy: IfNotPresent
          name: arch-skywalking-demo
          volumeMounts:
            - name: skywalking-agent
              mountPath: /skywalking
          ports:
            - containerPort: 8080
              name: app
              protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: arch-skywalking-demo
  namespace: default
  labels:
    app: arch-skywalking-demo
spec:
  selector:
    app: arch-skywalking-demo
  type: ClusterIP
  ports:
    - name: rest
      port: 8080
      protocol: TCP
      targetPort: 8080

高级特性

框架预置的agent 覆盖大多数通用场景埋点,有特殊需求的业务,可以通过应用代码自定义埋点实现更详细信息跟踪。

依赖引入:

依赖引入:
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-trace</artifactId>
    <version>8.7.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.skywalking/apm-toolkit-logback-1.x -->
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-logback-1.x</artifactId>
    <version>8.7.0</version>
</dependency>

Trace api

代码埋点:

    /**
     * 方法上添加skywalking注解进行埋点
     * tag key值可随意定义,
     *     value值 arg[0]表示第一个入参值注入。returnedObj返回对象,若对象为pojo,通过.引用子属性。
     */
    @Trace
    @Tag(key = "param.url", value = "arg[0]")
    @Tag(key = "param.value", value = "arg[1]")
    @Tag(key = "return", value = "returnedObj")
//    @Tag(key = "username", value = "returnedObj.username")
//    @Tag(key = "age", value = "returnedObj.age")
    private String requestRemoteUrl(String url,String value){
        log.info("requestRemoteUrl log trace...");
        //业务代码中埋点
        //端点设置:不设置,默认类名+方法名+参数名。自定义值自动覆盖默认值。
//        ActiveSpan.setOperationName(String.format("requestRemoteUrl:url[%s],value[%s]",url,value));
        ActiveSpan.tag("biz_code_param_url", url);
        ActiveSpan.info("在代码中添加日志埋点...");
        ActiveSpan.info("--- skywalking traceId="+TraceContext.traceId());
        ActiveSpan.info("--- skywalking spanId="+TraceContext.spanId());
        ActiveSpan.info("--- skywalking segmentId="+TraceContext.segmentId());

        //业务逻辑实现。。。

        //跨线程异步测试,通过RunnableWrapper封装类处理
        ExecutorService executorService = Executors.newFixedThreadPool(1);
        executorService.submit(RunnableWrapper.of(new Runnable() {
            @Override
            @Trace
            public void run() {
                ActiveSpan.info("线程异步代码中添加日志埋点,线程名:"+Thread.currentThread().getName());
                ActiveSpan.info("--- skywalking traceId="+TraceContext.traceId());
                ActiveSpan.info("--- skywalking spanId="+TraceContext.spanId());
                ActiveSpan.info("--- skywalking segmentId="+TraceContext.segmentId());
            }
        }));


        return "invoke remote provider of nacos with response is : " + revStr;
    }

埋点效果:

 

 

 

Logback traceId协同

项目应用中使用logback日志框架,可以接入skywalking traceId集成。在日志log中会自动埋入请求traceId,调查线上问题时,通过traceId可以方便的在skywalking UI中搜索相关请求链路信息。

设置 %tid 到 logback.xml文件

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
   <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
      <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
          <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</pattern>
      </layout>
   </encoder>
</appender>

说明:

  • <pattern>元素[%tid] 在业务日志中植入skywalking traceId值
  • 注意encoder、layout元素 class属性的值

下载以下logback-spring.xml日志配置文件作为参考:

附件 (1)上传文件

logback-spring.xml

<configuration>
	<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <!--<property name="PROJECT_NAME" value="dctl-starter-demo"/>-->
    <springProperty scope="context" name="PROJECT_NAME" source="spring.application.name" />
    <property name="LOG_HOME"  value="/data/log/${PROJECT_NAME}"/>
<!--    <springProperty name="LOG_HOME" source="logging.path" />-->

    <!-- skywalking with the MDC, set %X{tid} in Pattern section of logback.xml-->
    <property name="APP_LOG_PATTERN"  value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] [${PROJECT_NAME:-}] %-5level %logger{50} - %msg%n"/>

    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <pattern>${APP_LOG_PATTERN}</pattern>
            </layout>
            <!-- 记录日志的编码 -->
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
    </appender>
    <!-- 按照每天生成日志文件   -->
    <appender name="dailyFile"  class="ch.qos.logback.core.rolling.RollingFileAppender">   
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 日志文件输出的文件名 -->
            <FileNamePattern>${LOG_HOME}/${PROJECT_NAME}.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <MaxHistory>30</MaxHistory>
            <!-- 日志文件最大的大小 -->
            <MaxFileSize>100MB</MaxFileSize>
        </rollingPolicy>

        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <pattern>${APP_LOG_PATTERN}</pattern>
            </layout>
            <!-- 记录日志的编码 -->
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
    </appender>

    <appender name="errorFile"  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 日志文件输出的文件名 -->
            <FileNamePattern>${LOG_HOME}/${PROJECT_NAME}-error.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <MaxHistory>30</MaxHistory>
            <!-- 日志文件最大的大小 -->
            <MaxFileSize>100MB</MaxFileSize>
        </rollingPolicy>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <pattern>${APP_LOG_PATTERN}</pattern>
            </layout>
            <!-- 记录日志的编码 -->
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
    </appender>

    <!-- 日志输出级别 -->
    <root level="info">
        <appender-ref ref="STDOUT" level="info"/>
        <appender-ref ref="dailyFile" />
        <appender-ref ref="errorFile" />
    </root>
    <!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->
    <!-- com.tml为根包,也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG -->
    <!-- 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE  -->
<!--    <logger name="com.mybatis" level="debug"/>-->
<!--    <logger name="java.sql" level="debug"/>-->
    <!--<logger name="com.dctl.ea.starter.demo.service" level="debug"/>-->
</configuration>

查看应用日志文件,找到traceId

 

Skywalking UI界面,通过traceId查找请求链路

 

跨线程trace

注意:程序逻辑有异步代码处理的,原有agent方式无法通过当前线程跟踪trace上下文,必须通过以下注解或者封装类方式特殊处理,才能保证整个调用链完整性。

注解实现

 

 

 

包装类实现

 

详细可参考官方文档:

https://skywalking.apache.org/docs/skywalking-java/latest/en/setup/service-agent/java-agent/application-toolkit-trace/

附录

Agent参数

本地缓存队列参数

skywalking 本地缓存队列由 缓存通道*通道队列 构成

  • 缓存通道
    buffer.channel_size=${SW_BUFFER_CHANNEL_SIZE:5}
    jvm和环境变量参数等价,选择其中之一
    
    环境变量设置方式:SW_BUFFER_CHANNEL_SIZE=5,默认5个通道
    jvm虚拟机参数设置方式:-Dskywalking.buffer.channel_size=5 
    
  • 缓存队列大小
    buffer.buffer_size=${SW_BUFFER_BUFFER_SIZE:300}
    jvm和环境变量参数等价,选择其中之一
    环境变量设置方式:SW_BUFFER_BUFFER_SIZE=300,默认300长度
    jvm虚拟机参数设置方式:-Dskywalking.buffer.buffer_size=300
    

是否显示Sql参数

plugin.jdbc.trace_sql_parameters=${SW_JDBC_TRACE_SQL_PARAMETERS:false}

jvm和环境变量参数等价,选择其中之一

环境变量设置方式:SW_JDBC_TRACE_SQL_PARAMETERS=true,默认false
jvm虚拟机参数设置方式:-Dskywalking.plugin.jdbc.trace_sql_parameters=true,默认false

其他参数

  • 忽略请求后缀
    agent.ignore_suffix=${SW_AGENT_IGNORE_SUFFIX:.jpg,.jpeg,.js,.css,.png,.bmp,.gif,.ico,.mp3,.mp4,.html,.svg}
    jvm和环境变量参数等价,选择其中之一
    环境变量设置方式:SW_AGENT_IGNORE_SUFFIX=.jpg,.jpeg,.js,.css,.png,.bmp,.gif,.ico,.mp3,.mp4,.html,.svg
    jvm虚拟机参数设置方式:-Dskywalking.agent.ignore_suffix=.jpg,.jpeg,.js,.css,.png,.bmp,.gif,.ico,.mp3,.mp4,.html,.svg
  • 忽略请求url
    trace.ignore_path=/eureka/**,/consul/**
    对应插件apm-trace-ignore-plugin。多个path以’,’分隔。
    #  ant path match style
    #  /path/?   Match any single character
    #  /path/*   Match any number of characters
    #  /path/**  Match any number of characters and support multilevel directories
    #  Multiple path comma separation, like

    jvm虚拟机参数设置方式: -Dskywalking.trace.ignore_path=/eureka/**,/consul/**

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

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

相关文章

负载均衡的知识点

目录 1.负载均衡是什么 2.负载均衡的分类 客户端负载均衡&#xff1a; 服务端负载均衡&#xff1a; 软件实现&#xff1a;根据OSI模型可以分为四层负载均衡和七层负载均衡 硬件实现&#xff1a; 附1&#xff1a;客户端和服务端&#xff1a; 附2&#xff1a;OSI…

备战秋招 | 笔试强训

目录 一、选择题 二、编程题 三、选择题题解 四、编程题题解 一、选择题 1、使用printf函数打印一个double类型的数据&#xff0c;要求&#xff1a;输出为10进制&#xff0c;输出左对齐30个字符&#xff0c;4位精度。以下哪个选项是正确的&#xff1f; A. %-30.4e B. %4.…

基于DETR的人脸伪装检测

基于DETR的人脸伪装检测 前言前提条件实验环境项目地址LinuxWindows DETR训练自己的数据集修改models/detr.py中的参数进行训练进行预测 相关资源免费获取参考 前言 本文是个人使用DETR训练自己的COCO格式数据集的应用案例&#xff0c;由于水平有限&#xff0c;难免出现错漏&am…

​python接口自动化(二十八)--html测试 报告——下(详解) ​

简介 五一小长假已经结束了&#xff0c;想必大家都吃饱喝足玩好了&#xff0c;那就继续学习吧。一天不学习&#xff0c;自己知道&#xff1b;两天不学习&#xff0c;对手知道&#xff1b;三天不学习&#xff0c;大家知道&#xff1b;一周不学习&#xff0c;智商输给猪。好了开个…

excel怎么样将某列所有单元格中文本的非中文字符或数字或字母全部删除?

目录 1. 简述2. 函数功能及参数介绍&#xff08;1&#xff09;功能&#xff08;2&#xff09;参数介绍 3. 完整VBA代码4. 宏代码使用方法5. 效果图 1. 简述 当我们要处理大量行数的excel数据时候&#xff0c;有时某列中有些行中的单元格内容中含有我们不想要的部分&#xff08…

功率开关集成电路TWH8751路灯自动控制器/双D触发器CD4013路灯控制器电路设计

采用功率开关集成电路TWH8751的路灯自动控制器 本例介绍的光控路灯&#xff0c;在白天不工作&#xff0c;夜晚能自动点亮&#xff0c;可用于街道或农村场院等场合 。 一、电路工作原理 电路原理如图 19 所示。 该光控路灯电路由电源电路和光控电路组成&#xff0c;如图所示…

Latch up (闩锁效应)

Latch-up latch up 是指cmos晶片中, 在电源power VDD和地线GND(VSS)之间由于寄生的PNP和NPN双极性BJT(Bipolar Junction Transistors)相互影响而产生的一低阻抗通路, 它的存在会使VDD和GND之间产生大电流。    In the simplest way, the latch-up issue can be defined as a …

ModaHub魔搭社区:AI原生云向量数据库MIlvus Cloud实现 HNSW

实现 HNSW HNSW 并不简单,因此我们只在此处进行最简单的实现。像之前一样,我们首先创建一组(128 维)向量的数据集: >>> import numpy as np >>> dataset = np.random.normal(size=(1000, 128)) 第一步是构建 HNSW 索引。为此,我们需要将每个向量添加…

前端基础知识学习——圆角、透明圆角(十四)

文章目录 圆角方法一圆角方法二&#xff08;推荐&#xff09;透明圆角方法一透明圆角方法二&#xff08;推荐&#xff09; 圆角方法一 /* 添加圆角 方法1&#xff1a;border-radius cs3不兼容*/.bo{width: 100px; height: 200px;border: 1px solid #e5e5e5;margin:30px aut…

DMA-GD32

DMA-GD32 DMA模块包括DMA控制器、主模式控制电路、从模式控制电路和数据通道FIFOS. 主、从模式控制电路分别负责控制DMA模块在PCle总线的主模式和从模式下的工作状态 FIFOS实现数据缓冲通道,对总线端的高速信号和外设上本地低速信号进行速率匹配和缓冲 DMA模块的上述结构使得它…

政府-管制

垄断带来的问题 政府以四种方式中的一种对垄断问题作出反应 管制垄断者的行为努力使垄断行业更有竞争性:反垄断(反托拉斯)把一些私人垄断变为公有企业什么也不做管制 政府管制垄断者收取的价格。 如果价格定在边际成本上,资源配置就将是最有效率的。 自然垄断的边际成本定…

centos7.9php8swoole5swoft2环境安装遇到确实redis扩展的解决办法

1、环境介绍 运行系统&#xff1a;centos7.9 php版本&#xff1a;php8.0.29 swoole版本&#xff1a;swoole5 swoft版本&#xff1a;swoft2.02、遇到的问题 The requested PHP extension ext-redis * is missing from your system. Install or enable PHPs redis extension。这…

流量监控异常行为分析案例

分析原理 正常的基于TCP的网络流量&#xff0c;都是先建立TCP连接&#xff0c;再传输数据&#xff0c;然后断开连接。 而网络中经常存在中毒系统、配置错误等问题&#xff0c;导致网络中存在单向请求现象&#xff0c;这些信息也会在网络流量中体现。 NetInside自动发现大量连…

easyphp

说起来是easy但是&#xff0c;代码审计对于我来说有点小难 唯一觉得好的地方是因为基本上每一步都有回显&#xff0c;可以依照回显一步步注入 <?php highlight_file(__FILE__); $key1 0; $key2 0;$a $_GET[a]; $b $_GET[b];if(isset($a) && intval($a) > 60…

apple pencil一代的平替有哪些品牌?苹果平板的触控笔

随着苹果Pencil系列的推出&#xff0c;平替电容笔在国内市场得到了较好的发展&#xff0c;随之的销量&#xff0c;也开始暴涨&#xff0c;苹果pencil因为价格太高&#xff0c;导致很多人买不起。目前市场上&#xff0c;有不少的平替电容笔&#xff0c;可以替代苹果的Pencil&…

总结925

目标规划&#xff1a; 月目标&#xff1a;7月&#xff08;高等数学强化18讲&#xff0c;英语真题4套&#xff0c;数据结构&#xff09; 周目标&#xff1a;高等数学强化前5讲回顾&#xff0c;英语06年真题一套&#xff0c;数据结构第3章习题 每日规划 今日已做 1.早读&#…

普通人怎么实现财务自由?

有道无术&#xff0c;术尚可求也&#xff1b;有术无道&#xff0c;止于术。你好&#xff0c;我是程序员雪球&#xff0c;今天一起来聊聊普通人怎么实现财务自由&#xff1f; 作为普通人&#xff0c;怎么实现财务自由&#xff1f;其实只需要做好三件事&#xff1a;减少日常花销&…

一篇文章让你搞懂字符函数+字符串函数

List item 前言 C语言中对字符和字符串的处理很是频繁&#xff0c;但是C语言本身是没有字符串类型的&#xff0c;字符串通常放在常量字符串中或者字符数组中 字符串常量适用于那些对它不做修改的字符串函数 1.求字符串长度 1.1strlen 其返回值是一个size_t的无符号给整型 …

基于vue的MOBA类游戏攻略分享平台

本系统为了数据库结构的灵活性所以打算采用MySQL来设计数据库&#xff0c;而java技术&#xff0c;B/S架构则保证了较高的平台适应性。本文主要介绍了本系统的开发背景&#xff0c;所要完成的功能和开发的过程&#xff0c;主要说明了系统设计的重点、设计思想。

RK3588国产开发板Debian系统安装虚拟键盘

当我们在使用 debian 系统的时候&#xff0c;如果想要进行输入&#xff0c;无可避免地要外接键盘。当我们的 输入量不大的时候可以进行虚拟键盘的安装。具体步骤如下&#xff1a; 首先使用以下命令&#xff0c;对 onboard 虚拟键盘进行安装&#xff0c;如下图所示&#xff1a…