k8s集群监控cadvisor+prometheus+grafana部署

news2024/9/22 6:03:03

目录

1.新建命名空间monitor

2.部署

        2.1部署cadvisor

        2.2部署node_exporter

        2.3部署prometheus资源

        2.4部署rbac权限

        2.5.部署 metrics

        2.6部署grafana

3.测试效果


参考文章:

k8s集群部署cadvisor+node-exporter+prometheus+grafana监控系统 - cyh00001 - 博客园

准备工作:

节点介绍:

master:192.168.136.21

worker:192.168.136.22

worker:192.168.136.23

#vim缩进混乱,冒号模式下,:set paste进入黏贴模式,:set nopaste退出黏贴模式(默认)。

1.新建命名空间monitor

kubectl create ns monitor

拉取cadvisor镜像,由于官方的镜像在在谷歌镜像中,国内无法访问,我这里直接用别人的,直接拉取即可,注意镜像名是 lagoudocker/cadvisor:v0.37.0。

docker pull lagoudocker/cadvisor:v0.37.0 

2.部署

新建 /opt/cadvisor_prome_gra 目录

2.1部署cadvisor

 vim case1-daemonset-deploy-cadvisor.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: cadvisor
  namespace: monitor
spec:
  selector:
    matchLabels:
      app: cAdvisor
  template:
    metadata:
      labels:
        app: cAdvisor
    spec:
      tolerations:    #污点容忍,忽略master的NoSchedule
        - effect: NoSchedule
          key: node-role.kubernetes.io/master
      hostNetwork: true
      restartPolicy: Always   # 重启策略
      containers:
      - name: cadvisor
        image: lagoudocker/cadvisor:v0.37.0
        imagePullPolicy: IfNotPresent  # 镜像策略
        ports:
        - containerPort: 8080
        volumeMounts:
          - name: root
            mountPath: /rootfs
          - name: run
            mountPath: /var/run
          - name: sys
            mountPath: /sys
          - name: docker
            mountPath: /var/lib/containerd
      volumes:
      - name: root
        hostPath:
          path: /
      - name: run
        hostPath:
          path: /var/run
      - name: sys
        hostPath:
          path: /sys
      - name: docker
        hostPath:
          path: /var/lib/containerd

kubectl apply -f case1-daemonset-deploy-cadvisor.yaml

kubectl get pod -n monitor -owide

因为有三个节点,所以会有三个pod,如果后期加入工作节点,DaemonSet会自动添加。 

测试cadvisor  <masterIP>:<8080>

2.2部署node_exporter

部署node-exporter的DaemonSet资源和Service资源。

vim case2-daemonset-deploy-node-exporter.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: monitor
  labels:
    k8s-app: node-exporter
spec:
  selector:
    matchLabels:
        k8s-app: node-exporter
  template:
    metadata:
      labels:
        k8s-app: node-exporter
    spec:
      tolerations:
        - effect: NoSchedule
          key: node-role.kubernetes.io/master
      containers:
      - image: prom/node-exporter:v1.3.1 
        imagePullPolicy: IfNotPresent
        name: prometheus-node-exporter
        ports:
        - containerPort: 9100
          hostPort: 9100
          protocol: TCP
          name: metrics
        volumeMounts:
        - mountPath: /host/proc
          name: proc
        - mountPath: /host/sys
          name: sys
        - mountPath: /host
          name: rootfs
        args:
        - --path.procfs=/host/proc
        - --path.sysfs=/host/sys
        - --path.rootfs=/host
      volumes:
        - name: proc
          hostPath:
            path: /proc
        - name: sys
          hostPath:
            path: /sys
        - name: rootfs
          hostPath:
            path: /
      hostNetwork: true
      hostPID: true
---
apiVersion: v1
kind: Service
metadata:
  annotations:
    prometheus.io/scrape: "true"
  labels:
    k8s-app: node-exporter
  name: node-exporter
  namespace: monitor
spec:
  type: NodePort
  ports:
  - name: http
    port: 9100
    nodePort: 39100
    protocol: TCP
  selector:
    k8s-app: node-exporter

 kubectl get pod -n monitor

 

 验证 node-exporter 数据 ,注意是9100端口,<nodeIP>:<9100>

2.3部署prometheus资源

prometheus资源包括ConfigMap资源、Deployment资源、Service资源。

vim case3-1-prometheus-cfg.yaml

---
kind: ConfigMap
apiVersion: v1
metadata:
  labels:
    app: prometheus
  name: prometheus-config
  namespace: monitor 
