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

探索云原生技术之容器编排引擎Kubernetes/K8S详解(2)

❤️作者简介:2022新星计划第三季云原生与云计算赛道Top5🏅、华为云享专家🏅、云原生领域潜力新星🏅💛

❤️作者简介:2022新星计划第三季云原生与云计算赛道Top5🏅、华为云享专家🏅、云原生领域潜力新星🏅

💛博客首页:C站个人主页🌞

💗作者目的:如有错误请指正,将来会不断的完善笔记,帮助更多的Java爱好者入门,共同进步!



文章目录

      • 基本理论介绍
        • 什么是云原生
        • 什么是kubernetes
        • kubernetes核心功能
      • kubernetes部署服务(实战)
      • 配置kubernetes中kubectl命令自动补全插件
      • 资源管理
          • YAML语法
          • 一个小细节
          • 三种资源管理方式
            • 第一种:命令式对象管理:只能使用命令去操作kubernetes资源
            • 第二种:命令式对象配置:指定yaml配置文件来操作kubernetes资源(create(创建)或者patch(更新))
            • 第三种:声明式对象配置:指定yaml配置文件来操作kubernetes资源(apply(没有就创建,有就更新))
            • 三种方式使用场景总结


基本理论介绍


什么是云原生

Pivotal公司的Matt Stine于2013年首次提出云原生(Cloud-Native)的概念;2015年,云原生刚推广时,Matt Stine在《迁移到云原生架构》一书中定义了符合云原生架构的几个特征:12因素、微服务、自敏捷架构、基于API协作、扛脆弱性;到了2017年,Matt Stine在接受InfoQ采访时又改了口风,将云原生架构归纳为模块化、可观察、可部署、可测试、可替换、可处理6特质;而Pivotal最新官网对云原生概括为4个要点:DevOps+持续交付+微服务+容器

总而言之,符合云原生架构的应用程序应该是:采用开源堆栈(K8S+Docker)进行容器化,基于微服务架构提高灵活性和可维护性,借助敏捷方法、DevOps支持持续迭代和运维自动化,利用云平台设施实现弹性伸缩、动态调度、优化资源利用率。

(此处摘选自《知乎-华为云官方帐号》)

在这里插入图片描述


什么是kubernetes

kubernetes,简称K8s,是用8代替8个字符"ubernete"而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了应用部署,规划,更新,维护的一种机制

传统的应用部署方式:是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作,当然也可以通过创建虚拟机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。

新的部署方式:是通过部署容器方式实现,每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能快速部署,由于容器与底层设施、机器文件系统解耦的,所以它能在不同云、不同版本操作系统间进行迁移。

容器占用资源少、部署快,每个应用可以被打包成一个容器镜像,每个应用与容器间成一对一关系也使容器有更大优势,使用容器可以在build或release 的阶段,为应用创建容器镜像,因为每个应用不需要与其余的应用堆栈组合,也不依赖于生产环境基础结构,这使得从研发到测试、生产能提供一致环境。类似地,容器比虚拟机轻量、更"透明",这更便于监控和管理。

Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。

在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。

(此处摘选自《百度百科》)


kubernetes核心功能


  • 存储系统挂载(数据卷):pod中容器之间共享数据,可以使用数据卷
  • 应用健康检测:容器内服务可能进程阻塞无法处理请求,可以设置监控检查策略保证应用健壮性
  • 应用实例的复制(实现pod的高可用):pod控制器(deployment)维护着pod副本数量(可以自己进行设置,默认为1),保证一个pod或一组同类的pod数量始终可用,如果pod控制器deployment当前维护的pod数量少于deployment设置的pod数量,则会自动生成一个新的pod,以便数量符合pod控制器,形成高可用。
  • Pod的弹性伸缩:根据设定的指标(比如:cpu利用率)自动缩放pod副本数
  • 服务发现:使用环境变量或者DNS插件保证容器中程序发现pod入口访问地址
  • 负载均衡:一组pod副本分配一个私有的集群IP地址,负载均衡转发请求到后端容器。在集群内部其他pod可通过这个clusterIP访问应用
  • 滚动更新:更新服务不会发生中断,一次更新一个pod,而不是同时删除整个服务。
  • 容器编排:通过文件来部署服务,使得应用程序部署变得更高效
  • 资源监控:node节点组件集成cAdvisor资源收集工具,可通过Heapster汇总整个集群节点资源数据,然后存储到InfluxDb时序数据库,再由Grafana展示。
  • 提供认证和授权:支持角色访问控制(RBAC)认证授权等策略

