参考赵班长的unixhot以及马亮blog

笔者QQ572891887

Linux架构交流群:471443208

1.1Mesos简介

Mesos是Apache下的开源分布式资源管理框架,它被称为分布式系统的内核。Mesos最初是由加州大学伯克利分校的AMPLab开发,后在Twitter得到广泛使用。

Mesos-Master:主要负责管理各个framework和slave,并将slave上的资源分配给各个framework。

Mesos-Slave:负责管理本节点上的各个mesos-task,比如:为各个executor分配资源。

Framework:计算框架,如:Hadoop、Spark、Kafaka、ElasticSerach等,通过MesosSchedulerDiver接入Mesos

Executor:执行器,就是安装到每个机器节点的软件,这里就是利用docker的容器来担任执行器的角色。具有启动销毁快,隔离性高,环境一致等特点。

Mesos-Master是整个系统的核心,负责管理接入Mesos的各个framework(由frameworks_manager管理)和slave(由slaves_manager管理),并将slave上的资源按照某种策略分配给framework(由独立插拔模块Allocator管理)。

Mesos-Slave负责接受并执行来自Mesos-master的命令、管理节点上的mesos-task,并为各个task分配资源。Mesos-slave将自己的资源量发送给mesos-master,由mesos-master中的Allocator模块决定将资源分配给哪个framework,当前考虑的资源有CPU和内存两种,也就是说,Mesos-slave会将CPU个数的内存量发送给mesos-master,而用户提交作业时,需要指定每个任务需要的CPU个数和内存。这样:当任务运行时,mesos-slave会将任务放导包含固定资源Linux container中运行,以达到资源隔离的效果。很明显,master存在单点故障问题,为此:Mesos采用了Zookeeper解决该问题。

Framework是指外部的计算框架,如果Hadoop、Mesos等,这些计算框架可通过注册的方式接入Mesos,以便Mesos进行统一管理和资源分配。Mesos要求可接入的框架必须有一个调度模块,该调度器负责框架内部的任务调度。当一个framework想要接入Mesos时,需要修改自己的调度器,以便向Mesos注册,并获取Mesos分配给自己的资源,这样再由自己的调度器将这些资源分配给框架中的任务,也就是说,整个Mesos系统采用了双层调度框架:第一层,由Mesos将资源分配给框架。第二层,框架自己的调度器将资源分配给自己内部的任务。当前Mesos支持三中语言编写的调度器,分别是C++、Java、Python。为了向各种调度器提供统一的接入方式,Mesos内部采用C++实现了一个MesosSchedulerDriver(调度驱动器),framework的调度器可调用该driver中的接口与Mesos-master交互,完成一系列功能(如注册,资源分配等。)

Executor主要用于启动框架内部的task。由于不同的框架,启动task的接口或者方式不同,当一个新的框架要接入mesos时,需要编写一个Executor,告诉Mesos如何启动该框架中的task。为了向各种框架提供统一的执行器编写方式,Mesos内部采用C++实现了一个MesosExecutorDiver(执行器驱动器),framework可通过该驱动器的相关接口告诉Mesos启动task的方式。

整体架构如图1.1-1所示

图1.1-1总体架构

图1.1-1展示了Mesos的重要组成部分,Mesos由一个master进程管理运行着每个客户端节点的slave进程和跑任务的Mesos计算框架。

Mesos进程通过计算框架可以很细致的管理cpu和内存等,从而提供资源。每个资源提供都包含了一个清单(slave ID,resource1:amount1,resource2,amount2,…)master会根据现有的资源决定提供每个计算框架多少资源。例如公平分享或者根据优先级分享。

为了支持不同种的政策,master通过插件机制新增额一个allocation模块使之分配资源更简单方便。

一个计算框架运行在两个组建之上,一个是Scheduler,他是master提供资源的注册中心,另一个是Executor程序,用来发起在slave节点上运行计算框架的任务。master决定给每个计算框架提供多少计算资源,计算框架的调度去选择使用哪种资源。当一个计算框架接受了提供的资源,他会通过Mesos的任务描述运行程序。Mesos也会在相应的slave上发起任务。

资源提供案例,如图1.1-2所示

图1.1-2资源提供案例

下面我带大家一起熟悉图1.1-2的流程步骤

