java基础复习第四阶段

1 为什么将单体架构换成分布式架构??

说明: 由于程序将所有的功能模块放到同一台tomcat服务器中,那么如果服务器内部出现了问题,则直接导致整个服务器不能正常执行. 系统架构的耦合性高

核心理念: 按照指定的规则,将系统进行拆分.各自独立运行,减少架构的耦合性.

优点: 如果其中一个服务器出现了问题,则不会影响整个项目的正常运行(例如如果日志模块系统崩溃了,不会影响我登录模块的系统正常运行)

1.1 关于分布式总结

优点: 可以将大型项目按照指定规则拆分.降低了系统架构的耦合性.方便开发和"维护".
弊端: 拆分完成之后由于项目个数重点 运维不易. 可以接受!!!
分布式另外表现形式: 准备多台服务器一起为用户提供服务.
在这里插入图片描述

1.2 分布式项目的 jar包和工具类API是如何管理的?

首先我们创建一个父级工程,定义好所有要使用的jar包类型,然后让我们的系统服务器例如用户系统,权限系统等去继承这个父级工程,并且去依赖工具类API的使用。工具类API也要创建一个项目用来进行存放,并且这个项目也需要去继承父级工程。

2 什么是高可用?什么是集群?

高可用:当服务器发生宕机的现象时,可以自动的实现故障迁移.保证服务运算能力.

说明:采用多台服务器部署项目,共同为用户提供服务的.同时可以满足**高可用(HA)**的需求时,称之为集群.

3 什么是JSON?

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

3.1 三种JSON的格式(Object格式,Array格式,复杂/嵌套格式)

3.2 Object格式

在这里插入图片描述

例子:  {"id":"1","name":"tomcat"}

3.3 Array格式

在这里插入图片描述

例子:  ["99","C","D"]

3.4 "复杂"格式 (嵌套格式)

在这里插入图片描述

例子:["5","7","9",true,false,["看","说",{"id":"100","hobbys":["看电视","写代码","瞄美女"]}]]

3.5 JSON和对象如何互转?是第三方架包还是自己做的?哪个架包?

回答:用的是第三方jar包,import com.fasterxml.jackson.databind.ObjectMapper,但是通常我们会自己封装第三方jar来提供公共的api使用,判断传入的对象是否为空为null,并把异常转为非检查型异常也就是运行时异常(RunTimeException)

具体实现案例:

package com.jt.util;

import org.springframework.util.StringUtils;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
//说明:改API主要负责将对象转化为JSON,将JSON转化为对象,同时优化异常处理.
public class ObjectMapperUtil {
	
	//json与对象的转化   优化异常处理
	private static final ObjectMapper MAPPER = new ObjectMapper();
	
	//1.将对象转化为JSON
	public static String toJSON(Object target) {
		
		if(target == null) {
			throw new NullPointerException("taget数据为null");
		}
		
		try {
			return MAPPER.writeValueAsString(target);
		} catch (JsonProcessingException e) {
			e.printStackTrace();
			throw new RuntimeException(e); //如果转化过程中有问题则直接抛出异常
		}
		
	}


	//2. 将json串转化为对象   用户传递什么样的类型,就返回什么样的对象!!!
	// <T>  定义了一个泛型对象  代表任意类型
	public static <T> T toObject(String json,Class<T> targetClass) {
		
		if(StringUtils.isEmpty(json) || targetClass == null) {
			throw new NullPointerException("参数不能为null");
		}
		
		try {
			return MAPPER.readValue(json, targetClass);
		} catch (JsonProcessingException e) {
			
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
	
}

4 什么是反向代理机制?

4.1 业务功能案例分析

说明:我们用户现在需要上传一张推片到我们的后台服务器,图片如果需要展现,则通过网络虚拟地址进行访问。
虚拟路径: http://image.jt.com/2020/07/11/39ff8758-57bb-4452-bf29-db6061fff24a.jpg
磁盘地址: D:\JT-SOFT\images/2020/07/11/39ff8758-57bb-4452-bf29-db6061fff24a.jpg
为了让所有的用户都能访问图片信息,则准备虚拟地址,并且实现虚拟地址与本地磁盘地址之间的映射关系.该功能采用反向代理技术实现.

4.2 反向代理说明

反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。
总结:
1).反向代理服务器位于目标服务器与用户之间.
2).对于用户而言,反向代理服务器就是目标服务器.
3).用户访问时根本不清楚真实的服务器资源是谁,保护了真实服务器资源信息.
4).反向代理服务器一般是服务器端代理,保护真实服务器信息.

