Kubernetes 集群和应用监控方案的设计与实践

目录

  • Kubernetes 监控

    • 监控对象

    • Prometheus

    • 指标

  • 实践

    • 节点监控

    • 部署 Prometheus

    • 部署 Kube State Metrics

    • 部署 Grafana

    • 应用如何接入 Prometheus 和 Grafana

    • 告警

Kubernetes 监控

当你的应用部署到 Kubenetes 后,你很难看到容器内部发生了什么,一旦容器死掉,里面的数据可能就永远无法恢复,甚至无法查看日志以定位问题所在,何况一个应用可能存在很多个实例,用户的一个请求不指定被哪个容器处理了,这使得在 Kubernetes 中对应用进行故障排除较为复杂。在应用之外,由于 Kubernetes 作为基础设施,掌管这整个集群的生死,Kubernetes 的任何故障,必定影响到应用服务的运行,因此监控 Kubernetes 运行状况也至关重要。

当你的应用上了云原生,那你就不得不关注各个服务器的运行状态,基础设施和中间件的运行状态,Kubernetes 中每个组件和资源对象的运行状态,每个应用的运行状态。当然,这个运行状态是一个模糊的概念,取决于我们的关注点,每个被监控的对象要表达的 "运行状态" 是不一样的。为了可以监控我们关注的对象,对象需要做出一些配合,提供合适的运行状态的表达信息,以供我们收集和分析,这可以称为可观测性。

在云原生中,一般对可观测性分为三大作用域:

b29be9fba8d5d6b86a20f592fde50c79.png

你可以在 Kubernetes 文档中了解如何监控、调试,以及了解如何对日志进行处理:

https://v1-20.docs.kubernetes.io/docs/tasks/debug-application-cluster/

在本文中,所提到的监控,只包括 Metrics 。

Metrics、Tracing、Logging 不是完全独立的,在上图中,Metrics 也会可能包含 Logging 和 Tracing 的信息。

监控对象

要采集的监控数据,来源于被监控对象,而在 Kubernetes 集群中,我们可以将要监控的对象分为三大部分:

  • 机器:集群中的所有节点机器,指标有 CPU 内存使用率、网络和硬盘 IO 速率等;

  • Kubernetes 对象状态:Deployments, Pods, Daemonsets, Statefulset 等对象的状态和某些指标信息;

  • 应用:Pod 中每个容器的状态或指标,以及容器本身可能提供的 /metrics 端点。

Prometheus

在基础环境中,一个完整的监控应包括采集数据、存储数据、分析存储数据、展示数据、告警等多个部分,而每个部分都有相关的工具或技术解决云原生中环境的多样需求和复杂性问题。

既然要做监控,那么就需要监控工具。监控工具可以获取所有重要的指标和日志(Metrics也可以包含一些日志),并将它们存储在一个安全、集中的位置,以便可以随时访问它们来制定方案解决问题。由于在云原生中,应用在 Kubernetes 集群中部署,因此,监控 Kubernetes 可以让你深入了解集群的运行状况和性能指标、资源计数以及集群内部情况的顶级概览。发生错误时,监控工具会提醒你(告警功能),以便你快速推出修复程序。

Prometheus 是一个 CNCF 项目,可以原生监控 Kubernetes、节点和 Prometheus 本身,目前 Kubernetes 官方文档主要推荐使用 Prometheus 本身,它为 Kubernetes 容器编排平台提供开箱即用的监控能力。因此在本文中,对监控方案的设计是围绕 Prometheus 展开的。

