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…

系统下载地址

系统下载地址 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;很好的处理了空补偿、悬挂、重复请…

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;原因是归档日志满…

学习路线

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

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

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

WPF 实现调用本机摄像头~

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

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

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

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 …

想说爱你不容易 | 使用最小 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 来实现相…

Android下载文件

2019独角兽企业重金招聘Python工程师标准>>> package com.test;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.net.URL;import java.net.URLConnection;import android.app.Activity;import android.content.Intent…

C++之operator关键字(重载操作符) 使用总结

operator是C++的关键字,它和运算符一起使用,表示一个运算符函数, 一、为什么使用操作符重载 简单的说我们基本数据比如int float 都可以比较大小 有>、<、=,但是对象需要比较大小怎么办,我们也可以用>、<、=,只不过我们需要一个通用的规范比较对象的属性…

#HTTP协议学习# (七)cookie

本文转自&#xff1a;http://www.cnblogs.com/TankXiao/archive/2012/12/12/2794160.html Cookie是HTTP协议中非常重要的东西&#xff0c; 之前拜读了Fish Li 写的【细说Cookie】&#xff0c; 让我学到了很多东西。Fish的这篇文章写得太经典了。 所以我这篇文章就没有太多内容了…

C#中的类型~存储~变量

欢迎您成为我的读者&#xff0c;希望这篇文章能给你一些帮助。前言今天在群里看到朋友讨论把粉丝称为读者&#xff0c;这让我内心特别激动。以前我还是比较关注自己的文章阅读量&#xff0c;有没有人转发&#xff0c;今天新增多少个关注。而现在&#xff0c;我的关注点变了&…

C++之typename

1、typename和class 在模板前,typename和class没有区别 template<typename T> class A; template<class T> class A;typename和class对编译器而言却是不同的东西 2、声明一个类型 看下面的代码 我们编译下结果如下 编译器不知道T::const_iterator是个类型。如果…

mooc数据结构与算法python版期末考试_数据结构与算法Python版-中国大学mooc-试题题目及答案...

数据结构与算法Python版-中国大学mooc-试题题目及答案更多相关问题婴儿出生一两天后就有笑的反应&#xff0c;这种笑的反应属于()。【判断题】填制原始凭证&#xff0c;汉字大写金额数字一律用正楷或草书书写&#xff0c;汉字大写金额数字到元位或角位为止的&#xff0c;后面必…

使用 NetCoreBeauty 优化 .NET CORE 独立部署目录结构

在将一个 .NET CORE \ .NET 5.0 \ .NET 6.0 程序进行独立部署发布时&#xff0c;会在发布目录产生很多系统类库&#xff0c;导致目录非常不简洁。这给寻找入口程序造成了困难&#xff0c;特别是路遥工具箱这种绿色软件&#xff0c;不会在开始菜单、系统桌面创建快捷方式&#x…

ios之最简单的程序

1、构建学生对象并且打印相关信息 代码&#xff1a;#import <UIKit/UIKit.h> #import "AppDelegate.h"interface Student : NSObject //变量 property NSString *name; property int age; property float score;//method -(void)show;endimplementation Studen…

网站前端_EasyUI.基础入门.0009.使用EasyUI Layout组件的最佳姿势?

1. 基础布局<div id"l" class"easyui-layout" data-options"width:500,height:250"><div data-options"region:north,title:north,height:50"></div><div data-options"region:west,title:west,width:100&q…

MySQL数据库如何管理与维护_mysql数据库的管理与维护

mysql数据库的管理与维护云服务器(Elastic Compute Service&#xff0c;简称ECS)是阿里云提供的性能卓越、稳定可靠、弹性扩展的IaaS(Infrastructure as a Service)级别云计算服务。云服务器ECS免去了您采购IT硬件的前期准备&#xff0c;让您像使用水、电、天然气等公共资源一样…