热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:利用Ansible来做tomcat应用的持续交付

本文由编程笔记#小编为大家整理,主要介绍了利用Ansible来做tomcat应用的持续交付相关的知识,希望对你有一定的参考价值。
本文由编程笔记#小编为大家整理,主要介绍了利用 Ansible 来做 tomcat 应用的持续交付相关的知识,希望对你有一定的参考价值。


利用 Ansible 来做 tomcat 应用的持续交付

在做持续交付这件事,想必大家都是用 Jenkins 这款程序来做基石。当然,我们这次也是用 Jenkins作为承载工具,Jenkins强大的插件是有目共睹的,有些 ansible 做起来不容易的事情交给 Jenkins 反而简单有效。下面我会详细说明怎么持续交付tomcat应用。


应用架构

本次使用的应用架构是常见的负载均衡实例。

利用 Ansible 来做 tomcat 应用的持续交付


软件版本

os:centos 6.7 X64
ansible: 2.3.1.0
python: 2.6.6
ant: 10.1
java: 1.8.0_13
tomcat: 8.5.14
Jenkins: 2.73


服务器角色























主机 角色
node1 nginx,jenkins
node130 tomcat
node131 tomcat

集群搭建

本次使用anisble playbook

---
- hosts: node130 node131
vars:
- java_version: "1.8"
- tomcat_version: "8.5.14"
- iptables_allowed_tcp_ports: ["8080"]
roles:
- java
- { role: tomcat, java_home: "/usr/java/jdk1.8.0_131" }
- iptables
- hosts: node1
vars:
- java_version: "1.8"
- nginx_version: "1.12.1"
- nginx_upstreams:
- name: upstremtest
servers:
- 192.168.77.130:8080 max_fails=2 fail_timeout=2
- 192.168.77.131:8080 max_fails=2 fail_timeout=2
- nginx_vhosts:
- listen: 80
locations:
- name: /
proxy_pass: http://upstremtest
- jenkins_version: "2.73"
- jenkins_plugins_extra:
- ansible
- ansicolor
- iptables_allowed_tcp_ports: ["80","8080"]
roles:
- ant
- java
- nginx
- jenkins
- iptables
tasks:
- name: install ansible
package: name=ansible

确保正常访问以下服务:



  • nginx http://192.168.77.129/lework


  • jenkins http://192.168.77.129:8080 帐号密码:admin/admin


  • tomcat http://192.168.77.130:8080/lework http://192.168.77.131:8080/lework



node1服务器操作

在服务器上配置 ansible playbook

# cd /etc/ansible/
# cat tomcat-deploy.yml
---
- hosts: all
serial: 1
roles:
- deploy-tomcat
# cat hosts
[node130]
192.168.77.130
[node131]
192.168.77.131
[testservers:children]
node130
node131
[testservers:vars]
ansible_ssh_user=root
ansible_ssh_pass=123456
# git clone https://github.com/kuailemy123/Ansible-roles.git /etc/ansible/roles/
# chown jenkins.jenkins /etc/ansible/

jenkins 操作

登录jenkins之后,设置工具
点击“系统管理”==》“Global Tool Configuration”

利用 Ansible 来做 tomcat 应用的持续交付

利用 Ansible 来做 tomcat 应用的持续交付

利用 Ansible 来做 tomcat 应用的持续交付

创建发布项目
利用 Ansible 来做 tomcat 应用的持续交付

配置参数化构建

利用 Ansible 来做 tomcat 应用的持续交付

利用 Ansible 来做 tomcat 应用的持续交付



repo: https://github.com/kuailemy123/AntSpringMVC.git


配置构建环境

利用 Ansible 来做 tomcat 应用的持续交付

配置编译

利用 Ansible 来做 tomcat 应用的持续交付

配置ansible

利用 Ansible 来做 tomcat 应用的持续交付

配置ansible变量

利用 Ansible 来做 tomcat 应用的持续交付

这里就不配置邮件通知了。

创建回滚项目

利用 Ansible 来做 tomcat 应用的持续交付

配置参数化构建

利用 Ansible 来做 tomcat 应用的持续交付

配置构建环境

利用 Ansible 来做 tomcat 应用的持续交付