下面是 Prometheus 的一些组件介绍:

  1. Metric Collection: Prometheus 使用拉模型通过 HTTP 检索度量。在 Prometheus 无法获取指标的情况下,可以选择利用 Pushgateway 将指标推给 Prometheus 。

  2. Metric Endpoint: 希望使用 Prometheus 监视的系统应该公开某个/度量端点的度量, Prometheus 利用这个端点以固定的间隔提取指标。

  3. PromQL: Prometheus 附带了 PromQL,这是一种非常灵活的查询语言,可用于查询 Prometheus 仪表板中的指标。此外,Prometheus UI 和 Grafana 将使用 PromQL 查询来可视化指标。

  4. Prometheus Exporters: 有许多库和服务器可以帮助将第三方系统中的现有指标导出为 Prometheus 指标。这对于无法直接使用 Prometheus 指标检测给定系统的情况。

  5. TSDB (time-series database): Prometheus 使用 TSDB 高效地存储所有数据。默认情况下,所有数据都存储在本地。然而,为了避免单点故障,prometheustsdb 可以选择集成远程存储。

Prometheus 在 Kubernetes 中的监控方案结构如下:

531472ba09582f3bbdedc06c0631bfa3.png

【图源:https://devopscube.com/setup-prometheus-monitoring-on-kubernetes/】

指标

要监控的对象种类很多,我们把相同类型的对象称为一个实体,而每个实体运行时的对象产生的数据有各种各样的,为了归纳收集这些数据, Prometheus 将实体中的各种属性值分为 Counter (计数器)、Gauge (仪表盘)、Histogram(累积直方图)、Summary(摘要)四种类型,实体中的每个属性,称为指标,例如 容器已累计使用 CPU 量,使用指标名称 container_cpu_usage_seconds_total 记录。

每个指标一般格式为:

指标名称{元数据=值} 指标值

每个对象都在无时无刻产生数据,为了区分当前指标值属于哪个对象,可以给指标除了指标值外,附加大量的元数据信息,示例如下表示。

container_cpu_usage_seconds_total{beta_kubernetes_io_arch = "amd64",beta_kubernetes_io_os = "linux", container = "POD", cpu = "total", id = "...", image = "k8s.gcr.io/pause:3.5", instance = "slave1", job = "kubernetes-cadvisor", kubernetes_io_arch = "amd64", kubernetes_io_hostname = "slave1",kubernetes_io_os = "linux", name = "k8s_POD_pvcpod_default_02ed547b-6279-4346-8918-551b87877e91_0", namespace = "default", pod = "pvcpod"
}

对象生成类似这种结构的文本后,可以暴露 metrics 端点,让 Prometheus 自动采集,或通过 Pushgateway 推送到 Prometheus 中。

接下来,我们将在 Kubernetes 中搭建一个完整的 Prometheus 监控体系。

实践

节点监控

本章参考资料:https://devopscube.com/node-exporter-kubernetes/

node exporter 是用 Golang 编写的,用于在 Linux 系统上,收集内核公开的所有硬件和操作系统级别的指标,包括 CPU 、信息、网卡流量、系统负载、socket 、机器配置等。

读者可参考中列举出的 https://github.com/prometheus/node_exporter 中列举出的所有默认开启或默认关闭的指标。

既然要监控集群中的每个节点,那么就要做到每个节点都运行这一个 node exporter 实例,并且在集群新增节点的时候自动调度一个 node exporter 到这个节点中运行,因此需要采用 node exporter 的部署需要 DaemontSet 模式。

查看集群中的所有节点:

root@master:~# kubectl get nodes
NAME     STATUS                     ROLES                  AGE     VERSION
master   Ready,SchedulingDisabled   control-plane,master   98d     v1.22.2
salve2   Ready                      <none>                 3h50m   v1.23.3
slave1   Ready                      <none>                 98d     v1.22.2

Bibin Wilson 大佬已经封装好了用于 Kubernetes 的 node exporter 的 YAML 文件,我们直接下载即可:

git clone https://github.com/bibinwilson/kubernetes-node-exporter

打开仓库中的 daemonset.yaml 文件,大概了解其中的信息。

在 YAML 文件中,可以看到 node exporter 会被部署到命名空间 monitoring 中运行,它有两个 label:

labels:app.kubernetes.io/component: exporterapp.kubernetes.io/name: node-exporter

