自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(202)
  • 论坛 (2)
  • 收藏
  • 关注

原创 系统设计与实现相关流程和核心点的思考

2021-08-14 16:46:20 84

原创 第 13 节 热部署的用法与实现原理

1 引导语​ 在前面的几个小节中,我们主要围绕 SpringBoot 框架的相关核心功能点来讲解,主要分析了 SpringBoot 的设计初衷和相关核心设计,包括基于 main 方法来以独立 Java 进程的方式启动项目,SpringBoot 的自动配置机制、starter 包以及相关核心注解和 application.properties 属性配置文件等。​ 经过这些核心知识的讲解后,相信同学们都已经基本掌握了 SpringBoot 的用法,以及对相关功能点的设计与实现原理有了一个初步的认识。不过再进

2021-03-30 17:24:47 207

原创 第 12 节 属性配置之 application.properties 文件剖析

1 application.properties 文件与自动配置​ 在传统的基于 Spring 搭建的应用中,我们一般会使用一个 properties 类型的文件来存放应用的相关属性配置,其中 properties 文件的内容是由一个个键值对组成的,即 key=value,然后在使用了 @Configuration 注解的配置类使用 @PropertySource 注解引入该文件,如 @PropertySource(“classpath:app.properties”)。​ 而在基于 SpringBoo

2021-03-23 10:58:41 149

原创 第 11 节 starter 包的设计与如何自定义

1 starter 包​ 在前面介绍 SpringBoot 框架的设计初衷时我们提到,通过 Spring 框架开发应用的其中一个不足之处就是需要解决不同功能 jar 包之间的版本冲突问题,如在 pom.xml 文件中配置了两个功能 jar 包,由于这两个 jar 包都引用了同一个类而导致类冲突,此时需要花费大量的时间来折腾解决这种问题。另外就是需要记住实现某个功能所需的所有 jar 包,如果漏掉某个,则可能导致程序启动失败。​ 所以为了解决这两个问题,SpringBoot 框架设计了 starter 包

2021-03-19 16:02:37 200

原创 第 10 节 自动配置与条件化注解@Conditional

1 自动配置的实现​ 在前一节介绍的 @EnableAutoConfiguration 注解主要用于启用 SpringBoot 框架的自动配置功能,即 @EnableAutoConfiguration 注解担任的是一个开关的作用,打开这个开关之后,SpringBoot 的自动配置功能才可以生效。生效之后就需要在项目中自动加载和配置对应的 bean 对象,这个过程就涉及到自动配置的实现了。1.1 自动配置与个性化配置​ 在讲解自动配置实现之前,我们先聊下自动配置与个性化配置的问题。​ 虽然 Sprin

2021-03-12 16:53:18 110

原创 第 9 节 自动配置与@EnableAutoConfiguration注解

1 SpringBoot框架的自动配置​ 在前面章节中,我们主要分析了 Spring 框架的 IOC 容器的设计和 SpringBoot 框架在 Spring 框架的基础上,实现了可以以独立 Java 进程来启动 SpringBoot 应用,从而无需再将应用部署到 Tomcat 容器。这是 SpringBoot 框架的其中一个重大改进。除此之外,SpringBoot 提供的另外一个重大改进是自动配置。1.1 自动配置特性​ 简单来说,自动配置是指 SpringBoot 应用在启动时会自动创建相关的 b

2021-03-09 19:01:35 447

原创 第 8 节 @ComponentScan注解与Java Bean对象自动注入

1 Spring 框架的 Java Bean 对象自动注入1.1 @ComponentScan 注解与 <context:component-scan /> 标签的关系​ 在前一小节中我们多次提到 @ComponentScan 注解,@ComponentScan 是 Spring 框架的一个重要注解,也是 SpringBoot 的 @SpringBootApplication 注解包含的其中一个注解,主要用于实现 Java bean 对象的自动扫描、加载与注入到 Spring 的 IOC 容

2021-03-04 15:49:17 150 1

