自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(39)
  • 资源 (3)
  • 收藏
  • 关注

原创 Zookeeper 简单安装

一、下载Zookeeper点击下面网址进行Zookeeper的下载https://mirrors.bfsu.edu.cn/apache/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz二、解压将apache-zookeeper-3.7.0-bin.tar.gz 解压出 apache-zookeeper-3.7.0-bin三、修改配置在apache-zookeeper-3.7.0-bin目录下创建一个data文件夹进

2021-05-26 16:30:39 382 1

原创 Zookeeper 分布式锁 Java实现

如果大家对Zookeeper的文件系统、监听机制不是很了解的话可以先看下我之前写的这篇文章《Zookeeper简介》了解下。话不多说,我们直接进入正题吧。首先Zookeeper作为分布式锁的解决方案之一,必然有着其他中间件所没有的特性:Zookeeper中,在同一时刻,不允许多个客户端同时创建一个节点。Zookeeper中创建的临时节点在客户端与Zookeeper断开连接后就会被自动销毁。如果客户端对Znode发起了监听,那么当该Znode被删除后,客户端就会收到通知。基于上面这几个.

2021-05-25 22:05:22 504

原创 Zookeeper入门

一、概述Zookeeper是Apache旗下一个开源的分布式协调服务,它所提供的服务非常简单,客户端可以在其树状文件系统中创建任意节点,并且可以监听节点以及其子节点的变化。分布式应用可以基于Zookeeper提供的这些功能,实现诸如:注册中心、配置管理、集群管理、分布式锁、统一命名服务等功能。Zookeeper这个名字怎么来的呢?Zookeeper最早是源于雅虎研究院的一个研究小组,当时在雅虎内部很多大型系统都需要依赖一个类似的系统来进行分布式协调,但是这些系统往往都存在分布式单点问题。所以,雅虎的

2021-05-18 22:04:16 194

原创 Java 图片上传后发生了90度的旋转

一、背景在开发给上传图片打水印的时候,发现了一个奇怪的事情。某张图片在上传后发生了90度的旋转,但是在window打开来是竖的,上传后在打开就是横的。后来上网查询是由于手机在拍摄时候是横着拍的,在图片处理时将旋转角度存储在了exif信息中,但是用Java方法读取图片会忽略旋转角度,导致了这个问题,而window图片预览、手机图片查看等都会根据旋转角度进行调整,所以是没有问题的。具体表现如下:上传前:上传后就向左旋转了90度二、获取旋转角度那么我们如何才能获取到图片真实的旋转角度呢,这里就需

2021-05-01 22:22:46 2515 3

原创 Java 图片打文字、图片水印

