自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 基于k8s实现算法训练系统(架构思路+落地方案)

算法训练是本系统的核心功能之一,为用户提供深度学习算法训练平台,内置多种常用数据集,同时支持代码编程及图形化编程,其中代码支持python、scala、r 三种语言,图像化编程通过拖拽组件并选择参数完成建模无需编写代码即可开始算法训练,这种编程方式极大降低了开发者的门槛,提升了开发效率。

2022-10-14 19:53:55 3214 4

原创 Redis 实现延迟队列

关于消息队列,我们习惯于使用Rabbitmq 和 Kafka 作为消息队列中间件。但对于消费队列只有一组消费者时,也不需要非常高的可靠性,使用中间件显得十分繁琐,此时我们可以利用redis的特性来实现简单的消息队列。...

2022-08-16 15:48:27 1874

原创 redis设计与实现 笔记(一)

Redis简单动态字符串Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将 SDS 用作 Redis 的默认字符串表示。...

2022-08-08 14:32:13 1010

原创 minio 单机版安装

minio 单机版安装

2022-08-01 11:49:31 2221

原创 k8s(二)——— pod 详解

1. 先定义模板文件模板的参数含义:运行以下命令,通过模板创建Pod。创建成功后,可通过以下命令查询当前运行的所有Pod.查询podPod创建后,最常用的功能就是查询。可以用以下命令查询Pod的状态。还可以在查询命令中带上参数-w,以对Pod状态进行持续监控。只要Pod发生了变化,就会在控制台中输出相应信息。命令如下。另外,还可以在查询命令中带上-o wide参数,输出Pod的更多概要信息(如调度到哪台机器上,Pod本身的虚拟IP等信息)。命令如下。get命令除了可以显示简要的运行信息外,还可

2022-07-04 10:27:05 2015 2

原创 dubbo 核心源码——SPI和IOC、AOP

Dubbo的有很多的设计值得学习和借鉴。需要理解的几个点:​ 在Dubbo的源码中,很多地方会存在下面这样三种代码,分别是自适应扩展点,指定名称的扩展点,激活扩展点:​ 这种扩展点实际上就是Dubbo 中的 SPI机制。关于SPI,不知道大家是否还有印象,Springboot 自动装配的SpringFactoiesLoader,它也是一种SPI机制。SPI 全称是 Service Provider Interface,原本是JDK 内置的一种服务提供发现机制,它主要用来做服务的扩展实现。SPI 机制在很多

2022-06-27 17:10:34 447

原创 k8s使用nfs配置StorageClass,配置完成后,创建pvc一直为pending的状态。

k8s使用nfs配置StorageClass,配置完成后,创建pvc一直为pending的状态。出现报错provision "default/exampleforstorageclass" class "managed-nfs-storage": unexpected error getting claim reference: selfLink was empty, can't make reference

2022-06-23 20:23:55 1998

原创 K8s centos安装与部署,集群搭建

准备四台虚拟机,使用centos7操作系统,搭建集群系统。先搭建好一台虚拟机的环境,其他机器克隆就行。虚拟机参数:如果网络连接不成功,可以配置试试这篇博客https://blog.csdn.net/duyuanjun123/article/details/119833105在虚拟机中使用ip addr命令查看虚拟机ip因为虚拟机操作多少有点不方便,所以使用xshell或者fianlshell 连接连接成功配置一下yum源下载wget命令备份旧的yum仓库源清理旧包下载新的阿里的yum源仓库

2022-06-19 10:31:12 3914

原创 Spring深入学习(一)

IoC Service Provider会检查被注入对象的构造方法,取得它所需要的依赖对象列表,进而为其注入相应的对象。同一个对象是不可能被构造两次的,因此,被注入对象的构造乃至其整个生命周期,应该是由IoC Service Provider来管理的。对于JavaBean对象来说,通常会通过setXXX()和getXXX()方法来访问对应属性。这些setXXX()方法统称为setter方法,getXXX()当然就称为getter方法。通过setter方法,可以更改相应的对象属性,通过getter方法,可以获

2022-06-06 20:31:06 158

原创 zookeeper 的特性及其利用场景(分布式锁 和 Master选举)

