SpringCloud(19)之Skywalking应用上篇

news2024/12/22 18:32:01

一、Skywalking概述

        

        随着互联网架构的扩张,分布式系统变得日趋复杂,越来越多的组件开始走向分布式化,如微服务、消 息收发、分布式数据库、分布式缓存、分布式对象存储、跨域调用,这些组件共同构成了繁杂的分布式网络。 

        思考以下几个问题:

1.一个请求经过了这些服务之后出现了一个调用失败的问题,如何定位问题发生的地方?

2.如何计算每一个节点访问流量?

3.流量波动的时候,增加了哪些节点集群服务?

        这些问题想要得到解决,一定是有数据支撑,绝不是靠开发人员或者运维人员的直觉。所以为了解决分布式应用、微服务系统面临的这些挑战,APM系统运营而生。

1.1微服务系统监控的三要素

      

  • Logging:就是记录系统行为的离散事件,例如,服务在处理某个请求时打印的错误日志,我们可以将这些日志信息记录到 ElasticSearch 或是其他存储中,然后通过 Kibana 或是其他工具来分析   这些日志了解服务的行为和状态。大多数情况下,日志记录的数据很分散,并且相互独立,比如错 误日志、请求处理过程中关键步骤的日志等等。
  • Metrics:是系统在一段时间内某一方面的某个度量,例如,电商系统在一分钟内的请求次数。我们 常见的监控系统中记录的数据都属于这个范畴,例如 PromethusOpen-Falcon 等,这些监控系  统最终给运维人员展示的是一张张二维的折线图。  Metrics 是可以聚合的,例如,为电商系统中每  HTTP 接口添加一个计数器,计算每个接口的 QPS,之后我们就可以通过简单的加和计算得到    系统的总负载情况。
  • Tracing:即我们常说的分布式链路追踪。在微服务架构系统中一个请求会经过很多服务处理,调用 链路会非常长,要确定中间哪个服务出现异常是非常麻烦的一件事。通过分布式链路追踪,运维人 员就可以构建一个请求的视图,这个视图上展示了一个请求从进入系统开始到返回响应的整个流程。这样,就可以从中了解到所有服务的异常情况、网络调用,以及系统的性能瓶颈等。

1.2 什么是链路追踪

        谷歌在 2010 4 月发表了一篇论文《Dapper, a Large-Scale Distributed Systems Tracing

Infrastructure》介绍了分布式追踪的概念,之后很多互联网公司都开始根据这篇论文打造自己的分布 式链路追踪系统。前面提到的 APM 系统的核心技术就是分布式链路追踪。

        OpenTracing提供了一个标准的、与供应商无关的框架,这意味着如果开发者想要尝试一种不同的分布 式追踪系统,开发者只需要简单地修改Tracer配置即可,而不需要替换整个分布式追踪系统。

        现在OpenTracing API目前支持的语言众多:

1.2.1 链路追踪

         下面通过官方的一个示例简单介绍说明什么是 Tracing,Tracing学完后,更有助于大家运用Skywalking UI进行数据分析。

        在一个分布式系统中,追踪一个事务或者调用流程,可以用下图方式描绘出来。这类流程图可以看清各 组件的组合关系,但它并不能看出一次调用触发了哪个组件调用、什么时间调用、是串行调用还是并行调用。

         

        一种更有效的展现方式就是下图这样,这是一个典型的 trace视图,这种展现方式增加显示了执行时间 的上下文,相关服务间的层次关系,进程或者任务的串行或并行调用关系。这样的视图有助于发现系统 调用的关键路径。通过关注关键路径的执行过程,开发团队就可以专注于优化路径中的关键服务,最大 幅度的提升系统性能。例如下图中,我们可以看到请求串行的调用了授权服务、订单服务以及资源服务,在资源服务中又并行的执行了三个子任务。我们还可以看到,在这整个请求的生命周期中,资源服 务耗时是最长的。

1.2.2 OpenTracing

        学好OpenTracing,更有助于我们运用Skywalking UI进行数据分析。

Trace 

        一个Trace代表一个事物、请求或者是流程在分布式系中的执行过程。 OpenTracing 中的一条 Trace 认为是一个由多个 Span 组成的有向无环图(  DAG ),一个 Span 代表系统中具有开始时间和执行时 长的逻辑单元,Span一般会有一个名称,一条 Trace Span 是首尾连接的。