配置ansible

利用 Ansible 来做 tomcat 应用的持续交付

配置anisble变量

利用 Ansible 来做 tomcat 应用的持续交付


测试

执行tomcat_deploy任务



选择发布的节点,默认all


任务执行的日志

Started by user admin
Building in workspace /var/lib/jenkins/workspace/tomcat_deploy
Cloning the remote Git repository
Cloning repository https://github.com/kuailemy123/AntSpringMVC.git
> git init /var/lib/jenkins/workspace/tomcat_deploy # timeout=10
Fetching upstream changes from https://github.com/kuailemy123/AntSpringMVC.git
> git --version # timeout=10
> git fetch --tags --progress https://github.com/kuailemy123/AntSpringMVC.git +refs/heads/*:refs/remotes/origin/*
> git config remote.origin.url https://github.com/kuailemy123/AntSpringMVC.git # timeout=10
> git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10
> git config remote.origin.url https://github.com/kuailemy123/AntSpringMVC.git # timeout=10
Fetching upstream changes from https://github.com/kuailemy123/AntSpringMVC.git
> git fetch --tags --progress https://github.com/kuailemy123/AntSpringMVC.git +refs/heads/*:refs/remotes/origin/*
> git rev-parse refs/remotes/origin/master^{commit} # timeout=10
> git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
Checking out Revision 989ea3a6549e16e3dd4cd329ab969b47658c9d67 (refs/remotes/origin/master)
Commit message: "Create README.md"
> git config core.sparsecheckout # timeout=10
> git checkout -f 989ea3a6549e16e3dd4cd329ab969b47658c9d67
First time build. Skipping changelog.
[tomcat_deploy] $ ant -file build.xml -Ddeploy_node=all
Buildfile: /var/lib/jenkins/workspace/tomcat_deploy/build.xml
clean:
[delete] Deleting directory /var/lib/jenkins/workspace/tomcat_deploy/war/WEB-INF/classes
init:
[mkdir] Created dir: /var/lib/jenkins/workspace/tomcat_deploy/target
[mkdir] Created dir: /var/lib/jenkins/workspace/tomcat_deploy/war/WEB-INF/classes
resolve:
[echo] Getting dependencies...
[ivy:retrieve] :: Apache Ivy 2.4.0 - 20141213170938 :: http://ant.apache.org/ivy/ ::
[ivy:retrieve] :: loading settings :: url = jar:file:/usr/local/ant/lib/ivy-2.4.0.jar!/org/apache/ivy/core/settings/ivysettings.xml
[ivy:retrieve] :: resolving dependencies :: org.apache#WebProject;working@node1
[ivy:retrieve] confs: [compile, runtime, test]
[ivy:retrieve] found org.slf4j#slf4j-api;1.7.6 in public
[ivy:retrieve] found jstl#jstl;1.2 in public
[ivy:retrieve] found ch.qos.logback#logback-classic;1.1.2 in public
[ivy:retrieve] found ch.qos.logback#logback-core;1.1.2 in public
[ivy:retrieve] found org.springframework#spring-core;4.1.3.RELEASE in public
[ivy:retrieve] found commons-logging#commons-logging;1.2 in public
[ivy:retrieve] found org.springframework#spring-beans;4.1.3.RELEASE in public
[ivy:retrieve] found org.springframework#spring-context;4.1.3.RELEASE in public
[ivy:retrieve] found org.springframework#spring-aop;4.1.3.RELEASE in public
[ivy:retrieve] found aopalliance#aopalliance;1.0 in public
[ivy:retrieve] found org.springframework#spring-expression;4.1.3.RELEASE in public
[ivy:retrieve] found org.springframework#spring-web;4.1.3.RELEASE in public
[ivy:retrieve] found org.springframework#spring-webmvc;4.1.3.RELEASE in public
[ivy:retrieve] downloading https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.6/slf4j-api-1.7.6.jar ...
[ivy:retrieve] ............ (28kB)
[ivy:retrieve] .. (0kB)
..... 省略下载的信息
[ivy:retrieve] :: resolution report :: resolve 74135ms :: artifacts dl 120701ms
---------------------------------------------------------------------
| | modules || artifacts |
| conf | number| search|dwnlded|evicted|| number|dwnlded|
---------------------------------------------------------------------
| compile | 13 | 13 | 13 | 0 || 13 | 13 |
| runtime | 13 | 13 | 13 | 0 || 13 | 13 |
| test | 13 | 13 | 13 | 0 || 13 | 13 |
---------------------------------------------------------------------
[ivy:retrieve] :: retrieving :: org.apache#WebProject
[ivy:retrieve] confs: [compile, runtime, test]
[ivy:retrieve] 13 artifacts copied, 0 already retrieved (5920kB/79ms)
compile:
[javac] Compiling 1 source file to /var/lib/jenkins/workspace/tomcat_deploy/war/WEB-INF/classes
copy-resources:
[copy] Copying 1 file to /var/lib/jenkins/workspace/tomcat_deploy/war/WEB-INF/classes
package:
[ivy:retrieve] :: retrieving :: org.apache#WebProject
[ivy:retrieve] confs: [runtime]
[ivy:retrieve] 0 artifacts copied, 13 already retrieved (0kB/5ms)
[war] Building war: /var/lib/jenkins/workspace/tomcat_deploy/target/helloproject-20170819172002.war
main:
BUILD SUCCESSFUL
Total time: 3 minutes 19 seconds
[tomcat_deploy] $ /usr/bin/ansible-playbook /etc/ansible/tomcat-deploy.yml -i /etc/ansible/hosts -l all -f 5 -e deploy_port=8080 -e deploy_file=/var/lib/jenkins/workspace/tomcat_deploy/target/helloproject-*.war
PLAY [all] *********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.77.130]
TASK [deploy-tomcat : check | 发布文件是否存在] ****************************************
ok: [192.168.77.130]
TASK [deploy-tomcat : check | 目标应用服务的家目录是否存在] **********************************
ok: [192.168.77.130]
TASK [deploy-tomcat : check | 工作目录如果不存在则创建] ************************************
changed: [192.168.77.130] => (item=/tmp/tomcat-ansible-snap/new)
changed: [192.168.77.130] => (item=/tmp/tomcat-ansible-snap/pre)
changed: [192.168.77.130] => (item=/tmp/tomcat-ansible-snap/old)
TASK [deploy-tomcat : deloy | 解压代码至目标服务器] **************************************
changed: [192.168.77.130]
TASK [deploy-tomcat : deloy | 关闭服务] ********************************************
changed: [192.168.77.130]
TASK [deploy-tomcat : deloy | 等待端口关闭] ******************************************
ok: [192.168.77.130]
TASK [deploy-tomcat : deloy | 移动线上代码] ******************************************
changed: [192.168.77.130]
TASK [deploy-tomcat : deloy | 部署最新代码] ******************************************
changed: [192.168.77.130]
TASK [deploy-tomcat : deloy | 启动服务] ********************************************
changed: [192.168.77.130]
TASK [deploy-tomcat : deloy | 等待端口开启] ******************************************
ok: [192.168.77.130]
TASK [deploy-tomcat : verify | 查看http状态.] **************************************
ok: [192.168.77.130]
TASK [deploy-tomcat : backup | 创建存储备份的文件夹] *************************************
changed: [192.168.77.130]
TASK [deploy-tomcat : backup | 备份上线的代码] ****************************************
changed: [192.168.77.130]
TASK [deploy-tomcat : rollback | 检查/tmp/tomcat-ansible-snap/old是否存在代码] *********
skipping: [192.168.77.130]
TASK [deploy-tomcat : rollback | 关闭服务] *****************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : rollback | 等待端口关闭] ***************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : rollback | 部署上一版代码] **************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : rollback | 启动服务] *****************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : rollback | 等待端口开启] ***************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : verify | 查看http状态.] **************************************
skipping: [192.168.77.130]
PLAY [all] *********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.77.131]
TASK [deploy-tomcat : check | 发布文件是否存在] ****************************************
ok: [192.168.77.131]
TASK [deploy-tomcat : check | 目标应用服务的家目录是否存在] **********************************
ok: [192.168.77.131]
TASK [deploy-tomcat : check | 工作目录如果不存在则创建] ************************************
ok: [192.168.77.131] => (item=/tmp/tomcat-ansible-snap/new)
ok: [192.168.77.131] => (item=/tmp/tomcat-ansible-snap/pre)
ok: [192.168.77.131] => (item=/tmp/tomcat-ansible-snap/old)
TASK [deploy-tomcat : deloy | 解压代码至目标服务器] **************************************
changed: [192.168.77.131]
TASK [deploy-tomcat : deloy | 关闭服务] ********************************************
changed: [192.168.77.131]
TASK [deploy-tomcat : deloy | 等待端口关闭] ******************************************
ok: [192.168.77.131]
TASK [deploy-tomcat : deloy | 移动线上代码] ******************************************
changed: [192.168.77.131]
TASK [deploy-tomcat : deloy | 部署最新代码] ******************************************
changed: [192.168.77.131]
TASK [deploy-tomcat : deloy | 启动服务] ********************************************
changed: [192.168.77.131]
TASK [deploy-tomcat : deloy | 等待端口开启] ******************************************
ok: [192.168.77.131]
TASK [deploy-tomcat : verify | 查看http状态.] **************************************
ok: [192.168.77.131]
TASK [deploy-tomcat : backup | 创建存储备份的文件夹] *************************************
changed: [192.168.77.131]
TASK [deploy-tomcat : backup | 备份上线的代码] ****************************************
changed: [192.168.77.131]
TASK [deploy-tomcat : rollback | 检查/tmp/tomcat-ansible-snap/old是否存在代码] *********
skipping: [192.168.77.131]
TASK [deploy-tomcat : rollback | 关闭服务] *****************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : rollback | 等待端口关闭] ***************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : rollback | 部署上一版代码] **************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : rollback | 启动服务] *****************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : rollback | 等待端口开启] ***************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : verify | 查看http状态.] **************************************
skipping: [192.168.77.131]
PLAY RECAP *********************************************************************
192.168.77.130 : ok=14 changed=8 unreachable=0 failed=0
192.168.77.131 : ok=14 changed=7 unreachable=0 failed=0
Finished: SUCCESS