1、slave1报告给master他拥有4核cpu和4G剩余内存,Marathon调用allocation政策模块,告诉slave1计算框架1应该被提供可用的资源。

2、master给计算框架1发送一个在slave上可用的资源描述。

3、计算框架的调度器回复给master运行在slave上两个任务相关信息,任务1需要使用2个CPU,内存1G,任务2需使用1个CPU,2G内存。

4、最后,master发送任务给slave,分配适当的给计算框架执行器,继续发起两个任务(图1.1-2虚线处),因为任有1个CPU和1G内存未分配,allocation模块现在或许提供剩下的资源给计算框架2。

除此之外,当任务完成,新的资源成为空闲时,这个资源提供程序将会重复。

1.2Zookeeper简介

Zookeeper是一个分不是的,开放源码的分布式应用程序协调服务,是Google的Chuby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个分布式应用提供一致性服务的软件,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。

1.2.1Zookeeper角色

Leader(领导者):负责投票发起和决议,更新系统状态。

follower(跟随者):Follower用于接收客户请求并向客户端返回结果,在选主过程中参与投票。

ObServer(观察者):ObServer可以接受客户端连接,将写请求转发给Leader节点,但ObServer不参加投票过程,只同步Leader的状态,ObServer的目的是为了拓展系统,提高读取速度。

Client(客户端):请求发起方。

1.2.2Zookeeper工作原理

Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和Leader的状态同步以后,回复模式就结束了。状态同步保证了Leader和Server具有相同的系统状态。

为了保证事物的顺序一致性,Zookeeper采用了递增的事物ID号(zxid)来标识事物。所有的提议(proposal)都在被提出的时候加上了zxid。实现中zxid是一个64位的数字,它高32位是epoch用来标识Leader关系是否改变,每次一个Leader被选出来,它都会有每一个Server在工作过程中三中状态。

q   LOOKING:当前Server不知道Leader是谁,正在搜寻。

q   LEADING:当前Server即为选举出来的Leader。

q   FOLLOWING:Leader已经选举出来,当前Server与之同步。

1.2.3Zookeeper选主流程

当Leader崩溃或者Leader失去大多数的Follower,这时候zk进入恢复模式,恢复模式需要重新选举出一个新的Leader,让所有的Server都恢复到一个正确的状态。

ZK的选举算法有两种:

1、基于Basic paxos实现

2、基于fast paxos算法实现

系统默认的选举算法为fast paxos。

1.2.4Zookeeper同步流程

选完Leader以后,zk就进入状态同步过程。

1)Leader等待server连接。

2)Follower连接Leader,将最大的zxid发送给Leader。

3)Leader根据Follower的zxid确定同步点。

4)完成同步后通知Follower已经成为uptodate状态。

5)Follower收到uptodate消息后,又可以重新接受client的请求进行服务。

1.2.5Zookeeper工作流程

Leader三大功能:

1)恢复数据

2)维持与learner的心跳,接收learner请求并判断learner的请求消息类型

3)learner的消息类型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根据不同的消息类型,进行不同的处理。

PING消息是指Learner的心跳信息;REQUEST消息是Follower发送的提议信息,包括写请求及同步请求;ACK消息是Follower的对提议的回复,超过半数的Follower通过,则commit该提议;REVALIDATE消息是用来延长SESSION有效时间。

Follower主要四大功能:

1)向Leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息)。

2)接收Leader消息并进行处理。

3)接收Client的请求,如果为写请求,发送给Leader进行投票。

4)返回Client结果。

Follower的消息循环处理如下几种来自Leader的消息:

1)PING消息:心跳消息。

2)PROPOSAL消息:Leader发起的提案,要求Follower投票。

3)COMMIT消息:服务器端最新一次提案的信息。

4)UPTODATE消息:表明同步完成。

5)REVALIDATE消息:根据Leader的REVALIDATE结果,关闭待revalidate的session还是允许其接受消息。

6)SYN消息:返回SYNC结果到客户端,这个消息最初由客户端发起,用来强制得到最新的更新。

1.3Marathon简介

Marathon是一个Mesos框架,能够支持运行长服务,比如Web应用等。它是集群的分布式init.d能够原样运行任何Linux二进制发布版本,如Tomcat、Play等等。它也是一种私有的PaSS,实现服务的发现,为部署提供REST API服务,有授权和SSL、配置约束,通过HaProxy实现服务发现和负载平衡。

