【Kubernetes 企业项目实战】03、基于 Alertmanager 发送报警到多个接收方(下)
目录
一、promethues 采集 tomcat 监控数据
1.1 制作 tomcat 镜像
1.2 基于上面的镜像创建一个 tomcat 实例
1.3 采集数据
二、promethues 采集 redis 监控数据
2.1 配置一个 Redis 的 exporter
2.2 查看 Prometheus
2.3 grafana 导入模板
三、Prometheus 监控 mysql
3.1 安装 mysql
3.2 安装 mysql_exporter
3.3 登陆 mysql 为 mysql_exporter 创建账号并授权
3.4 创建 mysql 配置文件,运行时可免密码连接数据库
3.5 启动 mysql_exporter 客户端
3.6 修改 prometheus-alertmanager-cfg.yaml 文件
3.7 访问 Prometheus
四、Prometheus 监控 Nginx
4.1 下载 nginx-module-vts 编译模块
4.2 安装 nginx
4.3 安装 nginx-vts-exporter
4.4 修改 prometheus-alertmanager-cfg.yaml 文件
4.5 grafana 界面导入 nginx 监控模板
五、prometheus 监控 mongodb
5.1 下载 mongodb 和 mongodb_exporter 镜像
5.2 启动 mongodb
5.3 启动 mongo_exporter
5.4 修改 prometheus-alertmanager-cfg.yaml 文件
六、Pushgateway
6.1 Pushgateway 简介
6.2 Pushgateway 优点
6.3 Pushgateway 缺点
6.4 安装 Pushgateway
6.5 修改 prometheus-alertmanager-cfg.yaml 文件
6.6 测试推送数据到 pushgateway
6.7 把数据上报到 pushgateway
本篇文章所用到的资料文件下载地址:Prometheus常规服务-kubernetes文档类资源-CSDN下载
一、promethues 采集 tomcat 监控数据
tomcat_exporter 项目地址:GitHub - nlighten/tomcat_exporter: A Prometheus exporter for Apache Tomcat
把上面这几个文件上传到控制节点 master
[root@k8s-master1 tomcat]# pwd
/root/prometheus/tomcat
[root@k8s-master1 tomcat]# ls
metrics.war simpleclient_common-0.8.0.jar simpleclient_servlet-0.8.0.jar tomcat_exporter_servlet-0.0.12.war
simpleclient-0.8.0.jar simpleclient_hotspot-0.8.0.jar tomcat_exporter_client-0.0.12.jar
1.1 制作 tomcat 镜像
[root@k8s-master1 tomcat]# vim Dockerfile
FROM tomcat:8.5-jdk8-corretto
ADD metrics.war /usr/local/tomcat/webapps/
ADD simpleclient-0.8.0.jar /usr/local/tomcat/lib/
ADD simpleclient_common-0.8.0.jar /usr/local/tomcat/lib/
ADD simpleclient_hotspot-0.8.0.jar /usr/local/tomcat/lib/
ADD simpleclient_servlet-0.8.0.jar /usr/local/tomcat/lib/
ADD tomcat_exporter_client-0.0.12.jar /usr/local/tomcat/lib/# 构建镜像
[root@k8s-master1 tomcat]# docker build -t='k8s/tomcat_prometheus:v1' .# 打包镜像
[root@k8s-master1 tomcat]# docker save -o tomcat_exporter.tar.gz k8s/tomcat_prometheus:v1 # 传输到 node1、node2 节点
[root@k8s-master1 tomcat]# scp tomcat_exporter.tar.gz root@192.168.78.144:/root
[root@k8s-master1 tomcat]# scp tomcat_exporter.tar.gz root@192.168.78.145:/root# 在工作节点解压
[root@k8s-node1 ~]# docker load -i tomcat_exporter.tar.gz
[root@k8s-node2 ~]# docker load -i tomcat_exporter.tar.gz
1.2 基于上面的镜像创建一个 tomcat 实例
[root@k8s-master1 tomcat]# vim deploy-tomcat.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: tomcat-deploymentnamespace: default
spec:selector: matchLabels: app: tomcatreplicas: 2 template: metadata:labels:app: tomcatannotations:prometheus.io/scrape: 'true'spec:containers:- name: tomcatimage: k8s/tomcat_prometheus:v1imagePullPolicy: IfNotPresentports:- containerPort: 8080securityContext: privileged: true[root@k8s-master1 tomcat]# kubectl apply -f deploy-tomcat.yaml
[root@k8s-master1 tomcat]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
tomcat-deployment-b8cdddf47-828fg 1/1 Running 0 12s 10.244.169.147 k8s-node2 <none> <none>
tomcat-deployment-b8cdddf47-g5485 1/1 Running 0 12s 10.244.36.86 k8s-node1 <none> <none>
1.3 采集数据
[root@k8s-master1 tomcat]# kubectl get pods -n monitor-sa
NAME READY STATUS RESTARTS AGE
node-exporter-98zvk 1/1 Running 6 (22h ago) 2d23h
node-exporter-9qb2g 1/1 Running 6 (22h ago) 2d23h
node-exporter-t7q4g 1/1 Running 6 (22h ago) 2d23h
prometheus-server-bf4569646-plh6p 2/2 Running 2 (22h ago) 24h# 动态修改 Prometheus
[root@k8s-master1 tomcat]# kubectl edit pods -n monitor-sa prometheus-server-bf4569646-plh6p
······
apiVersion: v1
kind: Pod
metadata:annotations:cni.projectcalico.org/podIP: 10.244.36.82/32cni.projectcalico.org/podIPs: 10.244.36.82/32prometheus.io/scrape: "true" # 把 false 改为 true,表示允许被 Prometheus 抓取数据
······
在 promethues 上可以看到监控到的 tomcat 的两个 pod:
二、promethues 采集 redis 监控数据
2.1 配置一个 Redis 的 exporter
我们通过 redis 进行暴露监控:
[root@k8s-master1 redis]# pwd
/root/prometheus/redis
[root@k8s-master1 redis]# vim redis.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: redisnamespace: kube-system
spec:replicas: 1selector:matchLabels:app: redistemplate:metadata:labels:app: redisspec:containers:- name: redisimage: redis:4imagePullPolicy: IfNotPresentresources:requests:cpu: 100mmemory: 100Miports:- containerPort: 6379- name: redis-exporterimage: oliver006/redis_exporter:latestimagePullPolicy: IfNotPresentresources:requests:cpu: 100mmemory: 100Miports:- containerPort: 9121
---
kind: Service
apiVersion: v1
metadata: name: redis namespace: kube-systemannotations:prometheus.io/scrape: "true"prometheus.io/port: "9121"
spec:selector:app: redisports:- name: redisport: 6379targetPort: 6379- name: promport: 9121targetPort: 9121[root@k8s-master1 redis]# kubectl apply -f redis.yaml [root@k8s-master1 redis]# kubectl get pods -n kube-system | grep redis
redis-bd78c4cb5-6gbqb 2/2 Running 0 70s
redis 这个 Pod 中包含了两个容器,一个就是 redis 本身的主应用,另外一个容器就是redis_exporter;由于 Redis 服务的 metrics 接口在 redis-exporter 9121 上,所以我们添加了prometheus.io/port=9121 这样的 annotation 在 prometheus 就会自动发现 redis 了。
2.2 查看 Prometheus
已经监控到 redis:
2.3 grafana 导入模板
在 grafana 导入 redis 的 json 文件:Redis Cluster-1571393212519.json,监控界面如下:
三、Prometheus 监控 mysql
3.1 安装 mysql
方式一:
[root@k8s-master1 mysql]# pwd
/root/prometheus/mysql
[root@k8s-master1 mysql]# yum install -y mysql mariadb
[root@k8s-master1 mysql]# systemctl start mariadb
我 yum 安装 mysql 不成功,启动不起来,故使用方式二!
方式二:
可以查看我的这篇文章:CentOS 7 安装&卸载 MySQL 8 详细图文教程_Stars.Sky的博客-CSDN博客_centos7卸载mysql8
3.2 安装 mysql_exporter
# 上传 mysqld_exporter-0.10.0.linux-amd64.tar.gz 文件
[root@k8s-master1 mysql]# ls
mysqld_exporter-0.10.0.linux-amd64.tar.gz[root@k8s-master1 mysql]# tar -zxvf mysqld_exporter-0.10.0.linux-amd64.tar.gz [root@k8s-master1 mysql]# cd mysqld_exporter-0.10.0.linux-amd64/[root@k8s-master1 mysqld_exporter-0.10.0.linux-amd64]# cp -ar mysqld_exporter /usr/local/bin/[root@k8s-master1 mysqld_exporter-0.10.0.linux-amd64]# chmod +x /usr/local/bin/mysqld_exporter
3.3 登陆 mysql 为 mysql_exporter 创建账号并授权
[root@k8s-master1 mysql]# mysql -uroot -p
# 创建数据库用户
mysql> CREATE USER 'mysql_exporter'@'localhost' IDENTIFIED BY 'Abcdef123!.';
Query OK, 0 rows affected (0.01 sec)# 对 mysql_exporter 用户授权
mysql> GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'mysql_exporter'@'localhost';
Query OK, 0 rows affected (0.01 sec)# exit 退出mysql
mysql> exit
Bye
3.4 创建 mysql 配置文件,运行时可免密码连接数据库
[root@k8s-master1 mysqld_exporter-0.10.0.linux-amd64]# pwd
/root/prometheus/mysql/mysqld_exporter-0.10.0.linux-amd64
[root@k8s-master1 mysqld_exporter-0.10.0.linux-amd64]# vim my.cnf
[client]
user=mysql_exporter
password=Abcdef123!.
3.5 启动 mysql_exporter 客户端
[root@k8s-master1 mysqld_exporter-0.10.0.linux-amd64]# nohup ./mysqld_exporter --config.my-cnf=./my.cnf &# mysqld_exporter 的监听端口是 9104
[root@k8s-master1 mysqld_exporter-0.10.0.linux-amd64]# tail nohup.out
time="2023-01-16T11:09:07+08:00" level=info msg="Starting mysqld_exporter (version=0.10.0, branch=master, revision=80680068f15474f87847c8ee8f18a2939a26196a)" source="mysqld_exporter.go:460"
time="2023-01-16T11:09:07+08:00" level=info msg="Build context (go=go1.8.1, user=root@3b0154cd9e8e, date=20170425-11:24:12)" source="mysqld_exporter.go:461"
time="2023-01-16T11:09:07+08:00" level=error msg="Error pinging mysqld: this authentication plugin is not supported" source="mysqld_exporter.go:268"
time="2023-01-16T11:09:07+08:00" level=info msg="Listening on :9104" source="mysqld_exporter.go:479"
3.6 修改 prometheus-alertmanager-cfg.yaml 文件
[root@k8s-master1 prometheus]# pwd
/root/prometheus# 添加如下内容
[root@k8s-master1 prometheus]# vim prometheus-alertmanager-cfg.yaml
······- job_name: 'mysql'static_configs:- targets: ['192.168.78.143:9104'] # 安装 mysql 的 节点 iprules.yml: |groups:- name: example
······[root@k8s-master1 prometheus]# kubectl apply -f prometheus-alertmanager-cfg.yaml [root@k8s-master1 prometheus]# kubectl delete -f prometheus-alertmanager-deploy.yaml [root@k8s-master1 prometheus]# kubectl apply -f prometheus-alertmanager-deploy.yaml
3.7 访问 Prometheus
四、Prometheus 监控 Nginx
4.1 下载 nginx-module-vts 编译模块
# 把 nginx-module-vts-master.zip 上传到 master 节点
[root@k8s-master1 nginx]# pwd
/root/prometheus/nginx
[root@k8s-master1 nginx]# ls
nginx-module-vts-master.zip[root@k8s-master1 nginx]# unzip nginx-module-vts-master.zip
[root@k8s-master1 nginx]# mv nginx-module-vts-master /usr/local/
4.2 安装 nginx
# 上传 nginx-1.15.7.tar.gz 安装包
[root@k8s-master1 nginx]# tar -zxvf nginx-1.15.7.tar.gz [root@k8s-master1 nginx]# cd nginx-1.15.7/[root@k8s-master1 nginx-1.15.7]# ./configure --prefix=/usr/local/nginx --with-http_gzip_static_module --with-http_stub_status_module --with-http_ssl_module --with-pcre --with-file-aio --with-http_realip_module --add-module=/usr/local/nginx-module-vts-master[root@k8s-master1 nginx-1.15.7]# make && make install# 修改 nginx 配置文件
[root@k8s-master1 nginx-1.15.7]# vim /usr/local/nginx/conf/nginx.conf
worker_processes 1;events {worker_connections 1024;
}http {include mime.types;default_type application/octet-stream;vhost_traffic_status_zone;sendfile on;keepalive_timeout 65;server {listen 80;server_name localhost;location / {root html;index index.html index.htm;}location /status {vhost_traffic_status_display;vhost_traffic_status_display_format html;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}}# 测试 nginx 配置文件是否正确
[root@k8s-master1 nginx-1.15.7]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful# 启动 nginx
[root@k8s-master1 nginx-1.15.7]# /usr/local/nginx/sbin/nginx
访问 http://192.168.78.143/status 可以看到 nginx 监控数据:
4.3 安装 nginx-vts-exporter
GitHub 项目地址:GitHub - hnlq715/nginx-vts-exporter: Simple server that scrapes Nginx vts stats and exports them via HTTP for Prometheus consumption
# 上传 nginx-module-vts-master.zip 文件
[root@k8s-master1 nginx]# pwd
/root/prometheus/nginx
[root@k8s-master1 nginx]# ls
nginx-1.15.7 nginx-1.15.7.tar.gz nginx-module-vts-master.zip nginx-vts-exporter-0.5.zip[root@k8s-master1 nginx]# unzip nginx-vts-exporter-0.5.zip
[root@k8s-master1 nginx]# mv nginx-vts-exporter-0.5 /usr/local/
[root@k8s-master1 nginx]# chmod +x /usr/local/nginx-vts-exporter-0.5/bin/nginx-vts-exporter
[root@k8s-master1 nginx]# cd /usr/local/nginx-vts-exporter-0.5/bin/
[root@k8s-master1 bin]# nohup ./nginx-vts-exporter -nginx.scrape_uri http://192.168.78.143/status/format/json &
注意:http://192.168.78.143/status/format/json 这个地方的 ip 地址是 nginx 的 IP 地址;nginx-vts-exporter 的监听端口是 9913。
4.4 修改 prometheus-alertmanager-cfg.yaml 文件
# 添加如下 job
[root@k8s-master1 prometheus]# vim prometheus-alertmanager-cfg.yaml
······- job_name: 'nginx'scrape_interval: 5sstatic_configs:- targets: ['192.168.78.143:9913']
······[root@k8s-master1 prometheus]# kubectl apply -f prometheus-alertmanager-cfg.yaml [root@k8s-master1 prometheus]# kubectl delete -f prometheus-alertmanager-deploy.yaml [root@k8s-master1 prometheus]# kubectl apply -f prometheus-alertmanager-deploy.yaml
注意: - targets: ['192.168.124.16:9913'] 这个 ip 地址是 nginx-vts-exporter 程序所在机器的 ip 地址。
4.5 grafana 界面导入 nginx 监控模板
查看 Prometheus
在 grafana 导入 nginx-vts-stats_rev2.json 模板
五、prometheus 监控 mongodb
5.1 下载 mongodb 和 mongodb_exporter 镜像
[root@k8s-master1 mongodb]# docker pull mongo
[root@k8s-master1 mongodb]# docker pull percona/mongodb_exporter:0.34.0
5.2 启动 mongodb
[root@k8s-master1 mongodb]# pwd
/root/prometheus/mongodb
[root@k8s-master1 mongodb]# docker run -d --name mongodb -p 27017:27017 -v /root/prometheus/mongodb:/data/db mongo# 创建 mongo 账号密码,给 mongodb_exporter 连接 mongo 用
# 登录到容器
[root@k8s-master1 mongodb]# docker exec -it 6c1168199b09 mongo admin# 设置密码
> use admin
> db.createUser({ user: 'admin', pwd: 'admin111111', roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] })
> exit
5.3 启动 mongo_exporter
[root@k8s-master1 mongodb]# docker run -d --name mongodb_exporter -p 30056:9216 percona/mongodb_exporter:0.34.0 --mongodb.uri mongodb://admin:admin111111@192.168.78.143:27017
注:admin:admin111111 这个就是上面启动 mongodb 后设置的密码,@ 后面接 mongodb 的 ip 和端口。
5.4 修改 prometheus-alertmanager-cfg.yaml 文件
# 添加一个 job_name
[root@k8s-master1 prometheus]# vim prometheus-alertmanager-cfg.yaml
······- job_name: 'mongodb'scrape_interval: 5sstatic_configs:- targets: ['192.168.78.143:30056']
······[root@k8s-master1 prometheus]# kubectl apply -f prometheus-alertmanager-cfg.yaml [root@k8s-master1 prometheus]# kubectl delete -f prometheus-alertmanager-deploy.yaml [root@k8s-master1 prometheus]# kubectl apply -f prometheus-alertmanager-deploy.yaml
访问 Prometheus:
六、Pushgateway
6.1 Pushgateway 简介
Pushgateway 是 prometheus 的一个组件,prometheus server 默认是通过 exporter 主动获取数据(默认采取 pull 拉取数据),pushgateway 则是通过被动方式推送数据到 prometheus server,用户可以写一些自定义的监控脚本把需要监控的数据发送给 pushgateway, 然后pushgateway 再把数据发送给 Prometheus server。
6.2 Pushgateway 优点
Prometheus 默认采用定时 pull 模式拉取 targets 数据,但是如果不在一个子网或者防火墙,prometheus 就拉取不到 targets 数据,所以可以采用各个 target 往 pushgateway 上 push 数据,然后 prometheus 去 pushgateway 上定时 pull 数据。
在监控业务数据的时候,需要将不同数据汇总, 汇总之后的数据可以由 pushgateway 统一收集,然后由 Prometheus 统一拉取。
6.3 Pushgateway 缺点
- Prometheus 拉取状态只针对 pushgateway,不能对每个节点都有效;
- Pushgateway 出现问题,整个采集到的数据都会出现问题;
- 监控下线,prometheus 还会拉取到旧的监控数据,需要手动清理 pushgateway不要的数据。
6.4 安装 Pushgateway
# 安装 pushgateway
[root@k8s-master1 prometheus]# docker pull prom/pushgateway# 启动容器
[root@k8s-master1 prometheus]# docker run -d --name pushgateway -p 9091:9091 prom/pushgateway
在浏览器访问 192.168.78.143:9091 出现如下 ui 界面:
6.5 修改 prometheus-alertmanager-cfg.yaml 文件
# 添加如下 job
[root@k8s-master1 prometheus]# vim prometheus-alertmanager-cfg.yaml
······- job_name: 'pushgateway'scrape_interval: 5sstatic_configs:- targets: ['192.168.78.143:9091']honor_labels: true
······[root@k8s-master1 prometheus]# kubectl apply -f prometheus-alertmanager-cfg.yaml [root@k8s-master1 prometheus]# kubectl delete -f prometheus-alertmanager-deploy.yaml [root@k8s-master1 prometheus]# kubectl apply -f prometheus-alertmanager-deploy.yaml
在 prometheus 的 targets 列表可以看到 pushgateway:
6.6 测试推送数据到 pushgateway
# 向 {job="test_job"} 添加单条数据
[root@k8s-master1 prometheus]# echo "metric 3.6" | curl --data-binary @- http://192.168.78.143:9091/metrics/job/test_job注:--data-binary 表示发送二进制数据,它是使用 POST 方式发送的!
查看 pushgateway,这三个指标都可以在 Prometheus 看到:
# 添加复杂数据
cat <<EOF | curl --data-binary @- http://192.168.78.143:9091/metrics/job/test_job/instance/test_instance
#TYPE node_memory_usage gauge
node_memory_usage 36
# TYPE memory_total gauge
node_memory_total 36000
EOF
# 删除某个组下某个实例的所有数据
curl -X DELETE http://192.168.78.143:9091/metrics/job/test_job/instance/test_instance# 删除某个组下的所有数据
curl -X DELETE http://192.168.78.143:9091/metrics/job/test_job
6.7 把数据上报到 pushgateway
在被监控服务所在的机器配置数据上报,想要把 192.168.78.143 这个机器的内存数据上报到pushgateway,下面步骤需要在 192.168.78.143 操作:
# 编写脚本
[root@k8s-master1 prometheus]# vim push.sh
#!/bin/bash
node_memory_usages=$(free -m | grep Mem | awk '{print $3/$2*100}')
job_name="memory"
instance_name="192.168.78.143"
cat <<EOF | curl --data-binary @- http://192.168.78.143:9091/metrics/job/$job_name/instance/$instance_name
#TYPE node_memory_usages gauge
node_memory_usages $node_memory_usages
EOF# 设置计划任务,定时上报数据
[root@k8s-master1 prometheus]# chmod +x push.sh
[root@k8s-master1 prometheus]# crontab -e
*/1 * * * * /usr/bin/bash /root/prometheus/push.sh
打开 pushgateway web ui 界面,可看到如下:
注意:从上面配置可以看到,我们上传到 pushgateway 中的数据有 job 也有 instance,而prometheus 配置 pushgateway 这个 job_name 中也有 job 和 instance。这个 job 和 instance 是指pushgateway 实例本身,添加 honor_labels: true 参数,可以避免 promethues 的 targets 列表中的 job_name 是 pushgateway 的 job 、instance 和上报到 pushgateway 数据的 job 和 instance 冲突。
上一篇文章:【Kubernetes 企业项目实战】03、基于 Alertmanager 发送报警到多个接收方(上)_Stars.Sky的博客-CSDN博客
下一篇文章:【Kubernetes 企业项目实战】04、基于 K8s 构建 EFK+logstash+kafka 日志平台(上)_Stars.Sky的博客-CSDN博客
【Kubernetes 企业项目实战】03、基于 Alertmanager 发送报警到多个接收方(下)相关推荐
- 【Kubernetes 企业项目实战】05、基于云原生分布式存储 Ceph 实现 K8s 数据持久化(下)
目录 一.K8s 对接 ceph rbd 实现数据持久化 1.1 k8s 安装 ceph 1.2 创建 pod 挂载 ceph rbd 二.基于 ceph rbd 生成 pv 2.1 创建 ceph- ...
- 【Kubernetes 企业项目实战】06、基于 Jenkins+K8s 构建 DevOps 自动化运维管理平台(上)
目录 一.k8s 助力 DevOps 在企业落地实践 1.1 传统方式部署项目为什么发布慢,效率低? 1.2 上线一个功能,有多少时间被浪费了? 1.3 如何解决发布慢,效率低的问题呢? 1.4 什么 ...
- 【Kubernetes 企业项目实战】07、最新一代微服务网格 Istio 入门到企业实战(下)
目录 一.istio 核心资源解读 1.1 Gateway 总结: 1.2 VirtualService 1.2.1 VirtualService 主要由以下部分组成 1.2.2 virtualser ...
- 【Kubernetes 企业项目实战】09、Rancher 2.6 管理 k8s-v1.23 及以上版本高可用集群
目录 一.Rancher 介绍 1.1Rancher简介 1.2 Rancher 和 k8s 的区别 1.3 Rancher 企业使用案例 二.安装 Rancher 2.1 初始化环境 2.2 安装 ...
- android项目实战博学谷百度云,Android项目实战系列—基于博学谷(七)课程模块(下)...
由于这个模块内容较多,分为上.中.下 三篇博客分别来讲述,请耐心阅读. 课程模块分为四个部分 [ ] [课程列表]() [ ] [课程详情]() [x] [视频播放]() [x] [播放记录]() 课 ...
- Android项目实战系列—基于博学谷(七)课程模块(下)
由于这个模块内容较多,分为上.中.下 三篇博客分别来讲述,请耐心阅读. 课程模块分为四个部分 课程列表 课程详情 视频播放 播放记录 课程模块(下)主要讲述视频播放和播放记录两个部分 一.视频播放 1 ...
- 基于大数据技术之电视收视率企业项目实战(hadoop+Spark)
基于大数据技术之电视收视率企业项目实战(hadoop+Spark) 网盘地址:https://pan.baidu.com/s/1bEeSB1Y9nmjzctnbJMcBkg 密码:dohg 备用地址( ...
- [嵌入式Linux项目实战开发]基于QT4.7.4的音乐播放器实现与设计【2018年给力项目】
[嵌入式Linux项目实战开发]基于QT4.7.4的音乐播放器实现与设计[2018年给力项目]是[创科之龙]团队aiku嵌入式视频教程系列制作的现有的音乐播放器. 主要功能实现: 1.新建工程,基类选 ...
- android中私有方法 继承,Android项目实战系列—基于博学谷(五)个人资料
由于这个模块内容较多,篇幅较长,请耐心阅读. 个人资料模块分为两个部分 [x] [个人资料]() [x] [资料修改]() 一.个人资料 1.个人资料界面 (1).创建个人资料界面 在com.buxu ...
最新文章
- Java8-5-Function函数式接口进阶与默认方法详解
- 技术部门 Leader 与团队那些事
- 万万想不到!地球运行的真实轨迹原来是这样子!
- 创建Jenkins自动化部署任务
- 谷歌、阿里巴巴他们都来了,你呢?
- @程序员,不要再锤产品经理了,锤这个吧!!!
- 修改Myecclipse servlet/jsp的默认模板
- BIM学习笔记(一)
- 2021年危险化学品生产单位安全生产管理人员试题及解析及危险化学品生产单位安全生产管理人员模拟试题
- E001检测到您的环境不支持HTML5,佳能打印机故障代码、故障原因、故障排除
- 游戏盾SDK的防护介绍
- unity显示FPS
- Understanding and Diagnosing Visual Tracking Systems
- 安路FPGA学习之有趣的下载方式
- python实现c语言编译器安卓版_c语言编译器ide下载app-c语言编译器ide软件下载v1.5.1 安卓版-2265安卓网...
- Android检查GPU呈现模式和过度绘制
- 关于Win10应用商店打不开一直转圈圈的问题
- 游承超:手机防爆膜可以降低手机的压力(15P)
- Win2003系统安装SQL Sever2000后1433端口未开放的解释
- 网站丨怎有怎么多神奇的网站呀