zookeeper 的特性及其利用场景(分布式锁 和 Master选举)zookeeper 的数据结构Zookeeper 的数据模型和分布式文件系统类似,是一种层次化的属性结构,如图所示。和文件系统不同的是,Zookeeper的数据是结构化储存的,并没有在物理上体现出文件和目录。​ Zookeeper 树中的每个节点被称为Znode,Znode维护了一个 Stat状态信息,其中包含数据变化的时间和版本等。并且每个Znode可以设置一个value值,Zookeeper并不用与通信的数据库或者大容量的对象

2022-05-09 10:54:03 889

原创 深入浅出Springboot 自动装配原理

Springboot 自动装配原理Springboot 自动装配简单点说,就是自动将Bean装配到Ioc容器中,在了解Springboot 自动装配之前我们先来聊聊Spring 是怎么注入和配置Bean的。Spring Ioc/DIloC ( Inversion of Control)和 DI (Dependency Injection)的全称分别是控制反转和依赖注入。如何理解这两个概念呢?loCloC(控制反转)实际上就是把对象的生命周期托管到Spring容器中,而反转是指对象的获取方式被反转了

2022-05-02 20:43:02 767

原创 Websocket 心跳包重连实现

WebSocketWebSocket 类似于标准的TCP连接,它是IETF(RFC 6455)定义的通过TCP进行实时全双工通信一种通信方式,这意味这它的功能更强大,常用于如股票报价器,聊天应用。相比于SSE,它不仅可以双向通信,而且甚至还能处理音频/视频等二进制内容。原理:WebSocket协议是借用HTTP协议的101 switchprotocol(服务器根据客户端的指定,将协议转换成为 Upgrade首部所列的协议)来达到协议转换的,从HTTP协议切换成WebSocket通信协议。优点:它

2022-04-25 11:38:54 2825

原创 射击项目的架构设计与实现

射击项目的架构设计与实现用户模块的详细设计与实现登录与注册的详细设计与实现本系统为了方便用户的使用,采用登录注册一键化的方案,当用户输入手机号在系统总不存在时即为注册,如果手机号存在则为登录。本系统使用手机号发送验证码进行登录注册。具体实现:在用户填写填写好手机号后,前端向后端发送请求获取手机验证码,后端调用阿里云SMS服务,向用户发送验证码,并将验证码存入redis,并设置过期时间为一分钟。 设置过期时间的目的是防止用户短时间内多次发送验证码,导致资源浪费,过期时间未到则不会发送新的验证码,当用

2022-04-19 20:03:24 823

原创 软件架构的发展及研究现状

软件架构研究现状软件架构的发展经历了单体架构、分布式架构、SOA架构、微服务架构四个阶段。1.3.1 单体架构Web应用程序发展的早期,大部分web工程师将所有的功能集成在一个项目工程中,所有功能打在一个war包中部署到服务器,通过部署应用集群和数据库集群来提高系统的性能。这种模式下,项目架构简单,前期开发成本低、周期短,开发效率高,模块之间交互采用本地方法调用、容易部署、容易测试。但缺点也很明显:全部功能集成在一个工程中,大于大型项目不易开发、扩展和维护。版本迭代速度逐渐变慢,修改一个地方就要将整个

2022-04-11 11:07:41 4776

原创 八大排序总结(java)