1.4docker集群实践

1.4.1集群环境准备

主机名

IP地址(Host-Only)

描述

linux-node1.com

eth0:192.168.56.11

Mesos Master、Mesos Slave、Marathon

linux-node2.com

eth0:192.168.56.12

Zookeeper、Mesos Slave

备注

Zookeeper使用伪分布式不是,也就是一台虚拟机上启动三个不同端口的Zookeeper实例

Linux-node1实践环境

[root@linux-node1 ~]# cat /etc/redhat-release #查看系统版本

CentOS Linux release 7.1.1503 (Core)

[root@linux-node1 ~]# uname -r #查看内核信息

3.10.0-229.el7.x86_64

[root@linux-node1 ~]#  getenforce#检测selinux是否关闭

Permissive

[root@linux-node1 ~]# systemctl stop firewalld #关闭firewall防火墙

Linux-node2实践环境

[root@linux-node2 ~]# cat /etc/redhat-release #查看系统版本

CentOS Linux release 7.1.1503 (Core)

[root@linux-node2 ~]# uname -r #查看内核信息

3.10.0-229.el7.x86_64

[root@linux-node2 ~]#  getenforce
#检测selinux是否关闭

Permissive

[root@linux-node2 ~]# systemctl stop firewalld #关闭firewall防火墙

1.4.2Zookeeper伪集群安装部署

部署Zookeeper需要java支持, 主流1.7,稳定最新1.8,开发最新1.9,这边选择yum安装即可支持Zookeeper

[root@linux-node2 ~]# yum install -y java  #安装java

[root@linux-node2 ~]# cd /usr/local/src/ #进入源码安装目录

[root@linux-node2 src]# wget
http://mirrors.cnnic.cn/apache/zookeeper/stable/zookeeper-3.4.8.tar.gz #下载Zookeeper稳定版3.4.8

[root@linux-node2 src]# tar xf
zookeeper-3.4.8.tar.gz  #解压Zookeeper

[root@linux-node2 src]# mv zookeeper-3.4.8
/usr/local/ #将Zookeeper移动/usr/local/

[root@linux-node2 src]# ln -s
/usr/local/zookeeper-3.4.8/ /usr/local/zookeeper #给Zookeeper做一个软链接,方便以后升级等操作

1.4.2.1Zookeeper配置文件详解

由于是伪集群的配置方式,B(IP地址)都是一样,所以不同的Zookeeper实例通信端口号不能一样,所以要给它分配不同的端口号。

[root@linux-node2 src]# cd /usr/local/zookeeper/conf/ #进入Zookeeper配置文件目录

[root@linux-node2 conf]# mv zoo_sample.cfg zoo.cfg #重新命名为zoo.cfg

[root@linux-node2 conf]# cat zoo.cfg

tickTime=2000 #Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳。

initLimit=10个心跳的时间秒。

syncLimit=5 #表示Leader与Follower之间发送消息时请求和应答时间长度,最长不能超过多少个tickTime的时间长度,总的时间长度就是2*2000=4秒。

dataDir=/tmp/zookeeper #数据存放目录

clientPort=2181 #客户端连接端口

#maxClientCnxns=60 ,但是有的团队将几十个应用全部部署到一台机器上,以方便测试,这样这个数值就会超过。

#autopurge.purgeInterval=1 或更大的整数,默认是0,表示不开启自己清理功能。

#autopurge.snapRetainCount=3 个。

server.A=B:C:D:

A:#代表一个数字,表示这个是几号服务器。

B:#代表服务器的IP地址。

C:#代表服务器与集群中的Leader服务器交换信息的端口。

D:#如果集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。

1.4.2.2Zookeeper配置文件修改

由于是伪集群的配置方式,B(IP地址)都是一样,所以不同的Zookeeper实例通信端口号不能一样,所以要给它分配不同的端口号。

[root@linux-node2 conf]# grep '^[a-z]' zoo.cfg#过滤出修改好的配置

tickTime=2000

initLimit=10

syncLimit=5

dataDir=/data/zk1

clientPort=2181

server.1=192.168.56.12:3181:4181

server.2=192.168.56.12:3182:4182

server.3=192.168.56.12:3183:4183