Span

      Span 代表系统中具有开始时间和执行时长的逻辑单元,Span 之间通过嵌套或者顺序排列建立逻辑因果 关系。换句话就是到某个服务,这个服务的为一个span。

          每个 Span 中可以包含以下的信息:

1.操作名称:例如访问的具体 RPC 服务,访问的 URL 地址等;

2.起始时间;

3.结束时间;

4.Span Tag:一组键值对构成的Span标签集合,其中键必须为字符串类型,值可以是字符串、  bool 值或者数字;

5 Span Log :一组 Span 的日志集合;

6.SpanContextTrace 的全局上下文信息;

7.ReferencesSpan 之间的引用关系,下面详细说明 Span 之间的引用关系;

         在一个 Trace 中,一个 Span 可以和一个或者多个 Span 间存在因果关系。目前,OpenTracing 定义了 ChildOf FollowsFrom 两种 Span 之间的引用关系。这两种引用类型代表了子节点和父节点间的直接 因果关系。

1.ChildOf 关系 :一个 Span 可能是一个父级 Span 的孩子,即为 ChildOf 关系。下面这些情况会构 ChildOf 关系;

1.1:一个 HTTP 请求之中,被调用的服务端产生的 Span,与发起调用的客户端产生的 Span,就 构成了 ChildOf 关系;

1.2: 一个 SQL Insert 操作的 Span,和 ORM save 方法的 Span 构成 ChildOf 关系。

      很明显,上述 ChildOf 关系中的父级 Span 都要等待子 Span 的返回,子 Span 的执行时间影响了其所   在父级 Span 的执行时间,父级 Span 依赖子 Span 的执行结果。除了串行的任务之外,我们的逻辑中   还有很多并行的任务,它们对应的 Span 也是并行的,这种情况下一个父级 Span 可以合并所有子 Span 的执行结果并等待所有并行子 Span 结束。   

        FollowsFrom 关系:在分布式系统中,一些上游系统(父节点)不以任何方式依赖下游系统(子节点)的执行结果,例如,上游系统通过消息队列向下游系统发送消息。这种情况下,下游系统对应的子 Span 和上游系统对应的父级 Span 之间是 FollowsFrom关系。

1.3 常见的APM系统

        我们前面提到了APM系统,APM 系统(Application Performance Management,即应用性能管理) 是对企业的应用系统进行实时监控,实现对应用性能管理和故障定位的系统化解决方案,在运维中常用。

  • CAT(开源):由国内美团点评开源的,基于Java开发,目前提供 JavaC/C++ Node.js PythonGo 等语言的客户端,监控数据会全量统计。国内很多公司在用,例如美团点评、携程、 拼多多等。  CAT 需要开发人员手动在应用程序中埋点,对代码侵入性比较强。
  • ZipKin(开源):由 Twitter 公司开发并开源,Java 语言实现。侵入性相对于 CAT 要低一点,需 要对web.xml 等相关配置文件进行修改,但依然对系统有一定的侵入性。Zipkin 可以轻松与Spring Cloud 进行集成,也是 Spring Cloud 推荐的 APM 系统。
  • Pinpoint(开源):韩国团队开源的 APM 产品,运用了字节码增强技术,只需要在启动时添加    启动参数即可实现 APM 功能,对代码无侵入。目前支持 Java PHP 语言,底层采用 HBase 存储数据,探针收集的数据粒度非常细,但性能损耗较大,因其出现的时间较长,完成度也很高,文档也较为丰富,应用的公司较多。

  •  SkyWalking(开源):国人开源的产品,2019 4 17 SkyWalking Apache 基金会的 孵化器毕业成为顶级项目。目前 SkyWalking 支持 Java.Net Node.js 等探针,数据存储支持  MySQL ElasticSearch等。

  • 还有很多不开源的APM系统,例如:淘宝鹰眼、华为云APM等;