为了 node exporter 能够被调度到 master 节点中运行,我们需要为 Pod 添加容忍度属性:

template:metadata:labels:app.kubernetes.io/component: exporterapp.kubernetes.io/name: node-exporterspec:# 复制下面这部分到对应的位置tolerations:- key: "node-role.kubernetes.io/master"operator: "Exists"effect: "NoSchedule"- key: "node.kubernetes.io/unschedulable"operator: "Exists"effect: "NoSchedule"

为了部署 node exporter ,我们先创建命名空间:

kubectl create namespace monitoring

执行命令部署 node exporter:

kubectl create -f daemonset.yaml

查看 node exporter 实例

root@master:~# kubectl get daemonset -n monitoring
NAME            DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
node-exporter   3         3         3       3            3           <none>          22h

由于 node exporter Pod 分散在各个节点,为了便于 Prometheus 收集这些 node exporter 的 Pod IP,需要创建 Endpoint 统一收集,这里通过创建 Service 自动生成 Endpoint 来达到目的。

查看仓库下的 service.yaml 文件,其定义如下:

kind: Service
apiVersion: v1
metadata:name: node-exporternamespace: monitoringannotations:prometheus.io/scrape: 'true'prometheus.io/port:   '9100'
spec:selector:app.kubernetes.io/component: exporterapp.kubernetes.io/name: node-exporterports:- name: node-exporterprotocol: TCPport: 9100targetPort: 9100

此 Service 的选择器如下:

selector:app.kubernetes.io/component: exporterapp.kubernetes.io/name: node-exporter

创建 Service:

kubectl create -f service.yaml

查看 Endpoint 收集的 node exporter 的 Pod IP:

root@master:~# kubectl get endpoints -n monitoring 
NAME                    ENDPOINTS                                       AGE
node-exporter           10.32.0.27:9100,10.36.0.4:9100,10.44.0.3:9100   22h

node exporter 除了收集各种指标数据外,不会再干什么。

部署 Prometheus

本节参考https://devopscube.com/setup-prometheus-monitoring-on-kubernetes/

现在有了 node exporter ,可以收集节点各类指标,接下来便是对 Kubernetes 基础设施的 metrics 数据收集。

Kubernetes 自身提供的很多 metrics 数据,有三大端点 /metrics/cadvisor/metrics/resource and /metrics/probes 。

以 /metrics/cadvisor 为例,cAdvisor 分析在给定节点上运行的所有容器的内存、CPU、文件和网络使用情况的指标,你可以参考 https://github.com/google/cadvisor/blob/master/docs/storage/prometheus.md 了解 cAdvisor 的所有指标。

其它资料:

源码位置:https://github.com/kubernetes/metrics/blob/master/pkg/apis/metrics/v1beta1/types.go

Kubernetes 监控架构设计:https://github.com/kubernetes/design-proposals-archive

在本节中,部署的 Prometheus 将会对 kubenetes 进行以下动作以便收集 metrics 数据:

  1. Kubernetes-apiservers: 从 API 服务器获得所有的指标;

  2. Kubernetes 节点: 它收集所有的 kubernetes 节点指标;

  3. kubernetes-pods: pod 元数据上加上 prometheus.io/scrape 和 prometheus.io/port 注释,所有的 pod 指标都会被发现;

  4. kubernetes-cadvisor: 收集所有 cAdvisor 指标,与容器相关;

  5. Kubernetes-Service-endpoints: 如果服务元数据使用 prometheus.io/scrape 注释和 prometheus.io/port 注释,那么所有的服务端点都将被废弃;

Bibin Wilson 大佬已经封装好了相关的部署定义文件,我们直接下载即可:

git clone https://github.com/bibinwilson/kubernetes-prometheus

Prometheus 通过使用 Kubernetes API Server ,获取 各节点、Pod、Deployment 等所有可用的指标。因此,我们需要创建具有对所需 API 组的只有读访问权限的 RBAC 策略,并将策略绑定到监视名称空间,以限制 Prometheus Pod 只能对 API 进行读操作。

