Java
文章平均质量分 83
程铭程铭你快成名
这个作者很懒,什么都没留下…
展开
-
单元化架构之消息篇
设计原则前面我们讲到单元化架构中分为GZone、CZone和RZone,所以在消息的场景中跨Zone投递场景必不可少,我们应该本着一下原则就对我们架构进行升级改造。最小化对业务的侵入性希望业务不做改造或者做很少的改造就能支持跨Zone消息,尽量将跨Zone逻辑封装到消息服务器端。节约网络流量消息中心采用的是pub/sub的模式,一个消息往往有多个订阅端。在跨Zone的场景下,如果每个跨Zone的订阅端都单独投递一份消息,会带来大量的网络流量。所以消息在跨Zone时进行了合并,跨Zone时只将一条消原创 2022-03-15 11:24:39 · 6163 阅读 · 0 评论 -
单元化架构之流量调度篇
在之前的文章中,我们了解了单元化架构的一些基本理论和原理,没看过的小伙伴可以再次阅读哈。流量管控调拨和服务请求路由是LDC架构中的一个关键设计主题,本篇文章将向大家详细介绍核心原理和实现。整个流量调度的架构我们可以分为四层架构,分别是DNS、接入层、服务调用和DAO层。DNS比如用户在打开百度首页时,浏览器会先请求DNS解析www.baidu.com域名,得到一个IP,然后与这个IP建立通信请求。机房间流量分配,就是在DNS解析时完成的,这个过程可能用户都没有察觉到。DNS根据规则,将域名解析到其原创 2022-03-14 19:49:14 · 5625 阅读 · 1 评论 -
初识单元化架构
在当今的互联网业内,很多大型互联网系统,比如淘宝、支付宝、网商银行等,都已经实现了单元化架构,并从中获益匪浅,更多企业正加入其中。为什么要做单元化,单元化架构能给系统带来什么样的能力。本文将从架构发展历史的角度作为切入点来了解一下单元化架构的发展历史以及一些落地方案。单点架构支付请求要从客户端发送到服务端,服务端最终再把结果返回客户端,必然会有一次异地网络往返。应用进程内部会发生很多次业务逻辑运算,耗时忽略不计。应用会访问多次数据库,一笔支付请求按10次数据库访问算(对于支付系统来说并不算多,一笔业务可原创 2022-03-07 20:04:48 · 8567 阅读 · 0 评论 -
【社招】蚂蚁面经
最近面试了蚂蚁金服的岗位,经过一个多月的战斗最终收获offer,想记录一下整个面试过程希望可以帮助到更多的小伙伴~前期准备简历一份清晰的简历可以让你更容易获得面试机会,把自己的优势一定要写清楚,这样子才可以在n多份简历里脱颖而出。如果有自己的博客一定要贴上去或者参与过哪些开源项目也要贴上去,不然怎么证明自己对技术的热爱呢?项目准备这块是重点,一定要有深入的思考,不能说是按照产品的prd去crud,抽象抽象再抽象!包括项目的技术选型、技术方案评估、异常方案的设计等等。熟悉岗位JD在准原创 2022-02-16 10:47:55 · 2932 阅读 · 0 评论 -
如何做好应用架构分层和模块化?
没有顶层设计、模块划分的应用就像一团打结的毛线,代码分支可能会跳来跳来,没有边界。很难理清楚内部的业务逻辑,更糟糕的是随着需求的堆积,日积月累更难理清楚内部的模块划分,所以从一开始就应该定好系统的模块,确定好边界之后才知道每一部分往哪里放。每次实现一个新需求内心都有一个层次树,大概会在哪个模块加什么东西,传统的MVC 模型在web 应用流行了很久,也很容易理解,下面我基于之前实现的一个系统做了些修剪和设计,形成了一个比较通用的分层架构。如下图:后面分别讲解每一个模块的职责。controller控制原创 2021-12-24 21:58:29 · 2217 阅读 · 0 评论 -
Arthas这么好用,你还不会用吗
Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!是否有一个全局视角来查看系统的运行状况?有什么办法可以监控到JVM的实时运行状态?原创 2021-11-25 18:20:20 · 1977 阅读 · 2 评论 -
深度解析@Async引起的循环依赖
啊,昨晚发版又出现了让有头大的循环依赖问题,按理说Spring会为我们解决循环依赖,但是为什么还会出现这个问题呢?为什么在本地、UAT以及PRE环境都没有出现这个问题,但是到了PROD环境就出现了这个问题呢?本文将从事故时间线、及时止损、复盘分析等几个方面为大家带来详细的分析,干货满满!事故时间线本着"先止损、后复盘分析"的原则,我们来看一下这次发版事故的时间线。2021年11月16日晚23点00分00秒开始发版,此时集团的devops有点慢2021年11月16日晚23点03分01秒,收到发版失败原创 2021-11-17 18:12:19 · 5045 阅读 · 4 评论 -
对于分布式消息队列我有话说
消息中间件作为互联网常用的技术手段,能够进行服务解耦、削峰填谷、异步操作,虽然这些的确可以给我们的系统带来好处,但是如果使用不当也会带来不少的坑,本文以rabbitMQ为例来分享在使用在使用消息队列中遇到的一些坑以及解决方案。所以为分布式消息队列就是将消息分摊到各个节点上,所有节点上的消息汇总就是消息的总和。在了解今天正文内容之前,我们先大概了解一下消息队列的模型。从上面这张图可以看到,消息队列总共由发送者+队列+消费者组成。生产者在投放过程中消息丢失所谓生产者消息丢失指的是消息在生产者投放到队原创 2021-11-03 19:31:11 · 2497 阅读 · 0 评论 -
B站崩了、Facebook崩了,我们到底该怎么保证高可用
相信前一段时间的新闻大家都知道了,B站崩了三个半小时,Facebook全球崩了7个小时,那么作为工程师的我们到底应该怎么保证我们系统的稳定性和高可用呢?在了解以下思路和方案之前,我们先抛个砖,我们可以在两个层面保证高可用开发设计层面冗余:主备,负载均衡,failover取舍:降级,限流,熔断,超时控制运维层面灰度发、A/B Test故障演练监控报警异地多活背景以B站为例,我们来回顾一下B站宕机到恢复的时间线。2021年7月13日 晚上11点,B站主页崩溃App端原创 2021-10-27 15:39:28 · 2199 阅读 · 0 评论 -
基于ShardingSphere的Encrypt-JDBC数据脱敏实战
背景安全控制一直是治理的重要环节,数据脱敏属于安全控制的范畴。对互联网公司、传统行业来说,数据安全一直是极为重视和敏感的话题。数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。涉及客户安全数据或者一些商业性敏感数据,如身份证号、手机号、卡号、客户号等个人信息按照相关部门规定,都需要进行数据脱敏。在真实业务场景中,相关业务开发团队则往往需要针对公司安全部门需求,自行实行并维护一套加解密系统,而当脱敏场景发生改变时,自行维护的脱敏系统往往又面临着重构或修改风险。此外,对于已经原创 2021-10-19 15:00:47 · 3175 阅读 · 2 评论 -
99%的人都能看懂的MQ补偿机制
补偿机制的意义假设有这样子一种场景:客户端请求 ---->空间结构微服务 ---->业主档案微服务 ---->房源微服务。这种调用链非常普遍。那么为什么需要考虑补偿机制呢?一次跨机器的通信可能会经过DNS 服务,网卡、交换机、路由器、负载均衡等设备,这些设备都不一定是一直稳定的,在数据传输的整个过程中,只要任意一个环节出错,都会导致问题的产生。而在分布式场景中,一个完整的业务又是由多次跨机器通信组成的,所以产生问题的概率成倍数增加。但是,这些问题并不完全代表真正的系统无法处理请求,所原创 2021-09-22 09:39:24 · 4076 阅读 · 1 评论 -
JAVA并发都没搞明白,怎么进大厂?
本文转载自微信公众号「sowhat1412」https://mp.weixin.qq.com/s/2aNfF11-eou2Gkbi09cBPQ转载 2021-05-26 15:00:28 · 3544 阅读 · 0 评论 -
浅析Java的线程和Golang的协程
Java的多线程线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,Java的多线程是通过JMM(共享内存模型)来实现的。大部分的操作系统都是利用时间片轮转的抢占式调度方式,线程需要利用操作系统的调度算法在用户态和内核态来回切换,线程的切换是非常浪费资源的,所以Java的线程池在工作中才那么常用,也是面试中无法绕过的坎。程序一般不会直接去使用内核线程,而是去使用内核线程的一种高级接口——轻量级进程(Lightweight Pro原创 2021-03-22 15:36:33 · 3566 阅读 · 0 评论 -
超详细的SpringBoot+MySQL读写分离方案
在互联网应用中,大部分都是读多写少的场景,设置两个库,主库和读库,主库的职能是负责写,从库主要是负责读,可以建立读库集群,通过读写职能在数据源上的隔离达到减少读写冲突、释压数据库负载、保护数据库的目的。主从数据源的配置通过@ConfigurationProperties注解,可以将配置文件(一般命名为:application.yml)里的属性映射到具体的类属性上,从而读取到写入的值注入到具体的代码配置中,按照习惯大于约定的原则,主库我们都是注为master,从库注为slave,接着需要配置sessio原创 2021-02-26 11:54:49 · 4322 阅读 · 3 评论 -
接口幂等性这么重要,我们该怎么保证幂等性?
什么是幂等性想象一下这样的场景,用户在商城下单买东西,然后发起支付,钱已经扣成功了,但是由于网络超时或其它一些原因导致商城未能正常得到支付结果。用户又重新发起支付,如果支付服务没有幂等性保证,就会导致重复扣款,对用户来说就是极差的体验。通用的讲,服务在处理一条数据请求时,根据具体的业务场景判断,如果同一条数据请求有且仅能被处理一次,那么就需要对这条数据请求的处理保证幂等性,避免重复处理。常见错误方法加分布式锁加锁只能限制并发,但最终还是会被执行到,如果没有幂等性保证就会重复处理。先从数据库原创 2021-01-14 10:30:26 · 5157 阅读 · 1 评论 -
互联网中常见优化手段
你有没有想过,为什么跨行转账要告诉你2小时内到账,而不是立即到账?为什么抖音那么多用户同时在使用,却很少出现崩溃的情况?电商网站是如何支撑住双十一全国人民买买买的?性能优化对一个产品的重要性不言而喻,它直接影响网站的用户留存率,APP在商店的评分和用户粘性。一个响应慢的应用,即便它功能再强大,也留不住用户。性能优化对一个程序员同样非常重要——如果你是一个有追求的程序员的话。我们说,大多数人的职业生涯发展都应该是一个T字型,要在某一方面有深度,也要有广度。而性能优化,恰恰是一个既需要深度,又需要广度的话题原创 2020-11-06 22:08:15 · 6603 阅读 · 6 评论 -
浅析限流算法
计数器计数器算法的思想很简单,每当一个请求到来时,我们就将计数器加一,当计数器数值超过阈值后,就拒绝余下请求。一秒钟后,我们将计数器清零,开始新一轮的计数。计数器算法简单粗暴,易于实现。但是缺点也是有的,也就是所谓的"突刺现象"。举例说明一下,假如我们给计数器设置的阈值为100。系统瞬间内(比如10毫秒内)有200个请求到来,这个时候计数器只能放过其中的100个请求,余下的100个请求全部被拒绝掉。如果第二秒内没有请求到来,那么系统就处于空闲状态。也就是上一秒忙的要死,这一秒又闲的要死。如果我们能用一个容原创 2020-09-28 17:54:09 · 6363 阅读 · 0 评论 -
浅析HashSet源码
对于 HashSet 而言,它是基于 HashMap 实现的,底层采用 HashMap 来保存元素,所以如果对 HashMap 比较熟悉了,那么学习 HashSet 也是很轻松的。HashSet是一个无重复数据的集合,存放的数据也是无序的。构造方法// HashSet底层是通过HashMap来实现的,所以具有HashMap的一切特性private transient HashMap<E,Object> map;// 无参构造方法public HashSet() { map =原创 2020-09-10 14:54:14 · 6632 阅读 · 0 评论 -
浅析LinkedHashMap源码
上一篇文章对HashMap的重要属性和常用方法进行了详细的分析,LinkedHashMap很多东西都直接继承自HashMap,所以本文只分析一些LinkedHashMap的特性。LinkedHashMap通过维护双向链表解决了HashMap不能保持顺序插入和顺序遍历的问题,在一些场景下,这个特性很有用,比如缓存、LRU算法等。链表建立的过程因为LinkedHashMap直接继承自HashMap,数据插入的过程也是直接使用的是HashMap的方法,但是却不负责链表的维护。链表的建立过程是在插入键值对节点时原创 2020-09-09 18:17:55 · 6617 阅读 · 0 评论 -
HashMap源码详细分析(JDK1.8)
HashMap是我们日常开发中最最最常用的集合之一,本文通过对HashMap中重要属性和常用的方法进行分析,但是由于HashMap的源码有两千多行,所以只针对部分源码进行分析。HashMap的构造函数从源码中可以看到,HashMap的构造方法有四个,构造方法做的事情也比较简单,都是初始化一些变量loadFactor、threshold。 // 无参的构造方法是使用场景最多的 public HashMap() { this.loadFactor = DEFAULT_LOAD_FA原创 2020-09-08 23:34:35 · 6945 阅读 · 0 评论 -
不得不看的LinkedList源码分析
之前分析了一下ArrayList的源码,这篇文章继续分析LinkedList,LinkedList同样是我们平时工作中最常用的集合之一。LinkedList都有哪些特点LinkedList的底层是通过双向链表实现的LinkedList逻辑上是连续的(因为LinkedList开辟的内存不是连续的),是通过存放上一个节点的引用和下一个节点的引用来实现有序的链表相对于ArrayList来说,LinkedList查询元素的速度较慢,新增和删除元素的速度较快;但是在指定位置新增元素效率较慢,时间复杂度为O(原创 2020-09-04 16:26:19 · 6827 阅读 · 0 评论 -
一看就明白的ArrayList源码分析
ArrayList是我们平时开发中最常用的集合之一,本文通过源码来解析一下ArrayList的底层实现原理。ArrayList都有哪些特点ArrayList底层是通过定长数组实现的ArrayList存放的数据是有序且可重复的,且允许存入空值ArrayList是非线程安全的,在多线程环境下可能会出现ConcurrentModificationException由于ArrayList是基于定长数组实现的,所以可以保证在复杂度为O(1)的情况下完成查找数据ArrayList默认大小是0,在第一次存放原创 2020-09-03 20:27:12 · 7247 阅读 · 0 评论 -
深入理解单元测试
作为一个程序员,或多或少听说过单元测试,但很多小伙伴还没有在实际项目中用到。究其原因,可能是对单元测试有一些误解,比如:写单元测试需要花费更多的时间,我每天写产品代码都要加班,哪来时间写测试;写单元测试收益不大,还不是一样有bug;写单元测试有负担,改产品代码的结构,还得去改测试代码。先尝试解答这几个问题。写单元测试会花费更多的时间,这点描述其实不准确。准确地说,写单元测试需要花费更多写代码的时间,这点没什么可说的,毕竟要多写一些测试代码。但一个程序员,做一个需求的时候,花在纯写代码的时间原创 2020-08-30 20:16:46 · 7368 阅读 · 0 评论 -
Guava Cache的应用
maven依赖<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>28.1-jre</version></dependency>应用首先定义这个Cache。public class GlobalCache { private static GlobalCache原创 2020-07-02 18:28:18 · 945 阅读 · 0 评论 -
Spring Boot集成rabbitMQ实现消息推送
简介Spring Boot集成rabbitMQ实现消息推送,rabbitMQ为异步消息处理提出了一个很好的解决方案,它是一个非常好用的消息中间件。主要解决当生产者大量产生数据时,消费者无法快速消费的问题。这个时候需要一个中间层,保存这个数据,rabbitMQ是一个很好的解决方案。Spring Boot为rabbitMQ提供了支持, Spring Boot为rabbitMQ准备了spring-...原创 2019-09-17 15:59:36 · 5346 阅读 · 3 评论 -
通过构建核心抽象模型来提高阅读源码质量
经常阅读源码可以提高自己的编程水平和编程思想,但是阅读源码的过程非常的枯燥,所以很难坚持下来。但是如果能掌握正确的方法和使用合理的工具,其实也没有那么难。本文以openfeign为例来介绍如何阅读源码。简单设置一下Diagrams具体操作方法查看类图选中openfeign包 ->右键 Diagrams -> Show Diagrams -> Java Class Di...原创 2019-09-14 16:32:22 · 2785 阅读 · 2 评论 -
Spring Validation验证框架在实际项目中的应用
在介绍Spring Validation验证框架之前,先看一下我们常用的校验注解都有哪些限制说明@Null限制只能为null@NotNull限制必须不为null@AssertFalse限制必须为false@AssertTrue限制必须为true@DecimalMax(value)限制必须为一个不大于指定值的数字@DecimalMin(va...原创 2019-08-29 14:54:35 · 4405 阅读 · 0 评论 -
一文搞懂Spring中的事务管理
什么是事务?有一个最典型的例子用来描述事务:在银行里,一个人A给另一个人B转账100元,那么银行会有以下两个操作:给A的账户扣100元给B的账户增加100元但如果在转账的过程中银行系统出了问题,可能会有以下情况:A的账户扣了钱,B的账户没有增加钱A的账户没扣钱,B的账户增加了钱上述两种情况都是不符合期望的,但故障总是可能会发生的,那怎么解决这个问题呢?就是用事务。事务是一系...原创 2019-07-17 17:29:30 · 4944 阅读 · 0 评论 -
Java对象的序列化
基本概念什么是序列化和反序列化序列化就是将对象写入到IO流中,反序列化就是从IO流中恢复对象。为什么需要序列化序列化后的流,可用于持久化到磁盘,也可以用于网络传输。使得Java对象可以跨进程、跨主机使用。转成Json和XML算序列化吗Java对象转成字符串、Json、XML等其实也称为“序列化”,但与JVM提供的序列化功能不太一样,可以说序列化是一个比较抽象的概念,但本文主要指JVM...原创 2019-05-28 10:28:18 · 1300 阅读 · 0 评论 -
JackSon返回值为null的字段
说实话这个问题真的让我头疼,最终想到一个投机取巧的方法,下面且听我一一道来。背景因为mobile团队为了节省流量,所以架构组就把一些值为null或者""的字段给过滤掉了。至于是怎么过滤掉值为null或者""的字段的方法如下。在application-local.yml里面加入如下全局配置 jackson: default-property-inclusion: non_null...原创 2019-05-17 16:20:01 · 4721 阅读 · 4 评论 -
Jackson 序列化/反序列化时忽略某属性
在开发RestAPI的时候总会遇到如下情况:序列化时忽略某属性(如Name)反序列化时忽略某属性(如HashedName)Jackson提供了@Jsonignore这个注解,用于在(反)序列化时,忽略bean的某项属性。这次项目将Jackson升级到了1.9版本,在Jackson1.9的时候,@Jsonignore的语义有了如下变化1.9之前: 在Setter方法上加@Jsonig...原创 2019-04-29 15:19:18 · 7303 阅读 · 0 评论 -
解决 Can not construct instance of `xxxxx`
项目中使用了Lombok,这次升级之后,出现了如下问题:Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of XXXXXXX(no Creators, like default construct, exist): can not deserialize fro...原创 2019-04-29 15:00:25 · 64153 阅读 · 4 评论 -
Java8 Stream常用API整理
Java8中有两大最为重要的改变,第一个是Lambda表达式,另外一个则是Stream API。流是Java8引入的全新概念,它用来处理集合中的数据。众所周知,集合操作非常麻烦,若要对集合进行筛选、投影,需要写大量的代码,而流是以声明的形式操作集合,它就像SQL语句,我们只需告诉流需要对集合进行什么操作,它就会自动进行操作,并将执行结果交给你,无需我们自己手写代码。在项目中使用Stre...原创 2019-04-12 16:46:25 · 5478 阅读 · 4 评论 -
Java知识点脑图
原创 2019-03-27 17:58:08 · 1377 阅读 · 1 评论 -
Java8实现二次排序以及空值处理
今天在开发中遇到两个问题,我觉得挺有意思的所以记录一下。对list进行二次排序。处理list里的空值。解决方案主要使用thenComparing进行二次排序主要使用Comparator.nullsFirst(Comparator.naturalOrder())进行空值处理public class BookTest { private List&lt;Book&gt; li...原创 2019-03-04 17:17:24 · 7601 阅读 · 0 评论 -
REST接口设计规范
原文出处URI格式规范URI(Uniform Resource Identifiers) 统一资源标示符URL(Uniform Resource Locator) 统一资源定位符URI的格式定义如下:URI = scheme "://" authority "/" path [ "?" query ] [ "#" fragment ]URL是UR转载 2018-10-10 11:32:27 · 2988 阅读 · 1 评论 -
浅析Mybatis和Hibernate的区别
这两种ORM框架笔者都用过,但是个人更加倾向于Mybatis。接下来我将从多个方面来对比一下Mybatis和Hibernate的优缺点。关于原理两者都是基于对象关系映射 (Object Relational Mapping ,简称ORM)的思想来完成Entity(实体)和DB之间的依赖关系。两者都支持JDBC。两者都是通过SqlSessionFactoryBuilder由XML配置文...原创 2018-08-23 10:41:57 · 1986 阅读 · 0 评论 -
Java 下载远端图片到本地
需求是这样的:{ &quot;gid&quot;:&quot;question:9002511534732700001-subject:0-qtype:2&quot;, &quot;qtypeId&quot;:&quot;2&quot;, &quot;qtypeName&quot;:&quot;单选题&原创 2018-08-22 19:07:26 · 2060 阅读 · 0 评论 -
JAVA8新特性学习笔记
用JAVA8也好久了,在这里记录几个比较常见也是自己常用的新特性,与大家进行分享。Lambda表达式Stream APIDate APIOptional API接口的默认方法和静态方法Lambda表达式它允许我们将函数当成参数传递给某个方法,或者把代码本身当作数据处理。最简单的Lambda表达式可由逗号分隔的参数列表、-&amp;amp;amp;gt;符号和语句块组成。Lambda语法如下...原创 2018-08-15 11:55:08 · 4504 阅读 · 0 评论 -
Maven常用知识总结
Apache Maven是一个软件项目管理和综合工具。基于项目对象模型(POM)的概念,Maven可以从一个中心资料片管理项目构建,报告和文件。使用maven构建的javaweb项目的结构src main java packagetest java packageresource maven常用的一些命令mvn -v : 查看mvn的版本mvn co...原创 2018-07-04 22:12:13 · 1864 阅读 · 0 评论