自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ThreadLocal原理以及其安全问题

ThreadLocal 是一个线程内共享数据的类,其原理是在线程有一个 ThreadLocalMap,key是ThreadLocal对象,value是自定义的数据,所以在同一个线程中,用同一个threadlocal去get数据,能取到同样的数据。实现线程内数据共享。ThreadLocalMap说白了 ThreadLocalMap 就是有一个 Entry 的数组, Entry就是一个有着两个成员变量的类。一个变量是 value , 另一个成员变量 在继承的 WeakReference 里面,是 refe

2022-01-03 21:47:34 2395

原创 操作系统概念-----多进程管理

操作系统的核心就是多进程管理单个CPU如果顺序执行程序,效果如图. 读磁盘是一个很消耗时间的操作但是读磁盘并不是一个需要cpu的操作,所以cpu在读磁盘的时候去如果去执行程序B的话,cpu利用率就会增加那么问题来了,当从程序A切换到B再切换回去的时候,如何知道已经执行到哪里了呢? 这时候就需要有一个数据结构来存储 cpu切换之前的状态 叫做 PCB.PCBPCB用来描述一个进程.一个操作系统中,运行着多个PCB,操作系统是如何管理的进程的状态操作系统根据进程的状态将进程分类当一个进程

2021-12-30 13:47:57 620

原创 从NIO到Netty

有了网络IO知识之后,开始看java层面是如何来对多路复用器进行封装.单线程版多路复用import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.*;import java.sql.ClientInfoStatus;import java.util.Iterator;import java.util.Set;/** * Created by 祝程 on 12/25/21. *

2021-12-27 17:31:08 484

原创 网络IO原理.BIO->NIO->POLL->EPOLL

先来看两个demo程序import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.InetSocketAddress;import java.net.ServerSocket;import java.net.Socket;public class IOServer { priva

2021-12-25 14:24:33 1778

原创 JVM入门以及class文件格式

保证指令的有序性cpu有时为了提高效率会乱序执行指令.但是有的时候会因为乱序而导致异常x86 CPU 内存屏障sfence: 在sfence指令前的写操作必须在sfence指令后的写操作,之前完成lfence: 在lfence指令前的读操作必须在lfence指令后的读操作,之前完成mfence: 在mfence指令前的 读写 操作必须在mfence指令后的 读写 操作,之前完成jvm级别 内存屏障jvm 的内存屏障依赖于cpu硬件支持LoadLoadStoreStoreLoadS

2021-12-24 16:59:16 304

原创 操作系统和计组的基本知识

cpu 基本组成pc 程序计数器,记录当前指令的地址,指令存在于内存当中,内存相当于一个大型byte数组,pc记录当前指令存在于内存中的哪个位置registers 暂时存储cpu计算需要的数据ALU 逻辑运算单元. 一次计算2+3 的流程内存中先存储着2和3mov 指令把2 和 3 通过总线放到 寄存器 的不同存储单元中ALU 读取 寄存器中的数据,进行计算,把结果写入另一个寄存器.最后把结果的寄存器放入内存中CU 控制单元MMU 内存管理单元cache线程的切换当线程.

2021-12-22 15:36:46 739

原创 文件系统IO原理

宏观概念kernel在计算机中有一个 kernel 的概念,也就是内核,kernel 封装了对于计算机硬件的操作,我们写的软件其实就是调用kernel提供的api来操纵硬件, IO 也属于其中之一。VFS在kernel中 有一个概念叫 VFS虚拟文件系统 的概念,是一个树状结构。inode理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做 扇区Sector 。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一

2021-12-21 15:57:23 315

原创 linux入门-磁盘分区,挂载

linux 分区linux来说,无论有几个分区,分给哪一个目录使用,它归根结底只有一个根目录,一个独立且唯一的文件结构。linux中每个分区都是用来组成整个文件系统的一部分linux采用了一种叫做 挂载 的处理方法,他的整个文件系统中包含了一整套文件和目录,且将一个分区和一个目录联系起来。这是要载入的一个分区将使它的存储空间在一个目录下获得查看分区lsblk -f挂载mount 设备名称 挂载目录 mount /dev/sdb1 /newdisk取消挂载umount /newdi

2021-12-17 23:14:15 478

原创 linux入门-任务调度

crontab 进行定时任务设置基本语法crontab 【选项】-e 编辑 crontab定时任务-l 查询crontab任务-r 删除当前用户所有crontab任务快速入门crontab -e*/1 * * * * ls -l > /etc/ > /tmp/to.txt 参数说明一小时当中的第几分钟 0-59一天当中的第几个小时 0-23一个月当中的第几天 1-31一年当中的第几月 1-12一周当中的星期几 0-7* 代表任何时间,比如第一个 * 代表一小时