查看 clusterRole.yaml 文件,可以其要监控的资源对象列表:

- apiGroups: [""]resources:- nodes- nodes/proxy- services- endpoints- podsverbs: ["get", "list", "watch"]
- apiGroups:- extensionsresources:- ingresses

在集群中创建角色和角色绑定:

kubectl create -f clusterRole.yaml

可以通过 通过命令行标志和配置文件 对 Prometheus 进行配置。虽然命令行标志配置了不可变的系统参数(例如存储位置、要保存在磁盘和内存中的数据量等),但配置文件定义了与抓取作业及其实例相关的所有内容,以及加载哪些规则文件,因此部署 Permetheus 少不了做文件配置。

Permetheus 的配置文件以 YAML 格式编写,具体规则可以参考:https://prometheus.io/docs/prometheus/latest/configuration/configuration/

为了便于将配置文件映射到 Permetheus Pod 中,我们需要将配置放到 configmap ,然后挂载到 Pod,配置内容可以查看 config-map.yaml 。config-map.yaml 中定义了很多采集数据源的规则,例如收集 Kubernetes 集群和 node exporter ,配置可参考:

scrape_configs:- job_name: 'node-exporter'kubernetes_sd_configs:- role: endpointsrelabel_configs:- source_labels: [__meta_kubernetes_endpoints_name]regex: 'node-exporter'action: keep

你可以打开 https://raw.githubusercontent.com/bibinwilson/kubernetes-prometheus/master/config-map.yaml 在线预览这个文件。

创建 configmap:

kubectl create -f config-map.yaml

这个配置很重要,需要根据实际情况配置,一般由运维处理,这里就不再讨论。

接下来将要部署 Prometeus ,由于示例文件中使用 emtpy 卷存储 Prometheus 数据,因此一旦 Pod 重启等,数据将会丢失,因此这里可以改成 hostpath 卷。

打开 prometheus-deployment.yaml 文件:

emptyDir: {}

改成

hostPath:path: /data/prometheustype: Directory

可改可不改。

如果改的话,需要在被调度此 Pod 对应的节点上创建 /data/prometheus 目录。

部署 Prometeus :

kubectl create  -f prometheus-deployment.yaml

查看部署状态:

root@master:~# kubectl get deployments --namespace=monitoring
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
prometheus-deployment   1/1     1            1           23h

为了在外界访问 Prometeus ,需要创建 Service:

apiVersion: v1
kind: Service
metadata:name: prometheus-servicenamespace: monitoringannotations:prometheus.io/scrape: 'true'prometheus.io/port:   '9090'spec:selector: app: prometheus-servertype: NodePort  ports:- port: 8080targetPort: 9090 nodePort: 30000
kubectl create -f prometheus-service.yaml

接下来可以访问 Prometeus UI 面板。

点击 Graph,点击🌏图标,选择需要显示的指标值,再点击 Execute 查询显示。

6fec87a057165ca000ef66285b933a87.png

259e3b79bdc8db374157b88ee3741a2a.png

你还可以在 Service Discobery 中,查看 Prometheus 采集的 metrics 数据源。

fc6c78caa11c88f03c0af2d74b22eaf3.png

0ea688371338a8ae2956597160a37a96.png

如果你的集群没有安装过 kube-state-metrics,那么这个数据源会显示红色标记,在下一节中,我们继续部署这个组件。

至此,我们的监控结构如下所示:

1bd68e85caad50676bbe425d05385d2e.png

部署 Kube State Metrics

本节参考资料:https://devopscube.com/setup-kube-state-metrics/

Kube State metrics 是一个服务,它与 Kubernetes API Server 通信,以获取所有 API 对象的详细信息,如 Deployment、Pod 等。

Kube State metrics 提供了无法直接从本地 Kubernetes 监视组件获得的 Kubernetes 对象和资源 度量,因为 Kubenetes Metrics 本身提供的指标并不是很全面,因此需要 Kube State Metrics 以获得与 kubernetes 对象相关的所有度量。