4.3 正向代理(知识补充)

正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
知识点:
1).代理服务器位于用户与服务器之间
2).用户发起请求时,清楚的知道自己访问的真实服务器是谁.
3).代理服务器将用户的请求转交给服务器获取数据.
4).正向代理是客户端代理,保护了用户的信息.

5 Nginx介绍

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
内存: 不到2M
并发能力强: 3-5万次/秒 理想环境下 /tomcat服务器 150-220/秒

6 Nginx负载均衡策略

说明:在分布式条件下,为了提高用户请求的响应能力,准备多台服务器.一起抗击高并发.需要用户通过同一个网址访问不同服务器的技术称之为负载均衡机制.(准备多台Tomcat服务器,端口号是不同的)

6.1 负载均衡策略----轮询

根据配置文件的顺序,依次访问tomcat服务器.

 # 配置域名代理
   server {
	listen		80;
	server_name	manage.jt.com;

	location / {
		
		#代理的是服务器地址
		#proxy_pass   http://localhost:8091;   
		proxy_pass    http://jtW;
	}
 
   }

   #定义多台tomcat服务器   1.轮询策略
   upstream  jtW {
	server localhost:8081;
	server localhost:8082;
	server localhost:8083;
   }

6.2 负载均衡策略----权重

权重策略: 让性能更优的服务器更多的处理请求.

#定义多台tomcat服务器   1.轮询策略    2.权重策略
   upstream  jtW {
	server localhost:8081 weight=6;
	server localhost:8082 weight=3;
	server localhost:8083 weight=1;
   }

6.3 负载均衡策略—IPHASH策略

说明: 如果需要用户与后端服务器进行绑定时,可以使用IPhash策略.
案例A: 有时用户可能做登录操作,可能将用户信息保存到session对象 中,如果这时采用轮询/权重的策略,可能访问其他的业务服务器.导致用户频繁的登录.
配置信息:

	  #定义多台tomcat服务器   1.轮询策略    2.权重策略
   upstream  jtW {
   	ip_hash;
	server localhost:8081 weight=6;
	server localhost:8082 weight=3;
	server localhost:8083 weight=1;
   }

6.4 关于Nginx工作原理说明

默认条件下,nginx会按照指定的负载均衡规则访问服务器。如果访问的服务器又出现了问题,那么则会访问下一台服务器。但是随着负载均衡的继续,任然访问故障机.效率低.

down属性:说明:如果遇到某台tomcat服务器宕机,则可以通过down属性标识故障机,则nginx永远不会主动访问故障机.

	 #定义多台tomcat服务器   1.轮询策略    2.权重策略    3.ip_hash策略
   upstream  jtW {
   	#ip_hash;
	server localhost:8081 weight=6  down;
	server localhost:8082 weight=3;
	server localhost:8083 weight=1;
   }

backup属性:说明: backup的作用表示标识备用机. 一般情况下备用不工作.当遇到主机全部宕机/遇忙时,这时备用机才会生效

	 #定义多台tomcat服务器   1.轮询策略    2.权重策略    3.ip_hash策略
   upstream  jtW {
   	#ip_hash;
	server localhost:8081 weight=6  down;
	server localhost:8082 weight=3  down;
	server localhost:8083 weight=1  backup;
   }

6.5 nginx设定访问超时