2021-12-17 22:14:12 470

原创 linux入门-组管理和权限管理

Linux组基本介绍linux中每个用户中必须属于一个组。 Linux中每个文件有所有者,所在组,其他组的概念查看文件所有者 ls -l修改所有者 chown 用户名 文件名。 创建 apple.txt 然后将所有者修改为 tom。组的创建groupadd 组名。创建一个组monster 。groupadd monster然后创建一个用户fox放入monster。 useradd -g monster fox当某个用户创建了一个文件后,这个文件所在的组就是该用户所在的组修改

2021-12-17 21:36:59 198

原创 Linux入门-常用指令

/bin (/usr/bin, /usr/local/bin): 是Binary的缩写,存放着常用的命令/sbin (/usr/sbin,/usr/local/sbin) 存放的是管理员的程序/home 存放普通用户的主目录,在linux中每个用户都有一个主目录,目录名和用户名相同/root 该目录是系统管理员的主目录/lib 存放开机所需要的第三方库/etc 所有的系统管理所需要的配置文件和子目录,比如mysql的my.cnf/usr 用户的很多应用程序都放在这个文件下,类似于windows.

2021-12-17 16:04:17 965

原创 云原生入门-k8s-存储

configMap为了在K8S中存储配置文件。许多应用程序会从配置文件,命令行参数或环境变量中读取配置信息。configMap API 给我们提供了 向容器中注入配置信息的机制。ConfigMap 可以被用来保存单个属性,也可以用来保存正规配置文件或者JSON 大对象configMap 创建方式使用目录创建cat ui.propertiescolor.good=purplecolor.bad=yellowallow.textmode=truecat game.propertiesen

2021-12-15 19:38:09 539

原创 云原生入门-k8s-service

Kubernetes Pod是平凡的,它门会被创建,也会死掉(生老病死),并且他们是不可复活的。 ReplicationControllers动态的创建和销毁Pods(比如规模扩大或者缩小,或者执行动态更新)。每个pod都由自己的ip,这些IP也随着时间的变化也不能持续依赖。这样就引发了一个问题:如果一些Pods(让我们叫它作后台,后端)提供了一些功能供其它的Pod使用(让我们叫作前台),在kubernete集群中是如何实现让这些前台能够持续的追踪到这些后台的?答案是:Service如图, 一个叫Fr

2021-12-05 21:34:05 543

原创 云原生-K8S-资源控制器controller

pod 分类:自主式pod: 死亡不会被拉起控制器式pod :在控制器的生命周期里,始终维持pod的副本数量什么是控制器k8s 中内建了很多控制器,这些控制器相当于一个状态机,用来控制pod的具体状态和行为控制器是存在master节点上,控制node节点上的kubelet然后kubelet在创建对应的pod控制器类型ReplicationController & ReplicaSetDeploymentDaemonSetStateFulSetJob/ConJobHorizo

2021-12-04 15:31:26 597

原创 云原生入门-k8s