以下是可以从 Kube State metrics 中获得的一些重要度量:

  1. Node status, node capacity (CPU and memory)

  2. Replica-set compliance (desired/available/unavailable/updated status of replicas per deployment)

  3. Pod status (waiting, running, ready, etc)

  4. Ingress metrics

  5. PV, PVC metrics

  6. Daemonset & Statefulset metrics.

  7. Resource requests and limits.

  8. Job & Cronjob metrics

可以在这里的文档中查看受支持的详细指标:https://github.com/kubernetes/kube-state-metrics/tree/master/docs

cfddc8f0147c9d43f15a0f18ba4ba47d.png

Bibin Wilson 大佬已经封装好了相关的部署定义文件,我们直接下载即可:

git clone https://github.com/devopscube/kube-state-metrics-configs.git

直接应用所有 YAML 创建对应的资源:

kubectl apply -f kube-state-metrics-configs/
├── cluster-role-binding.yaml
├── cluster-role.yaml
├── deployment.yaml
├── service-account.yaml
└── service.yaml

上面创建的资源,包含以下部分,这一小节,就不展开讲解。

  1. Service Account

  2. Cluster Role

  3. Cluster Role Binding

  4. Kube State Metrics Deployment

  5. Service

使用以下命令检查部署状态:

kubectl get deployments kube-state-metrics -n kube-system

随后,刷新 Prometheus Service Discobery ,可以看到红色变成了蓝色,点击此数据源,可以看到以下信息:

49a585392a715019b736fd59e0e70727.png

- job_name: 'kube-state-metrics'static_configs:- targets: ['kube-state-metrics.kube-system.svc.cluster.local:8080']

此配置为 kube-state-metrics 的访问地址。

在此,我们部署的 Prometeus 结构如下:

e6ec49e149923df7f9e5d0a98b887919.png

部署 Grafana

本节参考资料:https://devopscube.com/setup-grafana-kubernetes/

经过前面几个小节的部署,已经搞好数据源的采集以及数据存储,接下来我们将部署 Grafana,利用 Grafana 对指标数据进行分析以及可视化。

Bibin Wilson 大佬已经封装好了相关的部署定义文件,我们直接下载即可:

git clone https://github.com/bibinwilson/kubernetes-grafana.git

首先查看 grafana-datasource-config.yaml 文件,此配置是为了 Grafana 自动配置好 Prometheus 数据源。

c9136ed2fa787cb56d41ce9b0e3c4b59.png

里面还有一个很重要的地址:

"url": "http://prometheus-service.monitoring.svc:8080",

首先你要使用命令测试 curl http://prometheus-service.monitoring.svc:8080,看看能不能获取到响应数据,如果出现:

root@master:~/jk/kubernetes-prometheus# curl http://prometheus-deployment.monitoring.svc:8080
curl: (6) Could not resolve host: prometheus-deployment.monitoring.svc
root@master:~/jk/kubernetes-prometheus# curl http://prometheus-deployment.monitoring.svc.cluster.local:8080
curl: (6) Could not resolve host: prometheus-deployment.monitoring.svc.cluster.local

可能是你 coredns 没有安装或者别的原因,导致无法通过此地址访问 Prometheus ,为了为了避免过多操作,可以改为使用 IP,而不是域名。

查看 Prometheus 的 Service IP:

root@master:~/jk/kubernetes-prometheus# kubectl get svc -n monitoring
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
prometheus-deployment   NodePort    10.105.95.8     <none>        9090:32330/TCP   23h

测试通过 Service IP 访问是否正常

root@master:~/jk/kubernetes-prometheus# curl 10.105.95.8:9090
<a href="/graph">Found</a>.

将 grafana-datasource-config.yaml 中的 prometheus-deployment.monitoring.svc.cluster.local:8080 改成对应的 Service IP,并且端口改成 9090。

