K8s快速入门
在k8s中所有的内容都抽象为资源,资源实例化之后,叫做对象。一般使用yaml格式的文件来创建符合我们预期期望的pod,这样的yaml文件我们一般称为资源清单
资源清单的格式:
apiVersion: group/apiversion # 如果没有给定group名称,那么默认为croe,可以使用kubectl api-versions 获取当前k8s版本上所有的apiVersion版本信息(每个版本可能不同)
kind: #资源类别
metadata: #资源元数据
name
namespace #k8s自身的namespace
lables
annotations #主要目的是方便用户阅读查找
spec:期望的状态(disired state)
status:当前状态,本字段有kubernetes自身维护,用户不能去定义
使用kubectl explain 获取资源配置清单中各字段设置的帮助文档:
帮助信息中常见格式如下:
apiVersion <string> #表示字符串类型
metadata <Object> #表示需要嵌套多层字段,需要查看下一级的字段帮助信息
labels <map[string]string> #表示由k:v组成的映射
finalizers <[]string> #表示字串列表
ownerReferences <[]Object> #表示对象列表
hostPID <boolean> #布尔类型
priority <integer> #整型
name <string> -required- #如果类型后面接 -required-,表示为必填字段
----------------------------------------------------------------------------------------
一、前言
kubectl是apiserver的客户端工具,工作在命令行下,能够连接apiserver上实现各种增删改查等各种操作
kubectl官方使用文档:https://kubernetes.io/docs/reference/kubectl/overview/
二、设置kubectl输入命令自动补全
[root@k8s-master01 ~]# yum install -y bash-completion
[root@k8s-master01 ~]# source /usr/share/bash-completion/bash_completion
[root@k8s-master01 ~]# source <(kubectl completion bash)
[root@k8s-master01 ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
三、使用kubectl进行增、删、查、改等常用操作
1.查看kubectl命令帮助
[root@k8s-master01 ~]# kubectl -h
kubectl controls the Kubernetes cluster manager.
Find more information at: https://kubernetes.io/docs/reference/kubectl/overview/
Basic Commands (Beginner): #基本命令集,适合新手
create Create a resource from a file or from stdin.
expose 使用 replication controller, service, deployment 或者 pod 并暴露它作为一个 新的
Kubernetes Service
run 在集群中运行一个指定的镜像
set 为 objects 设置一个指定的特征
run-container 在集群中运行一个指定的镜像. This command is deprecated, use "run" instead Basic Commands (Intermediate): #基本命令集,适合有一定基础的人
get 显示一个或更多 resources
explain 查看资源的文档
edit 在服务器上编辑一个资源
delete Delete resources by filenames, stdin, resources and names, or by resources and label selector Deploy Commands: #发布相关的命令集
rollout Manage the rollout of a resource
rolling-update 完成指定的 ReplicationController 的滚动升级
scale 为 Deployment, ReplicaSet, Replication Controller 或者 Job 设置一个新的副本数量
autoscale 自动调整一个 Deployment, ReplicaSet, 或者 ReplicationController 的副本数量 Cluster Management Commands: #集群管理相关的命令集
certificate 修改 certificate 资源.
cluster-info 显示集群信息
top Display Resource (CPU/Memory/Storage) usage.
cordon 标记 node 为 unschedulable
uncordon 标记 node 为 schedulable
drain Drain node in preparation for maintenance
taint 更新一个或者多个 node 上的 taints Troubleshooting and Debugging Commands: #故障检测及调试相关命令集
describe 显示一个指定 resource 或者 group 的 resources 详情
logs 输出容器在 pod 中的日志
attach Attach 到一个运行中的 container
exec 在一个 container 中执行一个命令
port-forward Forward one or more local ports to a pod
proxy 运行一个 proxy 到 Kubernetes API server
cp 复制 files 和 directories 到 containers 和从容器中复制 files 和 directories.
auth Inspect authorization Advanced Commands: #高级命令集
apply 通过文件名或标准输入流(stdin)对资源进行配置
patch 使用 strategic merge patch 更新一个资源的 field(s)
replace 通过 filename 或者 stdin替换一个资源
convert 在不同的 API versions 转换配置文件 Settings Commands: #设置相关的命令集
label 更新在这个资源上的 labels
annotate 更新一个资源的注解
completion Output shell completion code for the specified shell (bash or zsh) Other Commands: #其他命令集
api-versions Print the supported API versions on the server, in the form of "group/version"
config 修改 kubeconfig 文件
help Help about any command
plugin Runs a command-line plugin
version 输出 client 和 server 的版本信息 Usage: #使用格式
kubectl [flags] [options] Use "kubectl <command> --help" for more information about a given command. #各个子命令如何获取命令帮助
Use "kubectl options" for a list of global command-line options (applies to all commands). #查看命令的通用选项(所有命令)
#可以看到,命令帮助很人性化的帮我们对各个命令做了划分,让我们可以更好的学习和使用,下面我们开始使用kubectl命令在命令行下测试相关命令的用法
2.创建一个应用程序
1)创建一个应用程序,我们使用 "kubectl run " 命令,是 "kubectl run -h" 查看命令使用帮助,命令说明告诉我们这个命令可以创建一个deployment或者job的容器(deployment和job是什么意思,我们后续再讲)
[root@k8s-master01 ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 --dry-run=true #nginx-deploy表示deployment的名称 --image表示镜像的地址 --port表示pod暴露的端口 --replicas表示副本的个数 --dry-run表示测试,不真正执行命令
NAME AGE
nginx-deploy <unknown>
[root@k8s-master01 ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 #测试发现命令正常,执行命令
deployment.apps "nginx-deploy" created #提示我们创建成功了
[root@k8s-master01 ~]# kubectl get deployment #我们查看一下deployment的信息,是否有当前创建的
NAME(名称) DESIRED(需要pod的个数) CURRENT(当前已经存在的个数) UP-TO-DATE(最新创建的pod个数) AVAILABLE(可用的pod个数) AGE(deployment存活的时间)
nginx-deploy 1 1 1 1 12s
[root@k8s-master01 ~]# kubectl get pod -o wide #获取pod的信息,-o wide 表示更详细的显示信息
NAME(pod的名称) READY(就绪的个数/总的个数) STATUS(目前的状态) RESTARTS(重启的次数) AGE(存活的时间) IP(pod的IP地址) NODE(部署在哪个节点)
nginx-deploy-7db697dfbd-qkdqp 1/1 Running 0 19s 10.244.2.2 k8s-node02
2)下面我们来访问一下这个nginx pod
集群内访问
[root@k8s-master01 ~]# curl -I 10.244.2.2 #在集群内进行访问,返回状态码为200,访问没有问题
HTTP/1.1 200 OK
Server: nginx/1.14.0
Date: Tue, 30 Oct 2018 03:20:33 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Wed, 12 Sep 2018 00:04:31 GMT
Connection: keep-alive
ETag: "5b98580f-264"
Accept-Ranges: bytes
集群外部访问

当我们在集群之外访问是发现无法访问,那么集群之外的客户端如何才能访问呢?这就需要我们的service服务了,下面我们就创建一个service,是外部客户端可以访问我们的pod
3)创建一个service
[root@k8s-master01 ~]# kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --type=NodePort #
service "nginx" exposed #使用kubectl expose 可以创建一个service ,可以使用 kubectl expose -h命令查看命令帮助,由于篇幅有限,各参数含义参考命令帮助
[root@k8s-master01 ~]# kubectl get svc -o wide #查看我们service的详细信息
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 54m <none>
nginx NodePort 10.107.16.3 <none> 80:30757/TCP 56s run=nginx-deploy #这是我们新创建service的信息,使用30757端口进行映射
使用集群外客户端再一次访问,需要使用集群任意节点的IP地址加上暴露的端口号


