- 博客(148)
- 资源 (10)
- 收藏
- 关注
原创 单点登录原理及手写实现
1. 单点登录概念单点登录在大型网站中使用较多,比如阿里旗下的淘宝,天猫,支付宝等,假如我登录天猫,在天猫上面买一件商品,然后要用支付宝进行支付,此时如果还要登录支付宝才能去支付的话,这样的用户体验是极差的,另外各个子系统也会因为这种重复认证的逻辑而疯掉。单点登录就是用户只需要登录一次就可以访问所有相互信任的应用系统,一句话概括就是:一处登录,处处登录,一处注销,处处注销2. 单点登录演示(1) 未登录淘宝和天猫时(2)手机扫码登录淘宝,然后刷新天猫商城页面,可以看到,天猫商城也是登录状态了,此时
2020-07-05 21:31:56 949
原创 一步一步揭开SpringBoot自动装配的奥秘
1. 早期的spring解决的问题早期的spring,解决了Bean的自动注入问题package com.lchtest.spirngbootautoconfigprinciple.controller;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data...
2020-02-22 18:13:42 240
原创 假如让chaptgpt来面试Java后端开发……
国内不能直接访问chatgpt, chatgpt 镜像: https://github.com/xx025/carrot以下回答是其中一个镜像站点提供的回答(https://ywjux.aitianhu.top/#/chat/1002 )
2023-07-02 13:49:28 663
原创 centos上搭建redis伪集群
usr/local目录下创建redis-cluster目录,复制已经安装完成的redis到 /usr/local/redis-cluster/redis01目录(redis01会自动创建)(2)开启集群模式: cluster-enabled yes前面的注释去掉 (之前单机模式安装时,已经关闭了保护模式以及本机绑定bind)必须带上参数 -c ,以集群方式连接redis,否则设置值时会报错。搭建redis集群需要ruby脚本,需要安装ruby的环境。然后修改redis.conf配置。
2023-05-18 20:14:54 614
原创 redis单机版本Java代码实践
之所以要更换序列化方式,是因为默认的序列化方式,在redis中存储的数据无法直观看到其内容。但是更改了序列化方式后,存放的value只能是json格式,不能是纯字符串,如果是纯字符串,在取到数据后转换时会报错。引入redis的starter以及commons-pool2的依赖,commons-pool2是配置连接池需要使用的,不引入,只有连接池配置是不会创建连接池的。个人感觉修改默认序列化方式不如直接使用stringRedisTemplate,把需要存的数据手动转为json字符串后再存入更好。
2023-05-18 17:42:24 647
原创 redis单机安装
执行命令: make install PREFIX=/usr/local/redis/ ,会将redis安装到指定目录下,在这个目录下会生产bin目录。wget http://download.redis.io/releases/redis-7.0.4.tar.gz 直接下载到虚拟机中解压。然后执行source /etc/profile刷新。
2023-05-18 13:41:37 536
原创 redis面试题目-如何保证数据库与缓存的数据一致性
先删除缓存,再更新数据库,休眠1s、再次删除缓存。这么做的目的,就是确保读请求结束,写请求可以删除读请求造成的缓存脏数据,并发还是可能读到旧值覆盖缓存。由于缓存和数据库是分开的,无法做到原子性的同时进行数据修改,可能出现缓存更新失败,或者数据库更新失败的情况,这时候会出现数据不一致,影响前端业务。读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。更新的时候,先更新数据库,然后再删除缓存。2. 如何避免大量请求挤压:将队列水平拆分,提高并行度,不同的业务使用不同的队列。
2023-05-17 21:08:39 520
原创 jdk和mysql源码中的桥接模式
当一件事情有多个维度的变化的可能性时,桥接模式就派上用场了。如下图,一个消息系统中,发送消息的方式 和消息的类型都是可以独立变化的,两个维度的变化互不影响,比如消息可以通过邮件发送,而消息类型可以使普通消息,加急消息, 还可以通过短信来发送普通消息或者加急消息,这样的系统就很适合桥接模式来实现。每个独立变化的维度分别抽象出一个独立的接口,然后通过一个“桥”来持有这两个维度的顶层接口,来实现自己的业务逻辑:消息发送接口:package com.lchtest.pattern.birdge.messag
2022-04-03 11:33:35 2585
原创 多线程基础面试题目
sleep join yiled区别sleep会让线程睡眠指定的时间,释放CPU时间片;join本质是wait/notify 本质是让线程的执行结果对被阻塞的线程可见yiled 让出时间片,触发CPU的重新调度Java中可以创建volatile数组吗可以创建,但是volatile只是对引用可见,对数组中的元素,不是volatile的,可以通过代码进行验证,举例:反汇编需要设置 JVM参数:-server -Xcomp -XX:+UnlockDiagnosticVMOptions -X..
2021-12-03 23:13:02 649
原创 线程的状态与生命周期
代码示例package com.example.springbootthreaddemo.demo02;import com.mysql.cj.util.TimeUtil;import java.util.concurrent.TimeUnit;public class Demo { public static void main(String[] args) { new Thread(()->{ while(true){ .
2021-11-21 22:50:16 356
原创 JUC工具类Semaphore
Semaphore 字面意思是信号量,Semaphore 维护了一个信号量许可集。线程可以通过调用acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止;线程可以通过release()来释放它所持有的信号量许可。Semaphore可以起到“限流”的作用。案例:6辆汽车抢占三个车位package com.lchtest.juc.assistant;import java.util.concurrent.Semaphore;import
2021-08-15 17:16:09 156
原创 JUC工具类CyclicBarrier
CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。案例:参加赛的运动员,等发令枪响了才能起跑。CyclicBarrier 提供的操作:CyclicBarrier(int parties)// 创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,但它不会在启动 barrier 时执行预定义的操
2021-08-15 17:08:12 128
原创 JUC工具类CountDownLatch
1. CountDownLatchCountDownLatch 是JUC提供的一个同步工具类,允许一个或者多个线程一直等待,直到其他线程的操作都执行完成之后再继续往下执行。CountDownLatch是通过“共享锁”实现的。在创建CountDownLatch中时,会传递一个int类型参数count,该参数是“锁计数器”的初始状态,表示该“共享锁”最多能被count给线程同时获取。当某线程调用该CountDownLatch对象的await()方法时,该线程会等待“共享锁”可用时,才能获取“共享锁”进而继续运
2021-08-15 16:20:59 114
原创 JUC-Callable与Future接口
创建线程的四种方式(1) new Thread(2) 实现Runnable接口(3) Callable接口—— 可以拿到线程的执行结果(4) 线程池Runnable 缺少的一项功能是,当线程终止时(即 run()完成时),我们无法使线程返回结果。为了支持此功能,Java 中提供了 Callable 接口,而Callable 接口需要搭配Future一起使用package com.lchtest.juc.callable;import java.util.concurrent.Callable;
2021-08-15 11:29:41 108
原创 JUC-集合线程安全
List的线程安全先来看这么一段代码,我们创建了一个ArrayList,在循环中通过两个线程对这个list进行并非修改与读的操作package com.lchtest.juc;import java.util.*;import java.util.concurrent.CopyOnWriteArraySet;public class CopyOnWriteArraySetTest { public static void main(String[] args) { Lis
2021-08-15 10:41:11 159
原创 死锁的案例演示
package com.lchtest.juc;/** * 两个或两个以上的线程,因为竞争同一个资源而造成相互等待的现象 * 产生死锁的原因: * */public class DeadLock { static Object a = new Object(); static Object b = new Object(); public static void main(String[] args) { new Thread(() ->...
2021-08-15 09:42:56 147
原创 JUC-线程间通信
多线程编程步骤:创建资源类,在资源类中封装属性和操作方法如果是生产者消费者场景:在资源类的操作方法中,要完成 判断, 干活, 通知 操作创建多个线程,调用资源类的操作方法防止虚假唤醒,线程间通信场景下,资源类操作方法中的判断要使用while循环来判断,而不是if判断场景1: 假设有一个初始变量0,同时有两个用户线程,一个线程对变量进行加1,另一个对变量减1,两个线程交替执行(甚至更多线程)(1)使用Object对象的wait和notify来实现package com.lchtest.
2021-08-14 23:36:59 128
原创 JUC-Lock接口的基本使用
1. Synchronized回顾synchronized 是 Java 中的关键字,是一种同步锁。它修饰的对象有以下几种:修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象(锁的Class对象);修改一个类,其作用的范围是 synchronized 后面括
2021-08-14 22:34:27 159
原创 线程基本概念
进程和线程进程(Process) 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。**线程(thread) 是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际.
2021-08-14 11:43:37 146
原创 线程池的使用及原理
通过线程池来创建线程: // 一池多线程,参数为线程的数量 ExecutorService threadPool1 = Executors.newFixedThreadPool(5); // 单线程 的线程池 ExecutorService threadPool2 = Executors.newSingleThreadExecutor(); // 可扩容线程池 扩容机制? 当处理的任务数量不同时,线程池的数量也不同 Ex.
2021-08-14 11:18:06 149
原创 class文件是如何被加载的
类加载流程这里的引导类加载器是值BootStrapClassLoader, 其他类加载器包括ExtClassLoader ApplicationClassLoaderJVM默认提供了三种类加载器,它们负责加载不同的类:我们自己写的类,都是由应用类加载器来加载的...
2021-07-25 17:37:00 164
原创 JVM体系结构与Java虚拟机内部组成
1. JDK体系结构JDK=JRE + tools jdk包含了Java运行时环境(类库,jvm虚拟机)以及自带的一些api和工具2. java 跨平台的特性一次编写,到处运行 是因为JVM屏蔽了不同操作系统在底层硬件与指令上的区别(因此我们下载JDK时需要区分操作系统及位数来下载)3. jvm的组成部分完整的java虚拟机由三部分组成:1. 类装载子系统2. 运行时数据区(也叫jvm内存模型)运行时数据区又划分为:堆,方法区/元空间,栈,程序计数器,本地方法栈3. 字节码执行引擎
2021-07-05 23:04:47 194
原创 Jprofiler分析OOM内存溢出
先写一个堆溢出的程序:package com.lchtest;import java.util.ArrayList;import java.util.List;public class JvmSizeTest { public void testHeap(){//堆溢出 List<byte[]> list = new ArrayList<>(); int i=0; while (true){
2021-06-23 21:24:39 1471 2
原创 Jprofiler内存分析工具安装
idea安装jprofiler插件并重启jprofiler安装下载地址:https://www.ej-technologies.com/download/jprofiler/version_92默认是9.2版本的,右上角可以选择其他版本,下载后安装,要求安装路径不能有空格和中文!注册:参考https://blog.csdn.net/liyantianmin/article/details/86534544JProfiler 9.2 注册码L-Larry_Lau@163.com#238.
2021-06-23 21:00:09 207
原创 dubbo使用-windows安装nacos
window安装nacos注册中心nacos下载地址下载最新版本的nacos:解压后直接启动,会看到报错,参考Nacos-Windows启动与配置~ ,我们需要新建一个名为nacos的数据库,并在nacos的配置文件中使用该数据库:并且还需要执行nacos-mysql.sql 刷数据库,然后进入命令行,以单机方式启动nacos(nacos默认是集群方式启动):startup.cmd -m standalone访问http://localhost:8848/nacos/index.h.
2021-05-07 07:48:29 257
原创 sleuth链路监控
链路跟踪:1. 依赖包2. 配置项:3. zipkin安装参考:win10下载安装启动zipkin本地启动:java -jar zipkin-server-2.12.9-exec.jar ,监控地址: http://localhost:9411/zipkin/4. 发起请求,查看链路跟踪请求springcloud-gateway项目,调用链为:gateway-> order-service -> goods servicegateway中:order-service中:
2021-04-22 22:13:14 156
原创 Spring Cloud Gateway
1. 网关作用Spring Cloud 微服务体系中,每个服务 都是运行在独立的服务器上,整体上构成一个完整的服务,对于用户请求,每个服务都需要进行授权认证,流控等操作,这样一来,各个模块都要重复开发同样的功能,网关就是在请求到达每个服务之前,进行统一的授权认证操作,以及接口日志,限流操作,然后再将请求转发至对应的服务。Spring Cloud Gateway是spirng官方提供的组件,为了替代zuul(bio通信,性能差;2.x ) Spring Cloud Gateway基于NIO,webflu
2021-04-09 21:09:49 214
原创 Docker入门
微服务的持续构建与部署:Docker概念Docker产生背景物理机时代: 物理机-》安装操作系统 -》安装jdk …… 如果需要部署集群,那么就要增加物理机,会带来如下问题:硬件成本增加资源浪费,不能充分利用物理机的资源硬件资源限制运维成本虚拟化技术:充分利用资源:一台物理机上虚拟出来多个虚拟机去部署,充分利用物理机的磁盘,内存等硬件资源更容易扩展虚拟出来的机器,共享宿主机的物理资源,它可以有自己的操作系统和应用,问题也就在于它还是需要独自占用一个操作系统资源,虚拟机的操作
2021-03-31 22:08:21 123
原创 springcloud Hystrix应用
2.1 熔断降级服务熔断演示http://localhost:8081/hystrix/order/1 这个请求由于order-service未启动,服务不可达,会走fallback逻辑,http://localhost:8081/hystrix/order/2 这个请求返回“正常请求”给调用者。当多次请求http://localhost:8081/hystrix/order/1 后,发现原本正常响应的请求http://localhost:8081/hystrix/order/2 也走了fallbac
2021-03-05 08:15:30 399
原创 spring-cloud-config源码分析
1. Spring Environment运行环境,表示整个spring应用的运行环境信息profilespropertiesspring根据profile对bean进行逻辑分组可以在配置文件中设置: spring.profile.active=dev/prd/test ,需要在classpath下有对应的 application-dev.yml /application-prd.yml /application-test.yml 配置文件;第二个,可以在项目启动时添加JVM参数来设置当前生效
2021-01-26 08:18:54 440
原创 SpringCloud Config应用(SpringCloud Config Bus)
SpringCloud Config应用1.项目搭建1.1父项目1.2 注册中心搭建1.3 配置中心搭建1.4 order-service搭建1.4.1 ordre-service 父项目1.4.2 order-service-api子项目1.4.3 order-service-provider 子项目1.5 user-service搭建本文通过搭建一个eureka注册中心,config配置中心,以及两个configclient客户端来演示springlcoud config的使用。首先搭建项目1.项目
2020-12-27 17:36:09 165
原创 windows安装kafka
1.下载kafkahttps://www.apache.org/dyn/closer.cgi?path=/kafka/2.7.0/kafka_2.13-2.7.0.tgz 下载最新版本的kafka解压到指定的目录下即可使用bin目录是可执行文件,config目录是zookeeper kafka的相关配置文件启停windows 版本kafka最好用自带的zookeeper,否则可能会由于zookeeper版本与kafka版本不匹配导致启动应用无法正常启动。进入kafka解压后的根目录,切换
2020-12-27 14:42:05 349
dubbo入门示例,普通Java进程,不使用spring boot cloud
2022-11-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人