原图片打水印(文字)import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.BufferedImage;import java.io.File;import java.io.FileOutputStream;public class ImageUtils { // 水印字体 private static final Font FONT = new Font("微软雅黑", Font.PLAI

2021-04-29 15:34:39 142

原创 Dubbo @Adaptive注解 自适应扩展机制原理

Dubbo中可以通过SPI机制来加载对应扩展点实现,可是一个扩展点对应着多个实现类,我们如何才能触发目标实现类中的方法呢?Dubbo的Adaptive机制就是解决这个问题的。下面我们用代码来看一下@Adaptive注解的使用方式以及源码实现。扩展点接口 ICarServicepackage com.dubbo.service;import org.apache.dubbo.common.URL;import org.apache.dubbo.common.extension.Adapti.

2021-04-26 22:19:10 345

原创 Dubbo SPI 源码解析

Dubbo SPI基于Java的SPI机制,Dubbo在其思想的基础上自己实现了一套SPI机制,弥补了Java SPI的缺点,并进行了相应的扩展。1. Dubbo SPI 改进了 Java SPI 的以下问题:Java SPI是一次性加载、实例化所有的扩展点实现,不支持根据key值去加载、实例化指定的扩展点实现。Java SPI不支持IOC、AOP,Dubbo SPI则通过自动包装、自动装配等特性实现了IOC、AOP。ServerLoader在加载类的过程中如果出现异常无法加载没有相关的异常

2021-04-25 18:47:24 245

原创 Java SPI

什么是SPISPI全名是Service Provider Interface,通过接口寻找其具体的实现类,从而避免了使用方与提供方之间的强耦合,实现了动态可拔插的特性。比如JDBC的数据库驱动模块,在JDBC以前的版本中,需要直接在代码中采用Class.forName(驱动实现类全名)的方式进行驱动初始化,导致想要更换数据库驱动模块就需要修改代码,具有很强的耦合度。Class.forName("com.mysql.jdbc.Driver");// 下面是mysql的驱动实现类package c

2021-04-20 09:15:13 74

原创 Dubbo服务直连、只订阅

在本地或测试环境时,往往需要绕过注册中心,指定服务提供者从而进行测试,因此就可以通过如下配置进行服务直连。注意:配置后会忽略注册中心中注册的服务提供者列表,因此不推荐在生产环境下使用该功能。xml配置<dubbo:reference interface="com.test.IUserService" url="dubbo://127.0.0.1:20880"/>注解配置@Reference(url="dubbo://127.0.0.1:20880")private IUser

2021-04-15 08:55:30 243

原创 Dubbo、Zookeeper、SpringBoot整合

1. Zookeeper搭建1.1 下载 Zookeeper1.2 在zookeeper根目录下创建data文件夹1.3 在zookeeper的conf目录下创建zoo.config,修改里面的dataDir配置# The number of milliseconds of each ticktickTime=2000# The number of ticks that the initial # synchronization phase can takeinitLimit=10# Th

2021-04-08 16:42:02 84

原创 分布式事务:BASE理论

一、什么是BASE理论?全称:Basically Available(基本可用),Soft state(软状态),和 Eventually consistent(最终一致性)三个短语的缩写。eBay的架构师Dan Pritchett源于对大规模分布式系统的实践总结,在ACM上发表文章提出BASE理论,BASE理论是对CAP理论的延伸,其核心思想是:即使无法做到强一致性(Strong consistency),但应用可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventual co

2021-03-19 19:15:43 228 1

原创 分布式事务:CAP理论

CAP理论指的是在一个分布式系统中,不能同时满足一致性(Consistency)、可用性(Avalibality)、分区容错性(Partition Tolerance)。1. 一致性 Consistency分布式系统中的所有节点上的数据都是一致的。假设有一个分布式系统,其中有2个节点:节点A、节点B,两者的数据库中都存有x,其初始值都为0。此时客户端向这个节点A发起x=1的请求。1.1 强一致性返回成功响应后,节点A与节点B上的值都为1。任意时间各个节点上的值都是一致的1.2 弱一致性

2021-03-19 17:29:21 1001

原创 seata: no available service ‘null‘ found, please make sure registry config correct

最近尝试着在自己电脑上搭建了springboot + dubbo + seata(1.0.0) + nacos的环境,但是在启动程序后,出现了如下异常但是seata明明已经注册到了nacos中下面是我的seata-server配置(nacos-config.txt),并且已经通过nacos-config.sh推送到nacos中port.type=TCPtransport.server=NIOtransport.heartbeat=truetransport.thread-factory.bo

2021-03-18 09:27:36 648

原创 分布式事务:XA、TCC、最终一致性方案

1 分布式事务1.1 事务的四个特性 ACIDAtomicity 原子性事务中所有的操作要么一起提交,要么一起回滚。Consistency 一致性事务一旦提交,数据就会从一个一致性状态,到达另一个一致性状态。Isolation 隔离性一个事务中对数据的更改不会影响到另一个事务中的数据。Durablity 持久性一旦事务提交,那么对于数据库的更改就是永久的。1.2 事务场景假设有这么个场景,用户下单购买商品,则会调用订单中心让其生成订单记录,同时调用库存中心让其扣除商品库存。这两个中

2021-03-15 18:01:23 907

原创 Oracle、Mysql中新建、修改、删除索引

Mysql1、新建索引ALTER TABLE `report_task` ADD INDEX `idx_target_id`(`target_id`) USING BTREE COMMENT '目标id索引';2、删除索引ALTER TABLE `report_task` DROP INDEX `idx_target_id`;3、修改索引先删除后新建ALTER TABLE `report_task` DROP INDEX `idx_target_id`,ADD INDEX `i

2021-03-10 18:04:10 161

原创 MybatisGenerator自动生成代码(包含属性注释)

1、创建generatorConfig.xml文件<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><genera

2021-02-23 16:04:18 407

原创 Spring中对Mysql进行时区设置:The server time zone value ‘xxx‘ is unrecognized or represents more than one t

刚开始,我在项目的application.properties文件中进行了如下的数据库配置spring.datasource.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.url=jdbc:mysql://127.0.0.1:3306/c2c?useUnicode=true&characterEncoding=utf-8spring.datasource.username=rootspring.datasource.

2021-02-20 10:47:56 685 1

原创 Spring中 @Primary注解的作用

下面是Primary注解的源码:package org.springframework.context.annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotati

2021-02-19 15:17:38 2316

原创 idea插件:Mybatis Log Plugin 安装

Mybatis Log Plugin是一款用于将控制台中打印出的sql、参数拼装成完整sql语句的idea插件,方便了我们对于程序的调试和排错。当我们将mybatis的日志级别调至debug的时候,就会在控制台打印如下内容==> Preparing: insert into user_info (user_id, user_name, age) values ( ?, ?, ? ) ==> Parameters: null, lbb(String), 18(Integer)<.

2021-02-07 16:51:59 21168 6

原创 Result window is too large, from + size must be less than or equal to: [10000] but was

ES其默认返回的数据量是1w条,当from + size > 1w时,就会抛出如下异常Caused by: org.elasticsearch.ElasticsearchException: Elasticsearch exception [type=illegal_argument_exception, reason=Result window is too large, from + size must be less than or equal to: [10000] but was [518

2021-02-05 14:16:28 874

原创 Elasticsearch RestHighLevelClient 调试打印请求体、返回体

// 请求ESSearchResponse searchResponse = this.restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 打印Rest请求体System.out.println(searchRequest.source().toString());// 输出{ "from": 0, "size": 25, "query": { "bool": { "filte

2021-02-04 17:14:29 3360 2

原创 Elasticsearch RestHighLevelClient实现类似于SQL中in的操作

需求:查询年龄在10岁、20岁、30岁的人员Rest请求GET person/_search{ "query": { "bool" : { "filter" : [ { "terms" : { "age" : [ 10, 20, 30 ] } } ] } }}Java实现boolQueryBu

2021-02-04 15:39:43 1986

原创 Elasticsearch RestHighLevelClient异常:The number of object passed must be even but was [1]

在使用RestHighLevelClient进行新增/修改时,抛出如下异常// 新增/修改ES文档BulkRequest bulkRequest = new BulkRequest(ESConstant.USER_INDEX);for (SyncToEsViewObj syncToEsViewObj : syncToEsViewObjList) { bulkRequest.add(new IndexRequest().source(syncToEsViewObj).id(this.getEsI

2021-02-04 10:53:39 509

原创 window环境下elasticsearch7.8.0与kibana7.8.0的安装运行

1、下载elasticsearch与kibnaelasticsearch下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearchkibana下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch我这边选择的是 7.8.0 版本2、解压下载后的文件3、启动elasticsearch进入elasticsearch下的bin目录,执

2021-02-02 10:11:48 423

原创 Java steam流中toMap、groupingBy、flatMap的简单用法

@Data@ToStringpublic class Book { private String category; private String name; private int stock; public Book(String category, String name, int stock) { this.category = category; this.name = name; this.stock =

2021-02-01 10:05:45 1416

原创 1、Spring源码解析 - getBean

1、启动方法public static void main(String[] args) { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml"); Dog dog = (Dog) applicationContext.getBean("wangcai");}2、调用getBean方法,从IOC容器中获取对应的Bean实例org.sp

2021-01-29 17:37:49 167

原创 List与数组之间相互转化 (基础数据类型、非基础数据类型)

1、List转数组List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);// 实现代码Integer[] intArr = list.toArray(new Integer[]{});System.out.println(Arrays.toString(intArr));// 输出[1, 2, 3, 4, 5]

2021-01-29 09:46:06 788

原创 将一个List分割为多个固定大小的List

/** * 按照指定大小分割列表 * * @param list 原列表 * @param size 指定大小 * @param <T> * @return */public static <T> List<List<T>> splitList(List<T> list, int size) { if (CollectionUtils.isEmpty(list) || size <= 0) { retu

2021-01-28 09:43:32 641

原创 2、Spring源码解析 - populateBean

首先介绍几个概念1、什么是BeanWrapper?BeanWrapper是Spring操作Java Bean的一个工具类,通过它可以直接修改Java Bean的属性,其底层是通过反射的方式实现的。@Data@ToStringpublic class Person { private String name; private String idCardNo; private int age;}public static void main(String[] arg

2021-01-25 19:17:16 370 2

原创 使用mybatis-generator生成代码的时候,发现生成的xml中只有insert方法,并没有deleteByPrimaryKey、selectByPrimaryKey等方法

目前遇到的有几种情况会导致这样的问题1、对应的数据表没有设置主键解决方案:设置主键2、使用了 mysql-connector-java-8.0.15.jar 或 其他高版本的mysql数据库驱动解决方案:在jdbcConnection中添加userInformationSchema属性,并设值为true<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:

2020-12-31 16:03:41 816

原创 mysql 5.7.24 安装

1、下载mysql安装包下面的链接是mysql的官方下载地址,可以随意选择你要下载的版本,我这里下载的是 mysql-5.7.24-winx64.zip 版本。(可以使用迅雷下载,速度会快很多)https://downloads.mysql.com/archives/community/2、解压到目标目录下下面是我的解压后的文件路径D:\devtools\mysql3、配置环境变量新增MYSQL_HOME变量变量名:MYSQL_HOME变量值:D:\devtools\mysql

2020-12-31 14:34:09 246

原创 this调用自身方法,Transaction注解事务不生效的问题

起因:Spring的事务是通过代理类实现的,而下方代码中的this.addUserToDb()并没有走UserService的代理类,所以事务并不会生效。解决思路: 调用UserService代理类的addUserToDb()方法@Servicepublic class UserService implements IUserService { @Autowired private UserMapper userMapper; @Override public Lo

2020-12-25 09:37:34 4281 2

原创 Java8 steam.collect(Collectors.toMap())方法引发的NullPointerException 空指针异常

package com.example.demo;import java.util.Arrays;import java.util.List;import java.util.Map;import java.util.stream.Collectors;public class TestSteam { private static class Item { private String key; private String value;

2020-12-18 08:45:24 2085

原创 跨代引用、记忆集、卡表

跨代引用一、什么是跨代引用?新生代中的对象持有了老年代中的对象的引用 或 老年代中的对象持有了新生代中对象的引用。如下图所示,新生代中的A对象持有了老年代中C对象的引用;老年代中的C对象持有了新生代中B对象的引用;老年代中的D对象持有了新生代中E对象的引用。二、跨代引用所带来的问题当进行一次只局限于新生代区域内的垃圾回收(Minor GC),但是新生代中的对象完全有可能被老年代中的对象所引用。为了找出这个区域中的存活对象,不得不在固定的GC Roots之外,在额外的遍历整个老年代中的对象,来确

2020-12-13 21:08:12 1221

原创 垃圾回收算法

一、如何判断对象是否可以被回收1 引用计数法概念:在对象中添加一个引用计数器,每当一个引用指向该对象时,其引用计数器就加一;当引用失效时,其引用计数器就减一;当对象的引用计数器为0时,则该对象可以被回收。优点:实现简单,判定效率高。缺点:存在对象间循环引用导致对象不能被回收的问题。public class A { public B instanceB;}public class B { public A instanceA;}// a、b对象互相持有对方的一个对象引用,引用计数器

2020-12-08 21:57:13 126

原创 Java 运行时数据区

总览一、程序计数器程序计数器中存储的是当前正在执行字节码指令的地址,当字节码指令被执行时,程序计数器中存储的地址就会指向后续一条要执行的字节码指令。分支、循环、跳转等都是依赖于程序计数器完成。程序计数器是线程私有的,每个线程都有其各自的程序计数器,各个线程之间的程序计数器互不影响,独立存储。二、Java虚拟机栈Java虚拟机栈描述的是方法的执行过程:每个方法被执行的时候,都会在Java虚拟机栈中创建一个栈帧,用于存储局部变量表、操作数栈、动态连接和方法返回地址等信息。每个方法从被调用到执行

2020-12-06 22:26:17 90

原创 idea中使用yapi插件自动生成yapi接口文档

1、在idea的plugin中搜索easy-yapi插件2、安装后重启idea3、打开setting,在Other Settings下出现EasyApi菜单项,点开出现如下界面4、填充Yapi地址5、打开我们想要生成Yapi文档的Controller中6、同时按住 Shift + Alt + E 即会出现如下弹窗7、点击绿色钩子后,会弹出一个输入框,让你输入Yapi对应项目下的Token8、打开Yapi中对应的项目,在设置下的token配置中,找到对应的token,点击右边的复制

2020-12-04 08:34:59 16765 11

原创 Spring中的Interceptor拦截器中使用@Autowired注解,在运行时会出现空指针

Spring中的Interceptor拦截器中使用@Autowired注解,在运行时会出现空指针在开发登录模块时,我们会使用拦截器进行是否已登录的校验等,通常会通过如下自定义一个拦截器package com.demo.interceptors;import com.demo.service.ITestService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.we

2020-11-26 16:23:24 1458 4

原创 Ehcache 与 SpringBoot 整合

Ehcache 与 SpringBoot 整合1、maven依赖<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupI

2020-11-24 11:10:49 169 1

idea-MybatisLogPlugin.zip

idea插件 MybatisLogPlugin 不收费版本

2021-02-07

typora markdown编辑器

Typora gives you a seamless experience as both a reader and a writer. It removes the preview window, mode switcher, syntax symbols of markdown source code, and all other unnecessary distractions. Instead, it provides a real live preview feature to help you concentrate on the content itself.

2020-11-27

SublimeText3

一款具有代码高亮、语法提示、自动完成且反应快速的编辑器软件,不仅具有华丽的界面,还支持插件扩展机制,用她来写代码,绝对是一种享受

2020-09-18

空空如也

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

TA关注的人

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