微服务项目的部署
练习目标
- 掌握Docker Compose编排工具的使用
- 掌握微服务项目与Docker的整合方式
- 掌握微服务项目的部署方式
项目整合参考:https://blog.csdn.net/qq_37823605/article/details/91379272
练习内容
1、Docker Compose编排工具
1.1、Docker Compose的安装与卸载
1.1.1、安装条件
Docker Compose是依赖于Docker引擎的,所以在安装Docker Compose之前要确保机器上已经安装了Docker
1.1.2、安装Compose
a)、使用curl命令从GitHub的Compose仓库拉取Docker Compose,具体指令如下:
$sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
b)、更改Docker Compose的可执行文件权限,具体操作命令如下:
$sudo chmod +x /usr/local/bin/docker-compose
$docker-compose --version
1.1.3、Compose的卸载操作,命令如下:
$sudo rm /usr/local/bin/docker-compose
1.2、Composefile文件的使用说明
Dooker Compose编排工具的使用非常简单,只需要如下三步。
(1)编写Dookerfile文件。使用Dockerfile定义应用程序的环境,这样可以在任何地方使用它,Dookefile 的作用就是为每个服务构建镜像。
(2)定义yml文件(通常是docker- compose.yml)。 就是将前面介绍的服务部署指令及相关参数都统一在该文件中编写和配置,这样就省去了针对不同服务各自运行的麻烦。
(3)运行服务部署指令。根据具体的部署需求,来执行相应的部署指令,Docker 会读即dooker- composeyml文件内容启动整个应用服务。
在上述三步中,第一步中Dockerfile文件的编写已经在第7章有过讲解,而第三步的服务部署指令会在后面服务部署环节进行说明,所以现在需要掌握的就是如何编写docker-composeym文件。接下来,将针对Compose file文件的定义和配置进行详细讲解。
这里先通过一个Compose file 文件的示例来进行展示说明,具体内容如下所示。
version: "3"
services:mysql:image: mysql:5.6restart: on-failureports:- 3306:3306volumes:- microservice-mysql:/var/lib/mysqlnetworks:- microservice-netenvironment:MYSQL_ROOT_PASSWORD: rootMYSQL_DATABASE: microservice_mallmanagementdeploy:replicas: 1restart_policy:condition: on-failureplacement:constraints: [node.role == manager]eureka-server:image: 192.168.159.143:5000/microservice-eureka-server:0.0.1-SNAPSHOTrestart: on-failureports:- 8761:8761networks:- microservice-netdeploy:replicas: 1restart_policy:condition: on-failuregateway-zuul:image: 192.168.159.143:5000/microservice-gateway-zuul:0.0.1-SNAPSHOTrestart: on-failureports:- 8050:8050networks:- microservice-netdepends_on:- eureka-serverdeploy:replicas: 1restart_policy:condition: on-failureplacement:constraints: [node.role == manager]order-service:image: 192.168.159.143:5000/microservice-orderservice:0.0.1-SNAPSHOTrestart: on-failureports:- 7900:7900networks:- microservice-netdepends_on:- mysql- eureka-serverdeploy:replicas: 2restart_policy:condition: on-failureuser-service:image: 192.168.159.143:5000/microservice-userservice:0.0.1-SNAPSHOTrestart: on-failureports:- 8030:8030networks:- microservice-netdepends_on:- mysql- eureka-serverdeploy:replicas: 2restart_policy:condition: on-failurevisualizer:image: dockersamples/visualizer:stableports:- 8081:8080volumes:- /var/run/docker.sock:/var/run/docker.sockdeploy:placement:constraints: [node.role == manager]networks:- microservice-netnetworks:microservice-net:
volumes:microservice-mysql:
2、微服务于Docker的整合
2.1、添加Dockerfile文件
在Docker中,应用都是部署在容器中的,而容器又由镜像生成,镜像则通常是通过Dockerfile文件构建的,所以微服务与Docker整合的第一步就是 要提供Dockerile文件。
在上一个项目整合中讲解整合时编写的微服务项目microservice- -mallmanagement主要有4个子项目模块(包括2个微服务模块和2个辅助服务模块),我们需要针对每一个子项目模块编写对应的Dockerfile文件。这里以用户订单管理微服务模块为例,所编写的Dockerfile文件的具体内容如下所示。
FROM java:8-jre
MAINTAINER shirx <shirx@qq.com>ADD ./target/microservice-orderservice-0.0.1-SNAPSHOT.jar /app/microservice-orderservice.jar
CMD ["java", "-Xmx200m", "-jar", "/app/microservice-orderservice.jar"]EXPOSE 7900
2.2、添加dockerfile-maven插件
Dockerfile文件编写完成后,就可以使用Docker的框关指令构建镜靠并运行容器。然后流问容器中的应用了。只是上述所有的操作都是手动完成的,如果需要部署多个服务。将会丰常项
针对这种情况MAVEN提供了一个dackerfile -maven-plugin插件,很好地支持了与Docker的整合。该插件的使用非常简单,只需要在所有需要生成Docker容器项目的pom文件中添加该插件,并进行一些相关配置即可,其具体使用示例如下。
<build><plugins><!-- dockerfile plugin --><plugin><groupId>com.spotify</groupId><artifactId>dockerfile-maven-plugin</artifactId><version>1.3.6</version><configuration><!-- 生成的镜像仓库名称 --><repository>${docker.image.prefix}/${project.artifactId}</repository><!-- 生成的镜像版本 --><tag>${project.version}</tag><!-- 推送到私有镜像仓库时需要开启安全认证 --><useMavenSettingsForAuth>true</useMavenSettingsForAuth></configuration><!-- 直接使用mvn install命令打包项目,就会自动构建镜像和推送镜像 --><executions><execution><id>default</id><phase>install</phase><goals><goal>build</goal><goal>push</goal></goals></execution></executions></plugin></plugins></build>
2.3、添加docker-compose.yml编排文件
对于个别项目,可以直接通过Docker run等指令启动容器服务,但对于多个项目服务来有必要通过Docker compose编排工具运行服务。
接下来,就为microservice-mallmanagement添加一个docker-composeyml编排文件以便后续使用Docker compose编排工具,具体如文件所示
version: "3"
services:mysql:image: mysql:5.6restart: on-failureports:- 3306:3306volumes:- microservice-mysql:/var/lib/mysqlnetworks:- microservice-netenvironment:MYSQL_ROOT_PASSWORD: rootMYSQL_DATABASE: microservice_mallmanagementdeploy:replicas: 1restart_policy:condition: on-failureplacement:constraints: [node.role == manager]eureka-server:image: 192.168.159.143:5000/microservice-eureka-server:0.0.1-SNAPSHOTrestart: on-failureports:- 8761:8761networks:- microservice-netdeploy:replicas: 1restart_policy:condition: on-failuregateway-zuul:image: 192.168.159.143:5000/microservice-gateway-zuul:0.0.1-SNAPSHOTrestart: on-failureports:- 8050:8050networks:- microservice-netdepends_on:- eureka-serverdeploy:replicas: 1restart_policy:condition: on-failureplacement:constraints: [node.role == manager]order-service:image: 192.168.159.143:5000/microservice-orderservice:0.0.1-SNAPSHOTrestart: on-failureports:- 7900:7900networks:- microservice-netdepends_on:- mysql- eureka-serverdeploy:replicas: 2restart_policy:condition: on-failureuser-service:image: 192.168.159.143:5000/microservice-userservice:0.0.1-SNAPSHOTrestart: on-failureports:- 8030:8030networks:- microservice-netdepends_on:- mysql- eureka-serverdeploy:replicas: 2restart_policy:condition: on-failurevisualizer:image: dockersamples/visualizer:stableports:- 8081:8080volumes:- /var/run/docker.sock:/var/run/docker.sockdeploy:placement:constraints: [node.role == manager]networks:- microservice-netnetworks:microservice-net:
volumes:microservice-mysql:
3、环境搭建及镜像准备
3.1、搭建Docker主机
3.2、安装应用编译工具JDK
3.3、安装应用打包工具Maven
3.3.1、下载Linux版本的Maven工具包,并解压:下载地址http://maven.apache.org/download.cgi
3.3.2、将解压包移动到自定义目录下(这里将解压包直接移动到了opt目录下)
3.3.3、配置Maven环境变量。修改/etc/profile文件,
#set maven envirment
export M2_HOME=/opt/apache-maven-3.6.1/
export M2=$M2_HOME/bin
export MAVEN_OPTS="-Xms256m -Xmx512m"
export PATH=$M2:$PATH
3.4、镜像准备
由于之前3小节中dockerfile -maven的配置,在完成打包后也会自动构建镜像并推送到指定仓库,但无论是推送到Docker Hub还是本地私有镜像仓库,必须先登录认证才可进行推送。所以为了能够自动打包、构建镜像和推送镜像,在使用mvn install 命令打包之前,除了需要预先在dockerfile -maven插件配置中配置<useMavenSettingsForAuth>标签属性值为true外,还需要在Maven的settings.xml 配置文件(参考上一小节基础环境搭建时Maven的安装位置,此示例中的地址为/opt/apache -maven-3.5.0/confsettings.xml )中配置服务认证信息,具体配置内容如下( 注意要配置在<servers>标签内)。
<id>192.168.159.143:5000</id><username>yxk</username><password>123</password>
配置完成后,就可以将微服务项目microservice-malimanagement复制到manager1 服务主机的某个工作目录下,并进入到该项目pom文件所在位置(最外层的pom文件目录),然后使用mvn install 指令进行打包(首次打包会进行pom依赖文件的下载,所以需要一定的时间)。
执行完mvn install指令后的效果如下图所示。
如果出现如上图所示的“BUILD SUCCESS"信息,就表示打包、镜像构建和推送成功。如果某个过程执行失败,也可以从终端页面查看错误信息。
当确定全部执行成功后,我们还可以实际确认。先通过docker images指令查看镜像列表中是否有生成的指定镜像,然后再次进入本地私有镜像仓库配置的挂载目录/mntregistry/docker/rogistryN2/repositories进行确认,查看生成的镜像是否也推送到了本地仓库。
4、微服务的手动部署
4.1、集群服务中的网卡选择性注册
4.1.1、使用如下命令查看集群搭建后的网络列表详情。
docker network ls
从上图可以看出,当集群环境搭建完成后,会默认增加名为docker. gwbridge 和ingress的网络。其中ingress是集群环境下所有服务默认的网络管理方式,它主要用于在不同集群节点之间实现同一个服务的负载均衡,并且会默认为所有集群服务分配一个子网进行管理,而我们搭建微服务时,会根据需求自定义以overlay为驱动的网络用于多服务之间的通信管理。
这样,在搭建的集群环境下,就会出现多网卡网络管理的情况。由于它们分别对应不同的业务管理,所以可能会使得注册到Eureka中的服务地址有偏差,从而导致服务之间的通信失败,以及API网关代理的通信失败问题。
针对这个可能出现的问题,我们需要将自定义的网络,选择性地注册到Eureka注册中心上,具体的实现过程如下。
4.1.2、根据微服务项目的需求,在集群环境下预先自定义一 个以overlay为驱动的网络进行本地集群服务网络管理,具体操作指令如下。
docker network create -d overlay --subnet 10.0.0.0/24 microservice_net
执行上述指令后,会创建一个以overlay为驱动,名为microservice-net的网络,并且通过-- subnet参数指定该自定义网络的子网地址以10.0开头。
4.1.3、在所有需要注册到Eureka 注册中心的服务(包括microservice-gateway - zuul、microservice-orderservice和microservice-userservice服务)的配置文件application.yml中,添加指定注册到Eureka中心的优选服务子网地址信息,具体内容如下。
spring:cloud:inetutils:preferred-networks:- 10.0 # 设置注册到Eureka中心的优选服务地址
上述配置中,首先使用preferred-networks设置了该服务优选的网段以10.0开头,这与上面自定义的子网地址属于同一个网段;然后设置了prefer-ip-address属性值为true,表示优选通过IP地址找到对应的服务名称。
4.1.4、修改服务部署的编排文件docker-compose.yml,将所有服务启动时的网络设置为前面预先自定义的microservice_ net 网络来进行网络管理,将修改后的编排文件重命名为docker-compose - swarm.yml,如下所示。
version: "3"
services:mysql:image: mysql:5.6restart: on-failureports:- 3306:3306volumes:- microservice-mysql:/var/lib/mysqlenvironment:MYSQL_ROOT_PASSWORD: rootMYSQL_DATABASE: microservice_mallmanagementdeploy:replicas: 1restart_policy:condition: on-failureplacement:constraints: [node.role == manager]eureka-server:image: 192.168.159.143:5000/microservice-eureka-server:0.0.1-SNAPSHOTrestart: on-failureports:- 8761:8761deploy:replicas: 1restart_policy:condition: on-failuregateway-zuul:image: 192.168.159.143:5000/microservice-gateway-zuul:0.0.1-SNAPSHOTrestart: on-failureports:- 8050:8050depends_on:- eureka-serverdeploy:replicas: 1restart_policy:condition: on-failureplacement:constraints: [node.role == manager]order-service:image: 192.168.159.143:5000/microservice-orderservice:0.0.1-SNAPSHOTrestart: on-failureports:- 7900:7900depends_on:- mysql- eureka-serverdeploy:replicas: 2restart_policy:condition: on-failureuser-service:image: 192.168.159.143:5000/microservice-userservice:0.0.1-SNAPSHOTrestart: on-failureports:- 8030:8030depends_on:- mysql- eureka-serverdeploy:replicas: 2restart_policy:condition: on-failurevisualizer:image: dockersamples/visualizer:stableports:- 8081:8080volumes:- /var/run/docker.sock:/var/run/docker.sockdeploy:placement:constraints: [node.role == manager]networks:default:external:name: microservice_net
volumes:microservice-mysql:
5、集群服务部署
5.1、登录私有仓库
docker login 192.168.159.143:5000
5.2、部署服务
注:进入为服务项目中docker-compose-swarm.yml文件所在目录下,使用docker stack deploy部署服务,具体操作如下
docker stack deploy \
> -c docker-compose-swarm.yml \
> --with-registry-auth \
> mallmanagement
5.3、查看服务列表详情
docker service ls
5.4、在集群管理节点上,使用docker stack 的相关指令查看整个微服务项目在集群节点的分配与启动情况,
docker stack ps mallmanagement
5.5、上述指令中,docker stack ps用于查看整个微服务项目在集群节点的分配与启动情况,其中的mallmanagement就是在部署集群服务时指定的服务名称。
另外,由于在集群环境下部署服务是在后台启动的,所以在Docker客户端无法查看各个服务的启动详情。这里可以在集群管理节点上通过Docker service提供的服务日志指令来进一步查看某个具体服务从启动到运行的整个日志情况,具体操作指令如下。
docker service logs -f mallmanagement_oder-service
6、微服务测试
6.1、通过visuallizer集群服务可视化工具查看服务启动情况。微服务项目部署成功后,可以通过地址http://192.168.159.143:8081/(注意这是我的项目中manager1的主机地址,读者测试时要使用自己的主机地址)查看集群服务可视化工具visualizer 界面的显示情况,效果如图所示。
6.2、通过Eureka注册中心查看服务的启动情况。我们还可以通过地址Http://192.168.159.143:8761/访问服务注册中心的情况。
6.3、将数据库数据初始化。此项目中MySQL数据库是使用Docker容器构建的,所以对MySQL数据库服务上,具体操作如下。
sudo apt install mysql-client-core-5.7
执行上述指令后,就会在当前Docker 机器上安装一一个版本为5.7的MySQL客户端(这是使用当前Ubuntu下自带的安装包进行安装的),通过该客户端我们就可以连接到刚才启动的MySQL数据库服务上,具体操作指令如下。
$ mysql -h 127.0.0.1 -uroot -P
执行上述指令并连接成功后,就可以参考第9章中的9.1.3 小节对数据库microservice_mallmanagement中的表和数据进行初始化了。
当然我们也可以不用在Docker机器上安装MySQL客户端来连接数据库进行数据操作,通过MySQL客户端连接工具(如Navicat )连接到启动的MySQL数据库的服务地址也可以进行数据库数据的初始化操作。
6.4、测试微服务。
分别连接用户管理微服务和订单管理微服务的访问地址进行测试,具体地址分别为htp:/:/192. 168.197.143:8030/swagger-ui.html和htp://192.168.197.143:7900/swagger-ui.html (读者需要根据自己项目的服务地址进行访问)。此时测试方式同https://blog.csdn.net/qq_37823605/article/details/91379272 中的Swagger-U效果测试完全一样。
6.5、测试验证API网关服务。
订单微服务接 口调用方法为http://192.168.159.143:7900/order-service/order/findOrders/1,而用户微服务接口调用方法为http://192.168.159.143:8050/order-service/order/findOrders/shitou,当使用Zuul 网关代理服务后,这两个微服务接口调用方法则分别更改为http://192.168.159.143:8050/order-service/order/findOrders/1和http://192.168.159.143:8050/order-service/order/findOrders/shitou(此时通过API网关访问其他所有的微服务时,访问者只会看到访问的是同一一个服务地址下的内容)。
7、使用Jenkuns自动部署微服务
7.1、Jenkins安装
7.1.1、下载Jenkins。官网地址:https://jenkins.io/download/
7.1.2、启动Jenkins服务
java -jar jenkins.war --httpPort=49001
7.1.3、Jenkins初始化安装。
a)初始化认证密码
b)初始化插件安装
c)创建管理员用户
7.2、Jenkins集成插件配置
7.2.1、安装Maven插件
7.2.2、系统全局插件配置
7.3、服务自动化部署
7.3.1、构建新任务
7.3.2、配置源码仓库地址 https://github.com/Datacloudeyeshot/docker.git
7.3.3、构建触发器
7.3.4、服务发布配置
7.4、自动化部署服务
7.4.1、选择Console Output查看输出信息
7.4.2、输出信息页面
7.4.3、控制台信息提示
总结:
1、集群部署过程中,创建网络检查网段是否冲突;
2、项目打包mvn install 时注意给项目包一定的执行权;
3、切换管理员用户时,注意source一下环境变量,使maven和java的环境变量生效;
4、在install过程中注意网络的连通性。
相关文章:

