IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> day4-----交付dubbo微服务(1) -> 正文阅读

[系统运维]day4-----交付dubbo微服务(1)

作者:recommend-item-box type_blog clearfix

回顾内容

·制作Jenkins的Docker镜像
·设置了容器启动时使用的用户为root·设置容器内的时区为UTC+8
·加入了ssh私钥(拉取git代码的两种方式:基于http和基于ssh)·加入登录harbor的config文件
·修改了ssh客户端的配置
·安装了一个docker客户端
·配置共享存储NFS
·交付Jenkins到K8S集群配置CI流水线

Dashboard(仪表盘)
·    基于RBAC认证的一个GUI资源管理插件
·    两个常用版本: v1.8.3和v1.10.1
-    K8S如何基于RBAC进行鉴权
-    手撕ssl证书签发它

每一个公司都有自己的不同的服务,不一定都用的dubbo微服务
看下图说明::

第一个是注册中心Registry在dubbo微服务中就是zk,以集群状态的形式
第二个是提供者Provider,把提供者交付在k8s里面注册到注册中心
第三个是消费者Consumer在,也交付在k8s然后去注册,并订阅提供者的方法,方法是register的方法(默认),这样消费者在使用方法的时候就好像在使用本地方法一样(它里面可能仅仅写一个接口,没有具体代码,那么代码是在提供者的项目里面写的)
最后一个是monitor,需要通过它去观察提供者,消费者和注册中心,是不是在正常的工作

在这里插入图片描述
下面是要交付Jenkins
说明:三件事
首先它是做为一个持续集成的组件,用来帮助我们把源代码从版本控制中心(我们用的是jdk,你也可以用其他),然后通过配置和编译,让它变成我们可以执行的二进制代码,最后是把代码编译完成后把它变成docker镜像并提交到我们的私有镜像仓库。
我们为了让他完成这三件事,把jenkins也做成了docker,,加入harbor的config文件主要是为了让他能和harbor可以进行通信,,最后一步是安装一个docker的客户端,它在k8s的运算节点,docker的客户端和服务端是通过docker.sock进行通信的,你需要把它挂载到宿主机上
在这里插入图片描述
上面我们都是通过资源配置清单把服务交付服务的。
下面我们最的最多的三步,
第一准备docker的镜像,
第二把镜像给扔到私有镜像仓库里面,方便拉镜像
第三是准备资源配置清单,然后应用到k8s里面

还记得的那个蓝海(Open Blue Orean)插件,主要是帮助我们做流水线的。

二进制安装maven

能在Jenkins的po日志里面看到下面那个句话,说明它是启动成功的
在这里插入图片描述
其实Jenkins还是挺吃资源的,吃内存还是比较多的,你看是670多兆,相当于半个多g了,当然相对于Prometheus是很小的,Prometheus能到20多g
在这里插入图片描述

验证Jenkins是否真的可用

需要exec进入Jenkins的pod
你可以在浏览器上也可以在后台登录
在这里插入图片描述
首先验证是否可登陆,以及是否有docker的容器,你可以到21上看是否是有下面这些容器
在这里插入图片描述

