- 博客(31)
- 收藏
- 关注

原创 基于SpringCloud Alibaba的微服务项目基础骨架
本文从本人博客搬运,原文格式更加美观,可以移步原文阅读:微服务项目基础骨架背景目前项目开发最流行的架构是前后端分离,后端采用微服务形式。假设我们要开发一个全新的项目,如果从0开始搭建微服务,那么势必会花费很多时间。市面上也有很多开源项目可以帮助我们快速搭建自己的新项目,我也参考和使用过很多类似的开源项目,但是用过来发现一些问题:功能太多太杂,不够精简如果有一些个性化需求,原项目不能满足需要二次开发,那么有一定学习成本项目的结构、编码规范不一定优雅(我有一定的强迫症)。比如一个新增数据的接口,从C
2022-04-24 00:18:42
1639
1
原创 Nginx日志分割
nginx默认没有提供对日志文件的分割功能,所以随着时间的增长,access.log和error.log文件会越来越大,尤其是access.log,其日志记录量比较大,更容易增长文件大小,影响日志写入性能分割nginx日志的方法有很多,这里推荐利用Logrotate来完成Logrotate用法1.安装logrotate是一个linux系统日志的管理工具。可以对单个日志文件或者某个目录下的文件按时间/大小进行切割,压缩操作;指定日志保存数量;还可以在切割之后运行自定义命令logrotate是基于cr
2022-05-07 20:39:48
4797
原创 MinIO实战
基本介绍1.简介MinIO是一个开源的对象存储服务,非常适合存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。而一个对象文件可以是任意大小,从几十kb到最大5T不等。MinIO是一个非常轻量的服务,可以很简单地和其他应用结合,类似Redis、MySQLMinIO的优点如下:部署简单:一个二进制文件即是一切,还可以支持各种平台支持海量存储,可以按zone扩展,支持单个对象最大5TB低冗余且磁盘损坏高容忍,标准且最高的数据冗余系数为2(即存储一个1M的数据
2022-04-20 21:20:58
6066
1
原创 swagger文档增强工具knife4j使用详解
本文从本人博客搬运,原文格式更加美观,可以移步原文阅读:swagger文档增强工具knife4j使用详解使用原生的swagger作为接口文档,功能不够强大,并且默认的ui比较简陋,不符合大众审美。所以实际开发中推荐使用knife4j对swagger进行增强。knife4j的地址:https://gitee.com/xiaoym/knife4j基本使用想要使用knife4j非常简单,只要在Springboot项目中引入knife4j的依赖即可<dependency> <gro
2021-12-31 11:35:02
36274
8
原创 Mybatis-Plus中逻辑删除与唯一索引冲突的解决方案
本文从本人博客搬运,原文格式更加美观,可以移步原文阅读:Mybatis-Plus中逻辑删除与唯一索引冲突的解决方案一般情况下,对于数据表中不能重复的业务数据字段(比如身份证号,公司名称等等),我们都会为其加上唯一索引。虽然可以在业务代码中进行逻辑校验来规避重复数据被加入到数据库,但是还是建议加上唯一索引,原因如下:我们不能保证所有后端开发者都能进行严密的校验,很可能会有疏漏导致重复数据入库一般校验是否重复的方式为先查询,能查到就是重复,没查到就不重复,此时可添加。但是在高并发场景中,很可能由于并发请
2021-12-31 11:09:14
2920
6
原创 SpringBoot后端接口请求参数映射方式详解
本文从本人博客搬运,原文格式更加美观,可以移步原文阅读:SpringBoot后端接口请求参数映射方式详解在SpringBoot项目中,Controller层的接口如何接收前端HTTP请求中的参数我们日常开发中经常要用到,这里针对各种方式做一个测试与总结QueryString方式QueryString参数传递的方式为,在请求URL中直接拼接请求参数,如URL?param1=value1¶m2=value2QueryString参数传递方式对于请求方法GET、POST、PUT、PATC
2021-08-01 00:11:35
9990
2
原创 SpringBoot后端数据校验实战
本文从本人博客搬运,原文格式更加美观,可以移步原文阅读:SpringBoot后端数据校验实战一般我们会在Controller的接口中对前端传递的参数做数据校验,这是一个后端开发人员的基本素养在SpringBoot项目中,为了不让一大堆复杂的校验代码入侵业务逻辑,通常会用校验注解来简化代码要使用校验注解,首先要引入hibernate-validator依赖<!--JSR303数据校验支持--><dependency> <groupId>org.hibern
2021-07-25 11:34:38
4452
1
原创 RabbitMQ内存与磁盘相关配置
本文从本人博客搬运,原文格式更加美观,可以移步原文阅读:RabbitMQ内存与磁盘相关配置内存相关配置1.限制最大可用内存默认情况下,当生产者将消息发送到RabbitMQ的时候,队列中的消息会尽可能的存储在内存之中,这样可以更加快速的将消息发送给消费者。即使是持久化的消息,在被写入磁盘的同时也会在内存中驻留一份备份我们可以配置允许rabbitmq使用的最大内存是多少,当达到最大内存时,rabbitmq将会阻塞生产者继续发送消息给它rabbitmq有2种方式可以限制其最大可用内存,我们可以根据实际情
2021-07-11 22:09:38
17128
4
原创 RabbitMQ实现消费端限流与非公平分配
本文从本人博客搬运,原文格式更加美观,可以移步原文阅读:RabbitMQ实现消费端限流与非公平分配Qos机制概述默认情况下,rabbitmq在分发消息给消费者时,处理方式是将所有消息按照消费者的数量平均分配,一次性发送给所有消费者,然后等待消费者的响应:如果消费者响应ack,代表消费成功,rabbitmq会从队列中删除该条消息。响应ack分为两种情况:自动响应:这是默认方式。当消费者处理消息的方法正常执行完成时自动回复ack给rabbitmq手动确认:需要在配置文件中开启。在代码中手动控制回复
2021-07-10 20:14:20
1257
2
原创 RabbitMQ实现消息可靠投递
本文从本人博客搬运,原文格式更加美观,可以移步原文阅读:RabbitMQ实现消息可靠投递实际开发中,我们经常需要保证消息由生产者发送到消费者接收并消费的整个过程中,消息不丢失,这就需要在RabbitMQ中实现消息的可靠投递。主要包含以下两部分:发送端可靠性:指生产者发送消息到RabbitMQ Broker这个过程中保证消息不丢失接收端可靠性:指RabbitMQ Broker将消息发送给消费者并且消费者正确处理消息的这个过程中保证消息不丢失发送端可靠性发送端可靠性主要包含3个方面:消息抵达交
2021-07-08 22:19:21
1319
2
原创 RabbitMQ死信队列和延时队列
本文从本人博客搬运,原文格式更加美观,可以移步原文阅读:RabbitMQ死信队列和延时队列死信队列1.死信概念死信,顾名思义就是无法被消费的消息。一般来说,producer将消息投递到broker或者直接到queue里了,consumer从queue取出消息进行消费,但某些时候由于特定的原因导致queue中的某些消息无法被消费,这样的消息如果没有后续的处理,就变成了死信,接收死信消息的队列就叫死信队列2.成为死信的条件一个消息如果满足下列条件之一,会进入到死信路由(注意是路由,不是队列,一个路由可
2021-07-08 19:25:00
5081
2
原创 SpringBoot整合RabbitMQ
本文从本人博客搬运,原文格式更加美观,可以移步原文阅读:SpringBoot整合RabbitMQ基本整合引入maven依赖<!--amqp依赖--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId></dependency>全局配置文件
2021-07-08 19:22:30
848
原创 JWT详解
本文从本人博客搬运,原文格式更加美观,可以移步原文阅读:JWT详解JWT简介1.什么是JWT在介绍JWT之前,我们先来回顾一下利用token进行用户身份验证的流程:客户端使用用户名和密码请求登录服务端收到请求,验证用户名和密码验证成功后,服务端会签发一个token,再把这个token返回给客户端客户端收到token后可以把它存储起来,比如放到cookie中客户端每次向服务端请求资源时需要携带服务端签发的token,可以在cookie或者header中携带服务端收到请求,然后去验证客户端请
2021-07-07 22:42:19
279055
144
原创 若依系统用户权限模型分析
本文从本人博客搬运,原文格式更加美观,可以移步原文阅读:若依系统用户权限模型分析用户-角色-菜单1.基本使用这是一个经典的用户-角色-权限的模型,其中菜单就代表了权限(因为权限就代表能否访问某个资源,菜单可以代表资源),它们互为多对多关系新增菜单,需要选择上级菜单。菜单分为三类:目录、菜单、按钮目录表示外层,有一个下拉箭头,点击可以列出子菜单目录存储到数据库中有如下特点:parent_id为0component组件路径为空perms权限标识为空菜单表示目录下可点击的模块。其中
2021-07-07 22:40:22
8597
3
原创 SpringBoot整合MyBatis实战
本文从本人博客搬运,原文格式更加美观,可以移步原文阅读:SpringBoot整合MyBatis实战基本增删改查1.准备工作给数据库创建表tb_userCREATE TABLE `tb_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `user_name` varchar(30) NOT NULL DEFAULT '' COMMENT '姓名', `age` int(11) unsigned NOT NULL
2021-07-07 22:37:56
1191
原创 Jackson实战
本文从本人博客搬运,原文格式更加美观,可以移步原文阅读:Jackson实战Jackson是JavaEE项目中最常用的json序列化与反序列化工具,也是SpringBoot官方推荐的。本文介绍其在实际开发中的各种用法环境准备引入依赖<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId>
2021-07-07 22:31:54
381
原创 阿里云对象存储Java-SDK实战
本文从本人博客搬运,原文格式更加美观,可以移步原文阅读:阿里云对象存储Java-SDK实战目前项目中要保存上传的文件,很多时候都会用到对象存储。本文介绍阿里云对象存储Java-SDK在实际开发中的基本用法基本使用1.开通OSS服务首先要开通阿里云OSS服务,登录阿里云,找到对象存储OSS点击立即开通2.创建子AccessKey接着我们要用java代码完成将文件上传到阿里云OSS的功能。调用阿里云的服务接口需要AccessKey,默认的AccessKey是全局的,可以登录阿里云,并且权
2021-07-07 22:28:25
1651
原创 Docker在生产环境中的一些注意事项
本文从本人博客搬运,原文格式更加美观,可以移步原文阅读:Docker在生产环境中的一些注意事项限制容器日志大小Docker在不重建容器的情况下,日志文件默认会一直追加,时间一长会逐渐占满服务器的硬盘的空间,内存消耗也会一直增加。以下方式可以控制日志文件大小:启动容器时,通过参数来控制日志文件的个数和大小# 设置容器日志文件最大10MB,最大日志文件数量为3docker run -it --log-opt max-size=10m --log-opt max-file=3 redis全局日
2021-07-07 22:23:10
1331
原创 Docker可视化工具Portainer
本文从本人博客搬运,原文格式更加美观,可以移步原文阅读:Docker可视化工具PortainerPortainer简介Portainer是一个docker可视化管理工具,可以非常方便地管理docker镜像容器。官网地址:https://www.portainer.io/安装首先拉取portainer镜像docker pull portainer/portainer然后创建并启动容器,其中docker.sock包含了docker的容器数据docker run -d -p 8000:8000 -
2021-07-07 22:20:22
2231
原创 docker-compose容器编排
本文从本人博客搬运,原文格式更加美观,可以移步原文阅读:docker-compose容器编排基本介绍docker-compose是docker官方的开源项目,负责实现对docker容器集群的快速编排。它的作用是定义和运行多个docker容器的应用之前我们如果要启动多个容器,只能手动执行多个docker run命令。然而在日常工作中,一个项目往往要同时启动非常多的容器,并且容器的启动顺序也有要求,例如要运行一个web项目,除了启动web服务容器之外,还需要启动它依赖的mysql、redis等等,这时候手
2021-07-07 22:13:40
2660
原创 Docker容器网络通信机制
本文从本人博客搬运,原文格式更加美观,可以移步原文阅读:Docker容器网络通信机制原理当Docker启动时,会自动在主机上创建一个docker虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机,它会在挂载到它的网口之间进行转发。同时,Docker 随机分配一个本地未占用的私有网段中的一个地址给 docker 接口。比如典型的 172.17.0.1,掩码为 255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址我们可以通过
2021-07-07 22:01:51
683
原创 Docker安装常用服务
本文从本人博客搬运,原文格式更加美观,可以移步原文阅读:Docker安装常用服务用Docker安装常用的中间件服务非常方便,本文记录了如何用Docker安装常用的一些中间件服务MySQL5.7下载MySQL5.7镜像docker pull mysql:5.7启动MySQL容器实例docker run -p 3306:3306 --name mysql5.7 \-v mysql.conf:/etc/mysql \ # 映射容器与宿主机的mysql配置目录-v mysql.l
2021-07-07 21:24:29
959
原创 WxJava微信公众号开发实战
本文从本人博客搬运,原文格式更加美观,可以移步原文阅读:WxJava微信公众号开发实战之前我们介绍了Java如何进行微信公众号开发,阅读本文前小伙伴们可以先去了解下Java微信公众号开发之前我们开发微信公众号时,都是要手动自己实现微信接收、响应消息的封装,消息类型的判断,access_token的过期时间管理等等,还是比较麻烦的。有没有已经封装好的开源项目来简化开发呢?这里推荐WxJava,它的地址如下:github:https://github.com/Wechat-Group/WxJava
2021-07-06 23:41:27
25384
13
原创 Java微信公众号开发
本文从本人博客搬运,原文格式更加美观,可以移步原文阅读。原文地址:https://www.baobao555.tech/posts/ee7236bb/微信公众号介绍1.公众号的分类我们平常在微信应用上会看到有很多的公众号,但是各自并不一样,公众号也分很多种类型,不过最常见的就是服务号和订阅号了。下面我们来看一下他们的区别:订阅号:为媒体和个人提供一种信息传播方式,主要偏于为用户传达资讯(类似报纸杂志),主要的定位是阅读,每天可以群发1条消息服务号:为企业,政府或组织提供对用户进行服务,主要偏于服
2021-07-06 23:32:03
11439
9
原创 windows平台效率工具推荐
Rolan-解放桌面官方地址:https://getrolan.com/Rolan是一个应用程序快捷面板,可以随时呼出并运行指定的应用,解放杂乱的桌面安装好Rolan以后,我们可以将桌面所有应用程序图标都整理到一个文件夹中,然后将其拖入Rolan面板然后在需要的时候可以通过预设的快捷键(一般是alt+空格)快速呼出rolan面板,启动需要的应用。rolan最大的好处是可以在任何界面快速呼出,比如一般你在浏览网页时如果想启动一个程序,得先回到桌面,然后找到这个程序并双击。而有了rolan之后无需回
2021-07-06 23:20:50
787
原创 Java中注解(Annotation)的使用
注解的定义注解,顾名思义,就是给程序打上一些标签(标签中包含了信息),以便在开发时根据这些标签获取重要的信息,根据获取的信息从而动态对程序的运行产生期望的结果。注解可以大幅度简化开发,故很多开发框架都使用了注解。注解的定义语法非常简单,代表一个注解的关键字是==@interface==...
2019-07-30 17:37:16
521
1
原创 JDK8新日期时间api的使用
JDK8之前的日期api在介绍JDK8新增的api之前,有必要先回顾下老的日期api,所谓没有对比就没有伤害,我们先用下老的api看下难不难用。JDK8之前的api主要有3个类:Date、SimpleDateFormat、Calendar,他们的主要使用方法如下:Date类: //1、演示java.util.date System.out.p...
2019-07-30 10:18:16
886
原创 Java动态代理的简单使用
代理设计模式的含义是:当我们需要一个功能时,不直接找拥有该功能的类,而去找他的代理类去实现功能,代理类可以在实现功能的同时做一些其他操作。代理模式涉及如下概念:被代理类:实际拥有某个功能的类代理类:被外界调用实现某个功能的类,通过持有被代理类实例的引用来实现功能代理模式分为静态代理和动态代理,下面分别介绍静态代理了解动态代理之前,先介绍一下静态代理,它是理解动态代理的基础。我们思考一...
2019-07-26 17:57:31
242
原创 Java单例模式的5种实现方式
单例模式的本质就是只提供一个实例,Java中单例模式主要有以下5种实现方式:饿汉式实现步骤:定义SingletonHurry类私有化构造函数定义SingletonHurry类型的静态变量instance,并初始化定义静态方法getInstance(),返回instance参考代码如下://饿汉式,加载类的时候马上创建对象,没有线程安全问题public class Single...
2019-07-12 17:58:04
225
原创 Java枚举类的简单使用
手动实现枚举类枚举类的本质就是提供有限个实例,我们自己不能随便new对象,那么我们先按照如下步骤自己手动实现一下代表季节的枚举类,提供春、夏、秋、冬4个实例:定义MyEnumation类,私有化构造函数声明季节名称、季节描述2个成员变量,生成相应的构造方法和set/get方法声明4个静态的MyEnumation类型的常量分别代表春、夏、秋、冬,并初始化public class MyE...
2019-07-11 15:38:03
294
原创 LTE中PA/PB的理解
LTE中下行业务信道PDSCH的功率分配是采用固定功率分配方式的,其中涉及2个参数PA和PB比较难理解,这里介绍一下对这2个参数的理解。PA/PB理论描述首先,让我们回顾一下LTE时频资源图,在2个CRS端口的条件下,一个RB在时域和频域上的资源分布如下图(其中横向是时域,7个符号;纵向是频域,12个子载波),每个小格子代表一个RE。我们先把RE分成如下3类:RS:代表发射CRS的RE...
2019-05-16 11:30:41
30984
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人