原创 第 7 节 @Configuration注解与Java类配置

1 基于 xml 文件的应用配置​ 对于 SpringBoot 框架的使用老鸟可能会对 Java 类配置和 xml 文件配置的对应关系有清楚的了解,不过为了照顾部分 SpringBoot 框架使用新手同学,在这里分析一下两者的对应关系和如何使用 Java 类配置来替代 XML 文件配置。​ 传统的 Spring 应用一般都需要两个 xml 配置文件,分别是 Spring 框架的配置文件 applicationContext.xml 和 Spring MVC 的配置文件 dispatcher-servle

2021-02-19 10:58:32 177

原创 第 6 节 SpringBoot 框架启动类 SpringApplication 剖析

1 SpringApplicaiton 的 run 方法剖析1.1 应用启动类 Application 的特点​ 在前面的章节分析过,基于 SpringBoot 框架搭建的项目是可以通过执行项目启动类 Application 的 main 方法来以独立进程的方式来启动运行,其中由 SpringBoot 官网提供的项目压缩包的项目启动类 Application 的典型实现如下:其中 Demo 是对应项目的名字。import org.springframework.boot.SpringApplicati

2021-02-01 16:02:01 237 1

原创 第 5 节 Spring IOC容器的设计与初始化流程

1 Spring IOC 容器的使用1.1 IOC 的概念​ SpringBoot 框架提供了一套解决方案来简化 Spring 应用的开发,不过 SpringBoot 框架在内部还是基于 Spring 框架来实现对 Java bean 对象的管理的。​ 具体为基于 Spring 的 IOC 容器来完成 Java bean 对象的创建和对象间的依赖注入,所以称为 IOC 容器。IOC 的英文全称为 Inverse Of Control,意思是控制反转,即对象的创建与管理工作不在应用自身来维护,而是交给

2021-01-25 18:36:39 349 1

原创 第 4 节 基于 main 方法启动 SpringBoot 进程

1 静态 main 方法与 JVM 进程的关系​ 在讲解 SpringBoot 项目的启动和运行之前,首先分析一下基于静态 main 方法启动运行 Java 类的相关知识,以便读者能够更好理解基于 SpringBoot 框架搭建的项目的启动和运行方式。1.1 基于静态 main 方法执行 Java 类​ Java 类的静态 main 方法是每一个 Java 开发人员都再熟悉不过的一个方法,在进行 Java 应用程序开发,特别是 Java SE 应用程序开发时,一般都会在 Java 类定义一个静态 ma

2021-01-23 08:10:04 335

原创 第 3 节 SpringBoot项目搭建方法与项目结构分析

第 3 节 SpringBoot项目搭建方法与项目结构分析1 SpringBoot项目的搭建方法1.1 从官网下载压缩包​ SpringBoot 框架的主要目的是简化 Spring 应用的开发难度,所以在项目搭建方面,SpringBoot 开发团队也提供了很好的支持。我们只需要在 SpringBoot 官网:https://start.spring.io/,进行简单定制之后下载项目的压缩包即可,其中该压缩包内的项目包含了标准的目录结构。然后在本地解压之后,将项目导入开发工具,如 eclipse 或者

2021-01-19 10:53:49 266

原创 第 2 节 SpringBoot的设计初衷与核心功能

第 2 节 SpringBoot 的设计初衷与核心功能1 SpringBoot 的设计初衷1.1 应用迭代快​ 为了适应市场变化的需求,应用的更新迭代速度越来越快,所以如果还是基于SpringMVC 和 Tomcat 这套应用开发和部署方案,则会由于需要进行大量配置而影响开发效率,拖慢项目的开发进度。1.2 Spring 应用配置方式固定​ Spring 应用一般包括应用自身的配置和对第三方功能 jar 包依赖的配置,而这些配置的模式一般是固定的。​ 首先是基于 Spring 实现的 Web 应

2021-01-14 20:50:18 412

原创 第 1 节 Java Web应用开发简介与痛点剖析

