- 博客(65)
- 收藏
- 关注
原创 RabbitMQ的高可用、高可靠保证
前言RabbitMQ用了也有一两年了,知识点也是工作后零散的掌握,今天小小总结一下正文1. 高可用高可用的通俗解释是,能够7*24小时不间断的对外提供服务。由于单机存在单点故障,随时可能发生宕机,所以一般都是通过搭建集群来保证高可用的RabbitMQ有三种模式,单机模式就不做过多解释了,demo级别的,生产一般不可能使用单机模式,除非MQ只是用来打印日志普通集群模式queue的元数据包含了queue的具体信息,例如queue放在哪台broker上,是否持久化等,但不包含发送到queu
2021-05-01 17:06:44
2939
原创 浅析Spring Cloud Alibaba Nacos 服务注册原理
文章脉络Spring Cloud 服务注册原理1. spring cloud common组件导入spring.factories下的配置类/META-INF/spring.factories是spring默认的配置类扫描路径(会在之后的spring文章中提及)类似的还有spring.handles和spring.schema,用于解析集成框架的自定义标签,如 dubbo 和 mybatis 自定义标签这里我们重点关注 AutoServiceRegistrationAutoConfigura
2021-04-29 19:03:17
261
原创 从Redisson的实现谈谈分布式锁
前言关于Redis分布式锁的解决方案,网上相关资料已经有很多了,我也看过不少,看的过程中,就发现很多知识都看得懂,但轮到自己跟别人讲述,或者面对面试官的时候,往往不能够有条理的表达出来,如鲠在喉,仿佛压根没有掌握一样所以今天好好整理一下正文1. 分布式锁的诸多特性公平性 —— 公平锁 / 非公平锁安全性 —— 锁能够正常释放,持有锁的客户端发生异常或宕机时也不会造成死锁对称性 —— 加锁和解锁必须是同一个客户端锁续租 —— 指定时间内业务未执行完,锁可进行续租可重入 —— 递归调用不
2021-04-27 18:11:49
266
原创 谈谈Volatile
前言Volatile的能够保证并发编程的两大特性一是可以保证可见性,即一个线程对共享变量的修改,能够对其他线程立即可见二是可以保证有序性,即防止操作系统通过指令重排序来优化程序,毕竟在高并发的场景下,要保证重排序后的执行结果跟排序前的一致,是非常难的正文本文将围绕Volatile的三个内来展开内存模型(JMM)内存语义内存屏障1. 内存模型(JMM)关于L1、L2、L3高速缓存,L1和L2是一个CPU一个,L3是整个计算机共享一个,所以下图可能画的不太准确(懒得重画了),不过不影响各
2021-04-26 16:38:10
213
原创 讲讲Synchronized
前言网上关于Synchronized的博客和资源有很多,相信百度一下对程序员来说都不是什么难事,推荐看一下敖丙的阿里面试:跟我死磕Synchronized底层实现,我满分回答拿了Offer,讲的挺好的本文的定位在于,帮助自己和其他有需要的小伙伴,以一种容易记住的方式跟别人交(chui)流(shui),所以很多知识点能不搬运就不搬运了,默认大家都会了正文JDK 1.6之后针对Synchronized做了很多的优化,可以说Synchronized现在可以跟JUC包中的工具类相媲美,锁升级功不可没,锁升
2021-04-25 19:46:00
160
原创 搭建MySQL 8.0主从同步
前言本文采用的是docker搭建mysql 8.0主从同步,采用了两台云服务器master 106.52.206.63slave 106.13.191.167前期准备开通安全组,让两台服务器能够相互通信分别在两台服务器上拉取 mysql 镜像及启动容器# 拉取最新 mysql 镜像,目前最新 8.0docker pull mysql# 创建挂载目录sudo mkdir /usr/local/soft# 跳转到挂载目录cd /usr/local/soft# 创建 mys
2021-04-25 18:21:54
321
1
原创 并发编程系列
前言汇总一下自己写过的关于多线程的博客,也给自己以后多输出添加点动力和方向正文知识点链接基本知识大杂烩待补充Synchronize多线程并发编程之Java锁相关Volatile待补充ThreadLocal待补充线程池多线程并发编程之线程池应用及实现原理剖析JUC之ConcurrentHashMap待补充JUC之CopyOnWriteArrayList写时复制CopyOnWriteAQS多线程之锁原理及AQS、AQS之acqu
2021-04-24 21:12:37
77
原创 并发编程之阻塞队列
七种阻塞队列是哪几个呢?面试的时候,可以都回答上来吗DA BT LSP,大绅士?老帅DelayQueueArrayBlockingQueueLinkedTransferQueueSynchronousQueuePriorityBlockingQueue
2021-04-24 18:39:33
93
原创 关于MySQL调优
前言调优有四个大方向,对于程序员来说,关注SQL调优就够了就算是SQL调优,解锁姿势也很多,跟别人交(chui)流(shui)经验的时候,你记得过来吗,今天分享一种方便记忆的方式,毕竟正文调优,翻译过来不就是BETTER吗B+(最左前缀索引、覆盖索引)Explain(执行计划)Tui(推,索引下推)Type(类型检查)Engine(存储引擎)Return(回表查询)好了,记住这个单词,我们一个个来本文的定位在于跟他人交流的时候,怎么尽可能多的描述出来~(当然前提是你已经掌握了
2021-04-24 16:11:04
176
原创 浅析dubbo服务引入
服务调用方里注入的服务,从下图可以看到是一个proxy代理对象,外面一层是MockClusterInvoker对象,里面一层是FailoverClusterInvoker对象
2021-04-24 09:49:18
151
原创 Dubbo的常见知识点
前言汇总一下Dubbo涉及的几个比较重要的知识点,便于自己面试复习及查漏补缺同时,也是以一种输出倒逼输入的方式,给自己点动力去进行输入正文知识点链接Dubbo服务暴露浅析dubbo服务暴露Dubbo服务引入待补充Dubbo服务调用待补充Dubbo SPI待补充Dubbo Monitor待补充Dubbo集群容错待补充Dubbo设计模式待补充Dubbo优雅停机待补充结语在微服务大行其道的当下,如果不储备点知识防身,平
2021-04-23 18:02:00
71
原创 浅析dubbo服务暴露
前言敖丙是我非常喜欢的技术博主,2020年开始关注的,慢慢的看着他成为2020年度博客之星Top1,对比2020年的自己,还是那个小菜鸡,所以开始学这些技术大牛,写写博客总结经验,平时有空反复打磨,也欢迎各位看官挑挑刺,互相学习服务暴露先贴一张Dubbo官方的架构图,我们今天涉及的内容是第0步和第1步服务启动后,会调用spring容器的refresh(),后续会出文章讲讲refresh里的13个方法步骤1:spring容器启动,解析dubbo自定义标签,扫描dubbo.xsd文件,步骤2:将D
2021-04-23 17:26:21
443
1
原创 Tomcat的NIO线程模型
前言关于Tomcat的线程模型,网上也介绍了很多了,我也不搬过来了(主要是因为懒)至于原理嘛,我听一个老师这么说过,框架工具都是别人做出来的,你只能按照别人的思路来理解,毕竟你没有别人那么厉害说的也是o(╥﹏╥)o,打不过就加入所以,我今天也只是分享一种自己比较容易记住的方式,来记住Tomcat的NIO模型,便于自己以后跟别人吹水,同时也分享一下,还请各位看官勿喷Tomcat的NIO线程模型Tomcat有三种模型,BIO、NIO、APR,Tomcat8以上版本,默认使用的就是NIO模式,所以
2021-04-23 08:46:39
577
2
原创 Thymeleaf入门
前言入门级demo,仅供小伙伴入门,不涉及过多的教程(多了我也不会),入门后需要其他的知识点再慢慢去百度吧(摊手),本文对CRUD的小伙伴比较友好四步入门Thymeleaf步骤1:修改pom.xml文件,添加thymeleaf依赖(注:还需要添加properties)<!--thymeleaf--><dependency> <groupId>org.springframework.boot</groupId> <artifact
2021-04-22 10:14:05
376
原创 zookeeper + dubbo简单入门
前言入门级demo,提供一个可以运行起来的小demo,不涉及太多的理论知识,以后有机会再慢慢劝退远程直连调用步骤1:先新建一个maven项目,接着再新建两个子模块,服务提供者dubbo-provider和服务消费者dubbo-consumer步骤2:修改dubbo-provider和dubbo-consumer的pom文件,添加以下依赖<!--dubbo + zookeeper + netty + curator--><dependency> <group
2021-04-21 11:38:01
395
原创 AQS之acquire方法
前言JUC(java.util.concurrent)包下的很多并发同步工具类,大多基于AQS(AbstractQueuedSynchronizer 抽象队列同步器)实现加解锁的逻辑,其中acquire()尤为重要。acquire()是独占式地获取资源,acquireShared()是共享式地获取资源,如ReentrantReadWriteLock的writeLock和readLock;AQS采用模板方法模式实现acquire(),封装了线程获取资源失败后,进入同步队列并阻塞的逻辑。三个核心方法
2021-04-15 17:07:06
709
原创 技术债之回调方法
前言我在之前的项目中,接触过微信、支付宝等第三方支付api,对其中涉及的支付回调接口特别感兴趣,今天花了点时间学了下回调函数(也算是补之前的技术债o(╥﹏╥)o,毕竟回调也是很重要的知识点),记录个小demo,方便以后复习,本人技术水平有限,写出来的程序难免会有小缺陷,还请各位看官多多包容,废话不多说,直接上代码1. 先定义回调接口Callback/** * @author guoyiying * @desc ... * @date 2021-04-12 15:20:09 */public
2021-04-12 17:11:24
76
原创 CompletableFuture在Groovy中的应用
在前一篇博客中介绍了多线程在Groovy中的应用,发现Future获取结果的时候会阻塞,不能做到真正意义上的异步编程,之后再整理对应的原理解析篇,这里就先贴它的使用方式,因为公司代码不方便贴出来,所以贴了个简单的示例代码。import java.util.stream.Collectorsimport java.util.concurrent.TimeUnit;import java.util.concurrent.Callable;import java.util.concurrent.Execu
2020-12-05 14:08:53
338
原创 Groovy多线程样例
Groovy多线程以下代码是博主自己在平时工作中,使用groovy总结的一些多线程样例,博主作为多线程小白,很多东西都还在学习中,欢迎讨论指点~1. 必包操作StringBuffer demo = new StringBuffer();IntStream.range(0, 100).each { demo.append(it + " ");}return PluginResult.ok(demo.toString());2. 新建线程id = null;def thread =
2020-11-21 17:56:51
2328
1
原创 LeetCode上的SQL面试题
不管使用何种语言进行项目开发,都避免不了接触数据库,接触SQL语句,下面的这18道SQL语句面试题摘自力扣,比较具有代表性。1. 查找重复的电子邮箱2. 大的国家3. 交换性别4. 有趣的电影5. 组合两个表6. 超过经理收入的员工7. 重新格式化部门表8. 从不订购的客户9. 删除重复的电子邮箱10. 上升的温度11. 超过5名学生的课12. 第二高的薪水13. 换座...
2020-01-09 16:59:59
478
原创 面试题:线程A打印1-10数字,打印到第5个数字时,通知线程B
关于线程通信这块,一直处于一知半解的状态,没有进行系统全面的学习,看了前辈的博客后,按照自己的理解自己手敲了一遍,写篇博客记录一下,方便自己以后查阅复习。park/unparkvolatile关键字synchronized + wait/notifycountdownlatchcondition + await/signal1 park/unparkpackage com.exa...
2020-01-07 11:09:05
693
原创 java web之读取PDF文件内容
引入依赖编写工具类编写测试用例运行结果1 引入依赖 <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox --> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactI...
2019-12-27 14:09:02
624
原创 java集成elastic search之demo篇
引入依赖编写实体类编写操作接口编写配置文件运行测试效果图1 引入依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boo...
2019-12-27 13:39:05
1145
原创 java集成elastic search之搭建集群
1. 下载elastic search点击这里,跳转到下载页,下载解压。双击elasticsearch.bat文件。访问http://localhost:9200/,出现如下页面。2. 安装elasticsearch-headgit clone git://github.com/mobz/elasticsearch-head.git先按步骤3修改配置文件,再回来进行以下操作c...
2019-12-26 14:57:23
866
1
原创 java集成rabbitmq之安装篇
安装erlang安装rabbitmq启动rabbitmq服务端登录后台管理页面1 安装erlang点击这里跳转到下载页下载后,一路next到底,记住安装路径。新增环境变量ERLANG_HOME,值为上一步的安装路劲。将ERLANG_HOME加入到环境变量path中命令行输入erl,如下所示,即为配置erlang成功。2 安装rabbitmq点击这里跳转到下载页...
2019-12-23 20:03:06
374
原创 Java集成Jedis进行项目开发
下载Redis启动Redis引入依赖编写工具类代码测试1 下载Redis下载后解压2 启动RedisRedis采用CS模式,先启动Redis Server,再启动Redis Client。在对应文件路径下,使用命令行开启Redis Serverredis-server.exe redis.window.conf --maxmemory 200M使用以下命令开启Red...
2019-12-21 17:49:13
531
原创 Redis学习笔记之内存管理
前言数据类型占用内存String一个String类型的value最大可以存储512MbList一个List的元素个数最多为2^32-1个,也就是4294967295个Set一个Set的元素个数最多为2^32-1个,也就是4294967295个Hash键值对个数最多为2^32-1个,也就是4294967295个1 过期数据的处理策略1.1 主动...
2019-12-16 10:13:31
104
原创 Spring Boot系统配置自动装载
1 Spring Boot设计理念1.1 Spring Boot介绍Spring Boot对Spring平台和第三方库进行了整合,可创建可以运行的、独立的、生产级的基于Spring的应用程序。(大多数Spring Boot应用程序只需要很少的Spring配置)Spring Boot可以使用java -jar或更传统的war部署启动的java应用程序进行创建,可以内嵌Tomcat、Jetty...
2019-12-16 09:58:21
327
原创 写时复制CopyOnWrite
juc包中有两个关于写时复制的类CopyOnWriteArrayListCopyOnWriteArraySet概念:顾名思义,写的时候,对数组进行复制。适用场景:读多写少,大多数线程都是读请求,可以显著提高线程操作的效率,在读请求明显多于写请求的场景下,用于替换读写锁。1 CopyOnWriteArrayList部分源码数组是用volatile进行修饰的,关于volatile的相关...
2019-12-13 11:25:54
140
原创 多线程之锁原理及AQS
停车位的场景Locks包AQS抽象队列同步器1 停车位的场景2 Locks包Locks包层次结构Lock接口ReentrantLockReadWriteLocksynchronized vs Lock2.4 ReadWriteLock概念维护一对关联锁,一个只用于读操作,一个只用于写操作;读锁可以有多个读线程同时持有,写锁是排他的。同一时间,两把锁不能被不同线...
2019-12-13 10:28:52
264
原创 SpringCloud之Eureka组件
eureka是SpingCloud中服务注册与发现的组件,有server端和client端。eureka server是有管理界面的,当client向server注册时,会提供一些元数据,例如主机和端口、url、主页等,eureka server从每个client实例接收心跳信息,如果心跳超时,则通常将该实例从注册server中删除。1 eureka serverserver有一个注册表...
2019-12-12 14:36:55
179
原创 消息中间件如何确保数据不丢失?
我们把消息中间件当成一个快递中转站,思考两个问题:快递如何在中转站不丢失;派件员在派件的过程中丢失了快递,收件人没收到,该怎么解决。等同于生产者将消息投递到RabbitMQ,如果此时RabbitMQ宕机了,消息还没发送给消费者,如何确保消息在服务器重启后还能恢复;RabbitMQ推送消息给消费者,如何确保消费者接收到消息并成功消费。【答案】进行持久化,包括队列持久化和消息持久化...
2019-12-12 10:50:22
416
原创 NIO网络编程三大核心理念
Buffer缓冲区Channel通道Selector选择器1 Buffer缓冲区本质是一个可以写入数据的内存块(类似于数组),可以更轻松地使用内存块,相对于直接对数组操作,buffer api更加容易操作和管理。使用Buffer进行数据写入与读取,需要进行四个步骤:将数据写入缓冲区调用buffer.flip(),转换为读取模式缓冲区读取数据调用buffer.clear(...
2019-12-11 16:06:28
148
原创 垃圾回收机制
垃圾回收概念垃圾回收算法垃圾回收器1 垃圾回收概念1.1 可达性分析选定活动的对象作为GC Roots,然后跟踪引用链条。以下四种对象可以作为GC Root虚拟机栈中正在引用的对象本地方法栈中正在引用的对象静态属性引用的对象方法区常量引用的对象对于没有被标记为可达的对象,进行回收。1.2 引用类型和可达性级别强引用:最常见的对象应用,只要有强引用,就不会回收软...
2019-12-10 17:29:21
135
转载 RocketMQ安装
环境版本操作系统:Linux/Unixjava版本:JDK1.8+Maven 3.2.xGit1 安装JDK此处省略2 下载发行版点击此处,下载4.6.0源发行版> unzip rocketmq-all-4.6.0-source-release.zip> cd rocketmq-all-4.6.0/> mvn -Prelease-all -DskipTe...
2019-12-09 14:56:36
205
转载 zookeeper安装
环境版本操作系统:CentOS release 6.6(Final)java版本:jdk1.8zookeeper版本:zookeeper-3.4.111 安装JDK此处省略2 安装Zookeeper2.1 下载源码包,并解压官网下载wget http://mirror.olnevhost.net/pub/apache/zookeeper/zookeeper-3.4.11/zo...
2019-12-09 14:07:28
147
原创 Kafka入门
Kafka重要概念Kafka核心APIKafka使用场景1 Kafka重要概念主流MQ对比主要功能相关概念2 Kafka核心API四个核心APIAPI-producerAPI-consumerkafka整体架构2.1 四个核心APIProducer API允许一个应用程序发布一串流式的数据到一个或者多个Kafka topicConsumer API...
2019-12-09 11:32:39
537
原创 线程中止
不正确的线程中止 - stop正确的线程中止 - interrupt正确的线程中止 - 标志位1 不正确的线程中止 - stopStop:中止线程,并且清除监控器锁的信息,但是可能导致线程安全问题,JDK不建议用。Destory:JDK未实现该方法。public class Demo{ public static void main(String[] args) throws I...
2019-12-07 18:00:33
124
转载 Spring最常用的7大类注解
核心注解Spring MVC和REST注解Spring Boot注解Stereotype注解数据访问注解任务执行、调度注解测试注解1 核心注解@Required@Autowired@Qualifier@Configuration@ComponentScan@Lazy@Value1.1 @Required此注解用于bean的setter方法上。表示此属性是必须...
2019-12-06 16:08:29
231
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人