data:
  prometheus.yml: |
    global:
      scrape_interval: 15s
      scrape_timeout: 10s
      evaluation_interval: 1m
    scrape_configs:
    - job_name: 'kubernetes-node'
      kubernetes_sd_configs:
      - role: node
      relabel_configs:
      - source_labels: [__address__]
        regex: '(.*):10250'
        replacement: '${1}:9100'
        target_label: __address__
        action: replace
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
    - job_name: 'kubernetes-node-cadvisor'
      kubernetes_sd_configs:
      - role:  node
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
      - target_label: __address__
        replacement: kubernetes.default.svc:443
      - source_labels: [__meta_kubernetes_node_name]
        regex: (.+)
        target_label: __metrics_path__
        replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
    - job_name: 'kubernetes-apiserver'
      kubernetes_sd_configs:
      - role: endpoints
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
      - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
        action: keep
        regex: default;kubernetes;https
    - job_name: 'kubernetes-service-endpoints'
      kubernetes_sd_configs:
      - role: endpoints
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
        action: keep
        regex: true
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
        action: replace
        target_label: __scheme__
        regex: (https?)
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
        action: replace
        target_label: __metrics_path__
        regex: (.+)
      - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
        action: replace
        target_label: __address__
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
      - action: labelmap
        regex: __meta_kubernetes_service_label_(.+)
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        target_label: kubernetes_namespace
      - source_labels: [__meta_kubernetes_service_name]
        action: replace
        target_label: kubernetes_service_name

注意case3-2配置文件中的k8s-master记得更改,不能改成主机ip(原因未知)

设置192.168.136.21(k8s-master)节点为prometheus数据存放路径 /data/prometheus。

vim case3-2-prometheus-deployment.yaml

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-server
  namespace: monitor
  labels:
    app: prometheus
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus
      component: server
    #matchExpressions:
    #- {key: app, operator: In, values: [prometheus]}
    #- {key: component, operator: In, values: [server]}
  template:
    metadata:
      labels:
        app: prometheus
        component: server
      annotations:
        prometheus.io/scrape: 'false'
    spec:
      nodeName: k8s-master
      serviceAccountName: monitor
      containers:
      - name: prometheus
        image: prom/prometheus:v2.31.2
        imagePullPolicy: IfNotPresent
        command:
          - prometheus
          - --config.file=/etc/prometheus/prometheus.yml
          - --storage.tsdb.path=/prometheus
          - --storage.tsdb.retention=720h
        ports:
        - containerPort: 9090
          protocol: TCP
        volumeMounts:
        - mountPath: /etc/prometheus/prometheus.yml
          name: prometheus-config
          subPath: prometheus.yml
        - mountPath: /prometheus/
          name: prometheus-storage-volume
      volumes:
        - name: prometheus-config
          configMap:
            name: prometheus-config
            items:
              - key: prometheus.yml
                path: prometheus.yml
                mode: 0644
        - name: prometheus-storage-volume
          hostPath:
           path: /data/prometheusdata
           type: Directory

 创建sa和clusterrolebinding

kubectl create serviceaccount monitor -n monitor

kubectl create clusterrolebinding monitor-clusterrolebinding -n monitor --clusterrole=cluster-admin --serviceaccount=monitor:monitor

创建prometheus-deployment

kubectl apply -f case3-2-prometheus-deployment.yaml

 case3-2这一步有大坑,用“k8s-master"可以,但是用“192.168.136.21”就不可以!这一步整整卡了很多天,但是明明什么都没有做,期间关过机,之前是两者都不行,Deployment和pod一直起不来,查看pod的日志显示找不到“192.168.136.21”主机,改成“k8s-master”也不行,几天后突然就好了。

 

vim case3-3-prometheus-svc.yaml

---
apiVersion: v1
kind: Service
metadata:
  name: prometheus
  namespace: monitor
  labels:
    app: prometheus
spec:
  type: NodePort
  ports:
    - port: 9090
      targetPort: 9090
      nodePort: 30090
      protocol: TCP
  selector:
    app: prometheus
    component: server

kubectl apply -f case3-3-prometheus-svc.yaml

2.4部署rbac权限

包括Secret资源、ServiceAccount资源、ClusterRole资源、ClusterRoleBinding资源,ServiceAccount是服务账户,ClusterRole权限规则,ClusterRoleBinding是将ServiceAccount和ClusterRole进行绑定。