K8S架构图通过架构图可以看到K8S的几个关键组件之间的工作方式APIS 是接受 scheduler ,controller manager, kubectl , etcd 等组件的调用左边的是master节点,master节点里面的apis收到请求之后,就把请求发往对应的node节点里面的 kubelet中k8s 组件APIS: 所有服务访问统一入口controller manager: 维护副本的期望数目scheduler: 负责接受任务,选择合适的节点分配任务etcd: 键值对

2021-12-03 18:53:13 707

原创 从0开始学习云原生-----------Docker入门

docker架构图镜像(image)docker镜像好比一个模板,可以通过模板创建 容器服务 tomcat镜像==>run==>tomcat01 容器 (提供服务器)容器 (container)容器可以启动,停止删除。可以理解为一个简单的linux系统仓库 (repository)仓库就是存放镜像的地方安装docker删除久的docker sudo yum remove docker \ docker-client \

2021-11-27 13:58:54 827

原创 spring-session整合redis原理 排查失效原因

根据网上配置了一个springsession整合redis作为session后,发现session获取失败,redis里面是有值。登录模块设置进去也能获取的到,但是其他的服务就获取不到。记录一下,跟着源码探寻为何失败auth服务的配置引入依赖 <dependency> <groupId>org.springframework.session</groupId> <artifactId>sp

2021-10-03 18:49:26 2871 7

原创 SpringCache使用以及防止缓存雪崩方案

使用方式引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId

2021-09-18 17:18:43 787 3

原创 从0开始全栈项目-07前端项目品牌管理实现,接入阿里云OSS上传图片

先搭建商品管理的二级路由页面,分为添加和编辑在product包下定义addupdate包,但是路由得写在和product同级别

2021-08-14 19:26:49 95

原创 从0开始全栈项目-09品牌管理编写,使用JSR303数据校验

后端需要对前端传递过来的数据进行校验,使用 JSR实现常用的注解在controller 的 入参上添加 @Valid注解 @PostMapping("/add") public R add(@Valid @RequestBody WaresBrandVo brandVo){ brandService.add(brandVo); return R.ok(null); }异常返回的数据和约定格式不一致,所以需要统一处理验证异常情况,在.

2021-08-14 19:26:28 108

原创 从0开始全栈项目-08阿里云OSS接入

阿里云服务器上开通OSS服务,很简单专业数据简介Bucket 存储空间,基本上一个项目创建一个bucketObject 存储的对象Region 区域,存储区域EndPoint 访问域名访问秘钥 上传文件需要使用秘钥创建一个bucket然后上传上去之后,就可以在公网上访问了。服务端签名,前端上传图片策略下载maven依赖<dependency> <groupId>com.aliyun.oss</groupId> <artifac.

2021-08-14 16:13:18 114

原创 从0开始全栈项目-06前端项目商品分类实现

先去antd上找组件和布局,准备采用 card + table 的形式来实现编写请求列表的接口请求数据渲染页面实现编辑功能当点击修改分类的时候,需要 modal一个页面,里面可以输入新的名称,然后问是否要修改,确定的话就修改名称,然后刷新页面...

2021-08-09 00:06:46 206

原创 从0开始全栈项目-05前端项目初始化

