夜光带你走进Java架构师必备知识点(15)高级程序员

夜光序言:

 

 一举一动,都是承诺,会被另一个人看在眼里,记在心上的。

 

 

 

夜光带你走进Java架构师必备知识点(15)高级程序员_第1张图片

 

 

 

正文:

十九、数据交换格式与springIOC底层实现

1.什么是数据交换格式?

JSON、XML


2.XML和JSON各自的应用场景

 

移动端(安卓、IOS)通讯方式采用http协议+JSON格式 走restful风格。

很多互联网项目都采用Http协议+JSON

因为xml比较重WebService服务采用http+xml格式 银行项目使用比较多

XML:是一种重量级数据交换格式(标记语言)

JSON:本质上是一种轻量级数据交换格式

 


3.JSON和XML的区别

1.JSON占用宽带小,XML占宽带大

 


4.什么是JSON?

JSON是一种轻量级的数据交换格式,相比XML这种交换格式来说,XML比较复杂,而且需要编写大量的代码,所以客户端和服务器的数据交换格式往往通过JSON来进行交换。

JSON:JavaScript 对象表示法(JavaScript Object Notation)

JSON的形式是用大括号“{}”包围起来的项目列表,每一个项目间用逗号(,)分隔,而项目就是用冒号(:)分隔的属性名和属性值。这是典型的字典表示形式。

也再次表明javascript里的对象就是字典结构。不管多么复杂的对象,都可以用一句JSON代码来创建并赋值。在JSON中,名称 / 值对包括字段名称(在双引号中),后面写一个冒号,然后是值

 



 

5.JSON格式分类

json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构

1、对象:对象在js中表示为“{}”括起来的内容,数据结构为 key:value,key:value的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,

 这个属性值的类型可以是 数字、字符串、数组、对象几种;

2、数组:数组在js中是中括号“[]”括起来的内容,数据结构为 ["java","javascript","vb",...],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。

 经过对象、数组2种结构就可以组合成复杂的数据结构了。

 

 


5.java操作JSON有哪些框架?

gson(谷歌)、fastJson(阿里)、jackson(springmvc)

6.fastJson解析json

1.创建maven工程

2.引入fastJson依赖

com.alibaba

fastjson

1.1.43

3.详见程序

 

 


7.XML

1.什么是XML?

XML全称为可扩展标记语言,主要用于描述数据和用作配置文件

XML文档在逻辑上主要由5部分组成:

1.XML声明:指所用XML版本,文档的编码,文档的独立性信息

2.文档类型声明:指XML所用的DTD

3.元素:由开始标签、文档内容和结束标签构成

4.注释:用于文档中的内容,起一个说明的作用

5.处理命令:通过处理命令来通知其他应用程序来处理非XML格式数据,格式为:

XML的文档的根元素被称为文档元素,它和在其他外部出现处理命令,注释等作为文档实体的子节点,根元素本身和其内部的子元素也是一棵树。

 

 


 


8.解析XML方式有哪些?

dom4j:解析XML过程是通过获取document对象,然后继续获取各个节点以及属性等操作。

sax、pull、sax、pull

 

 



9.dom4j与sax区别

dom4j不适合大文件的解析,因为它是直接将文件加载到内存中,所以有可能出现内存溢出,sax是基于事件来对xml进行解析的,所以适合解析大文件的xml,

dom4j可以对xml进行灵活的增删改查和导航,而sax没有这么强的灵活性,以sax经常用来解析大型xml文件,而对文件进行一些灵活操作就用dom4j。

 

 


8.java反射机制

1.什么是java反射?

就是正在运行,动态获取这个类的所有信息,类可以不用new,使用java反射机制初始化,类中如果有私有属性,可以使用反射机制赋值。

反射机制的核心是当前类的class文件

2.反射机制的作用

1.提高程序的扩展性

3.如何禁止java反射机制?

调用newInsatance方法默认调用无参构造函数创建对象,并且是public类型,将构造函数私有化可禁止反射机制

4.反射机制的应用场景

springIOC、JDBC、框架

5.使用反射机制访问私有属性

 

 

 



 

9.手写springIOC框架

1.什么是springIOC?

把每一个bean(实体类)与bean之间的关系交个第三方容器(spring)管理。

2.springIOC底层实现原理

1.解析XML

2.使用bean的id查找对应xml节点,获取class节点属性

3.利用反射机制初始化类

4.利用反射机制给私有属性赋值

3.springIOC使用技术

dom4j+反射机制

 

 

 


 


二十、springcloud

1.什么是springCloud?

springcloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等。

springcloud运行环境简单,springcloud是基于springBoot的。