jenkins-54b8469cf9-7v28q   1/1     Running   0          17h
[root@hdss7-21 ~]# docker ps -a
CONTAINER ID   IMAGE                               COMMAND                  CREATED      STATUS      PORTS                               NAMES
600eff76f8cb   harbor.od.com/public/traefik        "/entrypoint.sh --ap…"   3 days ago   Up 3 days                                       k8s_traefik-ingress_traefik-ingress-zh4k6_kube-system_37fec845-24f2-4c6d-8201-fb4aed203a2c_0
bb5f952c3206   harbor.od.com/public/pause:latest   "/pause"                 3 days ago   Up 3 days   0.0.0.0:81->80/tcp, :::81->80/tcp   k8s_POD_traefik-ingress-zh4k6_kube-system_37fec845-24f2-4c6d-8201-fb4aed203a2c_279
47f6dcbee8ec   harbor.od.com/public/coredns        "/coredns -conf /etc…"   3 days ago   Up 3 days                                       k8s_coredns_coredns-6b6c4f9648-ckjh7_kube-system_3e9f9af1-4248-4e08-95e7-d2b4a3cb5ba3_0
ed804429de1d   harbor.od.com/public/pause:latest   "/pause"                 3 days ago   Up 3 days                                       k8s_POD_coredns-6b6c4f9648-ckjh7_kube-system_3e9f9af1-4248-4e08-95e7-d2b4a3cb5ba3_0
995e2b868b95   1b933b5c419a                        "nginx -g 'daemon of…"   3 days ago   Up 3 days                                       k8s_my-nginx_nginx-ds-pbql6_default_cb677867-23e7-480f-a986-128e3e30a064_0
cedc944769df   harbor.od.com/public/pause:latest   "/pause"                 3 days ago   Up 3 days                                       k8s_POD_nginx-ds-pbql6_default_cb677867-23e7-480f-a986-128e3e30a064_0
a46832c354e7   84581e99d807                        "nginx -g 'daemon of…"   3 days ago   Up 3 days                                       k8s_nginx_nginx-dp-5dfc689474-dbdsk_kube-public_af461457-7d0b-4f3e-bf3d-aa07c32202e2_0
b6276df69065   harbor.od.com/public/pause:latest   "/pause"                 3 days ago   Up 3 days                                       k8s_POD_nginx-dp-5dfc689474-dbdsk_kube-public_af461457-7d0b-4f3e-bf3d-aa07c32202e2_0
[root@hdss7-21 ~]# 

然后登录harbor
在这里插入图片描述
当年获得下面的一段信息了,说明你的Jenkins已经在正常的工作了
测试连接
下面是告诉你,你已经被成功认证了,但是gitee不能给你提供shell的接入点
在这里插入图片描述

安装部署maven软件是用来编译java程序的

下载地址
maven.apache.org/docs/history.html
https://archive.apache.org/dist/maven/maven-3/

[root@hdss7-200 jenkins_home]# cd /opt/src/
[root@hdss7-200 src]# wget https://archive.apache.org/dist/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1-bin.tar.gz
--2021-09-01 21:35:52--  https://archive.apache.org/dist/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1-bin.tar.gz
Resolving archive.apache.org (archive.apache.org)... 138.201.131.134, 2a01:4f8:172:2ec5::2
Connecting to archive.apache.org (archive.apache.org)|138.201.131.134|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 9136463 (8.7M) [application/x-gzip]
Saving to: ‘apache-maven-3.6.1-bin.tar.gz’

100%[============================================================>] 9,136,463   77.7KB/s   in 76s    

2021-09-01 21:37:08 (118 KB/s) - ‘apache-maven-3.6.1-bin.tar.gz’ saved [9136463/9136463]

[root@hdss7-200 src]# ll
total 575356
-rw-r--r-- 1 root root   9136463 Sep  4  2019 apache-maven-3.6.1-bin.tar.gz
-rw-r--r-- 1 root root 580021898 May 24 23:37 harbor-offline-installer-v1.8.3.tgz
[root@hdss7-200 src]# 

在运维主机上二进制部署,这里用3.6.1
首先需要确定下jenkins里面的java版本是多少
在这里插入图片描述
然后根据版本创建目录

