自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 浅谈目前最火的架构风格:微服务

目前最火的架构风格,微服务

2020-07-10 09:45:38 978

原创 实现分布式锁

Redisson实现分布式锁使用场景原始解决方法整合Redis的客户端RedissonRedissonRedisson的分布式锁和同步器可重入锁读写锁闭锁信号量使用场景前一篇文章说过在分布式场景下,高并发的情况下可能出现缓存击穿等缓存失效问题,解决该问题就是给业务加上锁。提到锁可能第一印象会想到synchronized,但是synchronized只能解决本地服务的线程问题,面对分布式下的集群(一个服务在多台服务器运行),本地锁明显是解决不了问题的,这就引出了分布式锁的概念。原始解决方法结合re

2020-08-05 16:18:13 254

原创 高并发下的三个缓存失效问题

缓存失效问题缓存穿透缓存雪崩缓存击穿缓存穿透定义:指的是查询一个不存在的数据,由于缓存不命中,到数据库中进行查找,数据库也无记录,而此时刚好也没有将查询的null值写入缓存,导致每次查询都得到存储层进行查询,失去了缓存的意义。风险:利用不存在的数据进行攻击,高并发下数据库压力增大,最终崩溃。解决:将返回的null结果(指定一个标志位,只要不是null,不让请求到数据库进行查询)进行缓存,并加入短暂过期时间(避免后续有数据了,但是缓存一直返回null)缓存雪崩定义:在高并发下,将

2020-08-03 17:06:15 236

原创 Nginx功能之一:动静分离

背景:以Nginx加Windows搭建域名访问环境时(上篇文章),我们建立项目一般都是将静态资源(包括js,css,img)放在相应的前端模板下,这样,当我们对项目进行多个请求时,Tomcat因为要处理请求数据的动态与静态资源,会承受不住压力,吞吐量很小,导致卡死机的情况发生,或者响应数据很慢。Nginx为我们提供了一个功能:动静分离。顾名思义,就是讲动态资源与静态资源分开进行管理,讲渲染页面的静态资源都给分离出来,放在Nginx里,当我们发送请求时,由Nginx来直接返回静态资源,Tomcat只需要处

2020-08-03 15:23:26 345

原创 Elastcisearch使用教程

Elasticsearch使用安装基本语法运用安装1、Linux环境下使用docker容器安装Elasticsearch打开终端,输入指令,此处如果之前没有pull镜像,则会为我们主动下载镜像docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” -e ES_JAVA_OPTS="-Xms64m -Xmx512m" -v /mydata/elasticsearch/config

2020-08-03 15:01:00 632

原创 Nginx+Windows搭建域名访问环境

Nginx+Windows搭建域名访问环境配置hosts文件配置目标IP地址的nginx配置上游服务器(网关)配置hosts文件在下面路径下找到hosts文件C:\Windows\System32\drivers\etc在文件最下方配置 “目标IP地址” “本机输入的想跳转到目标IP地址的域名”如192.168.205.122 www.niubi.com配置完后,当你本地输入www.niubi.com,就会跳转到指定IP地址192.168.205.122配置目标IP地址的nginx在ng

2020-08-01 15:08:46 575

原创 目前单点登录的两种常用方法

单点登录使用

2020-07-12 15:42:01 964

原创 Redis的优点和具体使用过程

浅谈Redis

2020-07-11 21:17:20 201

原创 微服务中使用spring cloud远程调用的过程

springcloud调用接口的具体过程

2020-07-10 17:02:42 1128

原创 微服务调用全过程之Nacos

还在用Eureka吗,来看一看功能更强大的Nacos吧!

2020-07-10 12:02:14 4258

原创 在本地Maven下载jar包的坑人bug,Non-parseable settings

在本地Maven下载jar包的坑人bug,Non-parseable settings

2020-07-08 22:29:22 3179 1

原创 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.athk.eduservice

解决的org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.athk.eduservice最详细的方法。mapper下的xml文件写sql语句不生效,报错的原因是因为mapper的项xml文件没有被转化成.class文件,导致sql没运行到。我们查看xml文件是否有被转化到被加载到项目中去,可以到target目录下查看。此时我们看到我们的src目录下是有xml文件的,但是我们再到tar

2020-07-08 11:01:05 206 1

原创 mybatis-plus最便捷、最常用、最强大的功能

mybatis-plus是一款MyBatis的增强工具包,简化CRUD操作。最近看到很多项目,朋友说的几家公司,都在开始用mybatis-plus了,可见,作为mybatis的增强工具,mybatis-plus正在一步步的发挥它的作用,在未来,应该会代替mybatis。在这里,跟大家分享一下,我最近常用的它的功能,也是我目前为止感觉式它最强大的功能。那就是代码生成器,废话不多说,直接上代码,大家看到一大串代码不用慌,这东西直接复制过去用就行了,都是mybatis-plus官方给出来的,我们只需要对一些路

2020-07-06 21:09:40 1287