CSS 布局:40个教程、技巧、例子和最佳实践
前言: 布局是WEB开发一个重要的课题,进入XHTML/CSS后,使用TABLE布局的方式逐渐淡出,CSS布局以众多优点成为主流,本文将介绍40个基于CSS的web布局的资源和教程。文章的出处在http://www.noupe.com/css/css-layouts-40-t…
【仿去哪儿登录】UITextField输入时检查输入框是否为空
APP登录时,一般是是等用户输入完账号和密码后才去检查是否为空,而去哪儿登录时,在账号和密码的输入过程中,只要当账号和密码其一为空时,登录按钮立即变成不可用(图1),只有账号和密码…

sql排名语句
查询全部 select dwmc,pjdf,row_number() over(order by pjdf desc) as paiming from Sab_hhb_zhb inner join jgdx on jgdx.midSab_hhb_zhb.mid查询单个select paiming from (select mid,pjdf,row_number() over(order by pjdf desc) as paiming from Sab_hhb_zhb ) Sab_hhb_z…

Sqoop的基础应用
实验目的要求 了解ET了工具Sqoop;学会安装配置Sqoop;学会使用数据迁移框架Sqoop;使用Sqoop导入MySQL到HDFS和Hive;使用Sqoop导出HDFS数据到MySQL; 实验环境 Java jdk 1.7;apache-maven-3.6.0;…