1.4 Skywalking 介绍 

        Skywalking是一个可观测性分析平台和应用性能管理系统,它也是基于OpenTracing规范、开源的AMP 系统。 Skywalking提供分布式跟踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。支持Java .Net Core, PHP, NodeJS, Golang, LUA, c++代理。支持Istio +特使服务网格

         SkyWalking 核心功能:

  • 服务、服务实例、端点指标分析;
  • 服务拓扑图分析;
  • 服务、服务实例喝端点SLA分析;
  • 慢查询检测
  • 告警

SkyWalking 特点:

  • 多语言自动探针,支持Java、.NET等多种语言;
  • 为多种开源项目提供了插件,为tomcat、HttpClient、Spring、RabbitMQ、Mysql等常见基础设施提供了自动探针;
  • 微内核+插件的架构,存储、集群关丽丽、使用插件集合都可以进行自行选择;
  • 支持告警;
  • 优秀的可视化效果 

 Skywalking架构图:

         SkyWalking 分为三个核心部分:

Agent(探针)  Agent 运行在各个服务实例中,负责采集服务实例的 Trace  Metrics 数据, 然后通过 gRPC 方式上报给 SkyWalking 后端。

OAPSkyWalking 的后端服务,其主要责任有两个,一个是负责接收 Agent 上报上来的 Trace Metrics 等数据,交给 Analysis Core  (涉及SkyWalking OAP 中的多个模块)进行流式分析,最终将分析得到的结果写入持久化存储中。SkyWalking 可以使用 ElasticSearch H2 MySQL 等作为其持久化存储,一般线上使用 ElasticSearch 集群作为其后端存储。另一个是负责响应 SkyWalking UI 界面发送来的查询请求,将前面持久化的数据查询出来, 组成正确的响应结果返回给 UI 界面进行展示。

 UI 界面 SkyWalking 前后端进行分离,该 UI 界面负责将用户的查询操作封装为 GraphQL 请求 提交给 OAP 后端触发后续的查询操作,待拿到查询结果之后会在前端负责展示。

1.4.1 Skywalking 安装 

         Skywalking数据存储方式有2种,分别为H2(内存)elasticsearch,如果数据量比较大,建议使用后 者,工作中也建议使用后者。

        Skywalking自身提供了UI管理控制台,我们安装的组件:

1:elasticsearch,建议使用elasticsearch7.x

2:elasticsearch-hq,elasticsearch的管理工具,更方便管理elasticsearch

3:Skywalking

4:Skywalking-UI

1.4.2 elasticsearch安装

 1)系统资源配置修改     

        elasticsearch占用系统资源比较大,我们需要修改下系统资源配置,这样才能很好的运行 elasticsearch,修改虚拟机配置,  vi /etc/security/limits.conf ,追加内容:

* soft nofile 65535
* hard nofile 65535

 修改 vi /etc/sysctl.conf ,追加内容 :

vm.max_map_count=655360

 让配置立即生效:

/sbin/sysctl -p

 

 2)安装elasticsearch

         建议安装elasticsearch7.x ,我们这里选择7.6.2,并且采用容器的安装方式,安装如下:

docker run --name elasticsearch -p 9200:9200  -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms84m -Xmx512m" -d elasticsearch:7.6.2

        此时就会从远程镜像仓库中拉取对应的镜像。

 3)elasticsearch跨域配置

         elasticsearch默认是没有开启跨域,我们需要配置跨域,并配置集群节点名字:

#进入容器
docker exec -it elasticsearch /bin/bash

         修改容器中 /usr/share/elasticsearch/config/elasticsearch.yml 文件,添加配置如下:

cluster.name: "elasticsearch"
http.cors.enabled: true
http.cors.allow-origin: "*"
network.host: 0.0.0.0
discovery.zen.minimum_master_nodes: 1

         参数说明:

cluster.name:集群服务名字

http.cors.enabled:开启跨域

http.cors.allow-origin: 允许跨域域名,*代表所有域名

network.host: 外部访问的IP

discovery.zen.minimum_master_nodes: 最小主节点个数

 安装完成后,重启容器 docker restart elasticsearch ,再访问 http://ip:9200/ 效果如下:

 

安装 ElasticSearch管理界面elasticsearch-hq 

docker run -d --name elastic-hq -p 5000:5000 --restart always elastichq/elasticsearch-hq

 安装完成后,访问控制台地址 http://IP:5000/#!/clusters/elasticsearch

 

