DevOps - Jenkins可视化流水线(后端部分)

news2024/10/4 11:18:23

目录

🧡创建DevOps工程

🧡拉取代码

🧡项目编译

🧡构建镜像

🧡推送镜像

🧡部署到Dev环境

🧡邮件功能

🧡激活微服务


💟这里是CS大白话专场,让枯燥的学习变得有趣!

💟没有对象不要怕,我们new一个出来,每天对ta说不尽情话!

💟好记性不如烂键盘,自己总结不如收藏别人!

💌 本章我们来学习 DevOps 开发部署全流程,直接在 KubeSphere 中创建可视化流水线,将一个医疗项目自动化部署上云。

💌在创建工程之前我们先把 maven 配置修改一下,让它从阿里云下载镜像。流水线带有缓存机制,已经下载过的 jar包,下一次流水线启动不会重复下载。

  <mirrors>
 	<mirror>
		<id>nexus-aliyun</id>
		<mirrorOf>central</mirrorOf>
		<name>Nexus aliyun</name>
		<url>http://maven.aliyun.com/nexus/content/groups/public</url>
	 </mirror>
  </mirrors>

🧡创建DevOps工程

💌首先进入企业空间点击 DevOps 工程,创建一个 DevOps 工程。

💌进入创建的 DevOps 工程创建一个流水线,然后就可以对流水线进行可视化编辑。

🧡拉取代码

💌第一步从 Gitee 上拉取代码,并查询下载的文件。

🍠点击空白处选择代理 选择 Jenkins Agent (kubesphere.io),这里我们是Java应用指定 maven 。

🍠点击第一个框,在右下角的任务处添加步骤指定 maven 容器。

🍠添加嵌套步骤,通过 Git 拉取仓库中的项目代码,需要创建一个自己的凭证,选定代码分支。

🍠拉取完代码之后通过 shell 命令 ls 显示下载的文件。

🧡项目编译

💌第二步项目编译,点击第二个框,添加 shell 命令:

mvn clean package -Dmaven.test.skip=true

🧡构建镜像

💌第三步并发构建每个服务的镜像。

🍠添加一个并行阶段,先检查上一步项目编译是否产生target文件,再构建镜像。

#检查编译文件target
ls hospital-manage/target
#构建镜像
docker build -t hospital-manage:latest -f hospital-manage/Dockerfile ./hospital-manage/

🍠一个并行阶段构建一个服务镜像比较麻烦,接下来可以编辑 Jenkins 文件来构建并行阶段。

    stage('default-2') {
      parallel {
        stage('build hospital-manage image') {
          agent none
          steps {
            container('maven') {
              sh 'ls hospital-manage/target'
              sh 'docker build -t hospital-manage:latest -f hospital-manage/Dockerfile ./hospital-manage/'
            }

          }
        }

        stage('build server-gateway image') {
          agent none
          steps {
            container('maven') {
              sh 'ls server-gateway/target'
              sh 'docker build -t server-gateway:latest -f server-gateway/Dockerfile ./server-gateway/'
            }

          }
        }

        stage('build service-cmn image') {
          agent none
          steps {
            container('maven') {
              sh 'ls service/service-cmn/target'
              sh 'docker build -t service-cmn:latest -f service/service-cmn/Dockerfile ./service/service-cmn/'
            }

          }
        }

        stage('build service-hosp image') {
          agent none
          steps {
            container('maven') {
              sh 'ls service/service-hosp/target'
              sh 'docker build -t service-hosp:latest -f service/service-hosp/Dockerfile ./service/service-hosp/'
            }

          }
        }

        stage('build service-order image') {
          agent none
          steps {
            container('maven') {
              sh 'ls service/service-order/target'
              sh 'docker build -t service-order:latest -f service/service-order/Dockerfile ./service/service-order/'
            }

          }
        }

        stage('build service-oss image') {
          agent none
          steps {
            container('maven') {
              sh 'ls service/service-oss/target'
              sh 'docker build -t service-oss:latest -f service/service-oss/Dockerfile ./service/service-oss/'
            }

          }
        }

        stage('build service-sms image') {
          agent none
          steps {
            container('maven') {
              sh 'ls service/service-sms/target'
              sh 'docker build -t service-sms:latest -f service/service-sms/Dockerfile ./service/service-sms/'
            }

          }
        }

        stage('build service-statistics image') {
          agent none
          steps {
            container('maven') {
              sh 'ls service/service-statistics/target'
              sh 'docker build -t service-statistics:latest -f service/service-statistics/Dockerfile ./service/service-statistics/'
            }

          }
        }

        stage('build service-task image') {
          agent none
          steps {
            container('maven') {
              sh 'ls service/service-task/target'
              sh 'docker build -t service-task:latest -f service/service-task/Dockerfile ./service/service-task/'
            }

          }
        }

        stage('build service-user image') {
          agent none
          steps {
            container('maven') {
              sh 'ls service/service-user/target'
              sh 'docker build -t service-user:latest -f service/service-user/Dockerfile ./service/service-user/'
            }

          }
        }

      }
    }

