讲讲并发编程的悲观锁和乐观锁
思维导图
文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary
悲观锁悲观锁是平时开发中经常用到的一种锁,比如ReentrantLock和synchronized等就是这种思想的体现,它总是假设别的线程在拿线程的时候都会修改数据,所以每次拿到数据的时候都会上锁,这样别的线程想拿这个数据就会被阻塞。如图所示:
synchronized是悲观锁的一种实现,一般我们都会有这样使用:
private static Object monitor = new Object();
public static void main(String[] args) throws Exception {
//锁一段代码块
synchronized (monitor){
}
}
//锁实例方法,锁对象是this,即该类实例本身
public synchronized void doSome(){
}
//锁静态方法,锁对象是该类,即XXX.class
public synchronized stat
三千字给大伙讲讲线程池
思维导图
文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary
前言在实际开发场景中,我们经常要使用多线程开发应用,比如实现异步操作,或者为了提高程序的效率等等。但是以前我见过有实习生在使用的时候是直接new Runable(),然后start()。没有使用线程池,可能很多初学者对线程池在多线程开发中没有足够的认识,所以我写一篇文章讲讲线程池,希望对大家有所启发。
一、什么是线程池线程池借鉴了”池化”技术的思想,线程池能够对线程的生命周期进行管理,对线程重复利用,并且能够以一种简单的方式将任务的提交与执行相解耦。
举个例子来说,线程就像是某个公司的客服小姐姐,每天都要接很多客户的电话,如果同时有1000个客户打电话进来咨询,按正常的逻辑,那就需要1000个客服小姐姐,但是在现实中往往需要考虑成本问题,招这么多人费用太多了,于是就可以这样优化,可以招100个人成立一个客服中心,如果同时超过100个人则提示让客户等待,等有空闲的客服小姐姐时就去响应客户。实现效益最大化。这就是一个池化技术在现实生活中类似的例子
SpringBoot启动流程是怎样的?
思维导图
文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary
前言SpringBoot一开始最让我印象深刻的就是通过一个启动类就能启动应用。在SpringBoot以前,启动应用虽然也不麻烦,但是还是有点繁琐,要打包成war包,又要配置tomcat,tomcat又有一个server.xml文件去配置。
然而SpringBoot则内置了tomcat,通过启动类启动,配置也集中在一个application.yml中,简直不要太舒服。好奇心驱动,于是我很想搞清楚启动类的启动过程,那么开始吧。
一、启动类首先我们看最常见的启动类写法。
@SpringBootApplication
public class SpringmvcApplication {
public static void main(String[] args) {
SpringApplication.run(SpringmvcApplication.class, args);
}
}
把启动类分解一下,实际上就是两
2020-11-15
java
SpringBoot
手把手教你搭建ELK日志集中分析平台
思维导图
文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary
概述我们都知道,在生产环境中经常会遇到很多异常,报错信息,需要查看日志信息排查错误。现在的系统大多比较复杂,即使是一个服务背后也是一个集群的机器在运行,如果逐台机器去查看日志显然是很费力的,也不现实。
如果能把日志全部收集到一个平台,然后像百度,谷歌一样通过关键字搜索出相关的日志,岂不快哉。于是就有了集中式日志系统。ELK就是其中一款使用最多的开源产品。
一、什么是ELKELK其实是Elasticsearch,Logstash 和 Kibana三个产品的首字母缩写,这三款都是开源产品。
ElasticSearch(简称ES),是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析。
Logstash,是一个数据收集引擎,主要用于进行数据收集、解析,并将数据发送给ES。支持的数据源包括本地文件、ElasticSearch、MySQL、Kafka等等。
Kibana,为 Elasticsearch 提供了分析和 Web 可视化界
从设计模式的角度剖析Mybatis源码
思维导图
文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary
概述Mybatis是一个比较主流的ORM框架,所以在日常工作中接触得很多。我比较喜欢看优秀框架的源码,因为能写出这种框架的作者肯定有其独特之处。如果能看懂源码的一些巧妙构思,一定是受益匪浅的。
所谓万事开头难,看源码也要找到切入的点。设计模式无疑是源码分析一个很好的切入点,废话不多说,那么我们就开始吧。
工厂模式工厂模式属于创建型模式。工厂模式的作用是把创建对象的逻辑封装起来,提供一个接口给外部创建对象,降低类与类之间的耦合。
在Mybatis中,用到工厂模式主要在DataSourceFactory。这是一个负责创建DataSource数据源的工厂。DataSourceFactory是一个接口,有不同的子类实现,根据不同的配置,生成不同的DataSourceFactory实现类。类图如下:
接着我们看一下DataSourceFactory的源码:
public interface DataSourceFactory {
void se
什么是skywalking?看完这篇你就懂了
思维导图
文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary
概述skywalking又是一个优秀的国产开源框架,2015年由个人吴晟(华为开发者)开源 , 2017年加入Apache孵化器。
skywalking是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。SkyWalking 是观察性分析平台和应用性能管理系统。提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案(官网介绍)。
一、OpenTracing规范OpenTracing是一种分布式系统链路跟踪的设计原则、规范、标准。
类似JDBC的规范,主要为了提供一套标准的JDBC API。OpenTracing也是一样,是为了统一提供一套链路追踪的标准API,所制定的一种规范。
OpenTracing通过提供平台无关、厂商无关的API,使得开发人员能够方便的添加(或更换)追踪系统的实现。
类似于JDBC的规范由各个数据库厂商实现一样,OpenTracing规范也是有很多
三千字Apollo配置中心总结
思维导图
文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary
一、概述Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。
目前Apollo在github有22.6k颗星,在官网登记的使用的公司有451家,算是很流行的配置中心的框架技术。所以接下来跟着我一起学习Apollo配置中心吧。
二、为什么使用配置中心首先,没有配置中心之前传统的配置都是写在配置文件中,比如各种yml、perproties、xml文件。
写在各种文件里最大的问题在于如果需要改配置信息,需要重新部署发布应用才能生效,这是第一个问题。
后面为了做到动态读取配置信息,后面有人改进一下把配置信息存储在数据库的一张表,程序读取表中的配置信息,这种方式很多公司都还在使用,因为简单,而且灵活(修改配置只需要执行个SQL语句,不需要重新部署发布)。但是也不是最完美的,因为缺少了权限控制,没有管理界面进行统一配置,没有历史版本的
3千字详细讲解OpenFeign的使用姿势
思维导图
文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary
前言目前在SpringCloud技术栈中,调用服务用得最多的就是OpenFeign,所以这篇文章讲一下OpenFeign,希望对大家有所帮助。
一、构建工程使用Nacos作为注册中心,不会搭建Nacos的话,可以参考上一篇注册中心的文章。
首先父工程parent引入依赖。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version>
3千字带你搞懂XXL-JOB任务调度平台
思维导图
文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary
一、概述在平时的业务场景中,经常有一些场景需要使用定时任务,比如:
时间驱动的场景:某个时间点发送优惠券,发送短信等等。
批量处理数据:批量统计上个月的账单,统计上个月销售数据等等。
固定频率的场景:每隔5分钟需要执行一次。
所以定时任务在平时开发中并不少见,而且对于现在快速消费的时代,每天都需要发送各种推送,消息都需要依赖定时任务去完成,应用非常广泛。
二、为什么需要任务调度平台在Java中,传统的定时任务实现方案,比如Timer,Quartz等都或多或少存在一些问题:
不支持集群、不支持统计、没有管理平台、没有失败报警、没有监控等等
而且在现在分布式的架构中,有一些场景需要分布式任务调度:
同一个服务多个实例的任务存在互斥时,需要统一的调度。
任务调度需要支持高可用、监控、故障告警。
需要统一管理和追踪各个服务节点任务调度的结果,需要记录保存任务属性信息等。
显然传统的定时任务已经不满足现在的分布式架构,所以需要一个分布式任务