执行tomcat_rollback任务



选择回滚的节点,默认all


执行的日志

Started by user admin
Building in workspace /var/lib/jenkins/workspace/tomcat_rollback
[tomcat_rollback] $ /usr/bin/ansible-playbook /etc/ansible/tomcat-deploy.yml -i /etc/ansible/hosts -l all -f 5 -e deploy_rollback=true
PLAY [all] *********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.77.130]
TASK [deploy-tomcat : check | 发布文件是否存在] ****************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : check | 目标应用服务的家目录是否存在] **********************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : check | 工作目录如果不存在则创建] ************************************
skipping: [192.168.77.130] => (item=/tmp/tomcat-ansible-snap/new)
skipping: [192.168.77.130] => (item=/tmp/tomcat-ansible-snap/pre)
skipping: [192.168.77.130] => (item=/tmp/tomcat-ansible-snap/old)
TASK [deploy-tomcat : deloy | 解压代码至目标服务器] **************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : deloy | 关闭服务] ********************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : deloy | 等待端口关闭] ******************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : deloy | 移动线上代码] ******************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : deloy | 部署最新代码] ******************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : deloy | 启动服务] ********************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : deloy | 等待端口开启] ******************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : verify | 查看http状态.] **************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : backup | 创建存储备份的文件夹] *************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : backup | 备份上线的代码] ****************************************
skipping: [192.168.77.130]
TASK [deploy-tomcat : rollback | 检查/tmp/tomcat-ansible-snap/old是否存在代码] *********
changed: [192.168.77.130]
TASK [deploy-tomcat : rollback | 关闭服务] *****************************************
changed: [192.168.77.130]
TASK [deploy-tomcat : rollback | 等待端口关闭] ***************************************
ok: [192.168.77.130]
TASK [deploy-tomcat : rollback | 部署上一版代码] **************************************
changed: [192.168.77.130]
TASK [deploy-tomcat : rollback | 启动服务] *****************************************
fatal: [192.168.77.130]: FAILED! => {"changed": true, "cmd": "/etc/init.d/tomcat start", "delta": "0:00:20.035003", "end": "2017-08-19 17:24:47.586469", "failed": true, "rc": 1, "start": "2017-08-19 17:24:27.551466", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
...ignoring
TASK [deploy-tomcat : rollback | 等待端口开启] ***************************************
ok: [192.168.77.130]
TASK [deploy-tomcat : verify | 查看http状态.] **************************************
ok: [192.168.77.130]
PLAY [all] *********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.77.131]
TASK [deploy-tomcat : check | 发布文件是否存在] ****************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : check | 目标应用服务的家目录是否存在] **********************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : check | 工作目录如果不存在则创建] ************************************
skipping: [192.168.77.131] => (item=/tmp/tomcat-ansible-snap/new)
skipping: [192.168.77.131] => (item=/tmp/tomcat-ansible-snap/pre)
skipping: [192.168.77.131] => (item=/tmp/tomcat-ansible-snap/old)
TASK [deploy-tomcat : deloy | 解压代码至目标服务器] **************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : deloy | 关闭服务] ********************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : deloy | 等待端口关闭] ******************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : deloy | 移动线上代码] ******************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : deloy | 部署最新代码] ******************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : deloy | 启动服务] ********************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : deloy | 等待端口开启] ******************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : verify | 查看http状态.] **************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : backup | 创建存储备份的文件夹] *************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : backup | 备份上线的代码] ****************************************
skipping: [192.168.77.131]
TASK [deploy-tomcat : rollback | 检查/tmp/tomcat-ansible-snap/old是否存在代码] *********
changed: [192.168.77.131]
TASK [deploy-tomcat : rollback | 关闭服务] *****************************************
changed: [192.168.77.131]
TASK [deploy-tomcat : rollback | 等待端口关闭] ***************************************
ok: [192.168.77.131]
TASK [deploy-tomcat : rollback | 部署上一版代码] **************************************
changed: [192.168.77.131]
TASK [deploy-tomcat : rollback | 启动服务] *****************************************
changed: [192.168.77.131]
TASK [deploy-tomcat : rollback | 等待端口开启] ***************************************
ok: [192.168.77.131]
TASK [deploy-tomcat : verify | 查看http状态.] **************************************
ok: [192.168.77.131]
PLAY RECAP *********************************************************************
192.168.77.130 : ok=8 changed=4 unreachable=0 failed=0
192.168.77.131 : ok=8 changed=4 unreachable=0 failed=0
Finished: SUCCESS

