![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
干货
文章平均质量分 89
不爱学习的辛
祝您早日学有所成,拿到满意offer。快速升职加薪,出任CEO,赢取白富美,走上人生巅峰。
展开
-
一文吃透Spring Cloud Alibaba 使用Seata解决分布式事务
为什么会产生分布式事务?随着业务的快速发展,网站系统往往由单体架构逐渐演变为分布式、微服务架构,而对于数据库则由单机数据库架构向分布式数据库架构转变。此时,我们会将一个大的应用系统拆分为多个可以独立部署的应用服务,需要各个服务之间进行远程协作才能完成事务操作。在微服务项目中通常一个大项目会被拆分为N个子项目,例如用户中心服务,会员中心服务,支付中心服务等一系列微服务,在面临各种业务需求时难免会产生用户中心服务中需要调用会员中心服务,支付中心服务而产生调用链路;服务与服务之间通讯采用RPC远程调用技术,但是原创 2021-11-09 20:16:49 · 332 阅读 · 0 评论 -
面试官让我详细剖析分布式微服务架构下网络通信的底层实现原理(图解)
在分布式架构中,网络通信是底层基础,没有网络,也就没有所谓的分布式架构。只有通过网络才能使得一大片机器互相协作,共同完成一件事情。同样,在大规模的系统架构中,应用吞吐量上不去、网络存在通信延迟、我们首先考虑的都是网络问题,因此网络的重要性不言而喻。作为现代化应用型程序员,要开发一个网络通信的应用,是非常简单的。不仅仅有成熟的api,还有非常方便的通信框架。可能大家已经忘记了网络通信的重要性,本篇文章会详细分析网络通信的底层原理!!1.1 理解通信的本质如图1-1所示,当我们通过浏览器访问一个网址时原创 2021-11-08 17:13:37 · 1759 阅读 · 0 评论 -
这一篇 K8S(Kubernetes)集群部署 我觉得还可以,现在分享给大家。
国内安装K8S的四种途径Kubernetes 的安装其实并不复杂,因为Kubernetes 属于Google 的产品,都是从Google的官方上进行下载,但是因为网络问题,在国内是没办法连接它的中央仓库进行下载安装包的,只能通过其他的途径进行安装,在国内有四种安装方式使用 Kubeadmin 通过离线镜像安装: Kubeadmin 是K8S提供的管理控制台,通过这里的命令可以非常方便的对我们集群进行快速发布和部署使用阿里云公有云平台安装K8S: 这是也是非常好用的,不用做任何设置,拿来就用,但是有一原创 2021-11-07 16:17:54 · 1428 阅读 · 0 评论 -
面试题系列:用了这么多年的 Java 泛型,我只知道它的皮毛
面试题:说说你对泛型的理解?面试考察点考察目的:了解求职者对于Java基础知识的掌握程度。考察范围:工作1-3年的Java程序员。背景知识Java中的泛型,是JDK5引入的一个新特性。它主要提供的是编译时期类型的安全检测机制。这个机制允许程序在编译时检测到非法的类型,从而进行错误提示。这样做的好处,一方面是告诉开发者当前方法接收或返回的参数类型,另一方面是避免程序运行时的类型转换错误。泛型的设计推演举一个比较简单的例子,首先我们来看一下ArrayList这个集合,部分代码定义如下。p原创 2021-11-05 19:30:26 · 131 阅读 · 0 评论 -
面试官问我:Java异常处理与多线程
异常处理异常概述与异常体系结构在Java语言中,将程序执行中发生的不正常情况称为异常(开发过程中的语法错误和逻辑错误不是异常)。Java程序在执行过程中所发生的异常事件可分为两类:Error: Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况,例如StackoverflowError和OOM。一般不编写针对性的代码进行处理。public static void main(String[] args) { // 1\. 栈溢出: java.lang.Stack原创 2021-11-04 21:59:26 · 128 阅读 · 0 评论 -
2021最新Java枚举类和注解
枚举类背景类的对象只有有限个: 性别 星期 季节 线程状态当需要定义一组常量时,强烈建议使用枚举类。如果枚举类中只有一个对象,则可以作为单例模式的实现方式。自定义枚举类import org.junit.Test;public class EnumTest { @Test public void test() { Season season = Season.SPRING; System.out.println(season);原创 2021-11-04 19:23:59 · 193 阅读 · 1 评论 -
Java面向对象
Java面向对象静态/非静态方法静态方法只能调用静态方法,非静态方法可以调用静态方法: public static void main(String[] args) { //静态方法 static 可以直接用类名.方法名直接调用 //非静态方法 需要先实例化这个类 new Student student = new Student(); student.say(); } public static void a()原创 2021-11-03 20:35:02 · 133 阅读 · 0 评论 -
面试官问我 Zookeeper 集群部署的那些事儿
简介ZooKeeper 是 Apache 的一个顶级项目,为分布式应用提供高效、高可用的分布式协调服务。ZooKeeper本质上是一个分布式的小文件存储系统。提供类似于文件系统目录树方式的数据存储,并且可以对书中的节点进行有效管理。从而用来维护和监控存储的数据的状态变化,通过监控这些数据状态的变化,实现基于数据的集群管理。运行模式ZooKeeper 运行模式有三种:单机模式、伪集群模式、集群模式单机模式: ZooKeeper 只运行一台服务器上面,这种模式一般用于开发测试环境,用于节省机器数量,原创 2021-10-31 22:27:19 · 149 阅读 · 0 评论 -
2021最新Hive面试题整理(一)
1、Hive表关联查询,如何解决数据倾斜的问题?(☆☆☆☆☆)1)倾斜原因:map输出数据按key Hash的分配到reduce中,由于key分布不均匀、业务数据本身的特、建表时考虑不周、等原因造成的reduce 上的数据量差异过大。 (1)key分布不均匀; (2)业务数据本身的特性; (3)建表时考虑不周; (4)某些SQL语句本身就有数据倾斜; 如何避免:对于key为空产生的数据倾斜,可以对其赋予一个随机值。 2)解决方案 (1)参数调节: hive.map.ag原创 2021-10-31 22:17:20 · 229 阅读 · 0 评论 -
面试题系列:new String(“abc“)创建了几个对象
new String(“abc”)创建了几个对象面试官考察点猜想这种问题,考察你对JVM的理解程度。涉及到常量池、对象内存分配等问题。涉及背景知识详解在分析这个问题之前,我们先来了解一下JVM的组成,如图所示。在JVM1.8中,内存划分为堆、程序计数器、本地方发栈、方法区(元空间)、虚拟机栈。JVM知识点普及下面分别解释一下JVM运行时内存的功能。堆内存空间堆是 JVM 内存中最大的一块内存空间,该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中。堆被划分为新生代和老年代,新生原创 2021-10-29 20:53:12 · 145 阅读 · 0 评论 -
Redis使用过程中有哪些注意事项,看看BAT这类的公司是正确使用Redis的
Redis使用过程中要注意的事项Redis使用起来很简单,但是在实际应用过程中,一定会碰到一些比较麻烦的问题,常见的问题有redis和数据库数据的一致性缓存雪崩缓存穿透热点数据发现下面逐一来分析这些问题的原理及解决方案。数据一致性针对读多写少的高并发场景,我们可以使用缓存来提升查询速度。当我们使用Redis作为缓存的时候,一般流程如图3-4所示。如果数据在Redis存在,应用就可以直接从Redis拿到数据,不用访问数据库。如果Redis里面没有,先到数据库查询,然后写入到Redis原创 2021-10-29 20:16:12 · 117 阅读 · 0 评论 -
阿里面试必问Java并发编程题AQS源码详解
作用提供一个框架用于实现依赖先进先出等待队列的阻塞锁和相关同步器(信号量,事件)使用子类应该定义为非公共内部帮助类,用于实现其封闭类的同步属性,AQS并不实现任何同步接口,这一部分主要是从源码里搬过来的class Mutex implements Lock, java.io.Serializable { // Our internal helper class private static class Sync extends AbstractQueuedSynchronizer {原创 2021-10-28 22:11:17 · 120 阅读 · 0 评论 -
全网讲的最透彻RabbitMQ延时队列应用场景
应用场景我们系统未付款的订单,超过一定时间后,需要系统自动取消订单并释放占有物品常用的方案就是利用Spring schedule定时任务,轮询检查数据库但是会消耗系统内存,增加了数据库的压力、还存在较大的时间误差解决:rabbitmq的消息TTL和死信Exchange结合介绍1.何为消息TTL、死信死信:对消息设置的过期时间到了,这个消息还没有被消费就认为这个消息死了,死了的消息会进入死信交换机(Dead Letter Exchanges)成为死信的三种条件:一个消息被Consum原创 2021-10-28 19:38:10 · 799 阅读 · 0 评论 -
如何彻底搞懂大厂是如何实现Redis高可用的?看这篇文章就够了!(1.2W字,建议收藏)
高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。假设系统一直能够提供服务,我们说系统的可用性是100%。如果系统每运行100个时间单位,会有1个时间单位无法提供服务,我们说系统的可用性是99%。很多公司的高可用目标是4个9,也就是99.99%,这就意味着,系统的年停机时间为8.76个小时。那么如何保证系统的高可用呢首先,在整个架构的每个节点中,不允许存在单点问题,因为单点一定是高可用最大的风险点,我们应该在系统设原创 2021-10-27 21:18:27 · 174 阅读 · 0 评论 -
全网最透彻:看动画学算法之:队列queue
简介队列Queue是一个非常常见的数据结构,所谓队列就是先进先出的序列结构。想象一下我们日常的排队买票,只能向队尾插入数据,然后从队头取数据。在大型项目中常用的消息中间件就是一个队列的非常好的实现。队列的实现一个队列需要一个enQueue入队列操作和一个DeQueue操作,当然还可以有一些辅助操作,比如isEmpty判断队列是否为空,isFull判断队列是否满员等等。为了实现在队列头和队列尾进行方便的操作,我们需要保存队首和队尾的标记。先看一下动画,直观的感受一下队列是怎么入队和出队的。先看原创 2021-10-27 20:28:19 · 231 阅读 · 0 评论 -
牛批!4个实验,彻底搞懂TCP连接的断开
前言看到这个标题你可能会说,TCP 连接的建立与断开,这个我熟,不就是三次握手与四次挥手嘛。且慢,脑海中可以先尝试回答这几个问题:四次挥手是谁发起的?如果断电/断网了连接会断开吗?什么情况下没有四次挥手连接也会断开?这不是面试,而是遇到了实际问题,至于是什么问题,容我先卖个关子,本文也不会解答,后面会有一篇专门的文章来说遇到的问题是啥,所以在讲实际问题之前,先弄懂理论。正常断开我们由浅入深,先了解正常情况下 TCP 连接是如何断开的,下图为 TCP 三次握手与四次挥手的经典图(来自《TCP原创 2021-10-26 21:35:59 · 414 阅读 · 0 评论 -
字节大佬教你如何玩转力扣
今天,我就给偏初学者的各种问题谈谈个人刷力扣这方面的观点。刷哪些题?大家刷力扣,目标肯定就是为了冲击大厂的面试笔试,小部分就是为了坚持刷题保持感觉提升自己算法编程能力,那么你肯定要把重点内容先掌握,哪些是重点内容呢?剑指offer:首先是剑指offer(https://leetcode-cn.com/problem-list/xb9nqhhg/),剑指offer的优先级还是很高的,就业必刷。在牛客上和力扣平台上都可以刷剑指offer的题,但是我个人更推荐力扣这个平台,我第一次刷剑指offer就是和.原创 2021-10-26 20:12:33 · 933 阅读 · 0 评论 -
我弟弟用了半天撸一个简易版mybatis
为什么需要持久层框架?首先我们先看看使用原生jdbc存在的问题?public static void main(String[] args) { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { // 加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); // 通过驱动管理类获取数据库原创 2021-10-25 21:10:13 · 124 阅读 · 0 评论 -
深入理解Java虚拟机之类加载机制篇
概述 虚拟机把描述类的数据从 Class 文件加载到内存中,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,就是虚拟机的类加载机制。 在Java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的,这种策略虽然增加了类加载时系统额外的开销,但是能给 Java 应用程序提供高度的灵活性,Java 的动态扩展优势就依赖于运行期动态加载和动态连接来实现的。例如用户可以在编写一个面向接口的应用程序时,可以等到运行时再指定具体的实现类,还可以通过 Java 预定义的和原创 2021-10-25 19:47:41 · 90 阅读 · 0 评论 -
P8大佬透彻讲解java定时任务调度框架
java定时任务目前主要有三种:Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行;而且作业类需要集成java.util.TimerTask,一般用的较少。Spring3.0以后自带的task,即:spring schedule,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多。Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执原创 2021-10-24 20:20:34 · 2328 阅读 · 0 评论 -
如果你还不知道Apache Zookeeper?你凭什么拿大厂Offer!!
很多同学或多或少都用到了Zookeeper,并知道它能实现两个功能配置中心,实现表分片规则的统一配置管理注册中心,实现sharding-proxy节点的服务地址注册那么Zookeeper到底是什么?以及为什么能实现这样的功能?接下来我们就来了解一下Zookeeper。Zookeeper的前世今生Apache ZooKeeper是一个高可靠的分布式协调中间件。它是Google Chubby的一个开源实现,那么它主要是解决什么问题的呢?那就得先了解Google ChubbyGoogle Chub原创 2021-10-24 20:14:39 · 73 阅读 · 0 评论 -
面试官:如何实现扫码登录功能?
扫码登录场景扫码登录场景想必我们都不陌生——很多PC端的网站都提供了扫码登录的功能,无需在网页上输入任何账号和密码,只需要通过手机上的APP,如微信、淘宝、QQ等等,使用扫描功能,扫描网页上的二维码,确认登录,就可以完成网页端登录。扫码登录分析我们来分析一下,扫码登录,其实涉及到三种角色,需要解决两个问题。三种角色很明显,扫码登录当中涉及到的三种角色:PC端、手机端、服务端。相关的设计都要围绕这三端来展开,具体的设计其实就是每一端应该完成什么功能?应该怎么实现?端和端应该如何交互?两个问题原创 2021-10-22 19:26:41 · 453 阅读 · 0 评论 -
从源码层面深度剖析Redisson实现分布式锁的原理(全程干货,注意收藏)
Redis实现分布式锁的原理前面讲了Redis在实际业务场景中的应用,那么下面再来了解一下Redisson功能性场景的应用,也就是大家经常使用的分布式锁的实现场景。引入redisson依赖<dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.16.0</version>原创 2021-10-22 15:56:37 · 130 阅读 · 0 评论 -
2021最新互联网面试必问Java后端面试题(含答案)
1.你觉得 Java 好在哪儿?这种笼统的问题如果对某些知识点没有深入、系统地认识绝对会蒙!所以为什么经常碰到面试官问你一些空、大的问题?其实就是考察你是否有形成体系的理解。回到问题本身。我觉得可以从跨平台、垃圾回收、生态三个方面来阐述。首先 Java 是跨平台的,不同平台执行的机器码是不一样的,而 Java 因为加了一层中间层 JVM ,所以可以做到一次编写多平台运行,即 「Write once,Run anywhere」。编译执行过程是先把 Java 源代码编译成字节码,字节码再由 JVM 解原创 2021-10-21 19:20:32 · 1629 阅读 · 0 评论 -
2021最新JVM夺命连环10问,你能答上来几道?
说说JVM的内存布局?Java虚拟机主要包含几个区域:堆:堆Java虚拟机中最大的一块内存,是线程共享的内存区域,基本上所有的对象实例数组都是在堆上分配空间。堆区细分为Yound区年轻代和Old区老年代,其中年轻代又分为Eden、S0、S1 3个部分,他们默认的比例是8:1:1的大小。栈:栈是线程私有的内存区域,每个方法执行的时候都会在栈创建一个栈帧,方法的调用过程就对应着栈的入栈和出栈的过程。每个栈帧的结构又包含局部变量表、操作数栈、动态连接、方法返回地址。局部变量表用于存储方法参数和局部变量。原创 2021-10-20 19:29:48 · 91 阅读 · 0 评论 -
什么是 JVM 类加载机制?你真的了解吗?
JVM在什么情况下会加载一个类?其实类加载过程非常的琐碎复杂,但是对于我们平时从工作中实用的角度来说,主要是把握他的核心工作原理就可以。一个类从加载到使用,一般会经历下面的这个过程:加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载所以首先要搞明白的第一个问题,就是JVM在执行我们写好的代码的过程中,一般在什么情况下会去加载一个类呢?也就是说,啥时候会从“.class”字节码文件中加载这个类到JVM内存里来。其实答案非常简单,就是在原创 2021-10-19 15:06:01 · 63 阅读 · 0 评论 -
面试:JVM,GC垃圾回收机制(通俗易懂)
一、如果判断对象可以回收1.1 引用计数法当一个对象被引用时,就当引用对象的值加一,当值为 0 时,就表示该对象不被引用,可以被垃圾收集器回收。这个引用计数法听起来不错,但是有一个弊端,如下图所示,循环引用时,两个对象的计数都为1,导致两个对象都无法被释放。1.2 可达性分析算法MAT工具–可视化Eclipse Memory Analyzer是一个快速且功能丰富的Java堆分析器,可帮助您查找内存泄漏并减少内存消耗。使用Memory Analyzer分析具有数亿个对象的高效堆转储,快速计算对原创 2021-10-19 15:03:39 · 414 阅读 · 0 评论 -
牛批!终于有人把JVM内存分配机制讲明白了!超详细解析!
一、对象的加载过程那么,当一个象被new的时候,是如何加载的呢?有哪些步骤,如何分配内存空间的呢?1.1 对象创建的主要流程还是这段代码为例说明:public static void main(String[] args) { Math math = new Math(); math.compute(); new Thread().start();}当我们new一个Math对象的时候,其实是执行了一个new指令创建对象。我们之前研究过类加载的流程,那么创建一个对象的原创 2021-10-18 21:53:31 · 388 阅读 · 0 评论 -
清华大牛花费50小时研究出来的java项目教程
一、前言最近在研究sonar扫面java项目,实在是花费了不少时间,估计有50个小时吧。从零开始接触sonar,在网上找教程看,按照教程的指引,自己搭建环境,很快成功扫描python项目。但是,在扫描java项目时,遇到了各种问题,一直扫描不成功。解决这个问题的过程着实是相当痛苦。首先是运行命令扫描代码,发现出错,复制出错提示信息百度找答案,就进行尝试,这个过程相当低效,一直没有进展。然后,我想到直接搜索关键字“sonar扫描Java项目”,发现找到的文章很少,而且内容比较混乱。接着,我决定自原创 2021-10-18 21:33:06 · 193 阅读 · 0 评论 -
Java并发编程系列11 | 线程调度
本文介绍线程调度的如下几个操作:线程优先级守护线程线程中断joinsleepyieldwait & notify1. 优先级每个线程执行时都有一个优先级的属性,优先级高的线程可以获得较多的执行机会,而优先级低的线程则获得较少的执行机会。操作系统采用时分的形式调度运行的线程,操作系统会分出一个个时间片,线程会分配到若干时间片,当线程的时间片用完了就会发生线程调度,并等待着下次分配。线程分配到的时间片多少也就决定了线程使用处理器资源的多少,而线程优先级就是决定线程需要多或者少分.原创 2021-02-04 17:28:50 · 90 阅读 · 0 评论 -
Java8中Stream原理分析
Stream的组成与特点Stream(流)是一个来自数据源的元素队列并支持聚合操作:元素是特定类型的对象,形成一个队列。Java中的Stream并不会向集合那样存储和管理元素,而是按需计算数据源流的来源可以是集合Collection、数组Array、I/O channel, 产生器generator 等聚合操作类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等和以前的Collection操作不同, Stream操作还有两个基础的特原创 2021-02-03 13:57:59 · 325 阅读 · 0 评论 -
一篇文章带你读懂: Java EE
何为 Java EE1.Java EE是一个标准中间件体系结构不要被名称”Java PlatformEnterprise Edition”误导,与Java不同,Java EE是一种体系结构,而不是一门编程语言。Java是一门编程语言,可以用来编写各种应用程序。Java EE是一个标准中间件体系结构,旨在简化和规范分布式多层企业应用系统的开发和部署。Java EE出现之前,分布式多层企业应用系统的开发和部署没有一个被普遍认可的行业标准,几家主要的中间件开发商的产品各自为政,彼此之间缺乏兼容性,可移植性差原创 2021-01-31 14:00:31 · 1574 阅读 · 1 评论 -
Java 的垃圾回收,从头到尾再说一次
什么是垃圾回收垃圾回收(Garbage Collection,GC),顾名思义就是释放垃圾占用的空间,防止内存泄露。有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。Java 语言出来之前,大家都在拼命的写 C 或者 C++ 的程序,而此时存在一个很大的矛盾,C++ 等语言创建对象要不断的去开辟空间,不用的时候又需要不断的去释放控件,既要写构造函数,又要写析构函数,很多时候都在重复的 allocated,然后不停的析构。于是,有人就提出,能不能写一段程序实现这块功能,原创 2021-01-30 13:50:50 · 119 阅读 · 0 评论 -
【干货】逛了4年Github ,一口气把我收藏的 Java 开源项目分享给你!
教程JavaJavaGuide :【Java学习+面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。CS-Notes :技术面试必备基础知识、Leetcode 题解、后端面试、Java 面试、春招、秋招、操作系统、计算机网络、系统设计。advanced-java :互联网 Java 工程师进阶知识完全扫盲:涵盖高并发、分布式、高可用、微服务、海量数据处理等领域知识。architect-awesome :后端架构师技术图谱。toBeTopJavaer :Java工程师成神之路 。t原创 2021-01-29 13:45:14 · 169 阅读 · 0 评论 -
干货 | 可以提高千倍效率的Java代码小技巧
前言代码优化 ,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了。代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,这时候就必须考虑每个可以优化的细节了,一个...原创 2021-01-28 15:22:18 · 119 阅读 · 1 评论