自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 收藏
  • 关注

原创 Dubbo——配置

配置XML配置常见配置不同粒度配置的覆盖关系动态配置中心属性配置映射规则重写与优先级API配置注解配置服务提供方Service注解暴露服务(2.7.7版本之后,使用@DubboService注解)增加应用共享配置指定Spring扫描路径服务消费方Reference注解引用服务(2.7.7版本之后,使用@DubboReference注解)增加应用共享配置指定Spring扫描路径调用服务配置加载流程配置来源覆盖关系配置格式XML配置常见配置标签用途解释<dubbo:servic

2021-04-19 17:02:03 409

原创 Dubbo——快速开始

快速开始架构设计导入依赖代码实现服务提供者定义接口服务服务方实现接口Spring属性配置启动类添加EnableDubbo注解服务消费者配置并调用远程服务Spring属性配置启动类添加EnableDubbo注解结果展示架构设计Springboot 2.4.5 + dubbo-spring-boot-starter 2.7.8 + zookeeper 3.4.6(PS:需要本地启动ZK服务端,如果想更换为Nacos,也参考使用Nacos作为注册中心的Dubbo示例)导入依赖 ...... <

2021-04-19 15:04:12 208

原创 Dubbo——入门

入门背景需求架构节点的角色说明调用关系说明功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入背景随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用已无法应对,分布式以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的

2021-04-16 15:10:53 161

原创 记工作中一次遇到难题时的解决方案(MongoDB使用group以及first查询效率变慢)

记工作中一次遇到难题时的解决方案(MongoDB查询效率)问题描述问题描述前几天接到一个需求,提供一个查询多设备最后一次的发送GPS的信息,数据是存在MongoDB里面的,每个月的数据都会新建一个collection来存,所以有时候有些设备在当月没有数据的话,需要去查询前一个月的数据返回,所以这里需要一个递归的算法。我原本以为这是一个蛮简单的需求,直接用MongoDB的聚合管道技术的match以及group函数就能轻松解决,我的想法是:首先使用match函数筛选所有需要查询的设备GPS信息对查询

2021-02-03 14:25:42 1484 3

原创 Spring Boot项目的启动流程

Spring Boot项目的启动流程Spring Boot优点@SpringBootApplication 注解工作也有两年之余了,做过的Spring Boot项目也蛮多的,但是对他的启动流程之前没有系统的学习以及记录过,而且之前面试也遇到过问Spring Boot的启动流程。那么今天我们就整体的分析一下,Spring Boot的启动流程吧。Spring Boot优点在开始之前我们先介绍一下Spring Boot用我的英语四级水平给大家翻译一下。这个是Spring Boot官网对它自己的描述

2021-01-06 17:12:22 352

原创 网络通信原理

网络通信原理TCP/IP五层模型物理层数据链路层网络层传输层TCPUDP应用层TCP/IP五层模型计算机之间要有统一的连接标准才能够完成相互通信,这个标准被称为互联网协议,而网络就是物理链接介质+互联网协议。按照功能的不同,我们将互联网协议从不同维度分为OSI七层、TCP/IP五层(或四层),如下图。物理层我i里层主要是基于电气特性发送高低电平信号,指的是电路中某一点电压的高低状态,在网络信号中,高电平数字用“1”表示,低电平数据用“0”表示。电平的高低是一个相对概念,3V对于7V是低电平,但对于

2020-12-11 11:23:31 888

原创 MyBatis源码解析之SqlSession执行Mapper过程

MyBatis源码解析之SqlSession执行Mapper过程分析过程在此声明,此文章是对江荣波老师的《MyBatis3源码深度解析》的总结,尊重原作者。分析过程上一篇文章我们了解到,MyBatis通过动态代理对象将Mapper方法的调用转换为调用SqlSession提供的增删改查方法,以Mapper的Id作为参数,执行数据库的增删改查操作。接下来我们一SELECT语句为例,介绍SqlSession执行Mapper的过程。SqlSession接口只有一个默认的实现,即DefaltSqlSess

2020-12-07 11:21:26 269

原创 MyBatis源码解析之Mapper方法调用过程

