这篇Java基础快速入门学习教程,让我至少少走3个月弯路
作为刚刚接触java的小白,今天这篇文章的目的是帮助大家快速入门java,少走弯路
Java 基本语法、Java 平台应用、Java的核心概念:JVM、JDK、JRE以及Java面向对象思想,同时要会学到如何在系统中搭建Java开发环境,以及如何利用第三方工具进行Java程序的开发。
还有记住学习Java语言最重要的是两点:
- 学习步骤/方法
- 学习资源
找到适合自己的学习方式,找到适合自己现阶段的学习资料,学习的过程中最好记笔记,因为好记性不如烂笔头。
推荐Java基础学习教程
https://www.bilibili.com/video/BV1Rx411876f
从中我们可以学习到很多类型的设计模式,其中包括工厂模式、抽象工厂模式、单例模式、适配器模式、观察者模式、装饰者模式等等。
建立起来环境了,最重要的是练习,熟能生巧,在不断的练习中去加深自己对程序语言的理解。
作为新手你可以去找一本比较好的经典的入门书籍,现在网络上也有非常多的资料,图文或者视频都可以,根据个人喜好选择来练习。
做Java开发的话,你需要了解这三个术语,叫SDK、API跟Lib,分别表示软件开发套件,应用编程接口和库。这三者之间其实有一定的联系,或者是交叉。
总体来说,它们都是给我们提供的一些封装了底层功能的基础设施。这些东西通常体现为我们所经常说的“框架”。事实上要成为一个资深的Java开发者,对各种API和框架的学习,可能是花时间最多的一个地方。
Java Web全栈开发的推荐学习内容,简单总结一下,大概包括下面这些内容。
每一部分都可以细化成很多知识点,这只是一个粗略的罗列。把它当做技术地图就好了。
开发环境的建立与项目管理:
Eclipse、IDEA、Maven和Git
Java编程基础:
Java基础无非就是需要知道Java概述、Java语言基础、面向对象、异常处理、常用类、数组和集合、IO流、线程、反射等。
● Java概述:你要知道Java一些基本的知识,比如优点,什么时候诞生的,目前的发展状况如何。
● Java语言基础:要学会一些标识符、变量、数据类型、运算符、控制语句、方法等知识。
● 面向对象:Java是一门面向对象开发的编程语言。
● 异常处理:计算机虽然不会出错,但毕竟是人类制造出来的,所以在编写代码的时候可能会出现一些异常错误,出了异常之后,需要程序员去进行处理。
● 常用类:Java给程序员提供了强大的API,使我们在开发的时候变得轻松许多,Java为我们提供的那些类,常用的那些,你一定要掌握。
● 数组和集合:这块内容在以后工作的时候100%会用到,所以一定要作为重点来学习。
● IO流:使用Java读取或者传输文件的时候会用到IO流,举个例子,你从网上买了一辆自行车,商家给你邮寄过来的应该是一些零件(组装好的自行车不利于邮寄),你需要自己动手去组装,同样,如果你想把某个文件从一个地方读取到另一个地方,使用IO流会极大的方便你的操作。
● 线程:通过线程,可以让程序更高效的工作,当然,如果使用不当,也会造成一堆问题。
● 反射:想要以后自己写一些框架,反射知识必不可少。
一般把以上的内容学会之后,Java基础的知识也就掌握了。
前端开发技术:
HTML、CSS、JavaScript基础
数据库:
数据库知识是程序员必须掌握的,包括建库、建表、增删改查、存储过程编写等等,熟悉并掌握sql语言的使用对程序员来说是非常重要的。
JDBC
JDBC是Java操作数据库的API,通过JDBC能让Java建立与数据库的沟通,掌握JDBC是Java程序员的必修内容。这部分内容包括驱动程序管理器(DriverManager)、连接(Connection)、容器(Statement、PreparedStatement、CallableStatement)、结果集(ResultSet)等类和接口的使用。
另外要掌握Java操作数据库的结构划分,掌握DAO框架的使用。
Spring基础:
依赖注入IoC、面向切面编程AOP、SpringBoot
框架:
Spring MVC、mybatis、Struts等,包括URL路由、模板、表单、Session、等知识
还有专门提一下JSP和Servlet,虽然现在各种成熟的MVC框架已经让Java Web开发基本很少使用JSP和Servlet的原生功能了,基本都做了一层封装。但是这部分基础知识建议初学者还是要认真学习。
Java自己核心的一些包和技术无非是:集合,泛型,IO,多线程,类加载机制,反射,代理。
掌握这些,Java就算入门了。从Java零基础快速入门学好Java语言。初学者最重要的就是不要懒!
Java基础教程:k8s快速入门
随着Docker技术的流行,对项目的容器化部署方式越来越流行,容器化部署的优点如下:
- 可以保证每个容器拥有自己的文件系统、CPU、内存、进程空间等
- 运行应用程序所需要的资源都被容器包装,并和底层基础架构解耦
- 容器化的应用程序可以跨云服务商、跨Linux操作系统发行版进行部署
虽然容器化部署可以带来很多便利,但是也会出现一些问题,比如说:
- 一个容器故障停机了,怎么样让另外一个容器立刻启动去替补停机的容器
- 当并发访问量变大的时候,怎么样做到横向扩展容器数量
这些容器管理的问题统称为容器编排问题,为了解决这些容器编排问题,就产生了一些容器编排技术:
- Swarm:Docker自己的容器编排工具
- Mesos:Apache的一个资源统一管控的工具,需要和Marathon结合使用
- Kubernetes:Google开源的的容器编排工具
目前为止Kubernetes是最为流行的一种容器编排技术。
kubernetes,由于k和s之间有8个字符,所以简称k8s,是一个全新的基于容器技术的分布式架构领先方案,是谷歌严格保密十几年的秘密武器—-Borg系统的一个开源版本,于2015年7月发布第一个正式版本,它的本质是一组服务器集群,可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理,主要提供了如下主要功能:
- 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
- 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
- 服务发现:服务可以通过自动发现的形式找到它所依赖的服务
- 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
- 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
- 存储编排:可以根据容器自身的需求自动创建存储卷
一个k8s集群主要是由控制节点(master)、工作节点(node)构成,每个节点上都会安装不同的组件。
master:集群的控制平面,负责集群的决策 ( 管理 )
ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制
Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上
ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等
Etcd :负责存储集群中各种资源对象的信息
node:集群的数据平面,负责为容器提供运行环境 ( 干活 )
Kubelet : 负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器
KubeProxy : 负责提供集群内部的服务发现和负载均衡
Docker : 负责节点上容器的各种操作
下面,以部署一个nginx服务来说明kubernetes系统各个组件调用关系:
- 首先要明确,一旦kubernetes环境启动之后,master和node都会将自身的信息存储到etcd数据库中
- 一个nginx服务的安装请求会首先被发送到master节点的apiServer组件
- apiServer组件会调用scheduler组件来决定到底应该把这个服务安装到哪个node节点上
- 在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知apiServer
- apiServer调用controller-manager去调度Node节点安装nginx服务
- kubelet接收到指令后,会通知docker,然后由docker来启动一个nginx的pod
- pod是kubernetes的最小操作单元,容器必须跑在pod中至此,
- 一个nginx服务就运行了,如果需要访问nginx,就需要通过kube-proxy来对pod产生访问的代理
这样,外界用户就可以访问集群中的nginx服务了
Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控
Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行
Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器
Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等
Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod
Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签
NameSpace:命名空间,用来隔离pod的运行环境
本次搭建的是一台Master节点和多台Node节点构成的集群
1) 检查操作系统的版本
2) 主机名解析
为了方便后面集群节点间的直接调用,在这配置一下主机名解析,企业中推荐使用内部DNS服务器
3) 时间同步
kubernetes要求集群中的节点时间必须精确一致,这里直接使用chronyd服务从网络同步时间。
企业中建议配置内部的时间同步服务器
4) 禁用iptables和firewalld服务
kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则
5) 禁用selinux
selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题
6) 禁用swap分区
swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用
启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备
但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明
7)修改linux的内核参数
8)配置ipvs功能
在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的
两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块
9) 重启服务器
上面步骤完成之后,需要重新启动linux系统
下面开始对集群进行初始化,并将node节点加入到集群中
下面的操作只需要在master节点上执行即可
下面的操作只需要在node节点上执行即可
kubernetes支持多种网络插件,比如flannel、calico、canal等等,任选一种使用即可,本次选择flannel
下面操作依旧只在master节点执行即可,插件使用的是DaemonSet的控制器,它会在每个节点上都运行
至此,kubernetes的集群环境搭建完成
接下来在kubernetes集群中部署一个nginx程序,测试下集群是否在正常工作。
在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。
kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,也就是在kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。
kubernetes的最小管理单元是pod而不是容器,所以只能将容器放在Pod中,而kubernetes一般也不会直接管理Pod,而是通过Pod控制器来管理Pod的。
Pod可以提供服务之后,就要考虑如何访问Pod中服务,kubernetes提供了Service资源实现这个功能。
k8s提供了三种资源管理方式
- 命令式对象管理:直接使用命令去操作kubernetes资源
- kubectl run nginx-pod –image=nginx:1.17.1 –port=80
- 命令式对象配置:通过命令配置和配置文件去操作kubernetes资源
- kubectl create/patch -f nginx-pod.yaml
- 声明式对象配置:通过apply命令和配置文件去操作kubernetes资源
- kubectl apply -f nginx-pod.yaml
kubectl命令
kubectl是kubernetes集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。kubectl命令的语法如下:
comand:指定要对资源执行的操作,例如create、get、delete
type:指定资源类型,比如deployment、pod、service
name:指定资源的名称,名称大小写敏感
flags:指定额外的可选参数
下面以一个namespace / pod的创建和删除简单演示下命令的使用:
命令式对象配置就是使用命令配合配置文件一起来操作kubernetes资源。
1) 创建一个nginxpod.yaml,内容如下:
2)执行create命令,创建资源:
此时发现创建了两个资源对象,分别是namespace和pod
3)执行get命令,查看资源:
这样就显示了两个资源对象的信息
4)执行delete命令,删除资源:
此时发现两个资源对象被删除了
声明式对象配置跟命令式对象配置很相似,但是它只有一个命令apply。
本章节将介绍如何在kubernetes集群中部署一个nginx服务,并且能够对其进行访问。
Namespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。
默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那此时就可以将两个Pod划分到不同的namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的\”组\”,以方便不同的组的资源进行隔离使用和管理。
可以通过kubernetes的授权机制,将不同的namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理。
kubernetes在集群启动之后,会默认创建几个namespace
下面来看namespace资源的具体操作:
查看
创建
删除
配置方式
首先准备一个yaml文件:ns-dev.yaml
然后就可以执行对应的创建和删除命令了:
创建:kubectl create -f ns-dev.yaml
删除:kubectl delete -f ns-dev.yaml
Pod是kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中。
Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器。
kubernetes在集群启动之后,集群中的各个组件也都是以Pod方式运行的。可以通过下面命令查看:
创建并运行
kubernetes没有提供单独运行Pod的命令,都是通过Pod控制器来实现的
查看pod信息
访问Pod
删除指定Pod
配置操作
创建一个pod-nginx.yaml,内容如下:
然后就可以执行对应的创建和删除命令了:
创建:kubectl create -f pod-nginx.yaml
删除:kubectl delete -f pod-nginx.yaml
Label是kubernetes系统中的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择。
Label的特点:
- 一个Label会以key/value键值对的形式附加到各种对象上,如Node、Pod、Service等等
- 一个资源对象可以定义任意数量的Label ,同一个Label也可以被添加到任意数量的资源对象上去
- Label通常在资源对象定义时确定,当然也可以在对象创建后动态添加或者删除
可以通过Label实现资源的多维度分组,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作。
一些常用的Label 示例如下:
版本标签:\”version\”:\”release\”, \”version\”:\”stable\”……
环境标签:\”environment\”:\”dev\”,\”environment\”:\”test\”,\”environment\”:\”pro\”
架构标签:\”tier\”:\”frontend\”,\”tier\”:\”backend\”
标签定义完毕之后,还要考虑到标签的选择,这就要使用到Label Selector,即:
Label用于给某个资源对象定义标识
Label Selector用于查询和筛选拥有某些标签的资源对象
当前有两种Label Selector:
- 基于等式的Label Selector
- name = slave: 选择所有包含Label中key=\”name\”且value=\”slave\”的对象
- env != production: 选择所有包括Label中的key=\”env\”且value不等于\”production\”的对象
- 基于集合的Label Selector
- name in (master, slave): 选择所有包含Label中的key=\”name\”且value=\”master\”或\”slave\”的对象
- name not in (frontend): 选择所有包含Label中的key=\”name\”且value不等于\”frontend\”的对象
标签的选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号\”,\”进行分隔即可。例如:
name=slave,env!=production
name not in (frontend),env!=production
命令方式
配置方式
然后就可以执行对应的更新命令了:kubectl apply -f pod-nginx.yaml
在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。Pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod。
在kubernetes中Pod控制器的种类有很多,本章节只介绍一种:Deployment。
命令操作
配置操作
创建一个deploy-nginx.yaml,内容如下:
然后就可以执行对应的创建和删除命令了:
创建:kubectl create -f deploy-nginx.yaml
删除:kubectl delete -f deploy-nginx.yaml
通过上节课的学习,已经能够利用Deployment来创建一组Pod来提供具有高可用性的服务。
虽然每个Pod都会分配一个单独的Pod IP,然而却存在如下两问题:
- Pod IP 会随着Pod的重建产生变化
- Pod IP 仅仅是集群内可见的虚拟IP,外部无法访问
这样对于访问这个服务带来了难度。因此,kubernetes设计了Service来解决这个问题。
Service可以看作是一组同类Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。
操作一:创建集群内部可访问的Service
操作二:创建集群外部也可访问的Service
删除Service
配置方式
创建一个svc-nginx.yaml,内容如下:
然后就可以执行对应的创建和删除命令了:
创建:kubectl create -f svc-nginx.yaml
删除:kubectl delete -f svc-nginx.yaml
小结
至此,已经掌握了Namespace、Pod、Deployment、Service资源的基本操作,有了这些操作,就可以在kubernetes集群中实现一个服务的简单部署和访问了,但是如果想要更好的使用kubernetes,就需要深入学习这几种资源的细节和原理。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。