• 技术问题整理01


    >>面向对象的特性?
    “封装”,把过程和数据包围起来,对数据的访问只能通过已定义的界面;
    “继承”,一种联结类的层次模型;
    “多态”,允许不同类的对象对同一消息做出响应。

    >>final, finally, finalize的区别?
    final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承。
    finally是异常处理语句结构的一部分,表示总是执行。
    finalize是Object类的一个方法,如果子类中重写了该方法,在垃圾收集器执行的时候会调用被回收对象的此方法。

    >>HashMap和Hashtable的区别?
    相同点:
    1.HashMap和Hashtable都实现了Map、Cloneable(可克隆)、Serializable(可序列化)这三个接口
    不同点:
    1.HashMap是非线程安全的,HashTable是线程安全的。
    2.HashMap可以使用null作为key,不过建议还是尽量避免这样使用。而Hashtable则不允许null作为key。HashMap以null作为key时,总是存储在table数组的第一个节点上。
    3.初始化容量不同:HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75。
    4.扩容机制不同:HashMap扩容时是当前容量翻倍即:capacity*2,Hashtable扩容时是容量翻倍+1即:capacity*2+1。
    5.添加key-value的hash值算法不同:HashMap添加元素时,是使用自定义的哈希算法,而HashTable是直接采用key的hashCode()
    6.实现方式不同:Hashtable 继承的是 Dictionary类,而 HashMap 继承的是 AbstractMap 类。
    7.支持的遍历种类不同:HashMap只支持Iterator遍历,而HashTable支持Iterator和Enumeration两种方式遍历
    8.同步性不同: Hashtable是同步(synchronized)的,适用于多线程环境,而HashMap不是同步的,适用于单线程环境。多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。
    9.HashMap和Hashtable的底层实现都是数组+链表结构实现。

    >>什么是SSL安全认证网关?
    SSL安全认证网关是通过网络层、应用层安全协议,集合SSL反向代理、隧道加密的高性能综合网关,作用于数据传输安全问题。
    使用场景:当互联网用户进行传输需要加密的敏感业务数据的时候,若平台没有做好数据传输和访问的安全防护,
    那么这些数据就较为容易的成为不法分子眼中的“待宰羔羊”随时都存在被窃取、篡改的风险。可以广泛的应用于金融、公安、教育、卫生及交通等行业。
    各单位密评建设和改造需求都可以满足。

    SSL安全认证网关的特点:
    身份互认:基于数字证书技术,提供服务端与客户端的单双向认证功能,以及多种形式的证书透传功能。
    SSL加速:极大减轻CPU处理SSL加解密运算负担,提高系统运行效率。
    负载均衡:支持4-7层负载均衡,同时支持多种调度算法,如轮询、随机、最小连接数、加权等。

    全场景传输加密:支持SSL加密通道模式、IPSec隧道模式和应用层传输加密协议,可支持全场景传输加密。
    HTTP管理:支持HTTP内容改写、HTTP请求、响应改写、HTTP重定向等。
    后台管理:网关后台管理支持证书管理、黑白名单管理、状态监控、日志审计、负载均衡、热备/集群等功能。

    >>什么是模块化?
    简单说就是把系统分成各个独立的部分,每个部分单独实现功能,将系统分割成可独立的功能部分。通俗点就是一些独立的程序段。
    每个程序模块要有自己的名称、标识符、接口等外部特征。
    随着MVC等框架、微服务等技术的兴起,模块化开发已经称为必须。web前端也已经演变称为大前端。

    模块化开发的优缺点:
    优点:可维护性高;架构清晰,灵活开发;降低程序耦合性;方便模块功能调试、升级以及模块间的组合分解。
    缺点:损耗性能;系统分层,调用链长;模块间通信发送消息很消耗性能。

    >>指针
    指针也就是内存地址,指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,
    而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。
    有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。

    >>MVVM模式
    MVVM模式分为Model,View,ViewModel 三个部分
    (1).Model:数据层,包含数据实体和对数据实体的操作
    (2).View:界面层,对应于Activity,XML,View,负责数据显示以及用户交互。
    (3).ViewModel:关联层,将Model和View进行绑定,Model或者View更改时,实时刷新对方。
    注意点
    1.View只做和UI相关的工作,不涉及任何业务逻辑,不涉及操作数据,不处理数据。UI和数据严格的分开
    2.ViewModel只做和业务逻辑相关的工作,不涉及任何和UI相关的操作,不持有控件引用,不更新UI。

    >>微服务系统和分布式系统的区别
    微服务是架构设计,分布式是系统部署方式。
    分布式:分散压力。微服务:分散能力。
    微服务相比分布式服务来说,它的微服务应用粒度更小,服务之间耦合度更低,由于每个微服务都由独立的小团队负责,因此它敏捷性更高。
    分布式服务最后都会向微服务架构演化,这是一种趋势,不过服务微服务化后带来的挑战也是显而易见的,例如服务粒度小,数量大,后期运维将会很难。

    单独架构-->分布式架构-->SOA 架构-->微服务架构

    >>索引
    1.提高查询效率
    2.降低CPU使用率
    最佳字段做前缀,复合索引顺序和使用顺序一致,不要跨字段使用
    添加索引的时候,要根据MySQL解析顺序添加索引
    使用了in有时候会导致索引失效,尽量将in字段放在最后面。
    不要在索引上进行任何操作(计算、函数、类型转换),否则索引失效
    索引不能使用不等于(!= <>)或is null (is not null),否则自身以及右侧所有全部失效(针对大多数情况)。复合索引中如果有>,则自身和右侧索引全部失效。
    like尽量以“常量”开头,不要以’%'开头,否则索引失效
    尽量不要使用类型转换(显示、隐式),否则索引失效
    尽量不要使用or,否则索引失效
    如果主查询的数据集大,则使用in关键字,效率高。如果子查询的数据集大,则使用exist关键字,效率高。
    避免使用select * …(select后面写所有字段,也比写*效率高)
    用where字句替换HAVING字句

    >>SQL优化
    避免使用select *
    用union all 代替union
    小表驱动大表
    批量操作
    多用limit
    in中值太多
    增量查询
    高效的分页
    用链接查询代替子查询
    join数量不宜过多
    join时需要注意
    控制索引的数量
    选择合理的字段类型
    提升group by的效率
    索引优化
    中间表

    >>范式
    第一范式(1NF)符合1NF的关系中的每个属性都不可再分,通俗的理解为,数据库表的每一列都是不可再分的原子列
    第二范式(2NF)2NF在1NF的基础上,消除了非主属性对于码的部分函数依赖
    第三范式(3NF)确保数据表中的每一列数据都和主键直接相关,而不能间接相关,属性不依赖于其他非主属性。

    >>外部攻击
    防范DoS攻击
    到目前为止,任何网络都无法免受DoS攻击,除非不用TCP/IP。

    预防为主保证安全
    DDoS攻击是黑客最常用的攻击手段,下面列出了对付它的一些常规方法。

    (1)定期扫描
    要定期扫描现有的网络主节点,清查可能存在的安全漏洞,对新出现的漏洞及时进行清理。骨干节点的计算机因为具有较高的带宽,是黑客利用的最佳位置,因此对这些主机本身加强主机安全是非常重要的。而且连接到网络主节点的都是服务器级别的计算机,所以定期扫描漏洞就变得更加重要了。

    (2)在骨干节点配置防火墙
    防火墙本身能抵御DdoS攻击和其他一些攻击。在发现受到攻击的时候,可以将攻击导向一些牺牲主机,这样可以保护真正的主机不被攻击。当然导向的这些牺牲主机可以选择不重要的,或者是linux以及unix等漏洞少和天生防范攻击优秀的系统。

    (3)用足够的机器承受黑客攻击
    这是一种较为理想的应对策略。如果用户拥有足够的容量和足够的资源给黑客攻击,在它不断访问用户、夺取用户资源之时,自己的能量也在逐渐耗失,或许未等用户被攻死,黑客已无力支招儿了。不过此方法需要投入的资金比较多,平时大多数设备处于空闲状态,和目前中小企业网络实际运行情况不相符。

    (4)充分利用网络设备保护网络资源
    所谓网络设备是指路由器、防火墙等负载均衡设备,它们可将网络有效地保护起来。当网络被攻击时最先死掉的是路由器,但其他机器没有死。死掉的路由器经重启后会恢复正常,而且启动起来还很快,没有什么损失。若其他服务器死掉,其中的数据会丢失,而且重启服务器又是一个漫长的过程。
    特别是一个公司使用了负载均衡设备,这样当一台路由器被攻击死机时,另一台将马上工作。从而最大程度的削减了DdoS的攻击。

    (5)过滤不必要的服务和端口
    过滤不必要的服务和端口,即在路由器上过滤假IP……只开放服务端口成为目前很多服务器的流行做法,例如WWW服务器那么只开放80而将其他所有端口关闭或在防火墙上做阻止策略。

    (6)检查访问者的来源
    使用Unicast Reverse Path Forwarding等通过反向路由器查询的方法检查访问者的IP地址是否是真,如果是假的,它将予以屏蔽。许多黑客攻击常采用假IP地址方式迷惑用户,很难查出它来自何处。因此,利用Unicast Reverse Path Forwarding可减少假IP地址的出现,有助于提高网络安全性。

    (7)过滤所有RFC1918 IP地址
    RFC1918 IP地址是内部网的IP地址,像10.0.0.0、192.168.0.0 和172.16.0.0,它们不是某个网段的固定的IP地址,而是Internet内部保留的区域性IP地址,应该把它们过滤掉。此方法并不是过滤内部员工的访问,而是将攻击时伪造的大量虚假内部IP过滤,这样也可以减轻DdoS的攻击。

    (8)限制SYN/ICMP流量
    用户应在路由器上配置SYN/ICMP的最大流量来限制SYN/ICMP封包所能占有的最高频宽,这样,当出现大量的超过所限定的SYN/ICMP流量时,说明不是正常的网络访问,而是有黑客入侵。早期通过限制SYN/ICMP流量是最好的防范DOS的方法,虽然目前该方法对于DdoS效果不太明显了,不过仍然能够起到一定的作用。

    >>JAVA的内存管理
    Java的内存管理就是对象的分配和释放
    分配:内存的分配是程序完成的,程序员通过new关键字为对象申请内存空间(基本数据类型除外),对象都是在堆(Heap)中分配空间。
    释放:对象的释放是由垃圾回收机制(Garbage Collection)来做的,GC为了能正确释放对象,需要监控每一个对象的运行状况,包括申请,引用,被引用,赋值等。

    >>JAVA内存泄漏与内存溢出
    内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;
    内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
    memory leak会最终会导致out of memory!

       以发生的方式来分类,内存泄漏可以分为4类: 
    1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。 
    2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。
        对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。 
    3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。
        比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。 
    4. 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。
        严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。
        但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。
        所以,我们称这类内存泄漏为隐式内存泄漏。 

    从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终消耗尽系统所有的内存。
    从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到 
    一、Java内存回收机制
    不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址。
    Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Heap)中分配的,所有对象的回收都是由Java虚拟机通过垃圾回收机制完成的。
    GC为了能够正确释放对象,会监控每个对象的运行状况,对他们的申请、引用、被引用、赋值等状况进行监控,Java会使用有向图的方法进行管理内存,
    实时监控对象是否可以达到,如果不可到达,则就将其回收,
    二、Java内存泄露引起原因
    内存泄露是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成的内存空间的浪费称为内存泄露。
    内存泄露有时不严重且不易察觉,这样开发者就不知道存在内存泄露,但有时也会很严重,会提示你Out of memory。
    那么,Java内存泄露根本原因是什么呢?
    长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,
    但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景。

    https://www.cnblogs.com/panxuejun/p/5883044.html

    >>微服务
    微服务本质
    微服务,关键其实不仅仅是微服务本身,而是系统要提供一套基础的架构,这种架构使得微服务可以独立的部署、运行、升级,不仅如此,
        这个系统架构还让微服务与微服务之间在结构上“松耦合”,而在功能上则表现为一个统一的整体。
        这种所谓的“统一的整体”表现出来的是统一风格的界面,统一的权限管理,统一的安全策略,统一的上线过程,统一的日志和审计方法,统一的调度方式,统一的访问入口等等。
    微服务的目的是有效的拆分应用,实现敏捷开发和部署 。
    微服务提倡的理念团队间应该是 inter-operate, not integrate 。inter-operate是定义好系统的边界和接口,在一个团队内全栈,让团队自治,原因就是因为如果团队按照这样的方式组建,将沟通的成本维持在系统内部,每个子系统就会更加内聚,彼此的依赖耦合能变弱,跨系统的沟通成本也就能降低。

    微服务与单体架构区别:
    单体架构所有的模块全都耦合在一块,代码量大,维护困难,微服务每个模块就相当于一个单独的项目,代码量明显减少,遇到问题也相对来说比较好解决。
    单体架构所有的模块都共用一个数据库,存储方式比较单一,微服务每个模块都可以使用不同的存储方式(比如有的用redis,有的用mysql等),数据库也是单个模块对应自己的数据库。
    单体架构所有的模块开发所使用的技术一样,微服务每个模块都可以使用不同的开发技术,开发模式更灵活。

    微服务与SOA区别:
    微服务,从本质意义上看,还是 SOA 架构。但内涵有所不同,微服务并不绑定某种特殊的技术,
    在一个微服务的系统中,可以有 Java 编写的服务,也可以有 Python编写的服务,他们是靠Restful架构风格统一成一个系统的。
    所以微服务本身与具体技术实现无关,扩展性强。

    >>虚拟化
    虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。
    在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。

    虚拟化使用软件的方法重新定义划分IT资源,可以实现IT资源的动态分配、灵活调度、跨域共享,提高IT资源利用率,
    使IT资源能够真正成为社会基础设施,服务于各行各业中灵活多变的应用需求。

    虚拟化是一种具体技术,指把硬件资源虚拟化,实现隔离性、可扩展性、安全性、资源可充分利用等特点的产品。

    虚拟化前:
    每台主机一个操作系统
    软件硬件紧密地结合
    在同一主机上运行多个应用程序通常会遭遇沖突
    系统的资源利用率低
    硬件成本高昂而且不够灵活

    虚拟化后:
    打破了操作系统和硬件的互相倚賴
    通过封装到到虚拟机的技术, 管理操作系统和应用程序为单一的个体
    強大的安全和故障隔离
    虚拟机是独立于硬件的, 它们能在任何硬件上运行

    https://blog.csdn.net/w918589859/article/details/114284566

    >>大数据
    大数据,那数据是从哪里来的呢?
    简单来说可以归类为三类:日志、数据库、爬虫

    >>SSL网关
    SSL(Secure Sockets Layer 安全套接层协议),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。
    TLS与SSL在传输层与应用层之间对网络连接进行加密。

    >>HTTPS
    HTTPS,是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版。即 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。 
    现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。经常会在 Web 的登录页面和购物结算界面等使用 HTTPS 通信。
    使用 HTTPS 通信时,不再用http://,而是改用https://。
    另外,当浏览器访问 HTTPS 通信有效的 Web 网站时,浏览器的地址栏内会出现一个带锁的标记。
    对 HTTPS 的显示方式会因浏览器的不同而有所改变。

    HTTP 与 HTTPS 的区别:
    HTTP用的端口号是80号端口,HTTPS用的端口号是443
    HTTP是超文本传输协议,信息采用铭文传输,HTTPS是具有安全性SSL加密的传输协议
    HTTP协议建立链接的过程比HTTPS协议更快,因为HTTPS除了三次握手还要经历SSL握手;建立连接后传输数据的速度没有明显的差距

    >>Hash加密
    Hash算法是一种单向密码体制,只有加密过程,没有解密过程。

    常见的Hash加密算法:
    MD5(Message Digest Algorithm 5)
    SHA(Secure Hash Algorithm)
    SM3(国产哈希算法)http://gmssl.org/docs/sm3.html

    >>多线程技术
    通俗易懂的来说,多线程技术就是可以让一个程序同时做多件事

    >>线程锁
    实现线程锁的三种常用方式
    1.synchronized代码块,格式:synchronized(任意对象){需要实现线程安全的代码}
    2.同步方法,其实和synchronized代码块是一样的,只不过是将代码块中的方法抽象出来(普通方法就相当于synchronized(this))
    3.Lock的三个常用方法,lock()获取锁。/tryLock()尝试获取锁,成功返回true,失败返回false,不阻塞。/unlock()释放锁。

    >>技术架构
    表示层框架:Struts、Struts2 都是 MVC 的 WEB 框架,
    数据持久化框架:Hibernate、MyBatis
    JBoss:是一个基于J2EE的开放源代码的应用服务器
    WGCLOUD:WGCLOUD设计思想为新一代极简运维监控系统,提倡快速部署,降低运维学习难度,全自动化运行,无模板和脚本

    >>设计模式
    单例模式、策略模式、代理模式、观察者模式、装饰模式、适配器模式、命令模式、组合模式、简单工厂模式、模板方法模式​

    >>常用的算法
    https://blog.csdn.net/wangnaisheng/article/details/125654491

    >>快速排序
    快速排序的基本思想:
    通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

    算法描述:
    快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:
    从数列中挑出一个元素,称为 “基准”(pivot);
    重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。
    在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
    递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

    >>堆排序
    堆排序(Heapsort):
    是指利用堆这种数据结构所设计的一种排序算法。
    堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

    算法描述:
    将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;
    将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];
    由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,
    然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。
    不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。

    >>SpringBoot中的一些特征:
    1、创建独立的Spring应用
    2、嵌入式Tomcat、Jetty、 Undertow容器(无需部署war文件)
    3、提供的starters 简化构建配置
    4、尽可能自动配置spring应用
    5、提供生产指标,例如指标、健壮检查和外部化配置
    6、完全没有代码生成和XML配置要求

    >>Spring、Spring Boot、Spring Cloud的
    关系: Spring-> Spring Boot> Spring Cloud这样的关系
    SpringBoot:是一个快速开发框架
    SpringCloud: 是一套目前完整的微服务框架,它是是一系列框架的有序集合。

    >>非关系学数据库:
    面向高性能并发读写的key-value数据库 Redis
    面向海量数据访问的面向文档数据库MongoDB

    >>@autowired和@resource注解的区别是什么?
    联系
    @Autowired和@Resource注解都是作为bean对象注入的时候使用的
    两者都可以声明在字段和setter方法上
    注意:如果声明在字段上,那么就不需要再写setter方法。但是本质上,该对象还是作为set方法的实参,通过执行set方法注入,只是省略了setter方法罢了

    区别
    @Autowired注解是Spring提供的,而@Resource注解是J2EE本身提供的
    @Autowird注解默认通过byType方式注入,而@Resource注解默认通过byName方式注入
    @Autowired注解注入的对象需要在IOC容器中存在,否则需要加上属性required=false,表示忽略当前要注入的bean,如果有直接注入,没有跳过,不会报错

    >>实体类、抽象类和接口的区别
    1、类只能继承类,接口只能继承接口,类可以实现接口,其它都不行。
    2、java中支持单继承,多实现规则。
    抽象类与接口都用于抽象,但是抽象类(JAVA中)可以有自己的部分实现,而接口则完全是一个标识(同时有多重继承的功能)。

    >>重载和重写的区别
    方法的重写Overriding和重载Overloading是Java多态性的不同表现。
    重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。
    如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。
    子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。
    如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。
    Overloaded的方法是可以改变返回值的类型

    >>什么是多态?如何实现多态?
    多态性(Polymorphism)是指在基类中定义的属性或⽅法被派⽣类继承后,可以具有不同的数据类型,或表现出不同的⾏为,从⽽使得同⼀个属性或⽅法在基类及其各个派⽣类中具有不同的语义。
    Java的多态性体现在两个⽅⾯:(1) ⽅法重载实现的静态多态性,⼜称为编译时多态;(2) ⽅法覆盖/重写实现的动态多态性,⼜称为运⾏时多态。

    >>error和exception有什么区别
    error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况
    exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况

    >>接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)
    接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数

    >>消息队列
    消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。
    消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。
    RabbitMQ即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用。

    >>负载均衡
    负载均衡(Load Balance)集群提供了一种廉价、有效、透明的方式来扩展网络设备和服务器的负载、带宽和吞吐量,同时加强了网络数据处理能力,提高了网络的灵活性和可用性。

    >>Nginx负载均衡服务
    严格来说,nginx仅作为nginx proxy反向代理使用,但该反向代理功能表现的效果是负载均衡集群的效果,因此称之为nginx负载均衡。

    反向代理和负载均衡的区别:
    负载均衡软件(如LVS)实现的功能只是对请求数据包的转发/改写、传递,其中DR模式明显的特征是从负载均衡下面的节点服务器来看,收到的请求还是来自访问负载均衡器的客户端的真实用户;
    反向代理在接受访问用户的请求后,会代理用户重新发起请求代理下的节点服务器,最后把数据返回给客户端用户,在节点服务器看来,访问节点服务器的客户端用户就是反向代理服务器,而不是真实的客户端用户。

    实现nginx负载均衡主要需要两个组件模块:
    ngx_http_proxy_module:proxy代理模块,用于将请求抛给服务器节点或upstream服务器池;
    ngx_http_upstream_module:负载均衡模块,可以实现网站的负载均衡功能以及节点的健康检查。

    实现不同调度算法
    rr 轮询调度算法;
    wrr 权重调度算法;
    ip_hash 算法(出现反复登录的情况,可通过缓存服务器解决;也可通过IP_HASH算法解决,但由于NAT转换,有可能造成负载不均的情况发生);
    least_conn 根据服务器连接数分配资源(分配给连接少的服务器).

    >>分布式事务
    事务具有 4 个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为 ACID 特性。
    Atomicity(原子性):一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复到事务开始前的状态,就像这个事务从来没有执行过一样。
    Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。完整性包括外键约束、应用定义的等约束不会被破坏。
    Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
    Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

    分布式事务:随着互联网的快速发展,软件系统由原来的单体应用转变为分布式应用,
        分布式系统会把一个应用系统拆分为可独立部署的多个服务,因此需要服务与服务之间远程协作才能完成事务操作,
        这种分布式系统环境下由不同的服务之间通过网络远程协作完成事务称之为分布式事务。

    >>系统的调优和优化
    缓存:缓存通常需要用空间换时间,在击中率较高的情况下,缓存通常能提升系统性能。
    批量:网络IO、磁盘IO、前端资源的压缩与合并,都是这种思维的表现。
    并发:通用的手法就是开多线程、多进程、扩充机器。
    无状态的服务,采用集群就能很好伸缩。
    有状态的服务,一种是扩充多节点,每个节点提供一样的数据,或者是每个节点各自提供部分数据

    >>接口限流算法
    常见的限流算法有:令牌桶、漏桶、Redis 计数器。

    HIS(医院信息系统HospitalInformationSystem)一般指医院信息系统(管理系统)

    企业资源计划即 ERP (Enterprise Resource Planning)生产资源计划、制造、财务、销售、采购等功能外,还有质量管理,实验室管理,业务流程管理,产品数据管理,存货、分销与运输管理,人力资源管理和定期报告系统

    oop一般指面向对象程序设计。 面向对象程序设计(Object Oriented Programming)作为一种新方法,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。

    PLM,是一个英文缩写,表示产品生命周期管理(Product Lifecycle Management,PLM)

    “Navicat”是一套可创建多个连接的数据库管理工具,用以方便管理 MySQL、Oracle、PostgreSQL、SQLite、SQL Server、MariaDB 和 MongoDB 等不同类型的数据库

    Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。

    mybatis是一个用Java编写的持久层框架,它使用ORM实现了结果集的封装。
    ORM是Object Relational Mapping 对象关系映射。简单来说,就是把数据库表和实体类及实体类的属性对应起来,让开发者操作实体类就实现操作数据库表。
    它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接等烦杂过程

    RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。
    RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。
     

  • 相关阅读:
    4.方法操作实例变量 对象的行为
    【Vue基础九】--父子组件传值
    新王炸:文生视频Sora模型发布,能否引爆AI芯片热潮
    vscode不显示横滚动条处理
    使用webpack基础配置并打包typescript
    ES6展开运算符—— 通俗易懂
    dart 学习 之 异常
    html5学习笔记21-css简略学习
    OCR文字检测与识别系统:融合文字检测、文字识别和方向分类器的综合解决方案
    前端Sortable拖拽实现排序
  • 原文地址:https://blog.csdn.net/wangnaisheng/article/details/125809428