🧡推送镜像

💌第四步并行推送每个镜像到阿里云镜像仓库上,每个服务器从镜像仓库下载镜像,和上一步类似。

🍠阿里云容器镜像服务中创建命名空间。容器镜像服务 (aliyun.com)

 🍠点击第四个框,添加阿里云凭证。

🍠 编辑 Jenkinsfile 的环境。

  environment {
    DOCKER_CREDENTIAL_ID = 'dockerhub-id'
    GITHUB_CREDENTIAL_ID = 'github-id'
    KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig'
    REGISTRY = 'registry-vpc.cn-beijing.aliyuncs.com'  //REGISTRY地址
    DOCKERHUB_NAMESPACE = 'jodie-hospital'  //命名空间名称
    GITHUB_ACCOUNT = 'kubesphere'
    APP_NAME = 'devops-java-sample'
  }

 🍠在添加凭证中添加嵌套步骤。

echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin
docker tag hospital-manage:latest $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER
docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER

🍠编辑 Jenkinsfile 并行阶段。

    stage('default-3') {
      parallel {
        stage('push hospital-manage image') {
          agent none
          steps {
            container('maven') {
              withCredentials([usernamePassword(credentialsId : 'aliyun-id' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
                sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
                sh 'docker tag hospital-manage:latest $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER'
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-manage:SNAPSHOT-$BUILD_NUMBER'
              }

            }

          }
        }

        stage('push hospital-gateway image') {
          agent none
          steps {
            container('maven') {
              withCredentials([usernamePassword(credentialsId : 'aliyun-id' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
                sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
                sh 'docker tag hospital-gateway:latest $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-gateway:SNAPSHOT-$BUILD_NUMBER'
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/hospital-gateway:SNAPSHOT-$BUILD_NUMBER'
              }

            }

          }
        }

        stage('push service-cmn image') {
          agent none
          steps {
            container('maven') {
              withCredentials([usernamePassword(credentialsId : 'aliyun-id' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
                sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
                sh 'docker tag service-cmn:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-cmn:SNAPSHOT-$BUILD_NUMBER'
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/service-cmn:SNAPSHOT-$BUILD_NUMBER'
              }

            }

          }
        }

        stage('push service-hosp image') {
          agent none
          steps {
            container('maven') {
              withCredentials([usernamePassword(credentialsId : 'aliyun-id' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
                sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
                sh 'docker tag service-hosp:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-hosp:SNAPSHOT-$BUILD_NUMBER'
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/service-hosp:SNAPSHOT-$BUILD_NUMBER'
              }

            }

          }
        }

        stage('push service-order image') {
          agent none
          steps {
            container('maven') {
              withCredentials([usernamePassword(credentialsId : 'aliyun-id' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
                sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
                sh 'docker tag service-order:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-order:SNAPSHOT-$BUILD_NUMBER'
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/service-order:SNAPSHOT-$BUILD_NUMBER'
              }

            }

          }
        }

        stage('push service-oss image') {
          agent none
          steps {
            container('maven') {
              withCredentials([usernamePassword(credentialsId : 'aliyun-id' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
                sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
                sh 'docker tag service-oss:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-oss:SNAPSHOT-$BUILD_NUMBER'
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/service-oss:SNAPSHOT-$BUILD_NUMBER'
              }

            }

          }
        }

        stage('push service-sms image') {
          agent none
          steps {
            container('maven') {
              withCredentials([usernamePassword(credentialsId : 'aliyun-id' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
                sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
                sh 'docker tag service-sms:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-sms:SNAPSHOT-$BUILD_NUMBER'
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/service-sms:SNAPSHOT-$BUILD_NUMBER'
              }

            }

          }
        }

        stage('push service-statistics image') {
          agent none
          steps {
            container('maven') {
              withCredentials([usernamePassword(credentialsId : 'aliyun-id' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
                sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
                sh 'docker tag service-statistics:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-statistics:SNAPSHOT-$BUILD_NUMBER'
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/service-statistics:SNAPSHOT-$BUILD_NUMBER'
              }

            }

          }
        }

        stage('push service-task image') {
          agent none
          steps {
            container('maven') {
              withCredentials([usernamePassword(credentialsId : 'aliyun-id' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
                sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
                sh 'docker tag service-task:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-task:SNAPSHOT-$BUILD_NUMBER'
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/service-task:SNAPSHOT-$BUILD_NUMBER'
              }

            }

          }
        }

        stage('push service-user image') {
          agent none
          steps {
            container('maven') {
              withCredentials([usernamePassword(credentialsId : 'aliyun-id' ,usernameVariable : 'DOCKER_USER_VAR' ,passwordVariable : 'DOCKER_PWD_VAR' ,)]) {
                sh 'echo "$DOCKER_PWD_VAR" | docker login $REGISTRY -u "$DOCKER_USER_VAR" --password-stdin'
                sh 'docker tag service-user:latest $REGISTRY/$DOCKERHUB_NAMESPACE/service-user:SNAPSHOT-$BUILD_NUMBER'
                sh 'docker push  $REGISTRY/$DOCKERHUB_NAMESPACE/service-user:SNAPSHOT-$BUILD_NUMBER'
              }

            }

          }
        }

      }
    }

🧡部署到Dev环境

💌第五步给每一个微服务准备一个 deploy.yaml(k8s的部署配置文件),并在流水线中指定文件位置。

🍠点击第五个框 kubernetesDeploy 插件会报错 ,我们先在工程管理里添加凭证,ID 为之前环境中给出的 demo-kubeconfig。

🍠和之前步骤一样直接编写并行阶段,参考构建和部署 Maven 项目 (kubesphere.io)。

    stage('default-4') {
      parallel {
        stage('deploy hospital-manage to dev') {
          agent none
          steps {
            container('maven') {
              withCredentials([
                kubeconfigFile(
                  credentialsId: env.KUBECONFIG_CREDENTIAL_ID,
                  variable: 'KUBECONFIG')
                  ]) {
                    sh 'envsubst < hospital-manage/deploy/deploy.yml | kubectl apply -f -'
                  }
                }
              }
            }
            
        stage('deploy server-gateway to dev') {
          agent none
          steps {
            container('maven') {
              withCredentials([
                kubeconfigFile(
                  credentialsId: env.KUBECONFIG_CREDENTIAL_ID,
                  variable: 'KUBECONFIG')
                  ]) {
                    sh 'envsubst < server-gateway/deploy/deploy.yml | kubectl apply -f -'
                  }
                }
              }
            }

        stage('deploy service-cmn to dev') {
          agent none
          steps {
            container('maven') {
              withCredentials([
                kubeconfigFile(
                  credentialsId: env.KUBECONFIG_CREDENTIAL_ID,
                  variable: 'KUBECONFIG')
                  ]) {
                    sh 'envsubst < service/service-cmn/deploy/deploy.yml | kubectl apply -f -'
                  }
                }
              }
            }

        stage('deploy service-hosp to dev') {
          agent none
          steps {
            container('maven') {
              withCredentials([
                kubeconfigFile(
                  credentialsId: env.KUBECONFIG_CREDENTIAL_ID,
                  variable: 'KUBECONFIG')
                  ]) {
                    sh 'envsubst < service/service-hosp/deploy/deploy.yml | kubectl apply -f -'
                  }
                }
              }
            }

        stage('deploy service-order to dev') {
          agent none
          steps {
            container('maven') {
              withCredentials([
                kubeconfigFile(
                  credentialsId: env.KUBECONFIG_CREDENTIAL_ID,
                  variable: 'KUBECONFIG')
                  ]) {
                    sh 'envsubst < service/service-order/deploy/deploy.yml | kubectl apply -f -'
                  }
                }
              }
            }

        stage('deploy service-oss to dev') {
          agent none
          steps {
            container('maven') {
              withCredentials([
                kubeconfigFile(
                  credentialsId: env.KUBECONFIG_CREDENTIAL_ID,
                  variable: 'KUBECONFIG')
                  ]) {
                    sh 'envsubst < service/service-oss/deploy/deploy.yml | kubectl apply -f -'
                  }
                }
              }
            }

        stage('deploy service-sms to dev') {
          agent none
          steps {
            container('maven') {
              withCredentials([
                kubeconfigFile(
                  credentialsId: env.KUBECONFIG_CREDENTIAL_ID,
                  variable: 'KUBECONFIG')
                  ]) {
                    sh 'envsubst < service/service-sms/deploy/deploy.yml | kubectl apply -f -'
                  }
                }
              }
            }

        stage('deploy service-statistics to dev') {
          agent none
          steps {
            container('maven') {
              withCredentials([
                kubeconfigFile(
                  credentialsId: env.KUBECONFIG_CREDENTIAL_ID,
                  variable: 'KUBECONFIG')
                  ]) {
                    sh 'envsubst < service/service-statistics/deploy/deploy.yml | kubectl apply -f -'
                  }
                }
              }
            }

        stage('deploy service-task to dev') {
          agent none
          steps {
            container('maven') {
              withCredentials([
                kubeconfigFile(
                  credentialsId: env.KUBECONFIG_CREDENTIAL_ID,
                  variable: 'KUBECONFIG')
                  ]) {
                    sh 'envsubst < service/service-task/deploy/deploy.yml | kubectl apply -f -'
                  }
                }
              }
            }

        stage('deploy service-user to dev') {
          agent none
          steps {
            container('maven') {
              withCredentials([
                kubeconfigFile(
                  credentialsId: env.KUBECONFIG_CREDENTIAL_ID,
                  variable: 'KUBECONFIG')
                  ]) {
                    sh 'envsubst < service/service-user/deploy/deploy.yml | kubectl apply -f -'
                  }
                }
              }
            }

          }
        }

🍠项目配置中心中添加阿里云密钥。

🧡邮件功能

💌第六步搭建邮件发送功能,部署成功后给指定邮箱发送通知。

🍠 使用QQ邮箱,开启POP3/SMTP服务。 jxqkqmuaapegbebh

🍠编辑工作负载 ks-jenkins 配置文件。

🍠 KuberSphere 平台设置-通知管理-邮件中设置SMTP服务器。

🍠点击第六个框,选择嵌套步骤-邮件。修改Jenkinsfile的符号body: "XXX"。

💌至此项目的后端部分就上云部署完成啦!!成功收取邮件的那一刻要流泪了!!

 💌到工作负载里如果发现一些微服务一直在更新,可能要扩展以下服务器内存和CPU,或者在master节点上curl 容器组IP:8080 激活一下。

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

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

相关文章

zookeeper下载安装

1、环境准备 ZooKeeper服务器是用Java创建的&#xff0c;它运行在JVM之上。需要安装JDK 7或更高版本。 2、上传 将下载的ZooKeeper放到/opt/ZooKeeper目录下 #上传zookeeper altp put f:/setup/apache-zookeeper-3.5.6-bin.tar.gz #打开 opt目录 cd /opt #创建zooKeeper目录…

电子招标采购系统源码之什么是电子招投标系统?

随着互联网时代的到来&#xff0c;各行业都受到不同的影响&#xff0c;其中招投标行业也不例外。为了顺应互联网潮流的发展&#xff0c;电子招投标逐渐取代传统的纸质的招投标方式&#xff0c;给招标方、投标方、招标代理等各方也带来了前所未有的机遇与挑战。那么什么是电子招…

日志采集 - Filebeat

Filebeat 是什么&#xff1f; Filebeat是本地文件的日志数据采集器&#xff0c;可监控日志目录或特定日志文件&#xff08;tail file&#xff09;&#xff0c;并将它们转发给Elasticsearch或Logstatsh进行索引、kafka等。 是使用 Golang 实现的轻量型日志采集器&#xff0c;也…

Spring Boot配置MinIO(实现文件上传、读取、下载、删除)

一、 MinIO MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等&#xff0c;而一个对象文件可以是任意大小&#x…

INSERT ON DUPLICATE KEY UPDATE返回值引起的小乌龙

一、东窗事发 某个版本送测,测试大佬给提了一个缺陷,且听我描述描述: 一个学习任务: 两个一模一样的学习动态: 产品定义:学习任务(生字学习)完成后,会在小程序生成一个动态,再次完成不重复生成obviously,上边出现的两个动态不符合“罗辑” 二、排查看看 既然出现了两个动态…

dubbo源码实践-transport 网络传输层的例子

1 Transporter层概述Transporter层位于第2层&#xff0c;已经实现了完整的TCP通信&#xff0c;定义了一套Dubbo自己的API接口&#xff0c;支持Netty、Mina等框架。官方定义&#xff1a;transport 网络传输层&#xff1a;抽象 mina 和 netty 为统一接口&#xff0c;以 Message 为…

剑指 Offer 09. 用两个栈实现队列

用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两个函数 appendTail 和 deleteHead &#xff0c;分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素&#xff0c;deleteHead 操作返回 -1 ) 示例 1&#xff1a; 输入&#xff1a; ["…

自然语言处理 第11章 问答系统 复习

问答系统问答系统概述问答系统定义问答(QA)系统发展历程问答系统分类&#xff1a;问答系统框架&#xff1a;内容提要专家系统检索式问答系统1.问题分析主要功能&#xff1a;问题分类 和 关键词提取问题分类实现方法2.关键词提取检索模块相关文档检索句段检索3. 答案抽取模块检索…

回顾2022年,展望2023年

这里写目录标题回顾2022年博客之星你参加了吗&#xff1f;学习方面写博客方面在涨粉丝方面展望2023回顾2022年 时间如梭&#xff0c;转眼间已经2023年了。 你开始做总结了吗&#xff1f; 博客之星你参加了吗&#xff1f; 这是 2022 博客之星 的竞选帖子&#xff0c; 请你在这…

【从零开始学习深度学习】36. 门控循环神经网络之长短期记忆网络(LSTM)介绍、Pytorch实现LSTM并进行训练预测

上一篇文章介绍了一种门控循环神经网络门控循环单元GRU&#xff0c;本文将介绍另一种常用的门控循环神经网络&#xff1a;长短期记忆&#xff08;long short-term memory&#xff0c;LSTM&#xff09;&#xff0c;它比GRU稍复杂一点。 本文将介绍其实现方法&#xff0c;并使用其…

leetcode 221. 最大正方形-java题解

题目所属分类 动态规划 前面写过一个面积最大的长方形 传送门 f[i, j]表示&#xff1a;所有以(i,j)为右下角的且只包含 1 的正方形的边长最大值 原题链接 在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内&#xff0c;找到只包含 ‘1’ 的最大正方形&#xff0c;并返回其面积。 代…

最邻近方法和最邻近插入法求TSP问题近似解(可视化+代码)

摘要&#xff1a;本文总体内容为介绍用最邻近方法(Nearest Neighbor Algorithm) 和最邻近插入法求解旅行商问题(Traveling Saleman Problem,TSP)。同时使用python实现算法&#xff0c;并调用networkx库实现可视化。此文为本人图论课下作业的成品&#xff0c;含金量&#xff1a;…

【若依】前后端分离版本

一、何为框架&#xff1f;若依框架又是什么&#xff1f;具备什么功能&#xff1f; 框架的英文为Framework&#xff0c;带有骨骼&#xff0c;支架的含义。在软件工程中&#xff0c;框架往往被定义为整个或部分系统的可重用设计&#xff0c;是一个可重复使用的设计构件。类似于一…

leetcode1801:积压订单中的订单总数(1.2日每日一题)

迟来的元旦快乐&#xff01;&#xff01;&#xff01; 题目表述&#xff1a; 给你一个二维整数数组 orders &#xff0c;其中每个 orders[i] [pricei, amounti, orderTypei] 表示有 amounti 笔类型为 orderTypei 、价格为 pricei 的订单。 订单类型 orderTypei 可以分为两种…

电子档案利用安全控制的办法与实现

这篇文章是笔者2015年发表在《保密科学技术》第2期的一篇文章&#xff0c;时隔7年半温习了一遍之后感觉还有一定的可取之处&#xff0c;所以在结合当前档案法律法规相关要求并修改完善其中部分内容之后分享给大家。 引言 INTRODUCTION 21世纪是一个信息化高度发展的时代&#…

网站漏洞与漏洞靶场(DVWA)

数据来源 本文仅用于信息安全学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若观众因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与本人无关。 为什么要攻击网站&#xff1f;常见的网站漏洞有哪些&#xff1f; 在互联网中&#xff0c;…

Java安装详细步骤(win10)

一、下载JDK JDK下载地址&#xff1a;Java Archive | Oracle&#xff0c;下图为win10版本 二、安装过程 2.1 以管理员方式运行exe 2.2 更改JDK安装目录和目标文件夹的位置 2.3 安装完成 三、配置环境变量 3.1 快速打开环境变量设置 WinR打开运行对话框&#xff0c;输入…

【计组】CPU并行方案--《深入浅出计算机组成原理》(四)

课程链接&#xff1a;深入浅出计算机组成原理_组成原理_计算机基础-极客时间 一、Superscalar和VLIW 程序的 CPU 执行时间 指令数 CPI Clock Cycle Time CPI 的倒数&#xff0c;又叫作 IPC&#xff08;Instruction Per Clock&#xff09;&#xff0c;也就是一个时钟周期…

软件测试新手入门必看

随着软件开发行业的日益成熟&#xff0c;软件测试岗位的需求也越来越大。众所周知&#xff0c;IT技术行业一直以来都是高薪岗位的代名词&#xff0c;零基础想要转业的朋友想要进入这个行业&#xff0c;入门软件测试是最佳的途径之一。考虑到大多数软件测试小白对这个行业的一片…

动态规划——树形dp

树形dp 文章目录树形dp概述树形dp 路径问题树的最长路径思路代码树的中心换根DP思路代码数字转换思路代码树形dp 有依赖的背包二叉苹果树思路代码树形dp 状态机没有上司的舞会思路代码战略游戏思路代码皇宫看守思路代码总结概述 树形 DP&#xff0c;即在树上进行的 DP。由于…