[root@hdss7-200 src]# mkdir /data/nfs-volume/jenkins_home/maven-3.6.1-8u232
[root@hdss7-200 src]# tar zxf apache-maven-3.6.1-bin.tar.gz -C /data/nfs-volume/jenkins_home/maven-3.6.1-8u232
[root@hdss7-200 src]# cd /data/nfs-volume/jenkins_home/maven-3.6.1-8u232
[root@hdss7-200 maven-3.6.1-8u232]# mv apache-maven-3.6.1/ ../
[root@hdss7-200 maven-3.6.1-8u232]# mv ../apache-maven-3.6.1/* .
[root@hdss7-200 maven-3.6.1-8u232]# ll
total 40
drwxr-xr-x 2 root root   4096 Sep  1 21:46 bin
drwxr-xr-x 2 root root   4096 Sep  1 21:46 boot
drwxr-xr-x 3  501 games  4096 Apr  5  2019 conf
drwxr-xr-x 4  501 games  4096 Sep  1 21:46 lib
-rw-r--r-- 1  501 games 13437 Apr  5  2019 LICENSE
-rw-r--r-- 1  501 games   182 Apr  5  2019 NOTICE
-rw-r--r-- 1  501 games  2533 Apr  5  2019 README.txt
[root@hdss7-200 maven-3.6.1-8u232]# pwd
/data/nfs-volume/jenkins_home/maven-3.6.1-8u232
[root@hdss7-200 maven-3.6.1-8u232]# 

然后对maven进行下初始化配置

[root@hdss7-200 maven-3.6.1-8u232]# pwd
/data/nfs-volume/jenkins_home/maven-3.6.1-8u232
[root@hdss7-200 maven-3.6.1-8u232]# vi conf/settings.xml 

在这里插入图片描述
这个说明下你在/data/nfs-volume/jenkins_home安装的内容到是要挂载到你的docker镜像里面的,说白了就是在你docker安装的
在这里插入图片描述

制作dubbo微服务的镜像底包

登录开源的这些内容可以看下
https://hub.docker.com/reposititory/docker/stanleyws
在运维主机200上

自定义Dockerfile

[root@hdss7-200 maven-3.6.1-8u232]# cd /data/dockerfile/
[root@hdss7-200 dockerfile]# ls
jenkins
[root@hdss7-200 dockerfile]# docker pull docker.io/stanleyws/jre8:8u112
8u112: Pulling from stanleyws/jre8
cd9a7cbe58f4: Pull complete 
8372fab2fcdf: Pull complete 
54746b802c92: Pull complete 
969413759d76: Pull complete 
3a44edd3f51d: Pull complete 
Digest: sha256:921225313d0ae6ce26eac31fc36b5ba8a0a841ea4bd4c94e2a167a9a3eb74364
Status: Downloaded newer image for stanleyws/jre8:8u112
docker.io/stanleyws/jre8:8u112
[root@hdss7-200 dockerfile]# docker images |grep jre
stanleyws/jre8                                8u112                      fa3a085d6ef1   4 years ago     363MB
[root@hdss7-200 dockerfile]# docker tag fa3a085d6ef1 harbor.od.com/public/jre:8u112
[root@hdss7-200 dockerfile]# docker push harbor.od.com/public/jre:8u112
The push refers to repository [harbor.od.com/public/jre]
0690f10a63a5: Pushed 
c843b2cf4e12: Pushed 
fddd8887b725: Pushed 
42052a19230c: Pushed 
8d4d1ab5ff74: Pushed 
8u112: digest: sha256:733087bae1f15d492307fca1f668b3a5747045aad6af06821e3f64755268ed8e size: 1367
[root@hdss7-200 dockerfile]# pwd
/data/dockerfile
[root@hdss7-200 dockerfile]# mkdir jre
[root@hdss7-200 dockerfile]# mv jre jre8
[root@hdss7-200 dockerfile]# cd jre8/
[root@hdss7-200 jre8]# vi Dockerfile
[root@hdss7-200 jre8]# cat Dockerfile
FROM harbor.od.com/public/jre:8u112
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
    echo 'Asia/Shanghai' >/etc/timezone
ADD config.yml /opt/prom/config.yml
ADD jmx_javaagent-0.3.1.jar /opt/prom/
WORKDIR /opt/project_dir
ADD entrypoint.sh /entrypoint.sh
CMD ["/entrypoint.sh"]
[root@hdss7-200 jre8]# vi config.yml
[root@hdss7-200 jre8]# cat config.yml
--- 
rules: 
 - pattern: '.*'