原创 Required request body is missing: public com.athk.commonutils.R com.athk.eduservice.controller.EduCo

美好的一天,从解决BUG开始!

2020-07-06 17:25:04 4241 1

原创 VUEResponse to preflight request doesn‘t pass access control check: No ‘Access-Control-Allow-Origin‘

Failed to load http://localhost:9001/eduservice/course/addCourseInfo: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http.

2020-07-06 16:54:55 5991

原创 EasyExcel的读写操作

还在用POI么 都在用阿里的EasyExcel了

2020-07-05 10:17:23 433

原创 nginx转发请求的实现和nginx启动失败的常见原因

nginx转发请求的实现nginx(反向代理服务器)常见的功能有1、转发请求2、负载均衡3、动静分离本文针对转发请求做一丢丢理解转发请求指的是把我们对其他端口页面进行访问时,都会先经过nginx服务器,然后nginx服务器根据你的请求路径进行路径匹配,当发现你请求地址中有特定值时,帮你访问特定的端口页面。具体操作在conf下找到nginx.conf,拉到最底下,在http{ }里面进行配置 server{ listen 9001;//监听端口, server_name

2020-07-04 21:36:30 3458

原创 使用对象存储OSS上传文件到阿里云

1、注册阿里云,搜索找到对象存储OSS,创建Bucket,记住Bucket名称1、搜索对象存储OSS2、创建Bucket2、点击Access Key获取到AccessKey ID和AccessKey Secret3、点击查看Bucket列表获取地域节点4、idea中引入相关依赖<dependencies> <!-- 阿里云oss依赖 --> <dependency> <groupId>com.aliyun.o

2020-07-04 17:01:45 692 1

原创 在线API文档Swagger的具体操作

引入相关依赖<!--swagger--><dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <scope>provided </scope></dependency><dependency> <groupId>io

2020-07-02 11:59:19 247

原创 MybatisPlus实现乐观锁

首先先介绍一下乐观锁与悲观锁。乐观锁主要用来解决丢失更新问题。所谓的丢失更新问题就是当一条数据同时被两个人拿到进行操作时,第一个人将数据实现了更新,紧接着第二个人拿着的数据看起来还是旧数据,实则已经被修改过了,第二个人对该数据再次进行修改。倘若两个人修改的数据不一样,第一个人就会一直以为自己已经修改了数据,并运用着自己以为改了但是被另一个人给改掉而自己却不知道的数据,实际运用场景中可能会引发较大的问题。运用悲观锁解决问题可以用synchronized或者lock进行解决,但是带来的问题就是当一个人在操

2020-07-02 11:36:22 594

原创 mybatisplus的自动填充功能

使用情景:当我们往数据库表中加入一条数据,或者更新一条数据的时候,通常要调用实体类的set方法,运用mybatisplus的自动填充功能则可以帮我们自动设置,不用我们手动调用set()方法。具体实现1、在实体类中对需要自动填充的属性加上注解//对于添加时要填充的@TableField(fill = FieldFill.INSERT)//对于更新时要填充的@TableField(fill = FieldFill.INSERT_UPDATE)2、创建类类要实现MetaObjectHandler

2020-07-01 11:57:12 2104

原创 主键策略

1、自动增长AUTO INCREMENT将表中的主键逐渐加1,到一定数量后分表操作,下张表的主键为上张表的最后一个数+1开始增长;优点:自动排序缺点:换表的时候得找到上一张表得最后一个主键值2、UUID每次会随机生成一个唯一的值优点:换表的时候不用考虑获取其他值,可以直接随机生成缺点:排序不方便3、redis实现redis的原子操作优点:不依赖数据库,性能优于数据库数字天然排序,对分页或者需要排序的结果很有帮助缺点:需要编码和配置工作量较大4、mybatisplus自带策略运用

2020-07-01 11:09:45 617

原创 使用Lombok插件给实体类代码简洁化,并利用mybatis-plus实现CRUD操作

导入Lombok依赖以下spring boot版本号2.2.1 IDEA版本2017<!--lombok用来简化实体类--><dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId></dependency><!--mybatis-plus--><dependency>

2020-07-01 10:40:52 433

原创 无法解析类 ‘Driver‘ 更少... (Ctrl+F1) Checks Spring Boot application .properties configuration files. High

spring boot版本号 2.2.1pom文件中已经加入了依赖<!--mysql--><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId></dependency>但是在application.properties中spring.datasource.driver-class-name=

2020-07-01 10:14:40 1809

原创 获取Class实例的四种方式

类的加载过程程序在经过javac.exe命令后会生成一个或多个字节码文件(.class结尾的文件),接着使用java.exe命令对字节码文件进行解释运行,这时候就把字节码文件加载到内存中。加载到内存中的类成为运行时类,运行时类是Class的实例。@Testpublic void test() throws ClassNotFoundException { //方式1:调用运行时类的属性 .class Class cla1 = person.class; System.out

2020-06-30 20:14:25 710

原创 Java集合JDK8

Java集合可以分为Collection和Map两种体系;Collection接口:单列集合,存储一个个的对象Collection接口下有两个子接口:List接口和Set接口List:存储有序、可重复的对象Set:存储无序、不可重复的对象List接口的实现类:ArrayList、LinkedList、VectorArrayList:作为List的主要实现类,线程不安全,效率高;底层使用数组transient Object[] elementData;来存储数据。/** *当你调用无参构造器时

2020-06-30 15:56:49 152

原创 String,StringBuffer,StringBuilder三者的异同

相同点:>在JDK8中String,StringBuffer,StringBuilder三者的底层存储都是用char[ ]来存储的。>都是final类,不可被继承。不同点:>String底层private final char value[];final决定了String的不可变性。>StringBuffer,StringBuilder是可变的。>StringBuffer线程安全,但是效率低下。>StringBuilder线程不安全,但是效率高。...

2020-06-30 10:14:43 128

原创 sleep和wait的区别

相同点:都可以使进程进入阻塞状态;不同点:>声明的父类不一样,Thread声明sleep,Object声明wait>sleep()可以在任何情景调用,wait()只能在同步方法或者同步代码块中被调用;>在同步方法或者同步代码块中,sleep()不会释放同步监视器,wait会释放同步监视器;...

2020-06-29 21:20:52 126

原创 线程安全的3个基本解决方法

出现线程安全问题的原因:某个线程仔操作共享数据的同时,另外的线程也对它进行操作。方式1: 同步代码块>synchronized(同步监视器){ 需要被同步的代码 };>说明:操作共享数据的代码,即为同步代码;>共享数据:多个线程共同操作的变量。比如卖票问题中的票数;>同步监视器:俗称,锁,任何一个类的对象都可以充当锁;>多个线程要共用同一个锁(保证线程安全)。class window1 implements Runnable{ private stati

2020-06-29 21:12:56 191

原创 线程的5个生命周期

线程一个完整的生命周期可以看成五个部分,分别是:1、新建:当一个线程被创建时(详见https://blog.csdn.net/fighting32/article/details/107022646)此时线程处于新建状态;2、就绪:当调用start()方法时,就会进入线程队列等待CPU时间片,此时它已经具备了运行的条件,只是没有被CPU分配到执行权力;3、运行:当就绪的线程被CPU时间片调度并获得CPU资源时,便进入运行状态,开始运行run()方法中的线程操作;4、阻塞:当被认为挂起,或执行输出输入

2020-06-29 17:27:01 1623

原创 多线程的四种创建方式

方式1:>继承于Thread类> 创建一个继承于Thead类的子类>重写Thread类的run方法>创建Thread的对象>通过该对象调用start()class A extends Thread{ @Override public void run() { for (int i= 1 ;i<=100; i++){ if(i % 2 != 0){ System.out.pr

2020-06-29 16:37:16 525

原创 单例设计模式(面试题手写)

作用:采取一定方法保证在整个软件系统中,对某个类只存在一个对象实例。优点:只生成一个实例,减少了系统功能开销。实现方式1:饿汉式1.私有化构造器2.内部创建对象3.提供公共静态方法,返回对象特点:加载时间长(坏处)线程安全(好处)//饿汉式class Bank{ //私有构造器 private Bank(){}; //内部创建对象 private static Bank instance = new Bank(); //返回对象 public

2020-06-29 11:35:08 398

原创 重载和重写的区别

从定义上看二者区别:重载:是在同一个类下定义相同名字但是参数不同或者返回类型不同的多个方法这里所说的参数不同可以分为:1、参数类型不相同2、参数个数不相同重写:是当子类继承父类后,对父类已经存在的方法进行重写覆盖操作,达到子类所想达到的实际运用效果(就比如父亲之前是拿钱做服装行业的,儿子继承父亲的财产后,并不想做服装生意,他有自己的想法,想开IT公司)这里有几个注意的点:1、重写的权限修饰符要不小于父类中的权限修饰符(比如父亲盖了一层楼,当你继承父亲后你起来当家了,你只能是往更高楼层盖,再怎么

2020-06-29 10:47:29 205

原创 一维数组的内存解析

当定义一个数组时,会先在栈中建立一个数组名,然后根据定义的数组的大小在堆建立一个内存空间,并给该内存空间第一个空间命名一个地址,将该地址赋给栈里面的数组名。当要操作到该数组时,会先找到栈中的变量名,再根据该变量名在堆中指定的地址值找到数组在堆中的第一个内存空间开始寻找,找到想做操作的值。当堆中的内存空间在栈中没有对应的值时,堆的内存空间则会被自动回收(JVM的垃圾自动回收机制),当main方法执行完成后,数组的变量名也会自动弹出栈,此时的堆的内存空间也会被自动回收...

2020-06-29 09:51:19 561

空空如也

空空如也

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

TA关注的人

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