看《码农翻身》的一些收获.

About 9 minbookjava code

test

今天是双十一,哪里也没去,早晨10点多就出门了,在新华书店里面呆了一天,在书架中找到了这本书,很容易的就看了进去,这本书用故事的方式描述生涩的代码以及程序。自己购买的java并发编程实战看了几页总是无法集中精力看下去,内容很充实,可能一直在家里躺在床上太安逸的看书,导致看着看着就放弃了,希望坚持下去。

这本书学会了一个很重要的做事方式<凡事必先骑上虎背>,在自己做一件事情犹豫不决的时候,想想这句话,在做事情的时候,需要先骑在老虎的背上。和明知山有虎,偏上虎山行差不多。在这种状态下,经常会出现骑虎难下的尴尬情况。只要不恐惧这种情况,那么在这种状态下学习就收获更多的东西。

一、概要

书籍用第一人称描述计算机的各个组成如:内存、进程等,和日本的《工作细胞》动漫差不多。从底层描述描述进程、线程、cpu、内存、硬盘等。整本书籍阅读起来相当的有趣,看的时候完全当成一本小说在读,但是读到最后,确实学到很多知识,虽然很多东西都是之前学习过的,但是很多也是自己理解不够透彻的。一方面可以巩固自己的知识,一方面也可以学习一些自己没接触过的东西。

二、计算机的世界

  • 进程:比如QQ运行,QQ音乐运行,微信运行,都需要一个进程去处理,一个计算机可以有多个进程。进程之间的切换实现了多个程序同时运行的效果。

  • 线程:一个进程可以拥有多个线程

  • cpu:由寄存器和运算器组成,寄存器用来存储数据,运算器负责运算,速度特别快

  • 内存:内存负责把硬盘的数据加载到内存里面,并且各种指令,执行速度一般

  • 硬盘:负责把数据持久化,存储数据,防止断电,执行速度特别慢

  • 汇编语言:比较难理解的语言,负责和底层的二进制(机器语言)打交道

  • 高级语言: 如c、c++、java、python等。用人类方便理解的语言和汇编语言打交道

  • tcp/ip:主要解决的就是网络传输数据的问题,通过没次发送少量数据拆包,并进行失败重发的功能解决发送大量数据的问题。发送的过程中由多个路由器进行转发到目的地完成。

三、java帝国

  • java class : java类主要由java的类加载调用,每个线程都会有一个函数栈(栈祯),用来进行方法调用

  • JDBC : 由一个工厂方法实现,封装了各种实现,用于和各种数据库对接,便于数据的持久化,代替的文件存储方法,提高效率。

  • Jsp : java的模版套用mvc的view。用于将html和数据组合生成html页面。freemarker也是类似的,但是freemarker静态的页面也是可以浏览的。

  • JTA : 在多个数据库之间传送数据,保证数据的事务性。由一个全局事务管理器实现,统一准备和统一提交。失败案例(全局事务管理器出现问题,将无法保存数据的一致性)

  • 消息队列(JMS - java message service):为了实现分布式项目的数据传递问题。如订单服务器给物流服务器发送订单,物流服务器出现问题,暂时无法接受订单。就可以由一个消息队列处理,有订单了,由订单服务器发送订单到消息队列排队,物流服务器可以随时接收订单,就是物流服务器有事情,也不会影响到订单服务器。

  • 动态代理:可以实现给一个类动态的添加新的行为。动态代理可以实现aop的切面功能。

  • java注解:注解相当于加强的注释。注解有元注解(注解的注解),通过注解可以减少xml文件的编写,最好的方式就是xml和注解配合一起使用。

  • 泛形:泛形就是可以限制一组数据的数据类型。<? extends Object> 的意思就是可以传入继承了对象类的任意对象。

  • 序列化:把java对象编程二进制字节流存储在硬盘上,当然还有一种办法就是把二进制字节流反序列化为java对象。

  • java程序的锁:在java中synchronized就是同步锁,每个线程需要访问锁里面的内容必须要拿到锁,没有拿到的就需要在线程池里面等待。这个是一个重量级的悲观锁(觉得线程随时都会更改数据)。另一种办法就是乐观锁(认为大部分情况多线程的情况都比较少),可以给数据添加一个版本号,每次更改数据后版本变化。在实现功能的时候,可以把数据获取出来更改之后,在修改的时候对比版本号是否一致,如果不一致则继续重新获取,直到版本号一致为止。这样就减少了同步锁导致的线程在线程里面等待所消耗的资源。

  • spring DI和IOC、AOP: 在一个大型的项目中日志、事务、登录等功能都会涉及到程序的各个层面,如果不统一管理,就会出现大量冗余的代码,而且大量的代码会导致代码的臃肿。像这些经常会出现的代码,可以用模版方法和装饰者模式去封装常用的代码,但是这样很多类都需要实现接口。为了避免这种情况,于是出现了控制反转ioc,和依赖注入di(把类的依赖情况转交给spring容器)。aop利用的java动态代理实现的面向切面编程。