[root@hdss7-200 jre8]# wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.3.1/jmx_prometheus_javaagent-0.3.1.jar -O jmx_javaagent-0.3.1.jar
--2021-09-01 22:29:35--  https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.3.1/jmx_prometheus_javaagent-0.3.1.jar
Resolving repo1.maven.org (repo1.maven.org)... 199.232.196.209, 199.232.192.209
Connecting to repo1.maven.org (repo1.maven.org)|199.232.196.209|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 367417 (359K) [application/java-archive]
Saving to: ‘jmx_javaagent-0.3.1.jar’

100%[============================================================>] 367,417      270KB/s   in 1.3s   

2021-09-01 22:29:37 (270 KB/s) - ‘jmx_javaagent-0.3.1.jar’ saved [367417/367417]

[root@hdss7-200 jre8]# ll
total 368
-rw-r--r-- 1 root root     30 Sep  1 22:28 config.yml
-rw-r--r-- 1 root root    297 Sep  1 22:26 Dockerfile
-rw-r--r-- 1 root root 367417 May 10  2018 jmx_javaagent-0.3.1.jar
[root@hdss7-200 jre8]# 
[root@hdss7-200 jre8]# vi entrypoint.sh
[root@hdss7-200 jre8]# chmod u+x entrypoint.sh 
[root@hdss7-200 jre8]# cat entrypoint.sh
#!/bin/sh
M_OPTS="-Duser.timezone=Asia/Shanghai -javaagent:/opt/prom/jmx_javaagent-0.3.1.jar=$(hostname -i):${M_PORT:-"12346"}:/opt/prom/config.yml"
C_OPTS=${C_OPTS}
JAR_BALL=${JAR_BALL}
exec java -jar ${M_OPTS} ${C_OPTS} ${JAR_BALL}
[root@hdss7-200 jre8]# 

在这里解释下上面的那个小脚本

[root@hdss7-200 jre8]# cat entrypoint.sh
#主要是定义了三个变量去执行一条命令,也就是M_OPTS、JAR_BALL、C_OPTS这三个变量,JAR_BALL好理解就是java的jia包
#!/bin/sh
#下面一句M_OPTS是java的一些启动参数,这个启动参数,运行时的时区是东八区,把pod的ip给传到上面wget下载的里面并打开一个端口,并很巧妙的使用${M_PORT:-"12346"},也就是如果你没有传端口默认打开的端口是12346,后面是config.yml是监控规则
M_OPTS="-Duser.timezone=Asia/Shanghai -javaagent:/opt/prom/jmx_javaagent-0.3.1.jar=$(hostname -i):${M_PORT:-"12346"}:/opt/prom/config.yml"
C_OPTS=${C_OPTS}
#下面是JAR_BALL等于${JAR_BALL},后面的${JAR_BALL}是取的当前docker运行时的环境变量,就是把docker运行时的环境变量赋值到shell脚本的JAR_BALL的变量里面,,是有k8s的资源配置清单里给它传的,这也就是云原生的思想,为什么docker在k8s里面不是一个信息孤岛,是通过环境变量的形式可以给容器做初始化的超作,这也就就是典型的云原生做初始化,如果你属性k8s的工作方式了可以完全不用去写,,上面一条原理是一样的。
JAR_BALL=${JAR_BALL}
#下面是真正执行的命令,,下面exec是什么意思呢,因为在执行脚本/entrypoint.sh的时候应该有一个pid这个pid的值是1,docker应该有一个pid等于1的进程一直在前台进行,这才能维持你的docker有一个生命状态,如果不写那么docker的进制就会退出了,exec就相当于代替前面的entrypoint.sh脚本维持pid等于1的进程,,就是为了让docker的生命周期保持在running状态而不是pending状态,,也即是让java成为主进程
exec java -jar ${M_OPTS} ${C_OPTS} ${JAR_BALL}
[root@hdss7-200 jre8]# 