冒泡排序代码实现package sort;import java.util.Arrays;/** * @author lixiangxiang * @description 冒泡排序 * @date 2021/4/25 20:47 */public class bubble { public static void main(String[] args) { int[] arr = {3, 9, -1, 10, -2}; int temp =

2022-04-03 21:08:30 84

原创 垃圾收集器与内存分配策略

垃圾收集器与内存分配策略概述垃圾收集器需要完成的三件事哪些内存需要回收?什么时候回收?如何回收?java内存运行时区域的各个部分**,java的程序计数器、虚拟机栈、本地方法栈**3个区域生命周期与线程一致。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这几个区域的内存分配和回收都具备确定性,在这几个区域内就不需要过多考虑如何回收的问题,当方法结束或者线程结束时,内存自然也跟着回收了。​ 而java堆和方法区这两个区域有着很显著的不确定性:一个接口的多个实现类需要的

2022-03-27 20:56:58 133

原创 redis 缓存穿透 缓存击穿 缓存雪崩介绍及解决方案

一、前言在我们日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读/写速度比较慢的问题而存在严重的性能弊端,一瞬间成千上万的请求到来,需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问题。为了克服上述的问题,

2022-03-20 17:44:02 279

原创 Mysql B+树索引介绍 及 页内储存结构

B+树 基本介绍概述Mysql 的默认储存引擎 是InnoDB,索引是储存引擎快速搜索数据的关键,而InnoDB使用的索引数据结构就是B+树。索引使用最形象的比喻就是目录,可以帮助mysql在大量数据中定位到我们想要的数据。今天要介绍的就是开发工作中最经常接触到的 B+树索引。B+树本质上是指的一种数据结构,它是由二叉查找树,平衡二叉树 和 B树演化而来,要想掌握它,我们必须先了解这三种数据结构。二叉排序树适用场景先看一个需求给你一个数列 (7, 3, 10, 12, 5, 1, 9),要

2022-03-12 16:21:54 4324

原创 订单超时实现方案总结

订单超时实现方案总结订单超时是一个经典的业务场景,在商城系统中很常见。常见的实现方案有以下几种定时轮询被动取消redis 过期回调延时消息一、 定时轮询实现方法: 开启一个定时任务,过一段时间轮询下数据库,将超时的订单关闭。优点:实现方法简单缺点:1. 时效性差,跟轮询时间差有关,轮询时间差越大,订单取消时间误差越大。2. 效率低。3. 对数据库压力大。如果设置的轮询间隔时间小,需要频繁读写数据库。二、被动取消实现方法: 当用户查询信息时,我们再去判断是否超时。优

2022-03-06 19:48:54 2765

原创 java 基础复习(一)

字符型常量和字符串常量区别字符型常量 (char)值用单引号引起,值可以转换为整型 与ASCII值相照应,可参加运算。java字符常量占两个字节。字符串常量(String)值用双引号引起,是引用类型,储存的是该字符串在内存中的位置。补充:字符串储存位置如果是直接赋值 如:(String str=”twm”), 引用指向的地址(字符串本身)存在方法区的常量池中,(如果该字符在常量池不存在,会直接在常量池生成一个)如果是 new String。创建时在堆中创建字符串对象,其引用指向的是字符串在堆中的

2022-02-27 21:49:18 354

原创 java网络编程模型总结

阻塞 I/O 模型阻塞 I/O 模型 :在读写数据时客户端会发生阻塞。阻塞I/O 模型的工作流程为:在用户线程发出I/O 请求之后,内核会检查数据是否就绪,此时用户线程一致阻塞等待内存数据就绪。在内存数据就绪后,内核将数据复制到用户线程中,并返回 I/O 执行结果到用户线程,此时用户线程将解除阻塞状态并开始处理数据。典型的阻塞 I/O 模型的例子 为 data = socket.read(),如果内核数据没有就绪,Socket线程就会一直阻塞在 read() 中等待内核数据就绪。非阻塞 I/O 模

2022-02-20 22:36:11 313

转载 Stream流详解及差用用法介绍

转载:https://blog.csdn.net/weixin_38294999/article/details/892776971. Stream初体验我们先来看看Java里面是怎么定义Stream的:A sequence of elements supporting sequential and parallel aggregate operations.我们来解读一下上面的那句话:Stream是元素的集合,这点让Stream看起来用些类似Iterator;可以支持顺序和并行的对原Str

2022-02-14 21:14:46 498

原创 自定义注解实现接口被访问时增加对应模块浏览量

一、什么是注解?注解的定义:Java文件叫做Annotation,用@interface表示,注解是一种能被添加到java代码中的元数据,类、方法、变量、参数和包都可以用注解来修饰。注解对于它所修饰的代码并没有直接的影响。元注解:包括@Retention、@Target、@Document、@Inherited四种。 @Documented – 注解是否将包含在JavaDoc中 @Retention – 什么时候使用该注解 @Target – 注解用于什么地方 @Inherite

2022-01-24 10:12:33 275

原创 docker-compose配置文件说明

1.version指定compose文件的版本号, 有1,2,3个版本,目前最新的是3版本,1版本已经在慢慢弃用,建议使用最新版本,如下命令,指定3版本version: "3"2.services根节点,编排的服务需要写在services下面,如下配置,在services下编排了web服务和nginx服务,web,nginx服务名称可自己定义version: '3'services: web: image: dev_tools_web nginx: i

2022-01-16 20:28:26 2850

原创 Springcloud笔记(二)

Zookeeper支付服务注册进zookeeper注册中心Zookeeperzookeeper是一个分布式协调工具,可以实现注册中心功能关闭Linux服务器防火墙后,启动zookeeper服务器docker-compose 集群搭建zookeeperhttps://zhuanlan.zhihu.com/p/121728783服务提供者1.新建名为cloud-provider-payment8004的Maven工程。2.POM<?xml version="1.0" encod

2022-01-09 18:50:28 219 1

原创 volatile和CAS

volatilevolatile 是java虚拟机提供的轻量级的同步机制保证可见性不保证原子性禁止指令重排JMM(java内存模型)JMM(java内存模型Java Memory Model,简称JMM)本身是一种抽象的概念并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。JMM关于同步的规定:1 线程解锁前,必须把共享变量的值刷新回主内存2 线程加锁前,必须读主内存的最新值到自己的工作内存。3 加锁解锁

2022-01-02 20:28:39 516

原创 垃圾收集器与内存分配策略

垃圾收集器与内存分配策略概述垃圾收集器需要完成的三件事哪些内存需要回收?什么时候回收?如何回收?java内存运行时区域的各个部分**,java的程序计数器、虚拟机栈、本地方法栈**3个区域生命周期与线程一致。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这几个区域的内存分配和回收都具备确定性,在这几个区域内就不需要过多考虑如何回收的问题,当方法结束或者线程结束时,内存自然也跟着回收了。​ 而java堆和方法区这两个区域有着很显著的不确定性:一个接口的多个实现类需要的

2021-12-26 17:24:25 421

原创 springcloud笔记(一)

入门SpringCloud 简介分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体,俗称微服务全家桶大厂微服务架构SpringCloud 技术栈Eureka简介Eureka采用了CS的设计架构,Eureka Sever作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用Eureka的客户端连接到Eureka Sever并维持心跳连接。这样系统的维护人员就可以通过Eureka Server来监控系统中各个微服务是否正常运行。在服务注册与发现中,有一个注册中心。

2021-12-19 18:58:56 465

原创 Maven中Optional和Scope元素的作用和使用场景

关于maven option的作用:option可以设置是否传递依赖,比如父工程有个jar包子工程也需要用,那么可以设置option为false 传递依赖,子工程可以直接使用父工程的jar包,如果设置为true则不会传递。这里以Spring Boot项目中的使用为例,比如我们在项目中经常使用的热部署组件spring-boot-devtools,就可以使用optional元素来进行定义,对应pom文件中配置如下:<!--devtools 热部署--><dependency>

2021-12-12 19:44:20 1965 1

原创 jvm 读书笔记(一) —— java 内存区域

java 内存区域划分程序计数器程序计数器是一块较小的内存空间,它的作用是记录下一条指令的地址。可以看做是当前线程所执行的字节码的行号指示器。...

2021-12-05 19:42:04 899

原创 前端传的参数自动转换为枚举的方式——spring convert转换

前端传的字符串自动转换为对应枚举的方式背景在项目中我们通常会使用枚举来接收一些值固定的参数,例如此次项目中我们需要传递一个语言参数,这个参数在系统中有三个值:中文 、英文、和繁体中文,在数据库存的是相对应的Integer值(别问我为啥还要整个小写,前端规范是小写,后段枚举规范用大写,没发用spring自带的枚举转换器。) @Getter@RequiredArgsConstructorpublic enum LanguageType { /** * 中文 */

2021-11-28 21:13:15 3976

原创 那些你不知道的MapStruct用法——Mapstruct自定义映射

那些你不知道的MapStruct用法——Mapstruct自定义映射前言mapStruct是一个很好用的字段映射工具,可以帮你自动生成代码完成字段映射。但有时需要在某些映射方法之前或之后应用自定义逻辑。比如我们从数据库查出来的sex字段是一个数字 0,1,我们需要将其转换为男,女 放入Dto传给前端。我之前的做法是,mapstruct做完映射之后再进行字段转换。但这样会让service层增加很多set get 代码,如果是集合之间进行转换,我们还需遍历一次。MapStruct 提供了两种方法:装饰器

2021-11-21 19:49:22 5717 1

原创 自定义lamba表达式属性名转字段名方法(mybaits-plus多表连接查询,无法使用lamba表达式指定获取字段名的解决办法)

自定义lamba表达式属性名转字段名方法(mybaits-plus多表连接查询,无法使用lamba表达式指定获取字段名的解决办法)背景使用mybatis-plus进行多表连接查询时需要自定义sql,可以将mybatis-plus的条件构造器传入进去,生成选择语句与筛选语句(如下图)让mybatis-plus条件构造器生成查询条件和选择语句可以使查询更加灵活,mybatis-plus条件构造器 支持lamba表达式,但仅限于QueryWrapper管理的类如果是多表查询,想要查另一个表的字段,只

2021-11-14 20:04:21 1224

原创 docker-compose 部署apollo springboot整合(多环境)

1.前言由于项目需求,需要在单台服务器上部署apollo,并配置多环境,试了官网的快速开始docker,用里面的sh文件启动,实现多环境较为麻烦(需要该配置文件和脚本文件),后来在网上2. 部署说明版本:apollo-1.8.0部署方式:docker-compose3. 部署步骤3.1 下载源码,创建数据库源码地址:https://github.com/ctripcorp/apollo/tree/v1.2.0创建数据库apollo 要部署三个模块:apollo-configservi

2021-11-07 20:35:12 1360

原创 软考架构设计师脑图总结

2021-10-31 15:47:56 266

原创 系统架构设计师(截图+做题思路+目录)

目录文章目录目录系统架构设计师考试介绍计算机组成与体系结构计算机体系结构分类—FlkynnCISC与RISC的区别层次化存储结构Cache局部性原理主存—分类磁盘结构与参数磁盘题做题方法系统配置与性能评价性能指标阿姆达尔解决方案阿姆达尔定律例题及解题方法性能评价方法性能监测方法操作系统进程管理—进程状态前趋图进程的同步与互斥PV操作pv操作与前趋图进程管理——死锁问题银行家算法储存管理 —— 页式存储储存管理——段式储存储存管理——段页式储存页面置换算法文件管理 —— 索引文件结构文件和树形目录结构空闲存

2021-10-24 15:21:41 2025

原创 rabbitmq 发布确认及死信队列

发布确认发布确认原理开启发布确认的方法发布确认默认是没有开启的,如果要开启需要调用方法 confirmSelect,每当你要想使用发布确认,都需要在channel 上调用该方法Connection connection = RabbitmqUtil.getConnection();Channel channel = connection.createChannel();//开启发布确认channel.confirmSelect();单个发布确认这是一种简单的确认方式,它是一种同步确认发

2021-10-17 18:50:50 186

原创 docker-compose初体验

Docker Compose简介目前我们使用 Docker 的时候,需要定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。微服务项目中有100个微服务!如果有问题重新启动非常麻烦。使用 Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具官方介绍定义、运行多个容器YAML file 配置文件single command。 命令有哪些?Compose is a tool

2021-10-10 17:58:06 138

原创 技术栈回顾之rabbitmq

消息队列之RabbitMQ目录消息队列之RabbitMQ什么叫消息队列为什么使用消息队列1. 解耦2 异步3、削峰/限流三 使用消息队列带来的一些问题消息队列技术选型RabbitMQ介绍消息模型RabbitMQ 基本概念名词解释RabbitMQ 安装rabbitmq 命令RabbitMQ 五种常用的消息模型1.1 基本消息模型1.2 Work Queues工作队列模型rabbitmq 的消息确认机制交换机三种常见类型1.3 fonout模型1.4 Routing模型1.4.1 Routing 之订阅模型-

2021-10-10 16:30:30 208

原创 nginx 反向代理、动静分离、负载均衡 (dockercompose方式 模拟 )

nginx 是什么,做什么事情Nginx (“engine x”)是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx.网站用户有:百度、京东、新浪、网易、腾讯、淘宝等nginx 作用反向代理(1) 正向代理在客户端 配置代理服务器,通过代理服务器进行服务器访问(2) 反向代理反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反

2021-09-19 17:31:18 415

空空如也

空空如也

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

TA关注的人

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