底层通过httpclient进行封装的。

 


2.什么是分布式?

 

不同模块部署在不同服务器上

作用:分布式解决网站高并发带来的问题

 

 



 

3.什么集群?

将一个项目部署多个节点,完成同一个任务

 

 



 

4.什么是SOA、rpc、微服务?

SOA: 架构理念, 面向服务架构

RPC:远程调用技术

微服务架构:将一个项目进行拆分成多个模块,多个模块之间通讯使用PRC远程调用技术。

 

 


5.restful、soap、rpc

 

1.RESTful:是一种架构设计风格,提供了设计原则和约束条件,而不是架构。而满足这些约束条件和原则的应用程序或设计就是 RESTful架构或服务。

2.SOAP:简单对象访问协议是一种数据交换协议规范,是一种轻量的、简单的、基于XML的协议的规范。SOAP协议和HTTP协议一样,都是底层的通信协议,只是请求包的格式不同而已,SOAP包是XML格式的。

SOAP的消息是基于xml并封装成了符合http协议,因此,它符合任何路由器、 防火墙或代理服务器的要求。

soap可以使用任何语言来完成,只要发送正确的soap请求即可,基于soap的服务可以在任何平台无需修改即可正常使用。

3.RPC:RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。

RPC 会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯)

RPC 是一个请求响应模型。客户端发起请求,服务器返回响应(类似于Http的工作方式)

RPC 在使用形式上像调用本地函数(或方法)一样去调用远程的函数(或方法)。

 


6.拆分成子项目开发的优缺点

缺点:成本高,开发效率低

优点:解耦、分子项目互不影响

 

 


7.服务提供者与消费关系

1.什么是服务?

服务就是提供接口。

2.什么是提供服务?

提供接口

3.什么是消费服务?

消费接口

 

 


8.服务注册中心(Eureka)

 

将一些服务信息注册到注册中心中。

1.创建祖册中心类

2.引入springBoot+springcloud+Eureka依赖

3.创建application.yml

4.加入配置

server:

port: 8761

eureka:

instance:

hostname: localhost

client:

registerWithEureka: false

fetchRegistry: false

serviceUrl:

defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

5创建服务类

6.在类前加入EnableEurekaServer注解,表示为服务注册中心

7.在类前加入SpringBootApplication注解,表示该类为启动类

8.启动,用springApplication.run()方法

 

 




 

 

9.提供服务

创建一个服务提供者 (eureka client),当client向server注册时,它会提供一些元数据,例如主机和端口,URL,主页等。Eureka server 从每个client实例接收心跳消息。

如果心跳超时,则通常将该实例从注册server中删除。

1.创建提供服务类

2.引入springBoot+springcloud+Eureka依赖

3.创建application.yml

4.加入配置

eureka:

client:

serviceUrl:

defaultZone: http://localhost:8761/eureka/

server:

port: 8762

spring:

application:

name: service-hi

5.创建提供服务类

6.在类前加入EnableEurekaClient注解,表示该类提供服务

7.启动 同springboot

9.消费服务(ribbon)

1.springcloud调用服务有哪些方式?

restTemplame、feign、ribbon(负载均衡)

2.什么是ribbon?

ribbon是一个负载均衡客户端,可以很好的控制htt和tcp的一些行为。Feign默认集成了ribbon。

3.步骤:

1.创建消费服务端类

2.引入springboot+springcloud+Eureka+ribbon依赖

3.

 

 

 




 

 

二十一、自定义注解与设计模式

1.自定义注解

1.什么是注解?

JDK1.5新增技术,注解,很多框架为了简化代码,都会提供注解,可以理解为插件,是代码级别的插件。

2.为什么要用注解?

提高编程效率

3.注解分类

内置注解、自定义注解

4.内置注解

SuppressWarnings:在程序前面加上可以在javac编译中去除警告--阶段是SOURCE

Deprecated:带有标记的包,方法,字段说明其过时----阶段是SOURCE

Overricle:打上这个标记说明该方法是将父类的方法重写--阶段是SOURCE

5.自定义注解

Target:Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。

在Annotation类型的声明中使用了target可更加明晰其修饰的目标。

1.CONSTRUCTOR:用于描述构造器

2.FIELD:用于描述域

3.LOCAL_VARIABLE:用于描述局部变量

4.METHOD:用于描述方法

5.PACKAGE:用于描述包

6.PARAMETER:用于描述参数

7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

Retention:表示允许使用反射获取信息

2.设计模式

1.什么是设计模式?

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。

使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。

2.设计模式分类

1.创建型模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

2.结构型模式:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