当你发现你容器死活起步来的时候可以尝试用下exec的方式

下面是可以build镜像了

首先我们去harbor.od.com去创新一个项目
在这里插入图片描述
所有的业务镜像地包都从base镜像里面去捞
在这里插入图片描述
build

[root@hdss7-200 jre8]# docker build . -t harbor.od.com/base/jre8:8u112
Sending build context to Docker daemon  372.2kB
Step 1/7 : FROM harbor.od.com/public/jre:8u112
 ---> fa3a085d6ef1
Step 2/7 : RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&    echo 'Asia/Shanghai' >/etc/timezone
 ---> Running in 57f517e3a47b
Removing intermediate container 57f517e3a47b
 ---> f6e1accb02a4
Step 3/7 : ADD config.yml /opt/prom/config.yml
 ---> de1afa1bf257
Step 4/7 : ADD jmx_javaagent-0.3.1.jar /opt/prom/
 ---> 3d4fae48d937
Step 5/7 : WORKDIR /opt/project_dir
 ---> Running in 5db1382b07e5
Removing intermediate container 5db1382b07e5
 ---> 25a9f793b3be
Step 6/7 : ADD entrypoint.sh /entrypoint.sh
 ---> b4a738a44df7
Step 7/7 : CMD ["/entrypoint.sh"]
 ---> Running in a072d01b0082
Removing intermediate container a072d01b0082
 ---> 543b20f391f9
Successfully built 543b20f391f9
Successfully tagged harbor.od.com/base/jre8:8u112
[root@hdss7-200 jre8]# 
[root@hdss7-200 jre8]# docker push harbor.od.com/base/jre8:8u112
The push refers to repository [harbor.od.com/base/jre8]
bee05a3ead66: Pushed 
1e8546938d03: Pushed 
ec7559a9b2a3: Pushed 
ad8b92153ecf: Pushed 
b400bce7c120: Pushed 
0690f10a63a5: Mounted from public/jre 
c843b2cf4e12: Mounted from public/jre 
fddd8887b725: Mounted from public/jre 
42052a19230c: Mounted from public/jre 
8d4d1ab5ff74: Mounted from public/jre 
8u112: digest: sha256:73df3fcedbc3430c5efa6a31c22cb5c168cca81d16022b49db298a4ac0881edd size: 2405

我们在生产中改的最多的也就是底包,所以这个最好多了解点

使用jenkins进行持续构建交付dubbo服务的提供者

配置流水线,点new item
在这里插入图片描述
点击自动刷新
在这里插入图片描述
在这里插入图片描述

版本更新后再等了你看有蓝海了

在这里插入图片描述

有了蓝海了就可以进行更新了创建了,先选择,在填写,最后创建
在这里插入图片描述
在这里插入图片描述
保留7天保留30个
在这里插入图片描述
第一个参数
在这里插入图片描述
第二个参数。
在这里插入图片描述
在这里插入图片描述
第四个参数
在这里插入图片描述
第五个参数
在这里插入图片描述
第6个参数
在这里插入图片描述
第七个参数
在这里插入图片描述
第八个参数
在这里插入图片描述
第九个参数和上面有所不同
在这里插入图片描述
第十个参数
在这里插入图片描述
准备流水线脚本