创建配置

kubectl create -f grafana-datasource-config.yaml

打开 deployment.yaml 查看定义,模板中 grafana 的数据存储也是使用 empty 卷,有数据丢失风险,因此可以改成用 hospath 或其他类型的卷存储。可参考笔者的配置:

volumes:- name: grafana-storagehostPath:path: /data/grafanatype: Directory

部署 Grafana:

kubectl create -f deployment.yaml

然后创建 Service:

kubectl create -f service.yaml

接着可以通过 32000 端口访问 Grafana。

账号密码都是 admin

至此,我们部署的 Prometheus 监控结构如下:

2b6da4b797b17331e8bb36a0614c371f.png

刚刚进去的时候空空如也,我们需要利用图表模板制作可视化界面,才能显示出漂亮的数据。

在 Grafana 官方网站中,有很多社区制作的免费的模板 https://grafana.com/grafana/dashboards/?search=kubernetes

首先打开 https://grafana.com/grafana/dashboards/8588 下载这个模板,然后上传模板文件,并绑定对应的 Prometheus 数据源。

dfea9d28b0c5ff6377b9c3d6deea5585.png

c5abfd7fcee49c3441896e9fbfdc2ee9.png

74a704618715976402aa12c2d3f85566.png

接下来就可以看到对应的监控界面了。

57195ba943f7345a79e954d9d8bfafb1.png

你可以打开 Browse ,继续导入更多的模板,然后查看要显示的模板监控界面。

5bceca805ebebb45889f67d4c759697b.png

应用如何接入 Prometheus 和 Grafana

前面已经提及对基础设施的监控,我们还可以对中间件如 TIDB、Mysql 等生成、收集指标数据,还可以在程序中自定义指标数据,然后自行制作 Grafana 模板。如果你是 .NET 开发,还可以参考笔者的另一篇文章来一步步了解这些过程:https://www.cnblogs.com/whuanle/p/14969982.html

告警

在监控体系中,告警是重中之重,一般需要根据公司的实际情况自研告警处理和推送通知组件

我们建议您阅读 基于 Rob Ewaschuk 在 Google 的观察的我的警报哲学https://docs.google.com/a/boxever.com/document/d/199PqyG3UsyXlwieHaqbGiWVa8eMWi8zzAn0YfcApr8Q/edit

在前面部署 Prometheus 时,config-map.yaml 便已经定义了一个告警规则。

prometheus.rules: |-groups:- name: devopscube demo alertrules:- alert: High Pod Memoryexpr: sum(container_memory_usage_bytes) > 1for: 1mlabels:severity: slackannotations:summary: High Memory Usage

一条告警规则主要由以下几部分组成:

  • alert:告警规则的名称。

  • expr:基于 PromQL 表达式告警触发条件,用于计算是否有时间序列满足该条件。

  • for:评估等待时间,可选参数。用于表示只有当触发条件持续一段时间后才发送告警。在等待期间新产生告警的状态为 pending。

  • labels:自定义标签,允许用户指定要附加到告警上的一组附加标签。

  • annotations:用于指定一组附加信息,比如用于描述告警详细信息的文字等,annotations 的内容在告警产生时会一同作为参数发送到 Alertmanager。

可参考:https://yunlzheng.gitbook.io/prometheus-book/parti-prometheus-ji-chu/alert/prometheus-alert-rule

8c78e202fde04dba0baa737e24374c23.png

在 Grafana 中也可以看到这条规则。

6399e30b82fa2fde76bc784c01d2e3e6.png

下面我们将来配置告警通知。

首先创建一个告警联系方式,笔者使用了钉钉 Webhook。

6064543d02ba08ac40a058d465898170.png

c156901929bbcba1654f9017bfc21575.png

然后找 Alert Rules,添加一个新的告警规则。

b2093606080ade252eadd51077dc7ca1.png

告警规则请参考:https://grafana.com/docs/grafana/latest/alerting/unified-alerting/alerting-rules/create-grafana-managed-rule/

