软件架构
文章平均质量分 89
软件架构(software architecture)是一系列相关的抽象模式,用于指导大型软件系统各个方面的设计。
蹊源的奇思妙想
微信公众号:蹊源的奇思妙想
“桃李不言,下自成蹊”的原义是桃树、李树不会说话,但因其花朵美艳,果实可口,人们纷纷去摘取,于是便在树下踩出一条路来。比喻为人真诚笃实,自然就能感召人心,无需张扬夸耀。
展开
-
搬砖日记-CountDownLatch和CompletableFuture的使用
搬砖日记-CountDownLatch和CompletableFuture的使用前言不知不觉在大厂搬砖快一年了,在这一年里不得不说我学到了很多,特别把之前学到的知识给落地,这给我带来一些满足感和充实感,于是我想着抽空把最近学到的知识给整理整理,既是温习回顾还是一种分享,本篇文章将带领大家了解一下CountDownLatch和CompletableFuture的使用.正文CountDownLatchCountDownLatch程序计数器:CountDownLatch用于主线程等待其他子线程任务都原创 2022-03-13 00:48:34 · 2066 阅读 · 1 评论 -
RabbitMQ实现延时队列
RabbitMQ实现延时队列前言我们在设计大型的购物类的网站的时候,有这样的一个场景就是我们下订单后如果长时间不去支付的话需要超时将订单取消,并且存库要恢复,这就是我们经常说的订单过期会库存。分布式秒杀系统的设计可参考我的博客:分布式秒杀系统的设计SpringBoot项目中使用RabbitMQ可参考我的博客:SpringBoot项目中使用RabbitMQ正文延时队列订单过期库存回库的场景:淘宝七天自动确认收货:在我们签收商品后,物流系统会在七天后延时发送一个消息给支付系统,通知支付系统将款原创 2021-03-10 17:11:15 · 859 阅读 · 3 评论 -
单例模式的线程安全问题
我们在日常的开发过程中经常会遇到资源的共享的情况,如果每一个请求进来我们对单独的实例化一个对象势必会极大损耗我们系统的性能,那么我们如何去解决多线程资源共享的问题——一起来了解一下设计模式中的单例模式吧!原创 2019-06-23 22:14:21 · 1897 阅读 · 0 评论 -
MySQL主从复制原理及其实践
MySql数据库主从复制的方式有两种基于日志(binlog)基于GTID(全局事务标识符)MySql主从复制(也称A/B复制)的原理1. 数据存储:Master将数据改变记录到二进制日志(binary log)中,也就是配置文件log-bin指定的文件,这些记录叫做二进制日志事件(binary log events);2. 数据传输:Slave 通过 I/O 线程读取 Master ...原创 2019-09-19 18:29:23 · 1822 阅读 · 0 评论 -
Mysql高并发解决方案
随着近些年来分布式的应用,其伴随而来的是系统的数据量也越来越大,为了可以提升系统的整体性能,我们对以Mysql为代表的关系型数据库也提出了“分布式”的要求.原创 2021-02-05 21:27:55 · 3182 阅读 · 1 评论 -
Zookeeper作为Dubbo服务治理中心
Zookeeper作为Dubbo服务治理中心前言前几天被人问到这样的一个问题:当我们使用Zookeeper作为Dubbo的注册中心时,我们如果启动新的服务提供者怎么被其他节点检测到,我们都知道节点的注册信息都会放在一个服务清单里面,所以这个问题可以理解为Zookeeper是怎么样创建并维护这个服务清单的?分布式可参考我的博客:溪源的Java笔记—分布式微服务可参考我的博客:溪源的Java笔记—微服务正文Zookeeper作为Dubbo服务治理中心首先我们要知道Zookeeper提供了一给类似原创 2021-02-03 21:04:23 · 431 阅读 · 1 评论 -
分布式秒杀系统的设计
不知道你在面试的过程中有没有被问到如何设计一个分布式秒杀系统?本篇博客根据大神们的梳理的体系并结合自己实际的项目经验,大致描述我们在设计分布式秒杀系统需要关注的核心内容——分布式锁、分布式限流、消息队列等等,希望可以帮助同学们可以在面试中更加从容地回答这个问题。原创 2021-02-02 14:11:41 · 3346 阅读 · 3 评论 -
从悲观锁、乐观锁到分布式锁
从悲观锁、乐观锁到分布式锁前言我们在设计商品秒杀模块时为了防止“库存”超卖的情况,我们常常会使用一个锁的机制,解决多线程下数据一致性问题,但是在分布式集群下单节点的锁往往是无法满足业务的需求,本篇博客从悲观锁、乐观锁开始,逐步介绍分布式数据一致性的利器——分布式锁。正文悲观锁与乐观锁悲观锁与乐观锁的差异:悲观锁:一段执行逻辑加上悲观锁,不同线程同时执行时,只能有一个线程执行,其他的线程在入口处等待,直到锁被释放sychronized提供的是悲观锁乐观锁:一段执行逻辑加上乐观锁,不同线程同时执原创 2021-02-02 12:09:03 · 772 阅读 · 1 评论 -
消息队列设计
消息队列设计前言最近被问到这样的问题,如何让你设计一套消息队列,你会从哪些角度去设计。于是我回顾了自己对目前两款主流的消息队列RabbitMQ与Kafka的原理,并收集了一些大佬们对此问题的解答,于是给出了自己的一些理解与认识。消息队列可参考我的博客溪源的Java笔记—消息队列正文消息队列消息队列要实现的主要功能解耦:基于消息的模型,关心的是“通知”,而非“处理”,相对而言更关心结果而不是过程,通过消息队列可以减少系统与系统的耦合性,换句话来说一个系统的低效率不会拖累其他系统。最终一致性:原创 2021-01-30 01:46:09 · 793 阅读 · 0 评论 -
蹊源的Java笔记—设计模式
我们在开发过程中会根据一些特点的场景去总结出一些常用的解决方法,这些解决方案实际上就是设计模式,本篇博客带领大家去了解一些场景的设计模式。原创 2021-01-04 12:29:03 · 1645 阅读 · 1 评论 -
蹊源的Java笔记—微服务
溪源的Java笔记—微服务前言微服务架构是一种架构风格和架构思想,它提倡将系统业务按照功能拆分为更加细粒度的服务,即每一个服务都是一个独立的应用。这些应用对外提供公共API用于应用调度。本篇博客从服务治理、微服务网关、Netty等方面介绍微服务。正文服务治理服务注册发现服务注册就是维护一个登记簿,它管理系统内所有的服务地址。当新的服务启动后,它会向登记簿交待自己的地址信息。服务的依赖方直接向登记簿要 Service Provider 地址就行了。当下用于服务注册的工具非常多 ZooKeep原创 2020-12-29 12:49:43 · 5307 阅读 · 8 评论 -
蹊源的Java笔记—分布式
溪源的Java笔记—分布式前言现在的互联网的架构中往往会面对这数以万计的并发访问,为了让系统在这样的访问压力下可以平稳运行,有这限流算法、分布式事务、分布式锁等分布式技术,本篇博客将针对其中几个经常被使用的技术和各位同学介绍介绍。消息队列可参考我的博客溪源的Java笔记—消息队列正文限流算法一般来说服务降级分为两种故障降级:当发生网络故障或者RPC服务返回异常,这种情况我们通常采用关联fallback方法,为客户端设置兜底数据,从而避免造成服务依赖的“雪崩”现象。限流降级:无论系统运行在什原创 2020-12-14 23:52:10 · 2048 阅读 · 1 评论 -
蹊源的Java笔记—消息队列
溪源的Java笔记—消息队列原创 2020-12-09 03:17:36 · 2151 阅读 · 2 评论 -
蹊源的Java笔记—Mysql数据库
溪源的Java笔记—Mysql数据库前言前段时间我们花了比较多的时间对Spring相关的知识点进行了整理,本期博客将带领各位同学来了解一下Mysql数据库的必备知识点。Spring的可参考我的博客溪源的Java笔记—Spring正文MysqlMysql是我们最常用的关系性数据库。Mysql的逻辑结构组件:客户端、核心服务、存储引擎Mysql查询的5个过程过程:客户端向MySQL服务器发送一条查询请求服务器首先检查查询缓存,如果命中缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段原创 2020-12-01 00:27:09 · 4834 阅读 · 6 评论 -
蹊源的Java笔记—Spring
在现如今的Java开发中有一个不得不提的工具,那就是Spring,Spring是Java EE编程领域的一个轻量级开源框架, 是为了解决企业级编程开发中的复杂性,实现敏捷开发的应用型框架 。本期博客带领大家去了解Spring相关的知识点。原创 2020-11-22 11:09:35 · 3403 阅读 · 3 评论 -
蹊源的Java笔记—线程与线程池
溪源的Java笔记—线程与线程池前言Java的进阶之路上不得不说的技术点就是——多线程,上期博客我们对JVM的知识进行了简单地整理,本期博客将针对线程与线程池后端知识点一一阐述。JVM虚拟机 可参考我的博客:溪源的Java笔记—JVM正文线程线程是CPU调度分派的基本单位。线程的周期新建:当程序使用new关键字创建了一个线程之后,该线程就处于新建状态,此时仅由JVM为其分配内存,并初始化其成员变量的值。就绪:当线程对象调用了start()方法之后,该线程处于就绪状态。Java 虚拟机会为原创 2020-11-11 18:08:33 · 3003 阅读 · 1 评论 -
蹊源的Java笔记—集合之Collection接口
溪源的Java笔记—集合前言在java中我们最常的数据接口就是集合,在面试的时候最常问的问题也是集合相关的问题,结合自己的面试经验,我做了简单地整理,希望可以能够帮助小伙伴们一二。正文集合集合有两个接口组成:Collection和MapCollection接口Collection接口有3个子接口分别是:List:有序且元素是可重复的Set:无序并元素是不可重复的Queue:先进先出的线性数据结构,并且只能观察到队首元素.List接口List的常用实现类有:ArrayList原创 2020-10-27 12:41:23 · 5196 阅读 · 7 评论 -
微服务+微信小程序实现社区服务
我在上大学的时候毕业设计做的是微服务`SpringCloud`结合微信小程序实现一个提供一些生活服务的微信小程序,它主要可以提供豆瓣电影资讯、热点新闻、天气预报、停车位预约等生活服务,也用到了一些分布式的技术比如消息队列、内存数据库等。原创 2020-10-19 00:13:50 · 16894 阅读 · 28 评论 -
开箱即用的SpringBoot模板
如果你从事的开发岗位是独立开发一个完整的项目的时候,我们需要前期做很多的开发准备,特别是使用比较多的技术栈的时候,我们前期会投入比较多的组件调试时间,其实这部分工作往往是不涉及业务的,完全可以把常见的技术栈集合在一起做一个开发模板,本篇博客为大家提供一个不涉及业务逻辑的`SpringBoot`项目模板。原创 2020-10-14 09:20:07 · 9265 阅读 · 27 评论 -
SpringCloud使用Eureka作为服务治理中心
我们在进行开发分布式架构的系统时,有一个不可或缺的工具那就是服务治理组件,我们可以通过它来实现服务的注册、发布和调用,可以理解为它维护着我们所有服务的花名册。目前主流的服务治理中心有`Zookeeper`、`Eureka`、`Nacos`等,本篇博客这里我想和大家介绍一下服务治理组件—`Eureka`的原理和使用。原创 2020-10-02 20:40:04 · 6335 阅读 · 2 评论 -
SpringCloud使用Consul作为服务治理中心
SpringCloud使用Consul作为服务治理中心前言我们在进行开发分布式架构的系统时,有一个不可或缺的工具那就是服务治理组件,我们可以通过它来实现服务的注册、发布和调用,可以理解为它维护着我们所有服务的花名册。目前主流的服务治理中心有Zookeeper、Eureka、Nacos等,但是今天这里我想和大家介绍一下另一种服务治理组件—Consul。Nacos的使用可以参考我的博客:Nacos服务治理中心和配置中心正文ConsulConsul是一个Spring Cloud 中集成好的开源的分布式原创 2020-09-30 00:54:13 · 5788 阅读 · 1 评论 -
使用Jenkins来构建GIT+Maven项目
使用Jenkins来构建GIT+Maven项目前言最近写了一篇博客是关于 使用Jenkins来构建SVN+Maven项目 ,这里使用的的代码版本工具是SVN,但是事实上也有很多公司使用GIT来进行代码管理,那么我们如何使用Jenkins去自动发布GIT+Maven项目呢?正文JenkinsJenkins是一个开源的、可扩展的持续集成、交付、部署的基于web界面的平台。允许持续集成和持续交付项目,无论用的是什么平台,可以处理任何类型的构建或持续集成。通常我们使用Jenkins主要实现以下功能:原创 2020-09-28 00:53:23 · 8968 阅读 · 7 评论 -
在centos7搭建git代码仓库
在centos7搭建git代码仓库前言在以前的开发自己的个人小程序时我一直使用SVN来作为代码的版本控制系统,但是使用SVN有一个比较明显的弊端就是代码都是以中央仓库的方式进行管理,必须要在联网的情况下才能使用。并且在我们日常的学习开发中是一个螺旋式的开发过程,我们更需要一个更容易实现多版本共存的代码控制系统。Git的使用可参考我的博客:Git 如何将自己本地分支代码上传到远处主分支正文GitGit是一个免费开源的分布式版本控制系统,旨在快速高效地处理从小型到大型项目的所有内容。SVN与GIT原创 2020-09-26 22:17:37 · 6477 阅读 · 2 评论 -
SpringBoot+Redis实现数据字典
我们在日常的开发过程中针对一些字段采用整型的方式去代替某些具体的含义,比如性别0代表男,1代表女。如果只是一些不会变更的转译我们可以采用常量或者枚举类的方式来实现,但是事实上我们也会遇到那种可能需要变更的,显然这种场景下使用枚举类这种方式是不合理的,那么如何动态地去进行转译呢?原创 2020-06-10 16:27:10 · 13084 阅读 · 9 评论 -
使用Jenkins来构建SVN+Maven项目
在我们开发过程中,由于主流的架构都是采用前后端分离的方式,我们作为后端开发者需要为前段持续地提供运行在容器中最新代码,虽然可以通过在编译器中打完包后在放到容器运行,但是显然这种方式是既不方便的,那么能不能呢使用更加便捷的方式来构建发布程序呢?原创 2020-09-16 21:53:22 · 11584 阅读 · 2 评论 -
开箱即用的Dubbo模版
近期做的项目是一个采用`Dubbo`架构的微服务项目,由于之前虽然学习过`Dubbo`架构但是一直没有机会独自搭建过,于是趁着这个机会凭借着自己浅薄的理解自己完整地搭建了一个开箱即用的`spring-dubbo-demo`。原创 2020-09-14 09:17:36 · 9096 阅读 · 3 评论 -
使用SVS实现签名验证
使用SVS实现签名验证前言最近开发了一个接口由于是给外部其他系统的调用的,所以为了接口安全性,我们需要选择一个符合业务需求的请求机制。根据和合作方的协商,我们决定采用了SVS签名验证的方式来保证接口的安全性。正文数字签名数字签名指的是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。它的基本原理是将原文用对称密钥加密传输,而将对称密钥用收方公钥加密发送给对方。收方收到电子信封,用自己的私钥解密信封,取出对称密钥解密得原文。使用sv原创 2020-09-10 22:56:58 · 15266 阅读 · 4 评论 -
微服务使用knife4j进行在线接口调试
之前发布了一个博客是关于`SpringBoot`使用`knife4j`进行在线接口调试,那是一个单节点下的教程,那么在微服务情况,每一个服务都是一个独立的`knife4j`的话,显然是不方便的,那么对于微服务的情况下,我们如何使用`knife4j`呢?原创 2020-09-07 12:57:07 · 14145 阅读 · 1 评论 -
Dubbo结合Gateway实现微服务网关
Dubbo结合Gateway实现微服务网关前言最近,我发布了Dubbo Demo项目以及Gateway网关的博客,于是奇思妙想到能不能将两者结合起来呢?首先我们可以在Dubbo的官网中看了开发者文档,它推荐使用的网关只有三种Kong、Dubbo Proxy以及Zuul,而GateWay被认为是Zuul的替代品,所以从理论上是完全可行,所以来吧,展示!Nacos安装以及其使用可参考我的博客:Nacos服务治理中心和配置中心Gateway安装及使用可参考我的博客:微服务网关-Gateway正文网关模原创 2020-09-07 01:42:18 · 20701 阅读 · 11 评论 -
SpringBoot使用validation-api实现参数校验
SpringBoot使用validation-api实现参数校验前言我们在开发Java项目的时候,经常需要对参数进行一些必填项、格式、长度等进行校验,如果手写代码对参数校验,每个接口会需要很多低级的代码,这样会降低代码的可读性。那么我们能不能使用一种比较优雅的方式来实现,对请求中的参数进行校验呢?knife4j的安装与使用可参考我的博客:SpringBoot使用knife4j进行在线接口调试正文ValidationApi框架就是用来解决参数校验中代码冗余问题,ValidationApi框架提供一些原创 2020-09-06 04:06:52 · 15061 阅读 · 2 评论 -
SpringBoot使用knife4j进行在线接口调试
前言我们在开发一个Java Web的项目,如果项目整体采用前后端分离的架构的方式,我们会经常使用Swagger来进行接口调试和为前端提供接口文档,但是Swagger并没有实际上那么方便,比如我们在发送Post请求时,参数选填还是非常不友好,那么有没有更好的工具呢?正文knife4jknife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,具有小巧,轻量,并且功能强悍的优点。Knife4j提供两大核心功能:文档说明 和 在线原创 2020-09-06 01:02:11 · 17142 阅读 · 2 评论 -
Elastic-job实现分布式定时任务
最近接了一个新的需求,需要使用到定时任务,由于我们的系统是分布式的,所以`Spring`自带的定时任务无法满足我们当前系统对定时任务的需要。我们需要一个能够便捷、高可用的分布式定时任务框架。比较了几个主流的分布式框架,我最终pick了当当开源项目`ElasticJob`。原创 2020-09-02 20:54:50 · 12279 阅读 · 2 评论 -
SpringBoot 通过自定义注解实现权限检查
最近开发了一个接口,完成后准备自测时,却被拦截器拦截了,提示:(AUTH-NO)未能获得有效的请求参数!怎么会这样呢?于是我全局搜了这个提示语,结果发现它被出现在一个Aspect类当中了,并且把一个 @interface 作为了一个切点,原来这里利用了Spring AOP面向切面的方式进行权限控制。原创 2020-08-27 22:36:49 · 13306 阅读 · 0 评论 -
分布式下的请求超时
分布式下的请求超时前言在日常的生产中,用户往往不在乎你使用的什么样的性能优化的手段,他们更关心地是点击一个按钮后能否立马给予反馈。这个用户等待反馈的时间,就是我们软件设计过程中的用户操作的响应时间。我们花费心思去优化系统提升系统性能,本质上就是缩短响应时间,从而提升用户体验的满意度。那到底什么样的系统才算得上“流畅丝滑”的呢?正文在互联网上对于用户响应时间,有一个普遍的标准,即2/5/10秒原则:在2秒之内给客户响应被用户认为是“非常有吸引力”的用户体验。在5秒之内响应客户被认为“比较不错”的原创 2020-08-25 13:32:06 · 13196 阅读 · 1 评论 -
高并发之限流算法
限流算法在我们的实际的生产当中存在这样的业务场景:短时间有大量的请求涌入造成了系统的崩溃。针对这种问题我们会采用一种服务降级的方式来保证核心服务可以正常运行。一般来说服务降级分为两种:故障降级:当发生网络故障或者RPC服务返回异常,这种情况我们通常采用关联fallback方法,为客户端设置兜底数据,从而避免造成服务依赖的“雪崩”现象。限流降级:无论系统运行在什么样的服务器,它都会有一定的流量带宽极限,我们可以采用设置请求阈值的方式来避免过多的请求涌入从而造成系统的崩溃。不同的RPC框架都有着不原创 2020-08-23 23:40:50 · 11753 阅读 · 2 评论 -
JavaWeb主流技术总览
项目分享:https://github.com/luo948521848/JavaWeb JavaWeb技术总览 前段技术 BootStrap 基于xml、javaScript、css开发框架 JavaScript直译式的脚本语言 JQuery JavaScript的库 Ajax 异步J...原创 2018-07-28 15:44:18 · 17334 阅读 · 0 评论 -
快速搭建Hadoop环境
1、基础集群环境搭建 1.1、安装JDK 1、上传jdk-8u151-linux-x64.tar.gz 2、解压到usr目录下 tar -zxvf jdk-8u151-linux-x64.tar.gz 3、配置环境变量 (1)vim /etc/profile (2)在最后加入: JAVA_HOME=/usr/java1.8 PATH=JAVAHOME/bin:JAVAHOME/b...原创 2018-08-08 20:40:52 · 2672 阅读 · 0 评论 -
flume基础教程
1. flume是什么flume 作为 cloudera 开发的实时日志收集系统,受到了业界的认可与广泛应用。Flume 初 始的发行版本目前被统称为 Flume OG(original genera﹋on,原创世纪),属于 cloudera。但 随着 FLume 功能的扩展,Flume OG 代码工程臃肿、核心组件设计不合理、核心配置不标准 等缺点暴露出来,尤其是在 Flume OG ...原创 2018-08-13 20:54:35 · 1952 阅读 · 0 评论 -
Hadoop HA高可用
为什么会有 hadoop HA 机制呢? HA:High Available,高可用 在Hadoop 2.0之前,在HDFS 集群中NameNode 存在单点故障 (SPOF:A Single Point of Failure)。 对于只有一个 NameNode 的集群,如果 NameNode 机器出现故障(比如宕机或是软件、硬件 升级),那么整个集群将无法使用,直到 NameNode 重...原创 2018-08-14 20:39:24 · 1915 阅读 · 0 评论 -
利用Spark MLIB实现电影推荐
源码及数据集:https://github.com/luo948521848/BigDataSpark 机器学习库MLLib MLlib是Spark的机器学习(Machine Learning)库,旨在简化机器学习的工程实践工作,并方便扩展到更大规模。MLlib由一些通用的学习算法和工具组成,包括分类、回归、聚类、协同过滤、降维等,同时还包括底层的优化原语和高层的管道API。具体来说,其主要...原创 2018-08-23 20:53:50 · 5279 阅读 · 0 评论