3.行为型模式:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

3.设计模式的原则

1.开闭原则

开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。

为了使程序的扩展性好,易于维护和升级。

2.里氏代换原则

里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。

LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。

里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。

而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

3.依赖倒转原则

是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。

4.接口隔离原则

使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。

5.迪米特法则(最少知道原则)

一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。

6.合成复用原则

原则是尽量使用合成/聚合的方式,而不是使用继承。

4.单例模式

1.什么是单例模式?

单例保证一个对象JVM中只能有一个实例,常见单例 懒汉式、饿汉式

2.什么是懒汉式?

需要的才会去实例化,线程不安全

3.什么是是饿汉式?

当class文件被加载的时候,初始化,天生线程安全。

5.工厂模式

1.什么是工厂模式?

实现创建者和调用者分离

6.代理模式

1.什么是代理模式?

通过代理控制对象的访问,可以详细访问某个对象的方法,在这个方法调用处理,或调用后处理。既(AOP微实现)  ,AOP核心技术面向切面编程

2.代理应用场景

安全代理:可以屏蔽真实角色

远程代理:远程调用代理类RMI

延迟加载:先加载轻量级代理类,真正需要在加载真实

3.代理分类

1.静态代理(静态定义代理类)

2.动态代理(动态生成代理类)

Jdk自带动态代理

Cglib 、javaassist(字节码操作库)

4.静态代理

静态代理需要自己生成代理类

5.JDK动态代理

不需要生成代理类,实现InvocationHandler就可以了。JDK的动态代理是通过反射机制生成的。

6.CGLIB动态代理

CGLIB动态代理使用asm框架生成代理

6.JDK动态代理和CGLIB动态代理的区别

jdk动态代理是由Java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。

总的来说,反射机制在生成类的过程中比较高效,而asm在生成类之后的相关执行过程中比较高效(可以通过将asm生成的类进行缓存,这样解决asm生成类过程低效问题)。

注意:jdk动态代理的应用前提,必须是目标类基于统一的接口。如果没有上述前提,jdk动态代理不能应用。

asm其实就是java字节码控制

 

 

 

 


二十二、网络编程

1.什么是网络编程?

网络编程本质意义是两个设备之间的数据交换,在计算机网络中,设备指的是计算机。

网络编程基本上是基于请求/响应方式的,也就是一个设备发送请求数据给另一个,然后接收另一个设备的反馈。

在网络编程中,发起连接程序,也就是发送第一次请求的程序,被称为客户端(client),等待程序连接的的程序称为服务端(server)

客户端可以在需要的时候启动,而服务器能够时刻响应连接,则需要一直连接。

 


2.IP地址和域名

 

在网络中需要知道一个设备的位置,则需要使用该设备的IP地址

IP地址是一个规定,现在使用的是IPv4,由4个0-255之间的数字组成,在计算机内部存储时只需要4个字节即可,在计算机中,IP地址是分配个网卡的,每个网卡都有一个唯一的IP地址

如果计算机有多个网卡,则该台计算机则拥有多个不同的IP地址,在同一网络内部,IP地址不能相同。

由于IP地址不方便记忆,所以创造了域名的概念,也就是给IP地址取一个字符的名字。

在网络中,只能使用IP地址进行数据传输,所以在传输之前,需要把域名转换为IP,这个由DNS服务器完成。

 


3.端口

为了在一台设备上可以运行多个程序,设计了端口(port),规定一个设备有216个,也就是65536个端口,每个端口对应一个唯一的程序,每个网络程序,无论是客户端还是服务端,都对应一个或多个特定的端口号

由0-1024之间组成,使用端口号可以找到一台设备上唯一的一个程序,如果需要和某台计算机简历连接,只需要知道IP地址或域名即可

但是如果想知道该台计算机上的某个程序交换数据,还必须知道该程序使用的端口号。

 


4.什么是Socket?

socket是为网络服务提供的一种机制,通讯两端都有socket,网络通讯是socket之间通讯,数据在两个socket之间通过IO传输。

 


5.TCP和UDP的区别

1.UDP

面向无连接,将数据及源的封装到数据包中,不需要建立连接

每个数据报的大小限制在64k内

因无连接,是不可靠协议

需要建立连接,速度快


2.TCP

建立连接,形成传输数据的通道

在连接中进行大量数据传输,以字节流形式

通过三次握手完成连接,是可靠协议

必须建立连接,效率会稍低

 


6.TCP握手协议

在TCP/IP协议中,TCP协议采用三次握手建立一个连接

第一次握手:建立连接时,客户端发送SYN包(SYN=J)到服务器,并进入SYN_SEND状态,等待服务器确认。