接着打开 Notification policies,为告警规则和联系方式做绑定,符合条件的告警信息将会被推送到指定的联系方式中。

2018a94dba6d71323b9cf2f54beb6ff1.png

cac0c3850dea045a0d06500527a203c5.png

在 Alert Rules 中可以看到告警信息的推送记录。由于笔者的服务器在国外,可能导致服务器无法使用钉钉的 Webhook 功能,因此这里一直在 Pending,因此笔者这里就不再做过多的尝试了,读者了解大概步骤即可。

0460b085daaefd6b99d192863fb3b9af.png

8a97e9e4299cf875a5680482d8b48e73.png

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

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

相关文章

全局照明算法基础——从辐射亮度到渲染方程

全局照明&#xff08;Global Illumination&#xff09;问题上已经有很多著名的算法&#xff0c;如路径追踪&#xff08;Path Tracing&#xff09;&#xff0c;辐照度&#xff08;Radiosity&#xff09;等。绝大部分书籍/教材都直接介绍了做法&#xff0c;在理论方面有所欠缺&am…

mysql 开发规范_专业级的MySQL开发设计规范及SQL编写规范

在团队开发过程中为了项目的稳定&#xff0c;代码的高效&#xff0c;管理的便捷制定内部种开发设计规范是必不可少的&#xff0c;这里分享一份我们定义MySQL开发设计规范包括表设计规范&#xff0c;字段设计规范&#xff0c;SQL编写规范数据库对象命名规范数据库对象命名规范的…

C++之explicit关键字使用总结

1、explicit关键字介绍 C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式). 2、贴代码 #include <iostream> #include <stdi…

系统下载地址

系统下载地址 http://pan.baidu.com/s/1o6hVbPC 其中有xp win7和win8 32位 win7和win8 64位转载于:https://blog.51cto.com/freedom886/1403433

聊一聊DTM子事务屏障功能之SQL Server版

背景 前面写了两篇&#xff08;聊一聊如何用C#轻松完成一个SAGA分布式事务和聊一聊如何用C#轻松完成一个TCC分布式事务&#xff09;如何用 C# 基于 DTM 轻松实现 SAGA 和 TCC 的分布式事务&#xff0c;其中有一个子事务屏障的功能&#xff0c;很好的处理了空补偿、悬挂、重复请…

更为详细的Txtsetup.sif文件解释

更为详细的Txtsetup.sif文件解释;代码页定义, 以免文本安装模式下无法正常显示简体中文 (以下基本都是跟简体中文相关的, 不同语言版本的 Windows, 此处定义也不同)[nls]AnsiCodepage c_936.nls,936OemCodepage c_936.nls,936MacCodepage c_10008.nls,10008UnicodeCasetable…

C++类与const关键字

1、const成员变量 const 成员变量的用法和普通 const 变量的用法相似,只需要在声明时加上 const 关键字 const 成员函数可以使用类中的所有成员变量,但是不能修改它们的值,这种措施主要还是为了保护数据而设置的 2、const 成员函数也称为常成员函数。 常成员函数需要在声明…

Dos中转义符

遇到个问题&#xff1a; java test R<file> 11 22 按理说应该打印 R<file>1122但是&#xff0c;系统报错&#xff0c;写的是系统找不到指定文件。 是"<>"引起的&#xff0c;加上Dos转义符中"^"即可。 java test R^<file^> 11 22 测…

ORA-00257+mysql_ORA-00257错误的解决办法

author&#xff1a; headsen chendate&#xff1a; 2018-04-17 11:12:39notice&#xff1a;个人原创&#xff0c;转载请注明作者和出处&#xff0c;否则依法追击法律责任。1&#xff0c;oracle数据库正常使用中&#xff0c;突然报ora-00257的错误&#xff0c;原因是归档日志满…

可穿戴设备对企业的积极意义