pipeline {
  agent any 
    stages {
      stage('pull') { //get project code from repo 
        steps {
          sh "git clone ${params.git_repo} ${params.app_name}/${env.BUILD_NUMBER} && cd ${params.app_name}/${env.BUILD_NUMBER} && git checkout ${params.git_ver}"
        }
      }
      stage('build') { //exec mvn cmd
        steps {
          sh "cd ${params.app_name}/${env.BUILD_NUMBER}  && /var/jenkins_home/maven-${params.maven}/bin/${params.mvn_cmd}"
        }
      }
      stage('package') { //move jar file into project_dir
        steps {
          sh "cd ${params.app_name}/${env.BUILD_NUMBER} && cd ${params.target_dir} && mkdir project_dir && mv *.jar ./project_dir"
        }
      }
      stage('image') { //build image and push to registry
        steps {
          writeFile file: "${params.app_name}/${env.BUILD_NUMBER}/Dockerfile", text: """FROM harbor.od.com/${params.base_image}
ADD ${params.target_dir}/project_dir /opt/project_dir"""
          sh "cd  ${params.app_name}/${env.BUILD_NUMBER} && docker build -t harbor.od.com/${params.image_name}:${params.git_ver}_${params.add_tag} . && docker push harbor.od.com/${params.image_name}:${params.git_ver}_${params.add_tag}"
        }
      }
    }
}

在这里插入图片描述
然后点config是能看到你之前填写的内容的
在这里插入图片描述
在这里插入图片描述
真正构建项目的时候应该点上面那个back to dashboard
在这里插入图片描述
真正构建的时候点这两个都是可以的
在这里插入图片描述
然后就会进入刚才你设置的页面了
在这里插入图片描述

真正构建需要先去harbor创建一个app项目

在这里插入图片描述
填写下面的参数–10个参数都要有
在这里插入图片描述
因为gitee里面我的没有代码,所以下面就不在多请参数去做
在这里插入图片描述
然后点console output
在这里插入图片描述

编译完成后配置资源配置清单

下面的时间是为了快速定位问题用的

[root@hdss7-200 maven-3.6.1-8u232]# cd /data/k8s-yaml/
[root@hdss7-200 k8s-yaml]# mkdir dubbo-demo-service
[root@hdss7-200 k8s-yaml]# cd dubbo-demo-service/
[root@hdss7-200 dubbo-demo-service]# vi dp.yaml
[root@hdss7-200 dubbo-demo-service]# cat dp.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: dubbo-demo-service
  namespace: app
  labels: 
    name: dubbo-demo-service
spec:
  replicas: 1
  selector:
    matchLabels: 
      name: dubbo-demo-service
  template:
    metadata:
      labels: 
        app: dubbo-demo-service
        name: dubbo-demo-service
    spec:
      containers:
      - name: dubbo-demo-service
        image: harbor.od.com/app/dubbo-demo-service:master_191201_1200
        ports:
        - containerPort: 20880
          protocol: TCP
        env:
        - name: JAR_BALL
          value: dubbo-server.jar
        imagePullPolicy: IfNotPresent
      imagePullSecrets:
      - name: harbor
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      securityContext: 
        runAsUser: 0
      schedulerName: default-scheduler
  strategy:
    type: RollingUpdate
    rollingUpdate: 
      maxUnavailable: 1
      maxSurge: 1
  revisionHistoryLimit: 7
  progressDeadlineSeconds: 600
[root@hdss7-200 dubbo-demo-service]# 

在21上创建

[root@hdss7-21 ~]# kubectl create ns app
namespace/app created
[root@hdss7-21 ~]# kubectl create secret docker-registry harbor --docker-server=harbor.od.com --docker-username=admin --docker-password=Harbor12345 -n app
secret/harbor created
[root@hdss7-21 ~]# 

应该资源配置清单前先看zk是否正常
下面说明没问题

[root@hdss7-11 zookeeper]# bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[root@hdss7-11 zookeeper]# 

[root@hdss7-21 ~]# kubectl apply -f http://k8s-yaml.od.com/dubbo-demo-service/dp.yaml
deployment.extensions/dubbo-demo-service created
[root@hdss7-21 ~]# 

看pod是否正常先看下日志

在这里插入图片描述
告诉你服务端已启动说明正常了
在这里插入图片描述
查看zk
在这里插入图片描述
在zk里面有dubbo说明提供者交付成功了
在这里插入图片描述

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-09-05 11:27:40  更:2021-09-05 11:28:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 14:06:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码