第 1 节 Java Web 应用开发简介与痛点剖析1 引导语​ 该专栏主要是讲解使用 SpringBoot 框架开发 Java 企业级 Web 应用的相关用法和原理,所以在进入 SpringBoot 框架的讲解之前,首先介绍一下 Java web 开发的相关原理,以便读者在之后能更好地理解基于 SpringBoot 开发 Java 企业级 Web 应用的相关用法和原理。2 基于 Servlet 组件的 Java Web 应用开发2.1 企业现状​ Java 语言是目前最流行的企业级 Web

2021-01-14 20:44:40 388 2

原创 异地多活的设计思路

一. 什么是异地多活异地多活是系统高可用的一种解决方案,它通过在多个不同机房建立多个数据中心,并且使这多个数据中心都可以同时在线提供服务来避免当出现机房断电、光纤被挖断等场景出现服务不可用的场景,实现服务高可用,同时这多个数据中心之间需要进行数据相互同步来保证数据的最终一致性。二. 哪些业务需要异地多活,哪些可以做到异地多活通过异地多活实现高可用并不是在所有场景下都可以做到的,通常需要结合业务重要程度,以及业务是否存在全局逻辑,以及异地多活场景中解决全局逻辑的成本来考虑是否需要做异地多活,同时需要考虑

2020-05-30 12:53:32 1169

原创 浅析数据高可用之异地多活

一、高可用的解决方案异地多活是服务高可用的一种解决方案,具体为在不同城市建立数据中心,即数据机房,然后各数据中心之间互相同步数据,相对于“冷备”而言,“多活”是指任意一个数据中心宕机了,可以马上切换到另外一个数据中心,继续提供服务,如修改负载均衡器的配置,将流量切换到另外一个机房。除了高可用外,异地多活还可以使不同地区的用户访问不同的数据中心,提高了访问速度,从而提高了用户体验。二、适用的业务类型异地多活一般适合于能容忍数据存在短暂不一致的业务,如用户中心,但是像金钱之类的业务则不太适合,如假

2020-05-27 11:36:07 847

原创 Zookeeper学习(三):脑裂现象与应对策略

脑裂现象脑裂现象主要是指当出现网络分区时,zookeeper集群形成了两个或者多个leader的情况,这时如果两个leader都提供服务,则会出现数据不一致问题。集群出现分区的选举方式当由于网络分区,集群被分离为多个子集群时,则此时原集群的leader失去了半数的follower节点,故需要重新进行leader选举。同时另外的子集群由于没有leader,故也会发起leader选举。此时就需要在可用性和数据一致性方面做出选择。zookeeper针对这种情况,提供了一下三种机制来对可用性和数据一致

2020-05-17 11:03:19 2432

原创 基于双向链表和哈希表(开放地址)实现LRU缓存

一、设计思路1. 数据存储数据存储使用开放地址哈希表,而不是使用链表哈希的方式,从而保证存放最多指定容量的数据。如果发生冲突,则往下查找直到找到一个空位置。对应的数据结构层面,则是使用数组,更确切地说是环形数组,因为当发生冲突时,需要查找除了直接通过 key % 容量capacity 取模之外的所有其他位置一遍,直到找到一个可以存放该键值对的位置。对于数据获取,也是类似的思路。2. LRU特性实现仿照Java的linkedhashmap来维护一个双向链表,每次访问一个节点或者新增一个节点则

2020-05-16 14:04:41 1023

原创 Kafka学习(三):服务器broker,生产者与消费者参数配置

2020-03-21 21:42:29 1619 1

原创 多租户系统设计之权限控制