项目搭建 react+antd+umi用umi创建项目npm create @umijs/umi-app目录结构封装网络请求工具类import { extend } from 'umi-request';import { notification, message } from 'antd';type Msg = { [key: number]: string}const codeMessage: Msg = { 200: '服务器成功返回请求的数据。', 20

2021-08-07 15:37:45 85

原创 从0开始全栈项目-04商品服务后端开发

服务初始化配置文件设置server: port: 4001spring: datasource: username: root password: root url: jdbc:mysql://192.168.10.129:3306/eshop_wares?useUnicode=true&characterEncoding=utf-8通过renren自动代码生成器其实把大部分CRUD功能已经实现,就差一个树状结构的商品分类列表的展示我写了一个通用的树形结构

2021-08-07 15:27:13 65

原创 从0开始全栈项目-03 项目整体架构和数据库定义

架构图

2021-08-07 15:25:58 275

原创 从0开始全栈项目-04 umi配置式路由实现多级路由导航以及路由权限校验

完成了用户的登陆,接下来需要实现前端的路由规则配置.才能完成后台管理系统的选项卡切换umi 路由官方文档.官方文档写的很抽象,理解了半天才弄懂是什么意思.umi路由分成配置路由和约定路由,如果 .umric.ts 配置文件里面没有 route属性,则采取约定式路由约定式路由比较蛋疼,还是配置式路由直观,很多东西可以直接设置配置式路由首先在 .umirc.ts 配置文件下添加routes属性是一个数组,里面放着各种路由页面, /login ,对应 login组件这就不谈了,一目了然,我

2021-08-03 22:34:58 2658

原创 从0开始全栈项目-03 前端后台管理页面前端react项目初始化

学习了一个月的js+react. 掌握了基本的react使用,准备用react搭建一套后台管理页面,期间穿插着后台的搭建,前后端并行开发。技术选型react16.8以上+redux+antd

2021-08-01 14:38:09 171

原创 从0开始全栈项目-02 linux下安装docker及环境

根据 docker官网.指示安装dockerdocker安装先清除docker sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \

2021-07-16 21:24:45 106

原创 从0开始全栈项目-02数据库配置

上一篇安装好了服务器和内网穿透,这章来把mysql+redis+elastic stack+kafka+rabbitmq搭建好。mysql8.0 安装直接使用宝塔面板的安装服务器里面有带mysql,点击安装就可以,安装好了之后需要重新设置mysql 的密码ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';exit;(退出mysql)还需要设置mysql的访问权限,不然navicat连接会报 host is not allow to conne

2021-07-14 22:56:28 95

原创 从0开始全栈项目-01服务器搭建以及frp内网穿透搭建

本篇专栏记录自己从0开始搭建服务器编写前后端过程。前端采用react,后端采用java。项目暂时定为一个电商项目,后端架构采用SSM+MYSQL+redis+kafka+rabbitmq+springcloud. 纯粹练手项目。今天是第一天,先在电脑上安装服务器+frp内网渗透让外网访问。vmware安装 centos7安装过程不做赘述,网上到处都是。安装好官网的centos7之后 首先是 yum 报错centos使用yum -y install报错"Could not resolve host:

2021-07-13 23:56:27 265 1

原创 mysql优化之IN和ORDER BY导致索引失效

两条sql语句selectt1。*fromt_alarm_notice_all t1wheretaskId IN( select taskId from t_task_user where userId = 999)order byt1.latm desclimit 10selectt1。*fromt_alarm_notice_all t1wheretaskId IN( '777')order byt1.latm desclimit 10

2021-01-19 22:14:48 2451

原创 mysql利用bin-log恢复数据

my.cnf 配置开启bin-logroot@ba586179fe4b:/# vi /etc/my.cnf[mysqld]# 开启二进制日志功能,mysql-bin 是日志的基本名或前缀名log-bin=mysql-bin查看是否开启了bin-logMySQL [(none)]> show variables like 'log_%';+----------------------------------------+-----------------------------+.

2021-01-17 00:12:50 642

原创 mysql优化之如何用复合索引将查询从15秒达到0.025秒

业务场景:任务命中记录列表需要显示每个任务的最新命中时间命中记录表CREATE TABLE `t_alarm_notice_all` ( `id` varchar(32) NOT NULL, `taskId` varchar(125) , `alarmType` smallint(4) DEFAULT NULL , `objectId` varchar(125) DEFAULT NULL , `idCard` varchar(18) DEFAULT NULL , `name` v

2021-01-15 14:36:55 168

原创 mysql优化之为什么我limit10也会全表扫描

mysql索引选择问题命中表 A , 推送表B。收到一条命中记录之后往命中表中插入一条记录,并且往订阅了这条任务的所有用户发送数据,发送后往推送表中插入一条数据。 所以 A 和 B 的关系是一对多的关系。现在需要查看历史命中记录,sql语句为select t1.*fromtable_a t1,table_b t2wheret1.id = t2.noticeIdORDER BY t1.time desclimit 10其中A表大概有14W条数据,B表大概15W条数据。 (测试环境单

2021-01-14 15:25:37 3414

原创 Ribbon架构解析之ServerList

ServerList可以看到,工作的实体类是 DomainExtractingServerList 我们先来看看类图再来看看接口的定义DomainExtractingServerList 类的构造方法中发现里面还有一个 serverList,而这个serverList是 DiscoveryEnabledNIWSServerList所以做事的就是 DiscoveryEnabledNIWSServerList 类,我们看看该类对于 serverList 的方法如何实现方法再跟到 eureka

2021-01-01 16:06:28 1171

原创 Ribbon架构解析之IPing心跳检测

LoadBalancer负载均衡器五大组件IPing:客户端用于快速检查服务器当时是否处于活动状态(心跳检测)IRule:负载均衡策略,用于确定从服务器列表返回哪个服务器ServerList:可以响应客户端的特定服务的服务器列表ServerListFilter:可以动态获得的具有所需特征的候选服务器列表的过滤器ServerListUpdater:用于执行动态服务器列表更新IPing查看接口定义非常简单,只有一个是否存活,查看其UML 图在 SpringCloud + Eureka

2021-01-01 16:04:45 618

原创 Ribbon架构解析之RetryHandler重试处理器

前言在分布式场景中,调用第三方接口会因为网络延迟、异常导致调用的服务出错,重试几次可能就会调用成功,是提高结果正确性的一种有效手段。重试机制最简单呢理解为try-catch-redo模式,但是优雅的重试也是有要求的,至少应该满足如下要求:无侵入:不改动当前的业务逻辑,对于需要重试的地方,可以很简单的实现可配置:包括重试次数,重试的间隔时间,是否使用异步方式等通用性:最好是无改动(或者很小改动)的支持绝大部分的场景重试固然重要,但不是什么场景下都适合重试的,并且重试在生产环境中需要慎用。对于重试

2021-01-01 15:21:00 397 4

原创 Ribbon架构解析之IClientConfig配置详解

Ribbon所有的配置均交由IClientConfig统一管理,并提供统一的入口、出口,其它核心组件如IClient、ILoadBalancer均会读取此配置来控制其行为。接口定义public interface IClientConfig { // 如account、user... public String getClientName(); // 默认值是ribbon public String getNameSpace(); // 加载给定客户端/负载均衡器(名为clinetNam

2021-01-01 14:54:56 1604 1

原创 Ribbon架构解析之IClient请求客户端

IClient Ribbon发送请求的抽象接口,我们先来看看接口定义传入一个 ClientRequest 和 一个 IClientConfig 返回一个 IResponse很简单.再来看看UMLClientRequest表示适用于所有通信协议的通用客户端请求对象。该对象是immutable不可变的。public class ClientRequest implements Cloneable { // 请求的URI protected URI uri; protected

2021-01-01 14:09:40 409

原创 eureka 源码解析

eureka 源码解析项目中遇到eureka客户端注册在服务端上明明已经下线但是却在服务端列表依然存在,还有的是服务明明存在,客户端却请求失败的情况.本次从源码的角度来分析eureka的客户端和服务端之间的通信过程.基本概念服务端: 为eureka的服务端,存储着客户端的信息客户端: 为eureka的客户端,也就是我们通常的微服务就相当于eureka的客户端.通常都是生产者和消费者共存.## 客户端注册自身到服务端并且拉取服务的流程DiscoveryClient 类为客户端的工作类,其中构造

2020-12-31 16:38:06 324

空空如也

空空如也

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

TA关注的人

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