hadoop程序MapReduce之SingletonTableJoin
需求:单表关联问题。从文件中孩子和父母的关系挖掘出孙子和爷奶关系 样板:child-parent.txt xiaoming daxiong daxiong alice daxiong jack 输出:xiaoming alice xiaoming jack 分析设计: mapper部分设计: 1、<k1,…
Android网络框架Volley的快速使用
一.基本使用 之前做Android开发都是使用学长自己封装好的网络请求框架,第三方网络框架也很多,网上搜索了一下,大多数人推荐使用 android-async-httpokhttpVolley 其中Volley是Google推出了官方的针对Android平台上的网络通信库,能…

浏览器版本过低
http://study.163.com/common/errors/notSupported.htm <div class"wb f-cb"> <a href"http://www.google.cn/intl/zh-CN/chrome/browser/" class"g f-hide" target"_blank">谷歌浏览器</a> <a href"http:/…

Spark的基础应用
目的要求 搭建Spark集群环境;Spark集群的启动、浏览与关闭;使用Eclipse编写Spark应用程序包;如何运行Spark任务; 实验环境 Java jdk 1.7;apache-maven-3.6.0;Eclipse;Apache_Hadoop集群&#…

HDU-2084 数塔 经典dp,水
1、HDU-2084 数塔 2、链接:http://acm.hdu.edu.cn/showproblem.php?pid2084 3、总结:从下往上推,最后归于顶点。方程为 dp[i][j] max(dp[i1][j],dp[i1][j1])a[i][j] #include<iostream> #include<cstring> #include<…
[16] 螺旋面(Spire)图形的生成算法
顶点数据的生成 1 bool YfBuildSpireVertices2 (3 Yreal radius, 4 Yreal assistRadius, 5 Yreal height, 6 Yuint slices,7 Yuint s…
iOS的页面跳转
1.通过NavigationController跳转 这个方式适用于根视图为NavigationController的控制器,首先,在storyboard中给跳转的目标控制器视图设置Identifier,名字自定,我这里直接使用Controller对应的名字,如图1:需…
最新Java面试题答案
JAVA基础 JAVA中的几种基本类型,各占用多少字节? 下图单位是bit,非字节 1B8bit String能被继承吗?为什么? 不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改…

fedora装机后要运行的脚本(原创)
脚本:sh.sh 1 #!/bin/zsh2 #安装rpmfusion源3 dnf config-manager --add-repohttp://repo.fdzh.org/FZUG/FZUG.repo4 #安装一下有用的一些软件包5 yum -y install yum-fastestmirror 6 yum -y install unrar7 yum -y install thunderbird8 yum -y install emacs9 yum -y instal…
【Android】FragmentTabHost实现底部Tab菜单选项
以前实现类似微博底部菜单使用的是TabHostActivity来实现,但是使用的时候提醒已经被弃用,现在我们可以通过FragmentTabHostFragment来实现。下面就是demo: 1.main_activity.xml 主布局文件。 <LinearLayout xmlns:android"http://sc…

mysql远程访问,修改root密码
mysql -uroot -p #input password use mysql; update user set host% where userroot; flush privileges; #ok 密码root密码也可以改: 先停止正在运行的mysql实例,在配置文件/etc/my.cnf里面加入 skip-grant-tables, 重新启动Mysql 或者使用…
java面试题2019 答案
Java 面试随着时间的改变而改变。在过去的日子里,当你知道 String 和 StringBuilder 的区别(String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象。因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String…

android layout analyze
adapterapientityhandleruiuntilwidgetappContent.java *************************************图片:drawable:存放各种位图文件,(.png,.jpg,.9png,.gif等)除此之外可能是一些其他的drawable类型的XML文件m…

【转】iOS开发学习计划
转自:简书 一、C语言基础 基本数据类型、基本运算、函数、数组、字符串、指针、结构体、预处理指令、枚举、文件操作、内存管理 二、Objective-C 1、Objective-C基本语法 数据类型、表达式、变量、循环结构、选择结构 2、Objective-C面向对象 类、对象、继承、自省…

[置顶] 单例模式lua实现
--[[优点一、实例控制单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。二、灵活性因为类控制了实例化过程,所以类可以灵活更改实例化过程。缺点一、开销虽然数量很少,但如果每次对象请求引用时都要检查…

我在CSDN的第一个1024
1024程序员节日历史 2002年,俄罗斯程序员Valentin Balt收集签名,向俄罗斯联邦政府请愿将9月13日设定为程序员节。 2009年9月11日,俄罗斯总统梅德韦杰夫在节日安排方案上签了名,“程序员节”从此成为了俄罗斯的一个正式节日。除了俄…

【转】判断UIViewController是否正在显示
最近做一个项目,要判断某个ViewController是否正在与用户交互、显示,百度了一下,这篇文章解决了我的问题,故转之:http://edsioon.me/if-uiviewcontroller-is-display/ 某些情况下,需判断当前ViewController…

c#中如何跨线程调用windows窗体控件?
我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。首先来看传统方法: public partial class Form1 : Form{public Form1(){InitializeCompone…

poj 1964 Cow Cycling(dp)
/* 一开始想的二维的 只维护第几只牛还有圈数 后来发现每只牛的能量是跟随每个状态的 所以再加一维 f[i][j][k]表示第i只牛 领跑的j全 已经消耗了k体力 转移的话分两类 1.换一只牛领跑 那么就从f[i][j][k]转移到f[i1][j][j] 2.不换 那就枚举i领跑几圈l f[i][j-l][k-l*l]转移到…
高级网络配置《 bond team桥接 》的建立
bond 资料详情 一、链路聚合:以太网链路聚合简称链路聚合,它通过将多条以太网物理链路捆绑在一起成为一条逻辑链路,从而实现增加链路带宽的目的。同时,这些捆绑在一起的链路通过相互间的动态备份,可以有效地提高链路…
iOS通过CAShapeLayer和UIBezierPath画环形进度条
UIBezierPath可以绘制矢量路径,而CAShapeLayer是Layer的子类,可以在屏幕进行绘制,本文主要思想是:CAShapeLayer按照UIBezierPath的矢量路径进行绘制。 效果图如图: 方法如下: interface ViewController ()…

这些云计算技术你了解过哪几种
新霸哥发现目前信息量高速增长的今天,IT行业正在面临着空间和成本等资源的巨大压力,但是随着这些需求的日益增长,在行业中出现了一类全新的解决方案,通过云计算技术对数据中心进行改造。要获得云计算的优势,必须在it基…

Tomcat官方文档关于数据源配置的内容
虽然有网上有网友自己总结的文章,但说明得总是不够清晰,还是参考官方文档理解得比较透彻: http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html 转载于:h…
利用kickstart自动安装虚拟机
虚拟机的手动安装 下载dhcp服务 systemctl stop firewalld getenforce setenforce 0 关闭防火墙 图中最后面添加一个 } yum install systemctl-4.05-8.el7.x86_64 rpm -ql syslinux rpm -ql tftp-server 在挂载…

第17章 使用iSCSI服务部署网络存储
章节概述: 本章节将分析SCSI与iSCSI技术结构的不同,了解iSCSI技术的优势、SAN存储网络技术结构以及iSCSI HBA卡的作用。 完整演示部署iSCSI target服务程序的方法流程:创建RAID阵列(5)后使用targetcli命令发布到iSCSI存储目录并创建ACL列表。…
【仿去哪儿】骆驼动画加载
简单的实现正在加载的动画,比较粗糙,没有实现后面的旋转地球。图一为去哪儿的截图,图二为本文实现的效果 图1 图2 一、新建LoadView继承自UIView,声明几个方法,这样在项目需要用到时,直接调用就行ÿ…