1.4.3 Skywalking安装 

         Skywalking的安装我们也采用Docker安装方式,同时我们需要为Skywalking指定存储服务:

##通过docker安装skywalking
docker run --name skywalking -d -p 1234:1234 -p 11800:11800 -p 12800:12800 --restart always --link elasticsearch:elasticsearch -e SW_STORAGE=elasticsearch7 - e SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 apache/skywalking-oap-server

 参数说明:

--link elasticsearch:elasticsearch:存储服务使用elasticsearch

-e SW_STORAGE=elasticsearch7:存储服务elasticsearch的版本

-e SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200:存储服务elasticsearch的链接地址

 接下来安装Skywalking-UI,需要指定Skywalking服务名字:

docker run --name skywalking-ui -d -p 8080:8080 --link skywalking:skywalking -e SW_OAP_ADDRESS=skywalking:12800 --restart always apache/skywalking-ui

         安装完成后,我们接下来访问Skywalking控制台: http://ip:8080

1.5 Skywalking的使用 

         相关术语:

skywalking-collector:链路数据归集器,数据可以落地ElasticSearch/H2

skywalking-ui:web可视化平台,用来展示落地的数据

skywalking-agent:探针,用来收集和发送数据到归集器

1.5.1 agent下载

         Skywalking-agent,它简称探针,用来收集和发送数据到归集器,我们先来学习下探针使用,探针对应 jar包在Skywalking源码中,我们需要先下载源码。

        Skywalking源码下载地址:  Index of /dist/skywalking   ,我们当前使用的版本是 8.3.0 ,选择下载对应版本。

 agent目录结构如下:

 目录结构说明:

activations 当前skywalking正在使用的功能组件。

agent.config 文件是 SkyWalking Agent 的唯一配置文件。

plugins 目录存储了当前 Agent 生效的插件。

optional-plugins 目录存储了一些可选的插件(这些插件可能会影响整个系统的性能或是有版权问 ),如果需要使用这些插件,需将相应 jar 包移动到 plugins 目录下。

skywalking-agent.jar  Agent 的核心 jar 包, 由它负责读取 agent.config 配置文件,加载 上述插件 jar 包,运行时收集到  Trace  Metrics 数据也是由它发送到 OAP 集群的。

1.5.2 agent应用

      项目使用agent,如果是开发环境,可以使用IDEA集成,如果是生产环境,需要将项目打包上传到服务 器。为了使用agent,我们同时需要将下载的 apache-skywalking-apm-bin文件包上传到服务器上去。 不过无论是开发环境还是生产环境使用agent ,对项目都是无侵入式的。

1.5.3 应用名配置

       我们需要用到 agent ,此时需要将 agent/config/agent.config配置文件拷贝到每个需要集成

Skywalking工程的resource目录下,我们将 agent.config拷贝到 工程\hailtaxi-parent 的每个子工 程目录下,并修改其中的 agent.service_name ,修改如下:

hailtaxi-gateway:

agent.service_name=${SW_AGENT_NAME:hailtaxi-gateway}

hailtaxi-driver:

agent.service_name=${SW_AGENT_NAME:hailtaxi-driver}

hailtaxi-order:

agent.service_name=${SW_AGENT_NAME:hailtaxi-order}

         agent.config 是一个 KV 结构的配置文件,类似于  properties 文件,value 部分使用 "${}" 包裹, 其中使用冒号  ":" 分为两部分,前半部分是可以覆盖该配置项的系统环境变量名称,后半部分为默 认值。例如这里的 agent.service_name 配置项,如果系统环境变量中指定了 SW_AGENT_NAME (注意,全是大写),则优先使用环境变量中指定的值,如果环境变量未指定,则使用 hailtaxi-driver这个默认值。

1.5.4 生产环境中使用agent

       生产环境使用,因此我们需要将agent和每个项目的jar包上传到服务器上,上传apache-skywalking-apm-bin至 /usr/local/server/skywalking ,再将工程hailtaxi-parent 中的项目打包,并分别上 传到服务器上,如下三个工程:

hailtaxi-order-1.0-SNAPSHOT.jar

hailtaxi-gateway-1.0-SNAPSHOT.jar

hailtaxi-driver-1.0-SNAPSHOT.jar