四、web冲浪

  • hyperText Transfer Protocol (HTTP) : 超文本传输协议,这里的超文本就是HyperText Markup Language (HTML,一种文本的标记形语言)

  • HTTPS : 在使用HTTP在网上传输HTML的时候是使用的明文,如果中途被截取了,隐私就会被泄露。HTTPS解决了安全性问题,用对称数据加密和非对称数据加密结合解决了网络传输HTML的安全性问题。对称加密利用一个公匙和私匙,公匙加密(所有人都可以知道公私),私匙解密(对应的公私加密的文件只有对应的私匙解密)。解密的私匙是需要双方都持有的,因为双方都需要加密解密,所以在保证安全的情况下把私匙传给对方就需要非对称加密了。非对称加密需要第三方的证书+签名,才可以完成(非对称加密还需要理解一下)。

  • SSO : 一个由很多子系统组合在一起的大型项目就需要实现在一个小的项目中登录之后,进入相关的项目就不用再次登录的单点登录功能。实现原理就是利用一个认证中心实现登录,用户首次登录时会获取到认证中心的一个cookie用于存放在浏览器端,浏览器上面存两个cookie,一个是认证中心的cookie一个是当前访问应用的cookie。用户访问另一个应用时,只需要将之前的cookie携带访问应用,后端通过应用验证cookie是否有效即可判断用户是否已经登录。

  • 授权 : 比如QQ、微信、微博第三方登录等,都是使用的授权登录方法。应用可以通过自己申请的第三方的appid和密匙,获取授权的code,授权code会有超时时间等,通过code可以获得token,最后通过token就可以实现登录逻辑。

  • 负载均衡 : 多台服务器运行相同的应用,nginx在进行接口转发时均衡的转化,不出现有的服务器严重负载,有的服务器轻松自在。

  • 高可用 : 当服务器出现故障之后,有备用的服务器顶上去,不会出现无法访问的情况。

    1. tomcat集群:通过多台tomcat服务器实现高可用,由nginx来进行服务转发(实现负载均衡)。
    2. redis集群:通过jedis负责分发tomcat的请求(redis cluster)。
    3. 数据库读写分离:由多台数据库实现,一个master数据库可读可写已写为准,多个slave数据库进行只读操作(读时需将数据同步至slave数据库,master出现故障由slave数据库顶替)

五、代码管理

  • VCS(Version Controller System): 版本控制系统,svn采取的就是这种方式管理的代码!采用更新,提交的方式进行。

  • 分支,多版本并行: 通过分支实现多版本并行,在代码开发的时候可以有多个版本并行开发,每个人在本地都有一个私有库,每个人都可以有选择性的提交不同版本的代码,最后只需进行合并即可。git就是采用的这种方式。

  • build: 代码的自动化构建。manven的pom.xml就是可以用build脚本进行自动化构建的一个工具(自动打包、编译、部署)。

六、其他

  • 声明式编程: SQL语句就是声明式编程(只提供声明,具体实现有系统负责)

  • 命令式编程: 大多数程序员使用的语言都是命令式编程(通过指令告诉计算机怎么做)。

Last update:
Contributors: gaoqisen,gaoqisen