pod和 apiserver 的认证信息通过 secret 进行定义,由于认证信息属于敏感信息,所以需要保存在secret 资源当中,并以存储卷的方式挂载到 Pod 当中。从而让 Pod 内运行的应用通过对应的secret 中的信息来连接 apiserver,并完成认证。

rbac权限管理是k8s的一套认证系统,上面只是简单讲解,深入了解可以浏览:k8s APIserver 安全机制之 rbac 授权_笨小孩@GF 知行合一的博客-CSDN博客_k8s rbac 写在哪个文件

vim case4-prom-rbac.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: prometheus
  namespace: monitor

---
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
  name: monitor-token
  namespace: monitor
  annotations:
    kubernetes.io/service-account.name: "prometheus"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: prometheus
rules:
- apiGroups:
  - ""
  resources:
  - nodes
  - services
  - endpoints
  - pods
  - nodes/proxy
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - "extensions"
  resources:
    - ingresses
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - configmaps
  - nodes/metrics
  verbs:
  - get
- nonResourceURLs:
  - /metrics
  verbs:
  - get
---
#apiVersion: rbac.authorization.k8s.io/v1beta1
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: prometheus
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus
subjects:
- kind: ServiceAccount
  name: prometheus
  namespace: monitor

kubectl apply -f case4-prom-rbac.yaml

2.5.部署 metrics

包括Deployment资源、Service资源、ServiceAccount资源、ClusterRole资源、ClusterRoleBinding资源。

注意是部署在kube-system!

vim case5-kube-state-metrics-deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: kube-state-metrics
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kube-state-metrics
  template:
    metadata:
      labels:
        app: kube-state-metrics
    spec:
      serviceAccountName: kube-state-metrics
      containers:
      - name: kube-state-metrics
        image: registry.cn-hangzhou.aliyuncs.com/zhangshijie/kube-state-metrics:v2.6.0 
        ports:
        - containerPort: 8080

---
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: kube-state-metrics
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: kube-state-metrics
rules:
- apiGroups: [""]
  resources: ["nodes", "pods", "services", "resourcequotas", "replicationcontrollers", "limitranges", "persistentvolumeclaims", "persistentvolumes", "namespaces", "endpoints"]
  verbs: ["list", "watch"]
- apiGroups: ["extensions"]
  resources: ["daemonsets", "deployments", "replicasets"]
  verbs: ["list", "watch"]
- apiGroups: ["apps"]
  resources: ["statefulsets"]
  verbs: ["list", "watch"]
- apiGroups: ["batch"]
  resources: ["cronjobs", "jobs"]
  verbs: ["list", "watch"]
