基于系统应用学习Java知识

基于系统应用学习Java知识

  • 背景
  • 思考结论
  • 系统应用技术框架组成
  • 总结

背景

最近身边有好友入门学习java,但又苦于java知识库的浩瀚对学习java感到迷茫。这点对我一个数学专业的学生自学java感同身受。在此之前我有零散地指导他们学习什么知识什么知识。但我发现经过一段时间我发现他们的学习效果并没有理想,依然很迷茫,不敢踏出到外面面试的脚步。经过与他们沟通,我发现他们有努力在学习,我要求他们学习的知识框架他们也在学习。我陷入了思考,发现他们的最大的自信不足是他们觉得他们现在还是什么都不会做,虽然我觉得他们可以了。

思考结论

为什么他们不敢出去面试?为什么他们觉得自己什么都不懂?就算我在努力的肯定了他们但他们还是不自信。经过几天的反思,我觉得我叫他们学习的知识过于零散,并且没有把这些知识在目前行业内如何联系起来用于实际的生产中。所以就会造成他们对外面世界的恐慌,对将来参加到开发中的恐慌。基于此反思,我整理了行业内目前系统的普遍玩法,并且这些知识如何在系统中发挥他的作用,这样会让入门者更加清晰有目标地学习对应的知识,并且增强自己对未来工作自信。

系统应用技术框架组成

工作至今,我参加公司的自研中台系统建设:用户中心、帐务征信调帐平台、帐务中心。自研系统是对标行业先进,起码要满足公司未来五年甚至十年发展,所以相对来说技术框架还是比较新,也是比较符合现状的。通过参与开发的系统和学习抽取这些系统用到的知识和这些知识在系统中发挥的作用,以供大家参考。
基于系统应用学习Java知识_第1张图片
图片说明:图片标的序号是以一个请求进到系统经过各个主键标的。下面我们就对各个序号在系统中承担的角色粗略说明一下:

①请求的方式:请求的方式有两种: 同步请求 和 异步请求。同步请求就是我们平时的http请求,Rpc框架调用。异步请求目前行业主要是基于消息队列来做异步请求。关于http请求要学习的目前最火的是SpringMvc,Rpc框架目前比较流行的是阿里的Dubbo,Spring生态的Spring Cloud。关于异步的消息队列,目前有很多种,各有各的应用场景,例如我司利用的是Kafka做消息队列,个人也更加喜欢kafka。关于异步请求和同步请求再多说一下就是个人建议系统之间的交互如果能用异步就异步,异步相对于同步的优点有:一、限流,根据自己的处理能力来消费请求 。二、数据柔一致性更容易实现。缺点就是延迟。

②分布式锁。现在,未来应用一般都是微服务、分布式。在分布式的前提背景下,当一个请求过来,对于需要加锁的接口我们都应该考虑分布式锁,虽然有些人基于乐观锁来控制,但个人觉得不可采取。因为基于未来应用的发展的瓶颈很大可能是会出现在数据库(虽然公司有搭数据库集群,但还是存在很多问题,就是目前两台数据库都支持读写,后面数据库的同步并没有完美的解决方法,所以架构组这边是打算增加用户路由,通过部署单元解决数据库的瓶颈问题(还在规划中))。扯远了,回到我们的分布式锁。目前实现分布式大多是基于zookeeper实现,同时zookeeper也支持分布式锁,但也许大家没有注意到Redis社区其实也分布式锁的解决方案Redisson,应用挺简单的。这里说一下这两者的区别,在做用户中心的时候对他们两个记忆犹新。一开始用户中心基于zookeeper做分布式锁,后面压测无法达标,要求1000QPS。不管我们通过这样的业务流程,代码优化都是无法达标,最好就达到300QPS。后面我们采用Redisson,顺利达标哈哈哈哈。这里也许有一个客观原因就是我们的测试环境的zookeeper太多应用在使用,什么duboo,elasticJod调度等等因素在里面。这些我们不说,我们只说这两者的区别的根本原因:zookeeper读写比较重,所以在压测的时候读写频繁所以响应很差,Redission是基于内存数据库,读写是很快的,所以响应也比较快。

③ Spring Security 一般配合Oauth做请求级别或者接口级别的身份确定和授权,是一种基于Spring Aop 和 Servlet过滤器的框架,提供全面的安全性解决方案。在应用中主要用来限制接口需要具备什么样权限的用户才可以访问,防止信息泄漏和系统安全漏洞。

④SpringBoot这里就不做过多的介绍,就是Spring容器的增加版。

⑤Redis目前是很多公司使用的内存数据库,它主要的应用场景是缓存一些经常被查询和很少改动的数据。主要是用于缓解数据库的压力和快速响应请求(内存处理比较快)。还有一些会把redis用作自增序列的作用,其实我是不提倡自增序列依赖于redis来产生,因为虽然redis提供高可用的解决方案哨兵模式和分布式的集群模式,但在实际生产中还是有可能出现故障的。因为不是每个系统都是按规则来办事,有些系统用redis来存大对象,很容易就搞挂redis,这样就得提供降级方案来维护系统的运行,而自增的降级不好做,你想一下如果我存的是数据,redis挂掉,我的降级方案就是直接去数据库获取该对象。那如果是自增怎么办?起码你得先查一下上一个值才能做自增吧。所以还是提倡自增不要依赖redis,可以在数据库中搞一个函数,依赖数据库来生成。(如果你的数据都挂掉,我相信你的应用应该也就不能再提供服务了)。还有使用redis的时候要知道redis存在一个序列化和反序列化的过程,这个也是很耗性能的,必要的场景可以考虑用本地缓存来代替redis缓存,降低性能损耗。

⑥mybatis没什么好说,就是数据持久层框架,网上有很多的教程。

⑦oracle数据库,现在很多公司使用的是免费的mysql数据库。

总结

在我画了这个脑图发给我朋友后,他们第一时间直接陷入了绝望,叹息自己好几个点都没接触过,现在连入门的皮毛都不具备,自己就懂一点springMVC、spring、mybatis、mysql…反正就是一大堆绝望了,直接就打算从入门到换行。我花了好长一段时间才安稳他们的情绪哈哈哈哈。
如果是这种效果那就是与我的初衷直接违背了,我整理这个东西的初衷是让他们清楚现在行业内系统一般怎样构建,我们学习路线该怎样走,先明白路线,然后知道各个组件是做什么,然后才逐一去攻破,继续深造自己的技术。而现在的入门,许多小型创业公司还是停留在面试造飞机,实际工作是扭螺丝的解段。就是一些简单的增删改查的功能。这些功能就是只需要springMVC、spring、mybatis、mysql就足够了。哈哈哈所以入行也许springMVC、spring、mybatis、mysql就够了,如果想走远还是得花功夫学习的。
在实际项目中的细节也远远不止这些,像用当当网的elasticJob来做分布式调度,基于搜索引擎,规则引擎来填充各个功能块。所以大家都是在路上,都是苦行僧。当你慢慢接触后你就发现其实还有很多东西有待你去开发,加油吧骚年。就到这里了哈,已经好久没写博客了,这篇博客是在公司996攻坚战两个月抽的时间完成的,有什么问题大家尽情提出来,大家一起学习

你可能感兴趣的:(java入门)