1)启动hailtaxi-gateway         

java -javaagent:/usr/local/server/skywalking/apache-skywalking-apm-
bin/agent/skywalking-agent.jar -Dskywalking.agent.service_name=hailtaxi-gateway -jar hailtaxi-gateway-1.0-SNAPSHOT.jar &

        我只就是指定对应的agent包,以及覆盖skywalking的服务名称 ,大家在生产环境中可以在挂在目录中存放agent包,然后存放统一的config文件,然后再通过命令行覆盖对应的服务名就好了。

 1.6Rocketbot

         前面我们已经完成了SkyWalking环境搭建和项目应用agent使用,我们来看如何使用 SkyWalking 提供 UI 界面—— Skywalking Rocketbot

        OAP服务和Rocket(其实就是个web项目)均已启动。

 1.6.1Rockerbot仪表盘

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

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

相关文章

Leaflet 加载高德地图

前言 在前面的文章中,我们学习了如何使用 Leaflet 创建一个基本的地图。在本文中,我们将学习如何在 Leaflet 中加载高德地图,并结合实际应用构建地图点击事件。 一、介绍 高德地图是一款由高德软件提供的数字地图服务,在国内使用…

在国内如何申请US,visa卡?

随着跨境与AI的发展大家对美国虚拟卡的需求也越来越多,比如说亚马逊、ebay、Etsy、ChatGPTPLUS、midjourney、POE等等软件以及海淘的需要,所以我们需要用到美国虚拟卡的场景就越来越多 如何获得一张US 虚拟信用卡? 方法很简单,点…

React-子传父

1.概念 说明&#xff1a;React中子组件向父组件传递数据通常涉及回调函数和状态提升等方法。 2.代码实现 2.1绑定事件 说明&#xff1a;父组件绑定自定义事件 <Son onGetSonMsg{getMsg}></Son> 2.2接受事件 说明&#xff1a;子组件接受父组件的自定义事件名称…

【Spring云原生】Spring Batch:海量数据高并发任务处理!数据处理纵享新丝滑!事务管理机制+并行处理+实例应用讲解

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &#x1f680; 本…

【Pytorch入门】常见Transforms/ __call__方法

在Python中&#xff0c;__call__方法是一个特殊方法&#xff0c;用于使对象可以像函数一样被调用。当一个对象实现了__call__方法时&#xff0c;可以直接使用括号运算符将对象作为函数调用。 通过实现__call__方法&#xff0c;可以为对象提供函数式的行为&#xff0c;使其更加…

超全Chat GPT论文修改指令

文献综述指令润色修改指令论文选题指令论文大指令研究理论指令论文致谢指令参考文献指令论文润色整体逻辑论文整体优化提问指令 1&#xff0e;文献综述指令 请你帮我写一份关于&#xff08;研究主题&#xff09;的文献综述。我的论文选题方向是 XXXX &#xff0c;我已经找到了…

Vue.js 修饰符:精准控制组件行为

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

IDEA中Maven无法下载jar包问题解决

在项目中经常会遇到jar包无法下载的问题&#xff0c;可以根据以下几种方法进行排查。 1. 排查网络连接 网络连接失败&#xff0c;会导致远程访问Maven仓库失败&#xff0c;所以应确保网络连接正常。 2. 排查Maven的配置 Maven配置文件&#xff08;settings.xml&#xff09;…

《数字图像处理(MATLAB版)》相关算法代码及其分析(3)

目录 1 对边界进行子采样 1.1 输入参数检查 1.2 处理重复坐标 1.3 计算边界最大范围 1.4 确定网格线数量 1.5 构建网格位置向量 1.6 计算曼哈顿距离 1.7 整理输出结果 1.8 返回结果 2 改变图像的存储类别 2.1 函数输入 2.2 数据类型转换 2.3 错误处理 2.4 返回结…

LabVIEW高温摩擦磨损测试系统

LabVIEW高温摩擦磨损测试系统 介绍了一个基于LabVIEW的高温摩擦磨损测试系统的软件开发项目。该系统实现高温条件下材料摩擦磨损特性的自动化测试&#xff0c;通过精确控制和数据采集&#xff0c;为材料性能研究提供重要数据支持。 项目背景 随着材料科学的发展&#xff0c;…