MyBatis源码解析之Mapped方法调用过程分析过程在此声明,此文章是对江荣波老师的《MyBatis3源码深度解析》的总结,尊重原作者。分析过程这里我们介绍Mapper方法的执行过程以及Mapper接口与Mapper SQL配置是如何关联的。首先我们需要调用SqlSession对象的getMapper()获取一个动态代理对象MapperProxy,然后通过代理对象调用方法即可。 // MapperRegistry类,根据Mapper接口Class对象获取Mapper动态代理对象 @Su

2020-12-07 10:06:04 626

转载 Kafka系列(七):Kafka设计原理

Kafka设计原理副本与ISR设计水印和leader epochcontroller的职责副本与ISR设计一个kafak分区本质上就是一个备份日志,即利用多份相同的备份共同提供冗余机制来保持系统的高可用性,这些备份在kafka中被称为副本。kafka把所有分区的副本均匀地分配到broker上,并能从这些副本中挑选一个副本作为一个leader副本对外提供服务,而其他的副本被称为follower副本,只能被动地向leader副本请求数据,从而保持与leader副本的同步。假如leader副本永远都能正常的

2020-11-23 10:24:17 117

原创 MyBatis源码解析之MappedStatement注册过程

MyBatis源码解析之MappedStatement注册过程分析过程总结在此声明,此文章是对江荣波老师的《MyBatis3源码深度解析》的总结,尊重原作者。分析过程在上一篇文章MyBatis源码解析之Mapper接口的注册过程中我们在Configuration找到一个MapperRegistry用来注册mapper接口信息,同样的,我们可以找到一个mappedStatements,用来注册所有的MappedStatement对象。 protected final Map<String, M

2020-11-18 17:52:09 1125

原创 MyBatis源码解析之Mapper接口的注册过程