kubernetes部署服务(实战)


  • 在Kubernetes集群中部署一个Nginx程序,测试下集群是否正常工作。

  • 1:部署Nginx

[root@k8s-master ~]# kubectl create deployment nginx --image=nginx:1.14-alpine
deployment.apps/nginx created

  • 2:暴露Nginx的80端口,并设置类型为NodePort:

[root@k8s-master ~]# kubectl expose deploy nginx --port=80 --target-port=80 --type=NodePortservice/nginx exposed

  • 3:查看服务状态:

[root@k8s-master ~]# kubectl get pod,serviceNAME READY STATUS RESTARTS AGE
pod/nginx-6867cdf567-pzl5p 0/1 Pending 0 3m18sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 19h
service/nginx NodePort 10.102.79.152 <none> 80:30048/TCP 2m47s

  • 4&#xff1a;发现pod一直处于Pending状态。&#xff08;出问题了&#xff09;

检查一下pod&#xff1a;

[root&#64;k8s-master ~]# kubectl describe pod nginx-6867cdf567-pzl5p
Name: nginx-6867cdf567-pzl5p
Namespace: default
Priority: 0
Node: <none>
Labels: app&#61;nginxpod-template-hash&#61;6867cdf567
Annotations: <none>
Status: Pending
IP:
IPs: <none>
Controlled By: ReplicaSet/nginx-6867cdf567
Containers:nginx:Image: nginx:1.14-alpinePort: <none>Host Port: <none>Environment: <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from default-token-jqrvp (ro)
Conditions:Type StatusPodScheduled False
Volumes:default-token-jqrvp:Type: Secret (a volume populated by a Secret)SecretName: default-token-jqrvpOptional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300snode.kubernetes.io/unreachable:NoExecute for 300s
Events:Type Reason Age From Message---- ------ ---- ---- -------Warning FailedScheduling <unknown> default-scheduler 0/1 nodes are available: 1 node(s) had taints that the pod didn&#39;t tolerate.Warning FailedScheduling default-scheduler 0/1 nodes are available: 1 node(s) had taints that the pod didn&#39;t tolerate.

  • 5&#xff1a;解决方法&#xff08;我也是莫名其妙就好了&#xff0c;可以看看下面的文章&#xff09;

解决方案


  • 6&#xff1a;外网访问Nginx

根据上面kubectl get service&#xff0c;我们可以看到Nginx被映射到外网的端口是30048&#xff0c;所以我们可以这样访问。


  • 注意&#xff1a;一定要通过centos服务器的ip&#43;映射到外网的nginx端口&#xff08;30048&#xff09;访问&#xff0c;而不是localhost

[root&#64;k8s-master ~]# curl http://192.168.184.100:30048/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href&#61;"http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href&#61;"http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>

  • 我们再来测试一下是否通过从机的ip访问kubernetes集群中的nginx。

[root&#64;k8s-master ~]# curl http://192.168.184.101:30048/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href&#61;"http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href&#61;"http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>

  • 结论&#xff1a;我们可以发现&#xff0c;不管是主机ip还是从机ip都可以访问kubernetes集群的nginx。

配置kubernetes中kubectl命令自动补全插件

如果重启机器出现无法自动补全&#xff0c;则执行下面全部source开头的命令即可。其他一概不用动。


  • 1&#xff1a;

yum install -y bash-completion

  • 2&#xff1a;

source /usr/share/bash-completion/bash_completion

  • 3&#xff1a;

source <(kubectl completion bash)

  • 4&#xff1a;

echo “source <(kubectl completion bash)>> ~/.bashrc

  • 5&#xff1a;

vim /root/.bashrc

  • 6&#xff1a;

source /usr/share/bash-completion/bash_completion

  • 7&#xff1a;

source <(kubectl completion bash)

  • 如何使用&#xff1a;我们在输入kubectl命令时可以用Tab键进行补全。

资源管理


  • 在kubernetes中&#xff0c;一切皆为资源&#xff0c;正如在Java中&#xff0c;一切皆为对象。

  • &#xff08;deployment&#xff0c;pod&#xff0c;service&#xff09;等等这些称之为资源。

  • kubernetes实际上就是一个集群&#xff0c;我们可以在kubernetes中部署程序&#xff0c;所谓的部署程序其实就是把程序放到Docker容器中&#xff0c;再将这些Docker容器放到一个个pod中&#xff08;而pod是kubernetes中的最小控制单元&#xff0c;kubernetes最底层只能控制pod而不是docker容器&#xff09;&#xff0c;如果需要外部网络&#xff08;kubernetes集群外的网络&#xff09;访问到这些pod&#xff0c;那么我们就必须使用到service资源&#xff0c;通过service我们就可以通过pod所在的机器的IP地址&#43;分配到的端口号进行访问

  • 如果kubernetes中的组件&#xff08;例如pod等等&#xff09;需要持久化&#xff0c;那么可以使用kubernetes提供的存储服务&#xff08;例如etcd&#xff09;。


YAML语法

特点



  • 大小写敏感

  • 缩进表示层级关系

  • 需要表示为同一层级关系的话必须将它们首字母左对齐

  • “#”为注释

  • 一个yaml文件里面写多个yaml配置&#xff0c;可以用 — &#xff08;三个减号&#xff09;来分隔。

  • 冒号后面要空格再写值&#xff08;key: value&#xff09;

检查yaml语法的网址


yaml文件如下&#xff1a;


# 整形
age: 10
# 布尔型
flag: true
# 实型&#xff08;浮点型&#xff09;
price: 123.66
# 日期型
date: 2022-5-14
#字符型
name: 张三
#对象
person:age: 20name: 李四
#数组
array:- 10- 20- 30

经过转换成JSON格式为如下&#xff1a;


{"age": 10,"flag": true,"price": 123.66,"date": "2022-05-14","name": "张三","person": {"age": 20,"name": "李四"},"array": [10,20,30]
}

一个小细节

  • 分别在master和slave01、slave02执行&#xff1a;

[root&#64;k8s-master ~]# docker images
...

[root&#64;k8s-slave01 ~]# docker images
...nginx 1.14-alpine 8a2fb25a19f5 3 years ago 16MB

[root&#64;k8s-slave02 ~]# docker images
...

  • 可以看到只有slave01有Nginx:1.14-alpine镜像&#xff0c;这是为什么呢&#xff1f;
  • 此时就牵扯到了kubernetes的执行流程&#xff1a;
    • 因为我们在kubectl执行创建pod&#xff08;deployment&#xff09;的时候&#xff0c;请求会先到apiServer&#xff0c;然后通过Scheduler计算将要调度到的某个node工作节点&#xff08;也就是slave01或者slave02&#xff09;
    • 再由controller manager去着手安排工作&#xff08;也就是上面的创建pod/deployment的任务&#xff09;给Scheduler计算出来的节点执行&#xff0c;这时安排给了slave01&#xff0c;slave01就会去查看本地docker有没有该镜像&#xff0c;如果没有才会从docker hub上面拉取&#xff08;kubernetes默认是这种机制&#xff0c;可以进行其他设置&#xff0c;比如一直从docker hub上面拉取或者一直从本地拉取这两种机制&#xff09;&#xff0c;这个时候就是只有slave01才有这个nginx镜像了&#xff0c;而正常来说master是没有的&#xff0c;除非手动拉取&#xff0c;因为master节点不会干活&#xff0c;干活的是slave节点。

三种资源管理方式

  • 第二种和第三种都是需要通过执行yaml配置文件来操作kubernetes资源的。而第一种不需要&#xff0c;直接使用命令即可。

第一种&#xff1a;命令式对象管理&#xff1a;只能使用命令去操作kubernetes资源

[root&#64;k8s-master ~]# kubectl run nginx-deployment --image&#61;nginx:1.14-alpine
kubectl run --generator&#61;deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator&#61;run-pod/v1 or kubectl create instead.
deployment.apps/nginx-deployment created

查看一下pod&#xff1a;


[root&#64;k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-768546d477-kzvbl 1/1 Running 0 16s

查看一下deployment&#xff1a;


[root&#64;k8s-master ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 1/1 1 1 72s

总结&#xff1a;可以看出kubectl run命令是通过创建deployment&#xff08;pod控制器&#xff09;从而创建pod。


第二种&#xff1a;命令式对象配置&#xff1a;指定yaml配置文件来操作kubernetes资源&#xff08;create&#xff08;创建&#xff09;或者patch&#xff08;更新&#xff09;&#xff09;

  • create创建操作&#xff1a;

创建yaml配置文件&#xff1a;


vim nginx-pod.yaml

内容如下&#xff1a;如何编写在下面会说。


apiVersion: v1
kind: Namespace
metadata:name: test
---
apiVersion: v1
kind: Pod
metadata: name: my-nginx-pod1namespace: test
spec:containers:- image: nginx:1.14-alpinename: nginx-containner1ports:- containerPort: 80

执行命令&#xff1a;


[root&#64;k8s-master ~]# kubectl create -f nginx-pod.yaml
namespace/test created
pod/my-nginx-pod1 created

查看namespace&#xff1a;


[root&#64;k8s-master ~]# kubectl get namespace
NAME STATUS AGE
default Active 113m
kube-node-lease Active 113m
kube-public Active 113m
kube-system Active 113m
test Active 37s

进入test的namespace查看pod&#xff1a;


[root&#64;k8s-master ~]# kubectl get pods --namespace&#61;test
NAME READY STATUS RESTARTS AGE
my-nginx-pod1 1/1 Running 0 100s

查看deployment&#xff1a;


[root&#64;k8s-master ~]# kubectl get deployment
No resources found in default namespace.
[root&#64;k8s-master ~]# kubectl get deployment --namespace&#61;test
No resources found in test namespace.

总结&#xff1a;这种创建pod方式和第一种是完全不一样的&#xff0c;这种方式不是通过创建deployment来创建pod&#xff0c;而是直接创建pod。


用刚刚的yaml文件删除命名空间和pod


[root&#64;k8s-master ~]# kubectl delete -f nginx-pod.yaml
namespace "test" deleted
pod "my-nginx-pod1" deleted

查看pod的详细内容


[root&#64;k8s-master ~]# kubectl describe pods my-nginx-pod1 -n test
Name: my-nginx-pod1
Namespace: test
Priority: 0
Node: k8s-slave02/192.168.184.102
Start Time: Sun, 15 May 2022 16:56:23 &#43;0800
Labels: <none>
Annotations: <none>
Status: Running
IP: 10.244.2.4
IPs:IP: 10.244.2.4
Containers:nginx-containner1:Container ID: docker://975f343633f5727105b580bc0b7137513a1db800162538062c503c009f6686d1Image: nginx:1.14-alpineImage ID: docker-pullable://nginx&#64;sha256:485b610fefec7ff6c463ced9623314a04ed67e3945b9c08d7e53a47f6d108dc7Port: 80/TCPHost Port: 0/TCPState: RunningStarted: Sun, 15 May 2022 16:56:24 &#43;0800Ready: TrueRestart Count: 0Environment: <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from default-token-x4cbn (ro)

可以看到pod的IP地址和容器镜像等等内容&#xff01;


集群内访问


[root&#64;k8s-master ~]# curl 10.244.2.4:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href&#61;"http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href&#61;"http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>

第三种&#xff1a;声明式对象配置&#xff1a;指定yaml配置文件来操作kubernetes资源&#xff08;apply&#xff08;没有就创建&#xff0c;有就更新&#xff09;&#xff09;

创建yaml配置文件&#xff1a;


vim nginx-pod-apply.yaml

内容如下&#xff1a;如何编写在下面会说。


apiVersion: v1
kind: Namespace
metadata:name: test
---
apiVersion: v1
kind: Pod
metadata: name: my-nginx-pod-apply1namespace: test
spec:containers:- image: nginx:1.14-alpinename: nginx-containner-apply1ports:- containerPort: 80

执行命令&#xff1a;&#xff08;由于里面的东西我们原来都没有&#xff0c;所以此时是created新增&#xff09;


[root&#64;k8s-master ~]# kubectl apply -f nginx-pod-apply.yaml
namespace/test created
pod/my-nginx-pod-apply1 created

查看pod


[root&#64;k8s-master ~]# kubectl get pods -n test
NAME READY STATUS RESTARTS AGE
my-nginx-pod-apply1 1/1 Running 0 64s

三种方式使用场景总结

使用场景资源管理方式命令模板
查询资源命令式对象管理kubectl get(describe) 资源名称
新增或者更新资源声明式对象配置kubectl apply -f XXX.yaml
删除资源命令式对象配置kubectl delete -f XXX.yaml

❤️&#x1f49b;&#x1f9e1;本章结束&#xff0c;我们下一章见❤️&#x1f49b;&#x1f9e1;


推荐阅读
  • 云原生SRE
    序言年底了,没有分手的朋友的赶紧分了,所谓新年新气象,年年不重样。去留无意,望看风卷残云。。。运维不会消失,但 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • 1.脚本功能1)自动替换jar包中的配置文件。2)自动备份老版本的Jar包3)自动判断是初次启动还是更新服务2.脚本准备进入ho ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • zuul 路由不生效_Zuul网关到底有何牛逼之处?竟然这么多人在用~
    作者:kosamino来源:cnblogs.comjing99p11696192.html哈喽,各位新来的小伙伴们,大家好& ... [详细]
  • 先上图引入插件在pubspec.yaml中引入charts_flutter插件使用的时候版本到0.6.0,插件地址:https:github.comgooglecharts使用插件 ... [详细]
author-avatar
流浪的牛仔2011Ting_883
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有