视觉Transformers中的位置嵌入 - 研究与应用指南

视觉 Transformer 中位置嵌入背后的数学和代码简介。 自从 2017 年推出《Attention is All You Need》以来&#xff0c;Transformer 已成为自然语言处理 (NLP) 领域最先进的技术。 2021 年&#xff0c;An Image is Worth 16x16 Words 成功地将 Transformer 应用于计算机视觉任务…

小迪安全31WEB 攻防-通用漏洞文件上传js 验证mimeuser.ini语言特性

#知识点&#xff1a; 1、文件上传-前端验证 2、文件上传-黑白名单 3、文件上传-user.ini 妙用 4、文件上传-PHP 语言特性 #详细点&#xff1a; 检测层面&#xff1a;前端&#xff0c;后端等 2、检测内容&#xff1a;文件头&#xff0c;完整性&#xff0c;二次渲染…

docker快照备份回滚

1. 安装系统 1.1 vm安装Ubuntu 参考:https://blog.csdn.net/u010308917/article/details/125157774 1.2 其他操作 添加自定义物理卷 –待补充– 1.2.1 查询可用物理卷 fdisk -l 输出如下 Disk /dev/loop0: 73.9 MiB, 77492224 bytes, 151352 sectors Units: sectors of …

Vue 项目重复点击菜单刷新当前页面

需求&#xff1a;“在当前页面点击当前页面对应的菜单时&#xff0c;也能刷新页面。” 由于 Vue 项目的路由机制是路由不变的情况下&#xff0c;对应的组件是不重新渲染的。所以重复点击菜单不会改变路由&#xff0c;然后页面就无法刷新了。 方案一 在vue项目中&#xff0c;…

英特尔/ARM/国产化EMS储能控制器解决方案

新型储能是建设新型电⼒系统、推动能源绿⾊低碳转型的重要装备基础和关键⽀撑技术&#xff0c;是实现碳达峰、碳中和⽬标的重要⽀撑。说到储能&#xff0c;大众首先想到的就是电池&#xff0c;其好坏关系到能量转换效率、系统寿命和安全等重要方面&#xff0c;但储能要想作为一…

[LeetBook]【学习日记】数组内乘积

题目 按规则计算统计结果 为了深入了解这些生物群体的生态特征&#xff0c;你们进行了大量的实地观察和数据采集。数组 arrayA 记录了各个生物群体数量数据&#xff0c;其中 arrayA[i] 表示第 i 个生物群体的数量。请返回一个数组 arrayB&#xff0c;该数组为基于数组 arrayA …

vue点击按钮同时下载多个文件

点击下载按钮根据需要的id调接口拿到返回需要下载的文件 再看返回的数据结构 数组中一个对象&#xff0c;就是一个文件&#xff0c;多个对象就是多个文件 下载函数 // 下载tableDownload(row) {getuploadInventoryDownload({ sysBatch: row.sysBatch, fileName: row.fileName…

STM32 TIM编码器接口

单片机学习&#xff01; 目录 文章目录 前言 一、编码器接口简介 1.1 编码器接口作用 1.2 编码器接口工作流程 1.3 编码器接口资源分布 1.4 编码器接口输入引脚 二、正交编码器 2.1 正交编码器功能 2.2 引脚作用 2.3 如何测量方向 2.4 正交信号优势 2.5 执行逻辑 三、编码器定时…

前端+php:实现提示框(自动消失)

效果 php部分&#xff1a;只展示插入过程 <?php//插入注册表中$sql_insert "INSERT INTO regist_user(userid,password,phone,email)VALUES (" . $_POST[UserID] . "," . CryptPass($_POST[Password]) . "," . $_POST[Phone] . ",&qu…

“而且,再加上”可以用哪个语法来表示,柯桥考级韩语学习

语法 --는/은/ㄴ 데다가 1.语法&#xff1a;는/은/ㄴ 데다가 2.表示&#xff1a;用于谓词词干和体词谓词形后, 表示在原有的状况上再加上其他情况。 3.添加&#xff1a; 4.例句&#xff1a; 当然&#xff0c;与这个语法含义相近的还有不少语法&#xff0c;有一部分是初级暂时…