概述业务层面的隔离是用户可以直接感知的隔离,也是多租户系统必须实现的隔离,在上篇文章中提到的数据隔离主要是针对数据存储层面而言的,用户一般感知不到,所以如“基于数据行的租户唯一标识”方案中,即使存储在相同的数据表也是可以的。在系统设计层面,业务隔离就是需要做好权限控制。基于RBAC模式的权限模型设计多租户系统的权限控制也是基于RBAC模式来设计的,即用户,角色,权限和资源(针对简单业务可以将...

2020-03-13 21:29:54 7639

原创 多租户系统设计之数据存储隔离

一、多租户架构的理解核心定义多租户架构的核心定义包括两点,第一点是一个服务,或者更通俗地讲是一套代码,被多方客户共用,第二点是不同客户之间的数据在逻辑上是隔离的,即每方客户拥有自己独立的数据空间,并在这个独立的数据空间内完成自身的业务行为。其中客户的群体需要根据这个服务的类型来区分,如 Saas 服务提供商的客户一般是不同的企业,而企业内部系统的客户则一般是不同的团队或者是不同的产品业务线。...

2020-03-07 11:20:58 3564

原创 分布式系统设计之限流算法剖析:漏桶与令牌桶

前言限流机制主要用于对流入系统的请求流量进行限制,保证在任何时候进入系统的请求流 量都是可控的。即不能超过系统预设的最大流量值,超过则需要排队等待或者直接拒绝,从 而避免高并发流量全部涌入系统,导致超出了系统的处理能力而出现系统机器宕机和服务不 可用问题。限流机制在实现层面,一般是基于漏桶算法或令牌桶算法来实现的,如下对这两种算法进行具体分析。漏桶算法对于漏桶算法,首先可以抽象为在业务服务...

2019-11-24 10:31:24 2006

原创 分布式系统设计之容错机制

前言由于分布式系统是由多个分布在不同网络节点的子系统或者称为子服务组成,在处理客 户端请求时,服务之间需要通过网络来进行相互调用,所以如果某个服务由于宕机或者其他 原因导致不可用,则服务调用方需要采取一定的容错机制来避免该不可用服务影响了当前服 务的请求处理。即一个服务可能会通过 RPC 调用多个其他服务,如果其中某个服务不可用, 则需要保证另外的多个服务的处理结果,以及当前发起 RPC 服...

2019-11-19 12:03:02 3725

原创 本地缓存与分布式缓存的优缺点、适用场景与实现分析

一、缓存的概念在服务端编程当中,缓存主要是指将数据库的数据加载到内存中,之后对该数据的访问都在内存中完成,从而减少了对数据库的访问,解决了高并发场景中数据库容易成为性能瓶颈的问题;以及基于内存的访问速度高于磁盘的访问速度的原理(数据库读取数据一般需要从磁盘读取),提高了数据的访问速度和程序性能。根据缓存是否与应用进程属于同一进程,可以将内存分为本地缓存和分布式缓存。本地缓存是在同一个进程内的...

2019-10-13 12:16:44 7499

原创 如何自定义一个 SpringBoot 的 starter 包

starter 包与自动配置的概念我们知道 SpringBoot 通过 starter 包引入对应的第三方 jar 包,然后通过自动配置机制来自动创建该第三方 jar 包对应的功能的 bean 对象。如通过引入 spring-boot-starter-data-redis 这个 starter 包并且在 application.properties 属性配置文件配置 Redis 服务器的域名和...

2019-10-04 20:57:51 2250

原创 Nginx七层负载均衡原理解析

一、网络协议:应用层七层负载均衡主要工作在网络七层ISO协议的第七层,即应用层。由于在应用层主要是处理对应的应用层协议的相关数据,如HTTP协议,而无法操作传输层TCP连接相关细节,故在七层负载均衡当中,负载均衡器主要是基于应用层协议的相关数据来进行请求转发,如对于HTTP协议,则主要是基于HTTP的Header头部信息、URL信息、Cookies等信息来进行集群节点的选择。由于负载均衡器需要...

2019-09-22 11:11:29 2528

原创 使用99个线程顺序打印1到99:volatile与synchronized关键字的应用

使用100个线程,顺序打印1到99。基本设计思路是:定义一个全局变量totalNum来控制当前需要打印哪个数字每个线程都使用一个顺序编号num当totalNum与num相等时,打印num,并且在该线程递增num,以便通知下一个线程打印。多线程相关:totalNum使用volatile关键字修饰保证线程可见性;每个线程内部基于synchronized关键字和基于Object类的wait方...

2019-09-21 15:47:53 2060

原创 LVS四层负载均衡原理解析

一、网络层协议网络协议是由七层ISO协议定义,自底向上分为物理层、数据链路层、网络层、传输层、会话层、表现层和应用层。四层负载均衡主要工作在网络七层ISO协议的第四层,即传输层。传输层的代表协议为TCP。相对于网络层,传输层对于数据包的区分,除了包含IP地址外,还包含端口号,并且TCP实现的是通过在不同机器的两个进程之间建立连接来进行通信。二、集群节点选择与连接建立所以四层负载均衡...

2019-09-21 08:05:20 2762

原创 分布式系统设计之高性能、高可用与高并发

概述在现代的互联网应用设计当中,通常会提到应用系统需要达到高性能,高可用和高并发这三“高”目标,其中这三个概念既有联系又有区别。高性能首先高性能是指应用系统对于客户端请求的处理速度快,响应时间短,对于用户来说就是该应用的操作流畅,拥有良好的用户体验。所以高性能是应用系统所需要具备的基本条件,不过不同业务的高性能的定义会有差别,如在线网络游戏需要保证在毫秒级别的响应时间,否则会让用户感觉...

2019-07-27 11:47:02 4399

原创 跨语言RPC框架:Gprc和protobuf的使用例子分析(包含完整项目源码)

概述Grpc是Google开发的一款高性能、跨语言的RPC框架,使用Google的数据序列化框架protobuf作为IDL(接口定义语言)跨语言的服务接口定义,以及数据序列化。在通信层面基于HTTP3.0实现,这是与大多数RPC框架基于TCP实现不一样的,主要原因是HTTP2.0在性能方面有了比较大的提升。除此之外,Grpc的设计的其中一个目的就是提供移动客户端与服务端的RPC调用,所以基于H...

2019-07-21 11:57:53 3985

原创 跨语言RPC框架:Thrift的使用例子解析(包含完整项目源码)

概述Thrift是由FaceBook于2007年开发的一款高性能,跨语言的RPC框架,支持多种不同语言之间的RPC调用,如Java,C++等,以下基于一个HelloWorld项目来展示Thrift框架的基本使用方法,项目的完整代码请参见:Thrift项目:Github thrift-IDLHelloWorld demo项目:Github thrift-demo1. 创建Thrift项目...

2019-07-20 01:03:45 3120

原创 分布式系统设计之负载均衡算法

概述在分布式系统设计当中,一般会对服务进行集群部署,集群中的多个节点提供相同的服务,所以可以将对该服务的请求分发给集群的任意一个节点来处理。为了将请求合理分发给集群的节点进行处理,即既要保证集群的每个节点都能够分配到请求,又能够实现不会给某个节点分配过多请求,导致超过节点处理能力,所以需要基于一定的规则来进行请求分发,这个规则也称为负载均衡算法。以下详细分析几种常见的负载均衡算法的工作原理。...

2019-07-11 23:26:47 3190

原创 分布式系统设计之CAP理论

一、概述CAP理论是美国加州大学的计算机科学家 Eric Brewer 在1998年提出的,该理论主要指出了分布式系统设计中存在两个质量指标:数据强一致性(Consistent)和服务高可用(Avaliability),以及一个不可避免的缺陷:网络分区,以及对应的网络分区容忍(Partition tolerance),其中数据一致性和服务可用性在分布式系统中是不能同时存在的,即要么保证数据的强...

2019-07-07 09:59:23 2678

原创 分布式系统设计概述

概述分布式系统主要用于解决单机在处理高并发请求,海量数据存储和海量数据计算分析时的瓶颈,通过将系统拆分为各个子系统,各个子系统可以在各自的机器上部署从而来实现整个系统的横向拓展。其中针对系统业务的差异,分布式系统设计的思路也会存在差异,以下主要是针对企业级应用服务,数据存储访问,数据计算分析服务来做个分析。1. 企业应用服务集群部署应对高并发请求的处理,同一个服务部署多个节点来解决单...

2019-07-03 11:52:26 3402

原创 Java NIO的三种Reactor线程模型分析

概述在使用Java NIO和多线程来进行高并发Java服务端应用程序设计时,通常是基于Reactor线程模型来设计的。Reactor,即包含一个Java NIO的多路复用选择器Selector的反应堆,当有反应时,即该Selector所管理的某个客户端连接有IO事件过来时,则在当前线程或者分配到其他线程来处理该IO事件。Reactor线程模型通常由接收客户端连接请求的acceptor线程和处...

2019-06-30 14:14:14 3679

原创 JDK1.8源码分析:线程本地变量ThreadLocal的使用与实现原理

一、概述在Java多线程编程当中,对于被多个线程的共享变量,一般的方式是通过加锁,如使用synchronized关键字或者Java并发包的ReentrantLock加锁来实现线程安全,或者该变量在Java并发包存在线程安全的版本实现,如整数Integer对应的AtomicInteger,HashMap对应的ConcurrentHashMap等,则使用对应的线程安全版本的实现。除了以上两种方式...

2019-06-18 14:10:23 4985

原创 Redis队列(三):消息的发布与订阅的C源码实现分析

一、概述在之前的文章分析过,Redis的消息发布与订阅支持基于频道channel的精确订阅与基于模式pattern的模糊订阅,并且是实时的消息传输,不会进行消息存储,如下从源代码来分析Redis的订阅与发布功能的实现,主要在Redis源码的pubsub.c文件定义。二、消息订阅1. 客户端和服务端的订阅存储结构消息订阅主要从客户端client和服务端server两个角度来分析。首先...

2019-06-09 00:49:54 6383

原创 Redis队列(二):消息的发布与订阅PubSub的使用

一、概述消息发布订阅模式在之前的文章中介绍了使用Redis列表这种数据类型来实现一个轻量级的消息队列,不过使用列表实现的消息队列存在一个缺陷就是由于是基于列表实现,所以消息出队列之后则不再存在,所以只能被一个消费者消费一次,不支持多个不同的消费者各消费一次,即不支持消息广播。为了实现消息队列常见的消息发布订阅PubSub模式,在Redis中提供了消息的发布与订阅实现,即消息生产者客户端可以...

2019-06-08 23:32:05 3864

原创 Redis队列(一):基于列表的消息队列的使用

概述在使用层面,Redis提供了用于存放字符串数据的列表这种数据类型,在数据存储容量方面,列表最多可以存放2的32次方减一个字符串元素,即大概40亿左右,不过一般不要存放这么多,否则由于数据是存放在内存中的,可能会撑爆内存。在内部数据结构实现层面,列表主要是基于链表实现的,字符串数据按照插入顺序在链表中排序,其中插入方式可以在链表前面和后面插入。除此之外,Redis还提供了列表的阻塞读取BL...

2019-06-08 18:09:20 4571

原创 RabbitMQ学习(三):高并发、高吞吐量、高可用的集群实现

一、概述高吞吐量与其他中间件产品类似,RabbitMQ也是通过集群的方式来解决单节点在处理海量消息时的性能瓶颈,通过集群的方式来实现高吞吐量,如单个RabbitMQ节点每秒只能处理1000个消息,而通过集群方式拓展,则可以进一步达到每秒10万个消息的处理或者更高的吞吐量。不过RabbitMQ的集群在处理海量消息时,是通过在集群的多个节点建立多个不同的队列来分散消息到多个不同节点的,所以在业...

2019-06-06 01:06:06 7915

空空如也

服务端开发的留言板

发表于 2020-01-02 最后回复 2020-01-02

原创文章数不对

发表于 2019-01-15 最后回复 2019-02-14

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除