属性说明:
1.max_fails=1 允许访问失败的最多次数
2.fail_timeout=60s 失败的超时时间(理解为时间区间)
当服务器宕机时,这时配置文件还没有被标识为down时.开启了高可用的机制. 只要失败的次数超过最大失败次数,则
在指定的时间周期之内,不会再次访问故障机.

	 #定义多台tomcat服务器   1.轮询策略    2.权重策略    3.ip_hash策略
   upstream  jtW {
   	#ip_hash;
	server localhost:8081 max_fails=1 fail_timeout=60s;
	server localhost:8082 max_fails=1 fail_timeout=60s;
	server localhost:8083 max_fails=1 fail_timeout=60s;
   }

7 如何实现数据库高可用??

问题描述1: 当数据库宕机之后,可能导致数据丢失.必须通过某些策略,保证数据的有效性.
问题描述2: 如果后端数据库宕机,则通过某些技术手段可以实现高可用(可以实现自动的故障迁移)

1.实现数据库冷备份
冷备份说明: 定期将数据库内容进行转储. 弊端:可能丢失数据. 公司中也会采用冷备份的方式以防万一.(仅仅是做导出的工作)
在这里插入图片描述

2.实现数据库热备份(搭建数据库的主从结构,一主多从,双主结构等等)
特点:可以保证数据的实时备份.
在这里插入图片描述
工作原理说明:
1.数据库主库将更新的数据信息写入到二进制日志文件中.
2.数据库从库通过IO线程去主库中获取二进制文件修改内容. 之后写入到中继日志中
3.数据库从库中的Sql线程读取中继日志中的信息,实现数据的同步.
并且为了降低组件之间的耦合性,采用异步的方式处理.

8 介绍一下Mycat是什么?

在这里插入图片描述
结合业务解释mycat的作用:现在我们有三台服务器需要连接后台数据库获取数据,这三台服务器的配置文件所写的连接信息都是数据库的信息例如用户名,密码,端口等。但是我们为了减低数据库的访问压力,我们不让这三台服务器去直接连我们的后台数据,而是在配置文件中所写的连接信息全是mycat服务器的信息,显然我们必须在mycat的配置文件中去编写连接我们后台数据库的真实信息才可以。两个核心文件一个是server.xml,另一个是schema.xml文件

9 为什么需要使用缓存

说明:使用缓存可以有效的降低用户访问物理设备的频次,有效的减少并发的压力。保护后端真实的服务器。

9.1缓存应该如何设计

1.缓存应该使用什么样的数据结构. K-V KEY必须唯一
2.如果需要缓存进行快速的读取,首先开发语言如何选择? C语言 软件的运行环境如何选择. 内存中
3.如何防止内存数据丢失! 缺点: 断电即擦除 内存数据的持久化操作(内存数据保存到磁盘中)
4.缓存的空间大小如何维护. 不能一直存,有时也会删除数据 如何操作? 内存优化算法: LRU算法/LFU算法
5.缓存使用如何防止宕机带来的影响 (HA)高可用 部署redis集群.

9.2 缓存的设计实现思路

思路:
1).准备key=“ITEM_CAT::”+parentID(保存key的唯一性)
2).准备value="JSON"串(value的数据具体看你想存入什么数据到redis数据库里面)
3).首先查询redis缓存
有: 直接获取缓存数据返回给用户.
没有: 直接查询数据库,之后将返回值结果保存到redis中,方便下次使用.

10 Redis支持存贮的数据类型有哪些?

它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)等

nosql: 非关系型数据库 redis ,mongdb,hbase;
消息中间件: 主要的作用是为了实现数据的平滑过渡,让程序调用更加流畅(润滑剂)

11 Redis为什么使用分片

1).说明: 虽然redis可以扩展内存空间的大小.但是如果需要存储海量的数据一味的扩大内存,其实效率不高.
2).分片介绍: 准备多台redis,共同为用户提供缓存服务.在保证效率的前提下,实现了内存的扩容.
用户在使用分片机制时,将多台redis当做1台使用.

12 什么是Redis持久化?Redis有哪几种持久化方式?优缺点是什么?

持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。