MyBatis源码解析之Mapper接口的注册过程在此声明,此文章是对江荣波老师的《MyBatis3源码深度解析》的总结,尊重原作者。我们先来看一串代码。 @Test public void testDynamicSql() throws IOException { // 获取配置文件输入流 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

2020-11-18 16:46:05 345

原创 MyBatis源码解析之SqlSession的创建

MyBatis源码解析之SqlSession的创建XPath方式解析XML文件Configuration的创建SqlSession的创建在此声明,此文章是对江荣波老师的《MyBatis3源码深度解析》的总结,尊重原作者。XPath方式解析XML文件MyBatis的主配置和Mapper配置都使用的XML格式。MyBatis中的Configuration组件用于描述主配置文件信息,框架在启动的时候会解析XML配置,将配置信息转换为Configuration对象。JDK API中提供了三种方式解析XML,

2020-11-18 15:46:22 251

原创 MyBatis源码解析之核心组件

MyBatis源码解析之核心组件MyBatis核心组件配置信息类ConfigurationSQL配置信息MappedStatementSQL执行器Executor操作数据库的类StatementHandler参数设置类ParameterHandler查询结果转换类ResultSetHandler类型处理器TypeHandler在此声明,此文章是对江荣波老师的《MyBatis3源码深度解析》的总结,尊重原作者。MyBatis核心组件这些组件的作用如下:Configuration:用于描述MyBat

2020-11-18 14:34:51 311

原创 Netty系列(一):异步和事件驱动

异步和事件驱动Java网络编程Netty简介Netty特性异步和事件驱动Netty的核心组件Channel回调Future事件和ChannelHandler把它们放到一起Java网络编程我们先来看一下最早的阻塞I/O代码。 //创建一个新的Socket客户端,用以监听指定端口上的连接请求。 ServerSocket serverSocket = new ServerSocket(PORT); //对accept()方法的调用将被阻塞,直到一个新的连接建立。 Socket socket = ser

2020-11-16 18:15:14 665

原创 Spring面试——事务

Spring面试——事务前言Spring事务的原理Spring事务回滚Spring事务什么情况下失效Spring的事务隔离和数据库隔离是不是一个概念Sping事务中一个带有事务的方法调用另一个带事务的方法,默认开启几个事务怎么保证Spring事务内的连接唯一性结束语前言之前面试被问过Spring事务的相关问题,结果因为总结的少,回答的支支吾吾,所以导致被发储备到人家公司的人才仓库了。┭┮﹏┭┮,所以接下来我就好好总结一下!Spring事务的原理Spring事务的本质就是数据库对事物的支持。没有数据

2020-11-13 11:46:13 460 1

原创 Kafka系列(六):Kafka之Consumer消费者

Kafka之Consumer消费者Consumer概述消费者消费者组位移(offset)位移提交消费者重组SpringBoot集成Kafka导入依赖参数自定义配置消费消息消息测试Consumer相关消息轮询位移管理consumer位移管理自动提交和手动提交Consumer概述消费者consumer是读取kafka集群某些topic消息的应用程序。消费者组消费者用一个消费者组名来标记自己,topic的每条消息都只会被发送到每个订阅它的消费者组的一个消费者实例上。我们知道kafka同时支持基于队列和

2020-11-11 18:06:28 1924

原创 Kafka系列(五):Kafka之Producer生产者

Kafka之Producer生产者Producer工作流程SpringBoot集成Kafka导入依赖参数自定义配置发送消息测试Producer相关自定义配置消息分区机制Producer拦截器无消息丢失配置producer端配置broker端配置消息压缩Producer工作流程producer首先使用一个线程,将待发送的消息封装进一个ProducerRecord类实例,然后将其序列化给分区器,再由后者确定了目标分区后一同发送到位于producer程序的一块内存缓冲区。而producer的另一个工作线程则负

2020-11-11 10:06:32 710

原创 Kafka系列(四):Zookeeper、Kafka单机集群搭建

Zookeeper、Kafka单机集群搭建Zookeeper单机集群搭建(windows)集群配置复制zookeeperzoo.cfg 配置启动服务Kafka单机集群搭建(windows)复制kafkaserver.properties配置启动服务kafka集群验证创建topic下载Zookeeper数据查看工具ZooInspector使用ZooInspectorZookeeper单机集群搭建(windows)集群配置我们使用3台Zookeeper服务器来构建集群, 在zookeeper的zoo.co

2020-11-10 12:12:50 192

原创 Kafka系列(三):基本概念与术语&使用场景

Kafka基本概念与术语&使用场景使用场景消息topic和partitionoffsetreplicaleader和followerISR使用场景消息传输网站行为日志追踪日志收集Event Sourcing流式处理使用场景消息消息的组成部分:Key:消息键,对消息做partition处理,即决定消息被保存在某topic下的哪个partition。Value:消息体,保存实际的消息数据。Timestamp:消息发送时间戳,用于流式处理以及其他依赖时间的处理语义,如果不指定则取当前时间。

2020-11-06 11:01:40 191

原创 Kafka系列(二):Kafka概要设计

Kafka概要设计吞吐量/延时消息持久化负载均衡和故障转移伸缩性吞吐量/延时对于任何一个消息引擎而言,吞吐量都是至关重要的性能指标。何为吞吐量?***吞吐量是某种处理能力的最大值。***,对于kafka而言,它的吞吐量就是每秒能处理的消息数或者每秒能处理的字节数。很显然,我们希望消息引擎的吞吐量越大越好。消息引擎还有一个名为延时的性能指标。他衡量的是一段时间间隔,可能是发出某个操作与接受操作响应之间的时间。或者是系统中导致某些物理变更的起始时刻与变更正式生效时刻之间的间隔。对于Kafka而言,延时可以

2020-11-05 18:01:39 163 1

原创 Kafka系列(一):Kafka快速入门

[KafkaServer id=0] started

2020-11-05 16:24:54 253

原创 Elasticsearch系列(二):SpringBoot整合Spring Data Elasticsearch

SpringBoot整合Spring Data ElasticsearchSpring Data Elasticsearch简介环境准备项目搭建以及相关代码Elasticsearch简单操作结束语Spring Data Elasticsearch简介Spring Data Elasticsearch是Spring Date项目下的一个子模块。官网地址:https://spring.io/projects/spring-data-elasticsearch我们先来说说这个Spring Data,我们可

2020-09-30 10:10:22 459

原创 Elasticsearch系列(一):Elasticsearch介绍及安装

Elasticsearch系列(一)Elasticsearch是什么Elasticsearch的优点全文搜索全文搜索Elasticsearch术语及概念对外接口范式和反范式缓存表和汇总表加快ALTER TABLE操作的速度Elasticsearch是什么Elasticsearch(ES)是一个基于Lucene构建的开源、分布式、RESTful接口全文搜索引擎。ES还是一个分布式文档数据库,其中每个字段都可以是被索引的数据而且可被搜索,它能够扩展至数以百计的服务器存储以及处理PB级别的数据。他可以在很短的

2020-09-29 17:02:27 173

原创 设计模式之代理模式

设计模式之代理模式代理模式的定义代理模式的应用代理模式的扩展代理模式的最佳实践代理模式的定义“Provide a surrogate or placeholder for another object to control access to it. ”(为其他对象提供一种代理以控制对这个对象的访问。)代理模式也叫做委托模式,它是一项基本设计技巧。许多其他的模式,比如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式,而且在日常的应用中,代理模式可以提供非常好的访问控制。pac

2020-08-17 16:46:56 65

原创 设计模式之建造者模式

设计模式之建造者模式建造者模式的定义建造者模式的应用建造者模式的注意事项建造者模式的最佳实践建造者模式的定义“Separate the construction of a complex object from its representation so that the same construction process can create different representations. ”(将一个复杂的对象的构建与他的表示分离,使得相同的构建过程可以创建不同的表示。)在建造者模式中,有如

2020-08-17 09:22:43 91

原创 设计模式之模板方法

设计模式之模板方法模板方法模式的定义模板方法模式的应用模板方法模式的最佳实践模板方法模式的定义“Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure ”(定义

2020-08-13 16:32:39 109

原创 设计模式之抽象工厂模式

设计模式之抽象工厂模式抽象工厂模式的定义抽象工厂模式的应用抽象工厂模式的注意事项抽象工厂模式的定义“Provide an interface for creating families of related or dependent objects without specifying their concrete classes. ”(为创建一组相关或相互依赖的对象提供一个接口,而且无须指定他们的具体类。)抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要

2020-08-13 11:39:22 92

原创 设计模式之工厂方法模式

设计模式之工厂方法模式工厂方法模式的定义工厂方法模式的应用工厂方法模式的最佳实践工厂方法模式的定义“Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiate to subclasses. ”(定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子

2020-08-11 19:58:41 114

原创 设计模式之单例模式

设计模式之单例模式单例模式的定义单例模式的应用单例模式的最佳实践单例模式的定义“Ensure a class has only instance, and provide a global point of access to it.”(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。)package com.example.demo.designpatterns;/** * 饿汉式 * 是否 Lazy 初始化:否 * 是否多线程安全:是 * 实现难度:易 * 描述:

2020-08-10 17:14:08 73

原创 设计模式的六大准则

设计模式的六大准则单一职责原则单一职责原则的英文名称是Single Responsibility Principle,简称是SRP。单一职责的好处:Ⅰ.类的复杂性降低,实现什么职责都有清晰明确的定义;Ⅱ.可读性提高,复杂性降低,那当然可读性提高了;Ⅲ.可维护性提高,可读性提高,那当然就更好维护了;Ⅳ.变更引起的风险降低,变更是必不可少的,如果接口的单一职责做的好,一个接口修改只对相应的实现类有影响,对其他的接口无影响,这对系统的拓展性、维护性都有非常大的帮助。单一职责原则最难划分的就

2020-08-10 15:27:12 417

原创 JVM之虚拟机类加载机制

JVM之虚拟机类加载机制概述虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。类加载的时机类从被加载到虚拟机内存中开始,到卸载出内存,它包含了以下七个生命周期:加载、验证、准备、解析、初始化、使用和卸载。(验证、准备和解析三部分统称为连接)加载、验证、准备、初始化和卸载这五个阶段的顺序都是确定的,类的加载必须按照这种顺序按部就班地开始,而解析阶段则不一定:它可以在初始化阶段之后在开始,

2020-07-21 14:35:31 166

原创 JVM之内存分配与回收策略

内存分配与回收策略对象优先在Eden分配大多数的情况下,对象是在新生代Eden区分配。当Eden区没有足够的空间进行分配时,虚拟机将发生一次Minor GC。public class Demo{ //-Xms20m -Xmx20m -Xmn10m -XX:SurvivorRatio=8 -XX:+PrintGCDetails //-XX:+UseSerialGC(Serial + Serial Old) public static void main(String args[]) {

2020-06-22 17:31:56 62

原创 JVM之垃圾收集相关参数

垃圾收集相关参数-XX:UserSerialGC虚拟机运行在Client模式下的默认值,打开此开关后,使用Serial + Serial Old的收集器组合进行内存回收-XX:UserParNewGC打开此开关后,使用ParNew + Serial Old的收集器组合进行内存回收-XX:UserConcMarkSweepGC打开此开关后,使用ParNew + CMS + Serial Old的收集器组合内存回收。Serial Old收集器将作为CMS收集器出现Concurrent Mode F

2020-05-20 19:46:51 176

原创 JVM之垃圾收集器

垃圾收集器Serial收集器Serial收集器是最基本、历史最悠久的收集器,曾经(JDK1.3.1之前)是虚拟机新生代收集的唯一选择。这个收集器是一个单线程收集器,但它的”单线程“的意思并不仅仅是说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是它进行垃圾收集时,必须暂停其他所有的工作线程(Stop The World),直到它收集结束。”Stop The World“这个名字也许听起来很酷,但这项工作实际上是由虚拟机后台自动发起和自动完成的,在用户不可见的情况下把用户的正常工作

2020-05-20 19:08:00 211

原创 JVM之垃圾收集算法

垃圾收集算法标记-清除算法算法分为标记和清除两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。它是最基础的收集算法,因为后续的收集算法都是基于这种思路并对其缺点进行改进而得到的。他主要有两个缺点:一个是效率问题,标记和清除过程的效率都不高;另外一个是空间问题,标记清楚之后会产生大量的不连续的内存碎片,空间碎片太多可能会导致,当程序以后的运行过程中需要分配较大的对象时无法找到足够的连续内存而不得不提前触发另一次垃圾回收。复制算法为了解决效率问题,一种称为“复制”

2020-05-20 11:06:54 95

转载 为什么代码里提倡单类型导入而不提倡按需导入?

为什么代码里提倡单类型导入而不提倡按需导入?这个问题是自从我来到现在待的公司之后,我的的代码在编译的时候报错了,原因是因为我用的按需导入(import java.util.*),check-style在我的代码编译的时候,给我报了个错。所以我很纳闷,为啥我们的check-style里面为什么要加上这个配置?后面在网上查了一下资料才发现,为什么提倡单类型导入而不提倡按需导入。因为使用单类型导入至少有以下两点好处:1.提高编译速度。2.避免命名冲突。(例如:当你import java.awt.*;imp

2020-05-18 17:09:23 1151

原创 JVM之如何判断一个对象已死

如何判断一个对象已死如何判断一个对象已死?如何判断一个对象已死?堆中几乎存放着Java世界中所有的对象实例数据,垃圾收集器在对堆经行垃圾回收之前,第一件事情就是要确定这些对象有哪些还“存活”着,有哪些已经“死去”。引用计数算法给对象中添加一个引用计数器,每当有一个地方引用它时,计数器就添加1;当引用失效之后,计数器就减去1;任何时刻计数器都为0的对象就是不可能再被使用的。但是在我们Java语言中,并没有选用引用计数算法来管理内存,其中最重要的原因是他难以解决对象之间的相互循环引用的问题。

2020-05-18 11:47:50 168

原创 基于注解的分布式锁

基于注解的分布式锁在上一篇笔记中我们介绍了基于Redis的分布式锁,这一篇我们就介绍一下基于注解的方法去使用这个分布式锁,使用这种切面的方式可以有效的减少功能性代码对业务代码的侵入性。首先我们需要定义一个注解类,相当于定义一个切点package com.example.demo.annotation;import java.lang.annotation.*;/** * @author : wulg29230 * @Date : 2020/3/9 14:36 **/@Target

2020-05-15 11:50:21 353

原创 Redis实现可重入分布式锁

111

2020-05-14 15:27:56 375 2

原创 Java之JVM内存管理机制

Java内存区域与内存溢出异常运行时数据区域运行时数据区域java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的区域。这些区域都有他们各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销魂。如下图,Java虚拟机所管理的内存将会包括以下几个运行区域。程序计数器Java虚拟机运行时数据区是一块较小...

2020-05-14 14:28:10 161 1

空空如也

空空如也

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

TA关注的人

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