1、创建三个目录来存放Zookeeper的数据

[root@linux-node2 conf]# mkdir -p
/data/{zk1,zk2,zk3}

[root@linux-node2 conf]# echo "1" > /data/zk1/myid

[root@linux-node2 conf]# echo "2" > /data/zk2/myid

[root@linux-node2 conf]# echo "3" >
/data/zk3/myid

2、生成三份Zookeeper配置文件

[root@linux-node2 conf]# pwd

/usr/local/zookeeper/conf

[root@linux-node2 conf]# cp zoo.cfg zk1.cfg

[root@linux-node2 conf]# cp zoo.cfg zk2.cfg

[root@linux-node2 conf]# cp zoo.cfg zk3.cfg

3、修改zk2、zk3对应的数据存放目录以及端口

[root@linux-node2 conf]# pwd

/usr/local/zookeeper/conf

[root@linux-node2 conf]# sed -i 's#zk1#zk2#g' zk2.cfg

[root@linux-node2 conf]# sed -i 's#zk1#zk3#g'
zk3.cfg

[root@linux-node2 conf]# sed -i 's#2181#2182#g'
zk2.cfg

[root@linux-node2 conf]# sed -i 's#2181#2183#g'
zk3.cfg

1.4.2.3Zookeeper角色查看

1、启动Zookeeper并查看角色

[root@linux-node2 conf]# /usr/local/zookeeper/bin/zkServer.sh
start /usr/local/zookeeper/conf/zk1.cfg #启动zk1

ZooKeeper JMX enabled by default

Using config: /usr/local/zookeeper/conf/zk1.cfg

Starting zookeeper ... STARTED

[root@linux-node2 conf]# /usr/local/zookeeper/bin/zkServer.sh
start /usr/local/zookeeper/conf/zk2.cfg #启动zk2

ZooKeeper JMX enabled by default

Using config: /usr/local/zookeeper/conf/zk2.cfg

Starting zookeeper ... STARTED

[root@linux-node2 conf]# /usr/local/zookeeper/bin/zkServer.sh
start /usr/local/zookeeper/conf/zk3.cfg #启动zk3

ZooKeeper JMX enabled by default

Using config: /usr/local/zookeeper/conf/zk3.cfg

Starting zookeeper ... STARTED

[root@linux-node2 conf]# /usr/local/zookeeper/bin/zkServer.sh
status /usr/local/zookeeper/conf/zk1.cfg

ZooKeeper JMX enabled by default

Using config: /usr/local/zookeeper/conf/zk1.cfg

Mode: follower #zk1当前状态Follower

[root@linux-node2 conf]# /usr/local/zookeeper/bin/zkServer.sh
status /usr/local/zookeeper/conf/zk2.cfg

ZooKeeper JMX enabled by default

Using config: /usr/local/zookeeper/conf/zk2.cfg

Mode: leader #zk2当前状态Leader

[root@linux-node2 conf]# /usr/local/zookeeper/bin/zkServer.sh
status /usr/local/zookeeper/conf/zk3.cfg

ZooKeeper JMX enabled by default

Using config: /usr/local/zookeeper/conf/zk3.cfg

Mode: follower #zk3当前状态Follower

2、连接Zookeeper

[root@linux-node2 conf]# /usr/local/zookeeper/bin/zkCli.sh
-server 192.168.56.12:2181

1.5Mesos集群部署

安装Mesosphere仓库,需要在Mesos Master和Mesos Slave节点安装

1.5.1Mesos_Master部署

[root@linux-node1 ~]# rpm -ivh http://repos.mesosphere.com/el/7/noarch/RPMS/mesosphere-el-repo-7-1.noarch.rpm
#node1安装Mesosphere仓库

[root@linux-node1 ~]# yum -y install mesos
marathon #安装Mesos和Marathon

[root@linux-node1 ~]# cat /etc/mesos/zk #增加Zookeeper配置

zk://192.168.56.12:2181,192.168.56.12:2182,192.168.56.12:2183/mesos

[root@linux-node1 ~]# systemctl enable
mesos-master mesos-slave marathon #加入开机启动 Mesos-master slave Marathon

[root@linux-node1 ~]# systemctl start
mesos-master mesos-slave marathon #启动Mesos-master
slave Marathon

1.5.2Mesos_Slave部署