service服务有个特点,如果端口暴露类型为NodePort,那么可以通过集群内任意一台主机加暴露的端口进行访问
4)现在我们来删除刚刚参加的pod,看看会发生什么
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deploy-7db697dfbd-qkdqp 1/1 Running 0 2h
[root@k8s-master01 ~]# kubectl delete pod nginx-deploy-7db697dfbd-qkdqp #删除deployment下的pod
pod "nginx-deploy-7db697dfbd-qkdqp" deleted
[root@k8s-master01 ~]# kubectl get pod -w #然后迅速的查看pod状态,-w是一直等待的意思,我们可以看到pod被删除后系统又自动创建一个新的pod (deployment管理的pod会尽量一直保持我们期望的状态)
NAME READY STATUS RESTARTS AGE
nginx-deploy-7db697dfbd-46x7s 0/1 ContainerCreating 0 6s
nginx-deploy-7db697dfbd-46x7s 1/1 Running 0 15s
查看下deployment和service的状态
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deploy 1 1 1 1 2h
[root@k8s-master01 ~]# kubectl get svc #service的名称和IP没有发生改变
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2h
nginx NodePort 10.107.16.3 <none> 80:30757/TCP 1h
再一次访问service地址,看看是否可以访问成功

没有问题,为什么我们删除pod之后重新创建service还可创建成功呢?这是因为service和pod直接是使用标签来进行关联的
[root@k8s-master01 ~]# kubectl describe svc nginx #查看nginx的信息
Name: nginx
Namespace: default
Labels: run=nginx-deploy #我们看到nginx的标签为run=nginx-deploy
Annotations: <none>
Selector: run=nginx-deploy
Type: NodePort
IP: 10.107.16.3
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 30757/TCP
Endpoints: 10.244.1.2:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
[root@k8s-master01 ~]# kubectl describe pod nginx-deploy-7db697dfbd-46x7s #在看下新创建的pod信息
Name: nginx-deploy-7db697dfbd-46x7s
Namespace: default
Node: k8s-node01/172.16.150.213
Start Time: Tue, 30 Oct 2018 13:06:02 +0800
Labels: pod-template-hash=3862538968
run=nginx-deploy #同样也拥有run=nginx-deploy的标签
Annotations: <none>
Status: Running
IP: 10.244.1.2
.......(以下省略)
5)下面我们来尝试手动对nginx-deploy这个deployment进行扩容和缩减操作
扩容:
[root@k8s-master01 ~]# kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deploy 1 1 1 1 2h
[root@k8s-master01 ~]# kubectl scale --replicas=5 deployment nginx-deploy #对名称为nginx-deploy类型为deployment的对象进行扩容,有初始的1个扩容到五个
deployment.extensions "nginx-deploy" scaled
[root@k8s-master01 ~]# kubectl get pod -w #我们可以看到pod扩容的过程
NAME READY STATUS RESTARTS AGE
nginx-deploy-7db697dfbd-46x7s 1/1 Running 0 14m
nginx-deploy-7db697dfbd-lr7wx 0/1 ContainerCreating 0 1s
nginx-deploy-7db697dfbd-sk48l 0/1 ContainerCreating 0 1s
nginx-deploy-7db697dfbd-tdtc8 0/1 ContainerCreating 0 1s
nginx-deploy-7db697dfbd-xg25w 0/1 ContainerCreating 0 1s
nginx-deploy-7db697dfbd-xg25w 1/1 Running 0 11s
nginx-deploy-7db697dfbd-lr7wx 1/1 Running 0 12s
nginx-deploy-7db697dfbd-sk48l 1/1 Running 0 12s
nginx-deploy-7db697dfbd-tdtc8 1/1 Running 0 12s
缩减:
[root@k8s-master01 ~]# kubectl scale --replicas=3 deployment nginx-deploy #使用replicas指定我们想要的个数即可
deployment.extensions "nginx-deploy" scaled
[root@k8s-master01 ~]# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
nginx-deploy-7db697dfbd-46x7s 1/1 Running 0 16m
nginx-deploy-7db697dfbd-lr7wx 0/1 Terminating 0 2m
nginx-deploy-7db697dfbd-sk48l 0/1 Terminating 0 2m
nginx-deploy-7db697dfbd-tdtc8 1/1 Running 0 2m
nginx-deploy-7db697dfbd-xg25w 1/1 Running 0 2m
nginx-deploy-7db697dfbd-sk48l 0/1 Terminating 0 2m
nginx-deploy-7db697dfbd-sk48l 0/1 Terminating 0 2m
nginx-deploy-7db697dfbd-lr7wx 0/1 Terminating 0 2m
nginx-deploy-7db697dfbd-lr7wx 0/1 Terminating 0 2m
6.现在我们对nginx-deploy进行滚动升级及回滚操作,由1.14-alpine 升级到1.15-alpine,并由1.15-alpine回滚到1.14-alpine版本(nginx在docker hub上版本信息:https://hub.docker.com/_/nginx/)
滚动升级:
[root@k8s-master01 ~]# kubectl set image deployment nginx-deploy nginx-deploy=nginx:1.15-alpine --record #具体命令及参数含义请参考命令帮助
deployment.apps "nginx-deploy" image updated
[root@k8s-master01 ~]# kubectl get pod -w #观察滚动升级的过程
NAME READY STATUS RESTARTS AGE
nginx-deploy-6c7dd4d9bf-c58mr 0/1 ContainerCreating 0 3s
nginx-deploy-6c7dd4d9bf-fvmt5 0/1 ContainerCreating 0 3s
nginx-deploy-7db697dfbd-46x7s 1/1 Running 0 27m
nginx-deploy-7db697dfbd-xg25w 1/1 Running 0 13m
nginx-deploy-6c7dd4d9bf-c58mr 1/1 Running 0 28s
nginx-deploy-7db697dfbd-xg25w 1/1 Terminating 0 13m
nginx-deploy-6c7dd4d9bf-lp7w2 0/1 Pending 0 0s
nginx-deploy-6c7dd4d9bf-lp7w2 0/1 Pending 0 0s
nginx-deploy-6c7dd4d9bf-lp7w2 0/1 ContainerCreating 0 0s
nginx-deploy-7db697dfbd-xg25w 0/1 Terminating 0 13m
nginx-deploy-7db697dfbd-xg25w 0/1 Terminating 0 13m
nginx-deploy-7db697dfbd-xg25w 0/1 Terminating 0 13m
nginx-deploy-6c7dd4d9bf-fvmt5 1/1 Running 0 30s
nginx-deploy-7db697dfbd-46x7s 1/1 Terminating 0 27m
nginx-deploy-7db697dfbd-46x7s 0/1 Terminating 0 27m
nginx-deploy-7db697dfbd-46x7s 0/1 Terminating 0 27m
nginx-deploy-7db697dfbd-46x7s 0/1 Terminating 0 27m
^C[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deploy-6c7dd4d9bf-c58mr 1/1 Running 0 41s
nginx-deploy-6c7dd4d9bf-fvmt5 1/1 Running 0 41s
nginx-deploy-6c7dd4d9bf-lp7w2 0/1 ContainerCreating 0 13s
[root@k8s-master01 ~]# kubectl get pod #查看最后的状态,比对一下现在的pod和之前的pod是否相同
NAME READY STATUS RESTARTS AGE
nginx-deploy-6c7dd4d9bf-c58mr 1/1 Running 0 1m
nginx-deploy-6c7dd4d9bf-fvmt5 1/1 Running 0 1m
nginx-deploy-6c7dd4d9bf-lp7w2 1/1 Running 0 45s
查看任意一个pod的信息,看看镜像是否升级
[root@k8s-master01 ~]# kubectl describe pod nginx-deploy-6c7dd4d9bf-c58mr
Name: nginx-deploy-6c7dd4d9bf-c58mr
Namespace: default
Node: k8s-node02/172.16.150.214
Start Time: Tue, 30 Oct 2018 13:33:15 +0800
Labels: pod-template-hash=2738808569
run=nginx-deploy
Annotations: <none>
Status: Running
IP: 10.244.2.5
Controlled By: ReplicaSet/nginx-deploy-6c7dd4d9bf
Containers:
nginx-deploy:
Container ID: docker://934e8074c90e0a5114ae846a2405515885efbcf1fcba8653a66d303f94e47253
Image: nginx:1.15-alpine #image信息
Image ID: docker-pullable://docker.io/nginx@sha256:ae5da813f8ad7fa785d7668f0b018ecc8c3a87331527a61d83b3b5e816a0f03c
......(以下省略)
版本回滚:
[root@k8s-master01 ~]# kubectl rollout undo deployment nginx-deploy #--to-revision 参数可以指定回退的版本
deployment.apps "nginx-deploy"
[root@k8s-master01 ~]# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
nginx-deploy-6c7dd4d9bf-c58mr 1/1 Running 0 7m
nginx-deploy-6c7dd4d9bf-fvmt5 1/1 Running 0 7m
nginx-deploy-6c7dd4d9bf-lp7w2 0/1 Terminating 0 7m
nginx-deploy-7db697dfbd-gskcv 0/1 ContainerCreating 0 4s
nginx-deploy-7db697dfbd-ssws8 0/1 ContainerCreating 0 4s
nginx-deploy-7db697dfbd-ssws8 1/1 Running 0 11s
nginx-deploy-6c7dd4d9bf-fvmt5 1/1 Terminating 0 7m
nginx-deploy-7db697dfbd-2qh7v 0/1 Pending 0 0s
nginx-deploy-7db697dfbd-2qh7v 0/1 Pending 0 0s
nginx-deploy-7db697dfbd-2qh7v 0/1 ContainerCreating 0 0s
nginx-deploy-6c7dd4d9bf-fvmt5 0/1 Terminating 0 7m
nginx-deploy-6c7dd4d9bf-lp7w2 0/1 Terminating 0 7m
nginx-deploy-6c7dd4d9bf-lp7w2 0/1 Terminating 0 7m
....(以下省略)
查看任意一个pod的信息,看看镜像是否回滚到1.14-alpine版本
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deploy-7db697dfbd-2qh7v 1/1 Running 0 5m
nginx-deploy-7db697dfbd-gskcv 1/1 Running 0 5m
nginx-deploy-7db697dfbd-ssws8 1/1 Running 0 5m
[root@k8s-master01 ~]# kubectl describe pod nginx-deploy-7db697dfbd-2qh7v #查看任意一个pod的版本信息,查看是否回滚到1.14版本
Name: nginx-deploy-7db697dfbd-2qh7v
Namespace: default
Node: k8s-node02/172.16.150.214
Start Time: Tue, 30 Oct 2018 13:40:55 +0800
Labels: pod-template-hash=3862538968
run=nginx-deploy
Annotations: <none>
Status: Running
IP: 10.244.2.7
Controlled By: ReplicaSet/nginx-deploy-7db697dfbd
Containers:
nginx-deploy:
Container ID: docker://b75740e5919bd975755b256c83e03b63ea95cf2307ffc606abd03b59fea6634a
Image: nginx:1.14-alpine
Image ID: docker-pullable://docker.io/nginx@sha256:8976218be775f4244df2a60a169d44606b6978bac4375192074cefc0c7824ddf
下面我们对刚刚操作的命令做一个大致的总结:
kubectl run #创建一个deployment或job来管理创建的容器
kubectl get #显示一个或多个资源,可以使用标签过滤,默认查看当前名称空间的资源
kubectl expose #将一个资源暴露为一个新的kubernetes的service资源,资源包括pod (po), service (svc), replicationcontroller (rc),deployment(deploy), replicaset (rs)
kubectl describe #显示特定资源或资源组的详细信息
kubectl scale #可以对Deployment, ReplicaSet, Replication Controller, 或者StatefulSet设置新的值,可以指定一个或多个先决条件
kubectl set #更改现有的应用程序资源
kubectl rollout #资源回滚管理
K8s快速入门的更多相关文章
- 菜鸟系列k8s——k8s快速入门(1)
k8s快速入门 1.快速创建k8s集群 参考网站:https://kubernetes.io/docs/tutorials/kubernetes-basics 点击教程菜单 1. Create a C ...
- .NET Core on K8S快速入门课程学习笔记
课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 目录 01-介绍K8s是什么 02-为什么要学习k8s 03-如何学习k8s ...
- .NET Core on K8S快速入门课程--学习笔记
课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 目录 01-介绍K8s是什么 02-为什么要学习k8s 03-如何学习k8s ...
- k8s学习笔记之三:k8s快速入门
一.前言 kubectl是apiserver的客户端工具,工作在命令行下,能够连接apiserver上实现各种增删改查等各种操作 kubectl官方使用文档:https://kubernetes.io ...
- 3、kubernetes应用快速入门190625
一.kubernetes应用入门 1.kubectl命令 Basic Commands create Create a resource from a file or from stdin. expo ...
- Kubernetes快速入门
二.Kubernetes快速入门 (1)Kubernetes集群的部署方法及部署要点 (2)部署Kubernetes分布式集群 (3)kubectl使用基础 1.简介 kubectl就是API ser ...
- istio部署-快速入门
参考 istio/istio Quick Start Evaluation Install fleeto/sleep fleeto/flaskapp 本文为 istio 快速入门部署,一般用于演示环境 ...
- K8S 从入门到放弃系列文章目录(Kubernetes 1.14)
1)软件环境 软件 版本 系统 Centos7.5 Kubernetes 1.14.1 Docker 18.09 Calico 3.6 Etcd 3.3.12 2)部署过程简单概要 三台master节 ...
- Golang Module快速入门
前言: 在Golang1.11之前的版本中,官方没有提供依赖和包管理工具.开发者通常会使用vendor或者glide的方式来管理依赖(也有直接使用GOPATH多环境方式),而在Golang1.11之后 ...
随机推荐
- PythonStudy——生成器
# 生成器:自定义的迭代器对象 # -- 就是用函数语法来声明生成器,用yield关键字取代return关键字来返回值,参数没有多少变化 # 总结:有yield关键字的函数,函数名() 不是调用函数, ...
- C#编程时应注意的性能处理
GC堆回收 那么除了通过new对象而达到代的阈(临界)值时,还有什么能够导致垃圾堆进行垃圾回收呢? 还可能windows报告内存不足.CLR卸载AppDomain.CLR关闭等其它特殊情况. 或者,我 ...
- 关于PCA
PCA是常见的降维技术. 对于使用PCA来进行降维的数据,需要进行预处理,是指能够实现均值为0,以及方差接近.如何来确定到底哪个维度是"主成分"?就要某个axis的方差. 为什么要 ...
- 友善RK3399/NanoPC-T4开发板wiringPi Python库访问GPIO外设实例讲解 -【申嵌视频】
1 wiringPi for Python简介 wiringPi for Python是wiringPi的Python语言扩展,用于在Python程序中操作GPIO/I2C/SPI库/UART/PWM ...
- h5互动课件动画如何实现?如何快速开发h5互动课件动画
最近几年随着h5的兴起,复杂的h5动画,甚至是交互动画类型的产品不断涌现,尤其在课件产品方面,很多公司都有相关需求,最近很多h5开发工程师想了解相关方面的技术. 针对h5,如果是简单的动画效果,可以考 ...
- Win7下,nginx默认80端口被System占用,造成nginx启动报错
在win7 32位旗舰版下,启动1.0.8版本nginx,显示如下错误: 2012/04/02 13:55:59 [emerg] 7864#2376: bind() to 0.0.0.0:80 fai ...
- python3-基础5
#函数 1 什么是函数? 2 为什么要用函数? 3 函数的分类:内置函数与自定义函数 4 如何自定义函数 5 语法 6 定义有参数函数,及有参函数的应用场景 7 定义无参数函数,及无参函数的应用场景 ...
- React 思维索引
关于分析React源码的文章已经有比较多,我就不献丑了. 根据分析的结果把React的大致流程和思维导图做了一点总结,图片如下: 源码在: https://github.com/laryosbert/ ...
- JSP和Struts2、Hibernate、Spring3基础内容和原理
一.JSP工作原理 1.首先是利用客户端浏览器,然后由客户端浏览器请求JSP页面,向JSP服务器发出请求. 2.JSP服务器内部原理 JSP服务器首先在收到客户端传送过来的请求后,将JSP页面编译成S ...
- Ubuntu 16.04 安装Go 1.9.2
系统环境 Ubuntu: 16.04 Go: 1.9.2 安装步骤 $ curl -O https://storage.googleapis.com/golang/go1.9.linux-amd64. ...