- apiGroups: ["autoscaling"]
  resources: ["horizontalpodautoscalers"]
  verbs: ["list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kube-state-metrics
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: kube-state-metrics
subjects:
- kind: ServiceAccount
  name: kube-state-metrics
  namespace: kube-system

---
apiVersion: v1
kind: Service
metadata:
  annotations:
    prometheus.io/scrape: 'true'
  name: kube-state-metrics
  namespace: kube-system
  labels:
    app: kube-state-metrics
spec:
  type: NodePort
  ports:
  - name: kube-state-metrics
    port: 8080
    targetPort: 8080
    nodePort: 31666
    protocol: TCP
  selector:
    app: kube-state-metrics

 kubectl apply -f case5-kube-state-metrics-deploy.yaml

2.6部署grafana

grafana图形界面对接prometheus数据源,包括Deployment资源、Service资源。

vim grafana-enterprise.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: grafana-enterprise
  namespace: monitor
spec:
  replicas: 1
  selector:
    matchLabels:
      app: grafana-enterprise
  template:
    metadata:
      labels:
        app: grafana-enterprise
    spec:
      containers:
      - image: grafana/grafana
        imagePullPolicy: Always
        #command:
        #  - "tail"
        #  - "-f"
        #  - "/dev/null"
        securityContext:
          allowPrivilegeEscalation: false
          runAsUser: 0
        name: grafana
        ports:
        - containerPort: 3000
          protocol: TCP
        volumeMounts:
        - mountPath: "/var/lib/grafana"
          name: data
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
          limits:
            cpu: 500m
            memory: 2500Mi
      volumes:
      - name: data
        emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: grafana
  namespace: monitor
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 3000
    nodePort: 31000
  selector:
    app: grafana-enterprise

kubectl apply -f grafana-enterprise.yaml

账号admin 密码admin

添加数据源data sources,命名为prometheus,注意端口号

 添加模板13332,还可以添加其他模板,例如:14981、13824、14518。

点击左侧“+”号,选择“import”导入模板。

cadvisor模板14282

 现在显示的是pod的ID,不方便管理员浏览,为了方便显示成POD的name,模板右侧的“设置图标”,选择“Variables”,选择第二个,将“name”改成“pod”即可。

  仪表台的每一个板块也需要更改,点击板块标题,选择“Edit”,“name”改成“pod”。

 

3.测试效果

新建名为nginx01的deployment任务,测试监控结果。

vim nginx01.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx01
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx01
  template:
    metadata:
      labels:
        app: nginx01
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9

 kubectl apply -f nginx01.yaml 

出现两个nginx01,因为设置了2个副本。

 自此,cadvisor+prometheus+grafana集群监控部署完成。

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

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

相关文章

JDBC --- 数据库连接池 C3P0

目录 1、基本定义 2、使用C3P0&#xff08;数据库连接池&#xff09;的必要性 2.1.JDBC传统模式开发存在的主要问题 2.1.1时间和内存资源消耗巨大 2.1.2 有内存泄漏的风险 3、数据库连接池的详细说明 4、使用连接池的明显优势 4.1.资源的高效利用 4.2.更快的系统反应速…

linux中awk命令和argxs命令的详解使用

一 awk命令1.1 命令的作用awk为行命令处理器&#xff0c;对每一行的文本数据&#xff0c;进行格式化文本信息。目的&#xff1a;在处理庞大文件时不会出现内存溢出或是处理缓慢的问题。1.2 案例应用获取某一行文本数据&#xff0c;提取不同字段的值。1.显示整行数据[rootlocalh…

怎么把照片合成一张?看完这篇文章你就知道了

大家平时有没有遇到过这样的情况&#xff1f;好朋友们组团一起出去玩&#xff0c;但是你因为个人原因无法跟大家一起去。这就可能导致姐妹中的合照少了你一个人&#xff0c;那么要怎样在图片上添加你去了的效果呢&#xff1f;其实很简单&#xff0c;只要编辑图片进行合成就可以…

指针进阶(1)

( )> [ ] > -> > -- > . > * &#xff08;优先级比较&#xff09; tips 1. &#xff08;全是笔者个人自己总结&#xff0c;仅供参考&#xff0c;随意取用&#xff09; 2. 3. 地址唯一标识一块内存空间 4. printf%s打印字符串的话只要给一个起始地址…

【 Vue3 + Vite + setup语法糖 + Pinia + VueRouter + Element Plus 第二篇】(持续更新中)

在第一篇中我们讲述了Vue3框架的搭建以及Vue3的常用语法&#xff0c;这篇文章将使用 Axios 和 Element Plus 并使用封装组件的方式完成表格搭建。 本期需要掌握的知识如下: 引入并封装 Axios 请求配置 .env 文件通过 api 接口获取数据 下期需要掌握的知识如下: 组件的封装和…

MySQL主从延迟的解决方案

1、MySQL主从延迟的解决方案 之前项目中基于 MySQL 主从复制以及 AOP 的方式实现了读写分离&#xff0c;也写了博客记录了这个实现过程。既然配置了 MySQL 主从复制&#xff0c;那么自然会存在主从延迟&#xff0c;如何尽可能减小主从延迟对应用系统的影响是很有必要的思考点&a…

特征工程原理(一)

一、定义 在机器学习原理中讲过机器学习的基本流程&#xff0c;其中很重要的一个环节就是特征工程。 1.1 基本概念 特征工程&#xff08;Feature Engineering&#xff09;&#xff1a;从原始数据中提取特征的过程&#xff0c;这些特征可以很好地描述数据&#xff0c;并且利用…

Showdoc升级版本记录

目录 Showdoc介绍 升级步骤 1.备份当前版本 2.下载安装最新版本 总结步骤&#xff1a; Showdoc介绍 ShowDoc是一个非常适合IT团队的在线API文档、技术文档工具。通过showdoc&#xff0c;你可以方便地使用markdown语法来书写出美观的API文档、数据字典文档、技术文档、在线…

GitHub创建仓库,使用SSH建立连接(github创建仓库,github使用SSH建立连接)

GitHub简介&#xff1a;GitHub是一个面向开源及私有软件项目的托管平台&#xff0c;也是一个开源代码库以及版本控制系统&#xff0c;Github拥有超过900万开发者用户&#xff0c;已经成为了管理软件开发以及发现已有代码的首选方法。 怎样创建仓库并使用&#xff1f;详细操作步…

FTP错误代码

本文迁移自本人网易博客&#xff0c;写于2015年4月15日&#xff0c;FTP错误代码 - lysygyy的日志 - 网易博客 (163.com)1、12003错误指定用户未添加到有权限的组中&#xff1b;即指定用户没有权限。2、CFtpFileFind.FindFile GetLastError 12110 &#xff08;1&#xff09;当递…

对比学习综述

一 . 发展历程大概可以分为四个阶段 1、百花齐放&#xff1a;在这个阶段中&#xff0c;方法、模型、目标函数、代理任务都还没有统一&#xff0c;所以说是一个百花齐放的时代。 InstDisc&#xff08;instance discrimination&#xff09;CPCCMC 2、CV双雄&#xff1a;这个阶…

十六、xml、单元测试、注解、单例模式

xml 1.概述【理解】 万维网联盟(W3C) 万维网联盟(W3C)创建于1994年&#xff0c;又称W3C理事会。1994年10月在麻省理工学院计算机科学实验室成立。 建立者&#xff1a; Tim Berners-Lee (蒂姆伯纳斯李)。 是Web技术领域最具权威和影响力的国际中立性技术标准机构。 到目前为止&…

新提案,初识CSS的object-view-box属性

在开发时&#xff0c;一直希望有一种原生的css方式来裁剪图片&#xff0c;并将其定位在我需要的任何方向。这可以通过使用一个额外的html元素和不同的CSS属性来实现&#xff0c;后面解释。在这篇文章中&#xff0c;将带领大家了解Jake Archibald在今年年初提出的新的CSS属性obj…

VisionBank AI实现4项技术突破----传统算法融合深度学习,重新定义“工业视觉检测大脑”

机器视觉经过长时间的发展&#xff0c;技术不断取得重大突破并被广泛应用&#xff0c;当前已遍布工业生产的各个环节。而且机器视觉易于实现自动化集成&#xff0c;软件集成&#xff0c;是实现智能制造的基础技术。据统计&#xff0c;中国的机器视觉市场需求近几年处于持续高速…

【目标检测】ROI Pool和ROI Align的区别

这里说一下ROI Pool和ROI Align的区别&#xff1a; 一、ROI Pool层 参考Faster RCNN中的ROI Pool层&#xff0c;功能是将不同size的ROI区域映射到固定大小的feature map上。 它的缺点&#xff1a;由于两次量化带来的误差&#xff1b; 将候选框边界量化为整数点坐标值将量化…

【Vue】后台管理系统

O 项目说明 1.脚手架 vitevue-cli 》 webpack 2.vite脚手架使用 官网&#xff1a;https://vitejs.cn/ Vue3 vite官网&#xff1a;https://cn.vitejs.dev/ Vite下一代的前端工具链&#xff0c;为开发者提供急速响应 # 安装 $ cnpm i vite -g $ vite -v vite/4.0.3 darwin…

Sentinel + Redis + Mysql + RabbitMQ 秒杀功能设计及后端代码实现

文章目录前言数据一致性高性能动静分离静态资源缓存流控缓存数据库消息队列RabbitMQ的优点高并发分布式锁后端代码实现中间件表结构添加依赖公共常量实体类Redission配置定时任务Controller下单接口付款接口接收通道消息完整代码前言 在开发秒杀系统功能的时候&#xff0c;需要…

MyBatis讲解,批量添加

一、批量添加 1.书写BookMapper 1.1先在navicat的新建查询里书写条件查询的sql语句 条件查询的sql语句 insert into book(book_name) values(三体); 1.2将sql语句复制到BookMapper里 用到foreach标签&#xff1b; collection&#xff1a;可以放数组&#xff0c;也可以放list集…

数据结构与算法-算法分析(2)

算法和算法分析 对于同一个问题可能由不同的算法。究竟来如何评价这些算法 一个算法首先要具备正确性&#xff0c;健壮性&#xff0c;可读性和有穷性&#xff0c;然后我们再比较其算法的效率&#xff0c;来评判算法的优劣。 主要从时间和空间上的效率进行评价算法&#xff0c…

对JSON的理解

什么是JSON? JSON全名是JavaSpript Object Notation。 JSON是轻量级的文本数据交换格式。 JSON是存储和交换文本信息的语法&#xff0c;类似XML,比XML更小&#xff0c;更快&#xff0c;更易解析。 JSON可以将Java对象转换为特殊格式的字符串&#xff08;JSON串&#xff09…