都说java饱和了,为什么我可以找到11k的工作?

每天看网上消息,很多人都说java越来越饱和,很难找到工作,后面我试了一下,却发现只要给你的东西认真学了,其实并没有太困难,感觉一直在说找不到工作了,大多都没有先衡量一下自身的情况,自身只有8k水平去面试12k的工作,就算面试进去也会被发现水平不够然后被刷下来。

就像我当初一起学习的同班同学一样,学的时候从不认真,2w多块钱打水漂一样,真以为交了那么多钱就能完全得到一份好的工作,只有学到了,才是自己的,不认真学而一直怪别人,工作上也不会有太大出息。

今年毕业,本科电子专业,目前人在北京做Java工程师,满打满算在学校自学了7个月的Java,毕业后的一个月一直在北京找工作,大概找了20多天面试了30家左右,拿到3个offer,最后选择了现在这家公司,待遇是税前11K,五险一金加节假日福利,工作时间是朝10晚7双休,有的时候需要加班。

之所以当时选择自学Java,是因为我的专业电子,如果出去做本专业的工作,那基本都是进入电子厂当小工,对于那些电路板我确实没有多大的兴趣,感觉跟旧时的工人差不多,因为我大一接触过C语言,所以对于编程有一定的了解,而且对于这些逻辑上的东西也比较感兴趣,最主要的是因为做软件工程师比其他行业工资都高,这是最吸引我的地方,都知道90后很穷,确实都缺钱花,那么缺钱花怎么办?我自己也知道,就是靠着自己的努力赚,抱怨那些东西都没什么用,钱又不是抱怨来的。

一开始自学的教程是在某宝买的,当时花了32块钱,是2017年的教程,我就是跟着教程一步步的走,因为自己比较喜欢看书,也有耐心看书,就自己买了一本Java入门书籍,我个人的感觉还是跟着视频教程学比较靠谱,看书太枯燥而且都是理论知识,用处不大,不过对于自己的编程思维还是有一定帮助的,对于刚接触编程的人来说,编程思维的锻炼尤其重要。

后来一做题目发现遗漏很多,虽然懂了书上那些基础的知识,但就跟了解了数学书上的公式差不多,一到做项目全都原形毕露,并且一个人有很多问题也没有人可以问,所以明白这个短板,就在黑马程序员报班学习,当初也考虑过尚硅谷和达内,但给达内打电话咨询时候,一天内给我打了三个电话,所以达内基础班都没有过去听就把他淘汰了,后来在黑马和尚硅谷之间选择,因为我当初看的视频大多都是黑马的,并且感觉线下培训还是黑马比较强,所以选了黑马。并且过年前出的黑马程序员中级路线图的资源也感觉都挺好的。

1. 首先你应该有一个比较好的学习教程,这是学习Java的根本.我们只有提前准备好视频教程,我们才知道现在应该学什么,后面应该学什么,企业岗位需要你掌握的技术知识点有哪些。

2. 然后你应该知道学习Java的难点在哪里?根据我学习的经验来看,学习Java最困难的时候就在前1-2个月,这个时候遇到学习心态爆炸的情况最多,因为Java语言的特点就在于开始学难,而以后越学越简单。Java需要记的东西非常多,还有就是刚接触编程如何培养编程思维,当你明确了刚开始学习Java的难点是什么,就有办法去解决它,从而绕过这些坑,进行有效率的学习。

3. 是不是有很多人觉得自己学了后面的就把前面的知识忘记了,而且还感觉视频教程中的都能听懂,但让自己写却写不出来代码,不知道如何实现。关于这两个问题,我想大部分人都遇到过,根据我个人的经验来看,这主要是因为自己当初所学的知识点没有经过大量的练习题和项目进行实践,只是在短期内脑海中的记忆,并没有形成一个深刻的记忆,因为自己没有经历啊,因为自己没有写过案例和项目。学编程技术是为了做更好的互联网产品,可是你却很少写代码,这样的学习方法怎么能是正确的呢?

我们学校食堂

4. 学到什么程度才能就业?

这是很多初学者都会问的问题,不知道自己应该学到什么程度才能就业,这个问题很简单啊,你去看看招聘网站的技能需求是什么。一般来讲,一家公司面试一个人,都是因为这个人简历上面写的技能跟自己公司符合,项目类型与自己公司相符,这就是符合他们公司的人才,公司会针对你简历上面写的技能需求,来对你进行技术询问。

现在公司招聘人才的标准都是差不多的,能参与到小组中合作开发项目,能独立分析业务需求,并且完成部分功能需求,在规定的时间内完成自己的工作任务。

Java的内容非常庞大,但是常用的只有20%左右,所以学习Java有句话,用20%的知识来解决80%的问题。

什么都没有准备,怎么可能得到高工资呢,对于我这个刚毕业的普通学校的人来说,11k已经是我们班最高的工资了,并且超出平均工资很多,我已经很满足了,还是很感谢黑马程序员的。

我只是想把学员心声和经验想分享给大家看,另外,黑马中级程序员路线图和资源在下方更多的链接里哦。

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系统各个组件调用关系:

  1. 首先要明确,一旦kubernetes环境启动之后,master和node都会将自身的信息存储到etcd数据库中
  2. 一个nginx服务的安装请求会首先被发送到master节点的apiServer组件
  3. apiServer组件会调用scheduler组件来决定到底应该把这个服务安装到哪个node节点上
  4. 在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知apiServer
  5. apiServer调用controller-manager去调度Node节点安装nginx服务
  6. kubelet接收到指令后,会通知docker,然后由docker来启动一个nginx的pod
  7. pod是kubernetes的最小操作单元,容器必须跑在pod中至此,
  8. 一个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,就需要深入学习这几种资源的细节和原理。

经过慎重考虑,我拿出这套适合初学者入门的Java基础完整版视频

作为走在编程教育培训前列的黑马程序员,肯定会有很多套教程,有些反响一般,有些却能横空出世,直接成为王牌资源。无可争议的处于我们观看榜、留存榜、好评榜的前列。

对于前期入门,就有几套推出的Java入门视频教程,而其中数据特别亮眼的就是这个:java基础教程(编程就像打字一样简单)。该视频专门针对零基础的学员录制,更适合小白学习,更贴近初学者的学习习惯。授课讲究通俗易懂,生动幽默。相信你能够轻松地入门Java语言。

也有很多观看过的学员留下好评:

看看下图(头条极速版可能就不行咯)就会自动回复这套啦,还有其他惊喜:

言归正传,小编该给大家介绍一下这套教程了:

java基础入门阶段

1 HelloWorld、2 常量、3 变量、4 数据类型、5 运算符、6 方法、7 流程控制语句、8 IDEA使用、9 数组

1 类、2 对象、3 封装、继承、多态、4 构造器、5super、this、6 接口、抽象类、7 权限修饰符、8 内部类、9 Random、ArrayList、String、Arrays、Math

可掌握的核心能力:

  • 掌握Java开发环境基本配置;
  • 掌握运算符、表达式、流程控制语句、数组等的使用;
  • 熟练使用Idea开发工具;
  • 掌握Java基本面向对象知识;
  • 掌握常用类String、ArrayList等的使用。

可解决的现实问题:

掌握Java基础知识,为后面的深入学习java课程打下坚实的基础。

看完此套教程可以学习javaweb教程

另外贴出学习路线图,希望有用。

学习当然有目的,但最终的最终,希望大家都能发大财!

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。