说明: Redis的数据都保存在内存中,如果断电或者宕机,则内存数据将擦除,导致数据的丢失.为了防止数据丢失,Redis内部有持久化机制.
当第一次Redis服务启动时,根据配置文件中的持久化要求.进行持久化操作.如果不是第一次启动,则在服务启动时会根据持久化文件的配置,读取指定的持久化文件.实现内存数据的恢复.

Redis 提供了两种持久化方式:RDB(默认) 和AOF

12.1 RDB(Redis DataBase,redis默认的模式)

特点:
1.rdb模式是redis中默认的持久化策略.
2.rdb模式定期持久化.保存的是Redis中的内存数据快照.持久化文件占用空间较小.
3.rdb模式可能导致内存数据丢失

命令:
前提:需要在redis的客户端中执行.
1.save 命令 立即持久化 会导致其他操作陷入阻塞.
2.bgsave 命令 开启后台运行. 以异步的方式进行持久化. 不会造成其他操作的阻塞

持久化周期:

	save 900 1        900秒内,如果用户执行的1次更新操作,则持久化一次
	save 300 10		  300秒内,如果用户执行的10次更新操作,则持久化一次
	save 60 10000	  60秒内,如果用户执行的10000次更新操作,则持久化一次
	save 1 1	 	  1秒内,如果用户执行的1次更新操作,则持久化一次    set 阻塞!!!!

12.2 AOF(Append-only file)

特点:
1). AOF模式默认条件下是关闭状态. 如果需要开启则需要修改配置文件.
2). AOF模式可以实现数据的实时持久化操作,AOF模式记录的是用户的操作过程.
3). 只要开启了AOF模式,则持久化方式以AOF模式为主.

appendfsync always    只要用户执行一次操作,则持久化一次.
 	**appendfsync everysec  每秒持久化一次   默认策略**      效率略低于RDB
 	appendfsync no        不主动持久化.

12.3 案例问题

公司新入职一个员工,对于业务不熟,出于好奇在生产环境下执行了flushAll命令,问:如果你是项目经理,如何解决 ??

处理方式:修改AOF文件中的flushAll命令,之后重启即可(如果是以AOF模式下持久化才有效,如果是以rdb模式持久化数据的话,神仙来都没办法了)

12.4 RDB和AOF的比较

比较:

1、aof文件比rdb更新频率高,优先使用aof还原数据。

2、aof比rdb更安全也更大

3、rdb性能比aof好

4、如果两个都配了优先加载AOF

持久化总结:
1.如果用户允许少量的数据丢失,则可以选用RDB模式. 效率更高
2.如果用户不允许数据丢失,则选用AOF模式.
3.可以2种方式都选, 需要搭建组从结构 , 主机选用RDB模式, 从机选用AOF模式,可以保证业务允许

12.5 什么是缓存穿透?如何避免?

缓存穿透

一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。

如何避免?

1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。

2:对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。

12.6 什么是缓存雪崩?何如避免?

缓存雪崩

当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统带来很大压力。导致系统崩溃。

如何避免?

1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。

2:做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期

3:不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

13 Redis内存策略(4种)

13.1 LRU算法

维度:T 时间

LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面(数据)置换算法,选择最近最久未使用的页面(数据)予以淘汰。该算法赋予每个页面(数据)一个访问字段,用来记录一个页面(数据)自上次被访问以来所经历的时间 t,当须淘汰一个页面(数据)时,选择现有页面(数据)中其 t 值最大的,即最近最少使用的页面(数据)予以淘汰。
在这里插入图片描述

13.2 LFU算法

维度:引用次数

LFU(least frequently used (LFU) page-replacement algorithm)。即最不经常使用(页面)数据置换算法,要求在(页面)数据置换时置换引用计数最小的(页面)数据,因为经常使用的(页面)数据应该有一个较大的引用次数。但是有些(页面)数据在开始时使用次数很多,但以后就不再使用,这类(页面)数据将会长时间留在内存中,因此可以将引用计数寄存器定时右移一位,形成指数衰减的平均使用次数。
在这里插入图片描述

13.3 TTL算法

说明: 将设定了超时时间的数据提前删除.
在这里插入图片描述

13.4 随机算法

随机算法:理解为灭霸的响指

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值