至此,持续交付实验就完成了,但是持续之路还是很漫长了。望大家永远前进。大家也可在发的过程中,测试发布是否是灰度发布。

for i in `seq 10000`;do curl -s -I http://192.168.77.129 | head -1;sleep 1;done;



本文转自简书,作者 lework,来源:https://www.jianshu.com/p/fca8f91ae223



近期好文推荐:




推荐阅读
  • ZooKeeper 学习
    前言相信大家对ZooKeeper应该不算陌生。但是你真的了解ZooKeeper是个什么东西吗?如果别人面试官让你给他讲讲ZooKeeper是个什么东西, ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文详细介绍了git常用命令及其操作方法,包括查看、添加、提交、删除、找回等操作,以及如何重置修改文件、抛弃工作区修改、将工作文件提交到本地暂存区、从版本库中删除文件等。同时还介绍了如何从暂存区恢复到工作文件、恢复最近一次提交过的状态,以及如何合并多个操作等。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 本文介绍了使用Python解析C语言结构体的方法,包括定义基本类型和结构体类型的字典,并提供了一个示例代码,展示了如何解析C语言结构体。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • [翻译]微服务设计模式5. 服务发现服务端服务发现
    服务之间需要互相调用,在单体架构中,服务之间的互相调用直接通过编程语言层面的方法调用就搞定了。在传统的分布式应用的部署中,服务地 ... [详细]
  • 在单位的一台4cpu的服务器上部署了esxserver,挂载了6个虚拟机,目前运行正常。在安装部署过程中,得到了cnvz.net论坛精华区 ... [详细]
  • LVS-DR直接路由实现负载均衡示例
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
author-avatar
疯狂人儿-
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有