第二次握手:服务器收到SYN包,必须确认客户的SYN(ACK=j+1),同时自己发送一个SYN包(SYN=K),即SYN+ACK包,此时服务器为V状态。

第三次握手:客户端收到服务器的SYN+ACK包向服务器发送确认包ACK(ACK=K+1),此包发送完毕,客户端和服务器进入ESTABISHED状态,完成三次握手

 


7.四次分手

 

由于TCP 连接是全双工的,因此每个方向都必须单独进行关闭,这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接

收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接再收到一个FIN后仍能发送数据,首先进行关闭的一个方向将执行主动关闭,而另一方执行被动关闭。

1.客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送

2.服务器B收到这个FIN,发回一个ACK,确定序号为收到的序号加1,和SYN相同,一个FIN将占用一个序号

3.服务器B关闭与客户端A的连接,发送一个FIN个客户端A

4.客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。

 

 





8.UDP服务端

1.创建socket服务,指定端口

DatagramSocket d=new DatagramSocket(8080);

2.定义接收数据格式

byte[] b=new byte[1024];   ----------()

DatagramPacket datagramPacket = new DatagramPacket(b, b.length); ----()

d.receive(datagramPacket);  ---()

3.获取IP地址

String ip = datagramPacket.getAddress().getHostAddress();    ----()

4.获取端口号

int port = datagramPacket.getPort();     ----()

5.获取数据

String str=new String(datagramPacket.getData(),0,datagramPacket.getLength());     ----()

6.关闭连接

d.close();  ----()

 


9.UDP客户端

1.建立socket服务

DatagramSocket datagramSocket = new DatagramSocket();     ----()

2.明确要发送的数据

String str="注意了,UDP发送数据来了···";     ----()

byte[] bytes = str.getBytes();    ----()

3.通过socket服务将数据发送出去,参数1为字节数据,参数2为字节长度,参数3为发送端ip地址,参数4为端口号

InetAddress serverIp = InetAddress.getByName("192.168.1.38");     ----()

DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length,serverIp,8080);    ----()

datagramSocket.send(datagramPacket);    ----()

4.关闭连接

d.close();---()

 

 


10.TCP客户端

1.建立连接

Socket socket = new Socket("192.168.168.1.38",8080);     ----()

2.获取socket流中的输出流,将数据发送给服务端

OutputStream outputStream = socket.getOutputStream();      ----()

outputStream.write("TCP客户端来了。。。。".getBytes());      ----()

3.关闭连接

socket.close();   ---()

 


11. TCP服务端

1.创建socket服务端服务,服务端为了让客户端连接上,必须提供一个端口,用于监听

2.获取客户端对象,通过客户端socket流和对应的客户端进行通讯

3.获取客户端socket读取流

4.读取数据并显示在服务端

5.关闭资源

 

 


二十三、HTTP

1.什么是HTTP协议?

对浏览器客户端和服务器端之间数据传输的规范

HTTP是一个属于应用层的面向对象的协议,由于其简洁、快速的方式,适用于分布式超媒体信息系统

HTTP协议主要包括:


1.支持客户/服务器模式

2.简单快速:客户向服务器请求服务时,只需要传送请求方法和路径,请求方法有:GET、POST、HEAD,每种方法规定了客户与服务器联系的类型不同

由于HTTP协议简单,使得HTTP服务器程序规模小,因而通信速度很快

3.灵活:HTTP允许传输任意类型的数据对象,正在传输的类型由content-type加以标记

4.无连接:无连接的含义是限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接,采用这种方式可以节俭传输时间。

5.无状态:HTTP协议是无状态协议,无状态是指协议对于事务处理没有记忆能力,缺少状态意味着如果后续处理需要前面的信息则必须重传,

  这样导致每次连接传送的数据量增大,另一方面,在服务器不需要先前信息时应答比较快。

HTTP是使用socket中TCP协议实现,基于请求(客户端)、响应(服务端)

HTTP协议分为请求报文和响应报文

 


2.HTTP请求报文

HTTP请求报文由:响应行、响应头、响应体组成

method:请求方式 get/post

get:数据量小,安全性不高  默认方式

post:量大,安全性相对高

action:请求的服务器路径

id:编号:前端区分唯一,js使用

name:名称后端(服务器)区分唯一性,获取值

           只要提交数据给后台,必须存在name


3.HTTP响应报文

 

HTTP响应报文和请求报文是对应的也是由:响应行、响应头、响应体组成。

 

你可能感兴趣的:(Java架构师之旅,Genius-Java语言,My,thoughts)