[root@linux-node2 ~]# rpm -ivh
http://repos.mesosphere.com/el/7/noarch/RPMS/mesosphere-el-repo-7-1.noarch.rpm #node2安装Mesosphere仓库

[root@linux-node2 ~]# yum -y install mesos #安装Mesos

[root@linux-node2 ~]# systemctl start mesos-slave #启动Mesos-slave

1.5.3Mesos_Web界面

访问:http://192.168.56.11:5050如图1.5-1所示

图1.5-1Tasks表格没有任何条目

运行Mesos任务,可以在Web界面查看task如图1.5-2所示

[root@linux-node1 ~]# MASTER=$(mesos-resolve `cat
/etc/mesos/zk`)

[root@linux-node1 ~]# mesos-execute
--master=$MASTER --name="cluster-test"--command="sleep 60"

图1.5-2运行Mesos任务

1.5.4Marathon调用Mesos运行Docker容器

[root@linux-node1 ~]# yum -y install docker #安装Docker

[root@linux-node1 ~]# systemctl enable docker #Docker加入开机自启动

[root@linux-node1 ~]# systemctl start docker #启动Docker容器

[root@linux-node1 ~]# docker pull nginx #pull一个nginx镜像

linux-node1:再所有mesos-slave上增加配置参数,并重启

[root@linux-node1 ~]# echo 'docker,mesos' | tee
/etc/mesos-slave/containerizers

[root@linux-node1 ~]# systemctl restart
mesos-slave #重启Mesos-slave

linux-node2: 再所有mesos-slave上增加配置参数,并重启

[root@linux-node2 ~]# echo 'docker,mesos' | tee
/etc/mesos-slave/containerizers

[root@linux-node2 ~]# systemctl restart
mesos-slave #重启Mesos-slave

通过marathon默认监听8080端口,通过marathon创建项目,如图1.5-3所示

图1.5-3Marathon界面

下面通过Mesos调度,使用marathon来创建一个nginx镜像的Docker容器,Marathon启动时会读取/etc/mesos/zk配置文件,Marathon通过Zookeeper来找到Mesos Master。

Marathon有自己的REST API,我们通过API的方式来创建一个Nginx的Docker容器。首先创建如下的配置文件nginx.json

[root@linux-node1 ~]# cat nginx.json

{

"id":"nginx",

"cpus":0.2,

"mem":32.0,

"instances": 1,

"constraints": [["hostname",
"UNIQUE",""]],

"container": {

"type":"DOCKER",

"docker": {

"image": "nginx",

"network": "BRIDGE",

"portMappings": [

{"containerPort": 80,
"hostPort": 0,"servicePort": 0, "protocol":
"tcp" }

]

}

}

}

使用curl的方式调用

[root@linux-node1 ~]# curl -X POST
http://192.168.56.11:8080/v2/apps -d @/root/nginx.json -H "Content-type:
application/json"

[root@linux-node1 ~]# docker ps -a #查看通过API和手动创建的容器

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                            NAMES

1231814cd679        nginx               "nginx -g 'daemon
off"   56 seconds ago      Up 55 seconds       443/tcp, 0.0.0.0:31011->80/tcpmesos-16f943e5-be56-4254-858e-6347b89779de-S0.c47be185-eafc-4bd6-b0ca-e13e4536440b

访问Docker随机启动的端口31011,如图1.5-4所示

图1.5-4成功访问Nginx界面

在MarathonWeb界面查看,如图1.5-5所示

图1.5-5MarathonWeb界面查看Nginx已经在运行

在Mesos界面查看,如图1.5-6所示

图1.5-5Mesos界面查看Nginx Tasks

也可以点击Marathon左上角的创建进行创建容器。

注意:这里哪Nginx来举例,注册中心的marathon+mesos+docker集群是不适合用于服务的,也就是说不适合于对外开放端口的。比如说爬虫,因为不开放端口,需要做的仅仅是从队列中取资源,然后处理,存库。

这个仅仅是job的发布管理运行,还有没CI,也就是说持续集成,后期我会发布jenkins+docker+mesos+marathon+git持续集成的方案,如果将代码发布结合DCO框架。

Mesos+Zookeeper+Marathon+Docker分布式集群管理最佳实践的更多相关文章

  1. 搞懂分布式技术5:Zookeeper的配置与集群管理实战

    搞懂分布式技术5:Zookeeper的配置与集群管理实战 4.1 配置文件 ZooKeeper安装好之后,在安装目录的conf文件夹下可以找到一个名为“zoo_sample.cfg”的文件,是ZooK ...

  2. Docker容器集群管理之Swarm

    Docker容器集群管理主流方案 Swarm Docker公司自研发的集群管理系统. Kubernetes Google开源的一个容器集群管理系统,用于自动化部署.扩展和管理容器应用.也称为K8S ...

  3. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.感谢 在此感谢.net ...

  4. Docker Swarm——集群管理

    前言 之前在总结docker machine的时候,当时对docker理解还不够深入,甚至还不知道 docker machine 与 docker swarm 的区别. 在查阅资料以及官方文档之后,今 ...

  5. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之集群部署环境规划(一)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.环境规划 软件 版本 ...

  6. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之自签TLS证书及Etcd集群部署(二)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.服务器设置 1.把每一 ...

  7. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之flanneld网络介绍及部署(三)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.flanneld介绍 ...

  8. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之部署master/node节点组件(四)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 1.部署master组件 ...

  9. 基于puppet分布式集群管理公有云多租户的架构浅谈

    基于puppet分布式集群管理公有云多租户的架构浅谈 一.架构介绍   在此架构中,每个租户的业务集群部署一台puppet-master作为自己所在业务集群的puppet的主服务器,在每个业务集群所拥 ...

随机推荐

  1. 微信公众号平台接口开发:基础支持,获取access_token

    新建Asp.net MVC 4.0项目 WeChatSubscript是项目UI层 WeChatTools是封装操作访问公众号接口的一些方法类库 获取AccssToken 我们要的得到AccessTo ...

  2. (C#:Socket)简单的服务端与客户端通信。

    要求:1.可以完成一对一的通信:2.实现服务端对客户端一对多的选择发送:3.可以实现服务端的群发功能:4.可以实现客户端文件的发送: 要点:服务器端:第一步:用指定的端口号和服务器的ip建立一个End ...

  3. Android基础工具函数代码集

    整理在学习研究Android开发,编写了一些基本用到的工具集,现在整理分享(后续会持续更新,有问题还请指出). 1.HttpClient工具,使用Apache的HttpClient类实现get和pos ...

  4. BZOJ 3479: [Usaco2014 Mar]Watering the Fields(最小生成树)

    这个= =最近刷的都是水题啊QAQ 排除掉不可能的边然后就最小生成树就行了= = CODE: #include<cstdio>#include<iostream>#includ ...

  5. Brackets 前端编辑器试用

    Brackets编辑器介绍 "一个现代的,开源的,了解网页设计的编辑器"这是官方的宣传语.也就是说它适用于网页开发,包含了许多亮点功能:实时预览(Live Preview).内联编 ...

  6. Asp.net mvc 4.0 高级编程 百度云下载

    Asp.net mvc 4.0 高级编程 百度云下载地址:链接:http://pan.baidu.com/s/1o6zFvOe 密码:xyss 1.基于 ASP.NET MVC4.0 + WebAPI ...

  7. SQL SERVER的统计信息

    1 什么是统计信息     统计信息 描述了 表格或者索引视图中的某些列的值 的分布情况,属于数据库对象.根据统计信息,查询优化器就能评估查询过程中需要读取的行数及结果集情况,同时也能创建高质量的查询 ...

  8. 每天一个linux命令(48)--ln命令

    ln是Linux中又一个非常重要的命令,它的功能是为某个文件在另外一个位置建立一个同步的链接,当我们需要在不同的目录,用到相同的文件时,我们不需要在每个需要的目录下都放一个相同的文件,我们只要在某个固 ...

  9. FineUIMvc随笔 - 不能忘却的回发(__doPostBack)

    声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. 用户反馈 有网友在官方论坛抛出了这么一个问题,似乎对 FineUIMvc 中的浏览器端与服务器端的交互方式很有异议. 这里面的关 ...

  10. 【webpack】-- 模块热替换

    全称是Hot Module ReplaceMent(HMR),理解成热模块替换或者模块热替换都可以吧,和.net中的热插拔一个意思,就是在运行中对程序的模块进行更新.这个功能主要是用于开发过程中,对生 ...