在耐克裁掉该公司的FuelBand运动手环硬件部门后&#xff0c;众多媒体和肇事者即开始唱衰可穿戴设备。在这些唱衰可穿戴的人总&#xff0c;有一些人从来没有用过可穿戴设备&#xff0c;有的甚至都没有见过可穿戴设备&#xff0c;他们只是根据自己的臆想&#xff0c;过往的经验&a…

学习路线

为什么80%的码农都做不了架构师&#xff1f;>>> 一、构想 1.专门制定某领域学习路线。 2.为人们进入某领域而学习提供依据。 转载于:https://my.oschina.net/kun123/blog/838360

C++之inline函数使用总结

一、C++为什么引入inline函数? 主要目的:用它代替C语言中表达式形式的宏定义来解决程序中函数调用的效率问题。 C语言中的宏定义,它使用预处理器实现,没有了参数压栈、代码生成等一系列得到操作,因此效率很高。 但缺点如下: 预处理器符号表中的简单替换,不能进行参数…

数字图像处理技术在TWaver可视化中的应用

数字图像处理&#xff08;Digital Image Processing&#xff09;又称为计算机图像处理&#xff0c;它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。常用的图像处理方法有图像增强、复原、编码、压缩等&#xff0c;数字图像处理应用领域非常广泛。具体关于数字…

WPF 实现调用本机摄像头~

WPF开发者QQ群&#xff1a;340500857由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ 邀请入群需备注WPF开发者 PS&#xff1a;有更好的方式欢迎推荐。接着很久前的上一篇此项目使用了OpenCVSharp加载本地摄像头&#xff0c;多个摄像头支持切换展示&…

python process 函数_Python Process创建进程的2种方法详解

前面介绍了使用 os.fork() 函数实现多进程编程&#xff0c;该方法最明显的缺陷就是不适用于 Windows 系统。本节将介绍一种支持 Python 在 Windows 平台上创建新进程的方法。Python multiprocessing 模块提供了 Process 类&#xff0c;该类可用来在 Windows 平台上创建新进程。…

全球增长最快域名解析商Top10:中国占据四席

IDC评述网&#xff08;idcps.com&#xff09;04月29日报道&#xff1a;根据国外域名统计机构DailyChanges最新实时数据显示&#xff0c;4月27日&#xff0c;在全球增长最快的十家域名解析服务商榜单中&#xff0c;中国占据四个席位。上榜的中国域名解析商分别是&#xff1a;51D…

webpake-node-sass 报错

问题描述&#xff1a; npm run dev 就报错&#xff0c;在安装node-sass错误 解决方法 &#xff1a; 找到node_modules下的node-sass文件&#xff0c;进入&#xff0c;如果没有vendor文件夹&#xff0c;就创建一个空文件夹&#xff0c;命名为vendor。 1:下载 对于版本的 binding…

C++之‘nullptr’ was not declared in this scope

在vim里面写了一个简单cpp文件,为了避免野指针,需要指针初始化 char *p2 = nullptr 1、编译时报错如下 2、解决办法 编译加上 g++ -std=gnu++0x int.cpp -o int 3、C里面的null和C++里面的nullptr、NULL介绍 NULL在C++中的定义 /* Define NULL pointer value */ #ifndef …

IOS原生地图与高德地图

原生地图 1、什么是LBS LBS: 基于位置的服务 Location Based Service 实际应用:大众点评&#xff0c;陌陌&#xff0c;微信&#xff0c;美团等需要用到地图或定位的App 2、定位方式 1.GPS定位 2.基站定位 3.WIFI定位 3、框架 MapKit:地图框架&#xff0c;显示地图 …

想说爱你不容易 | 使用最小 WEB API 实现文件上传

前言在 .NET 6 之前&#xff0c;实现文件上传功能十分简单&#xff1a;[HttpPost("upload")] public async Task<IActionResult> Upload(IFormFile file) {//对file执行操作return Ok(file.FileName); }但是&#xff0c;当使用 .NET 6 的最小 WEB API 来实现相…