自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 最佳实践,一款基于 Flutter 的桌面应用

这篇文章介绍作为一名后端开发人员,快速的入门前端或者客户端一些相关的技术的心得。先来说说为什么作为一名后端开发人员也需要学习一些前端或者客户端相关的技术。可以扩展技术视野,让我们更加深刻的理解相关领域的发展。如果有一天你想要独立自主开发一款属于自己的互联网产品,在没有团队的情况下,你可能啥都要自己做,需要学习这些技术以让你拥有开发自己产品的能力。更加深刻的理解一款产品的开发流程。

2024-06-25 17:38:57 477

原创 Java 面试笔记 | Java 基础:线程池

在日常的工作学习生活中,用一种好的方法去学习,可以更加有效,比如费曼学习法将学到的知识用自己的组织的语言表达出来,如果能够清晰明白的向别人解释清楚,那么就说明你是真的懂了,学会了。如果不能够很好的表述出来,或者被别人问倒了,那说明有不懂的细节存在,需要再次对所学的知识进行巩固。这篇文章介绍线程池的相关知识。

2024-06-25 17:31:24 1007

原创 ElasticSearch 快速上手教程 (三) —— 基本操作

ES 数据的存储与查询

2023-07-28 23:06:27 160

原创 ElasticSearch 快速上手教程 (二) —— 基本概念术语

上一部分,我们讲解了 ES 的一些基本概念和应用场景,以及如何在本机搭建一个 ELK 测试环境。现在这篇文章带你了解 ES 当中一些基本术语以及相关的工作原理。

2023-07-05 23:36:54 538

原创 ElasticSearch 快速上手教程(一)—— ES 的安装

ElasticSearch 快速上手教程

2023-05-23 11:08:34 1467

原创 使用 Docker 搭建 Jenkins CI/CD 环境

Jenkins 持续集成、持续部署

2022-09-10 16:21:42 1134

原创 使用 MyBatis-Plus 代码生成器生成代码

在项目当中,如 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,重复去创建很繁琐,我们可以通过程序自动生成的,提升我们开发的效率。这篇文章记录如何使用 MyBatis-Plus 的代码生成器,生成代码,减少我饿们重复性劳动。下面给出一个可行的参考代码,具体的步骤可以参考官网文档@SpringBootTest(classes = DistributedLockApp.class)@RunWith(SpringRunner.class)@Slf.

2022-02-09 22:05:50 1654

原创 谈谈 MyBatis 中 Mapper 接口方法的执行过程

你是否也曾好奇MyBatis中的Mapper当中的方法是如何被执行?这篇文章通过源码解析其中的流程。概述MyBatis通过JDK动态代理的方式创建Mapper接口的代理对象,当Mapper代理对象调用Mapper接口中定义的方法时,会调用InvocationHandler中的invoke()方法,执行相应的拦截逻辑,从而完成数据库操作。执行过程我们知道Mapper由两部分组成:Mapper接口和通过注解或者XML文件配置的SQL语句。以下通过一个单元测试的代码来看如何执行Mapper中定义的方.

2022-02-08 20:01:56 1410

原创 图解 JVM

JVM 的一些知识总结运行时内存区域对象在内存当中如何表示?对象的创建过程如何访问内存中的对象

2022-01-24 21:33:43 173

原创 图解 ThreadLocal 源码

前言先来看以下这样一段代码:public class ThreadLocalDemo { static class ThreadA implements Runnable { private ThreadLocal<String> threadLocal; public ThreadA(ThreadLocal<String> threadLocal) { this.threadLocal = threadLocal

2022-01-20 10:51:05 337

原创 Spring Boot 整合 Swagger2

在前后端分离的项目当中,API文档是不可或缺的,Swagger 是一个可以根据我们代码中的注解元信息自动生成在线API文档的工具。在前后端分离的项目当中,API 文档是不可或缺的,Swagger 是一个可以根据我们代码中的注解元信息自动生成在线 API 文档的工具。这篇文章介绍一下 Swagger 的用法以及 Spring Boot 如何集成 Swagger。Swagger 常用注解@Api:修饰整个类,描述Controller的作用@ApiOperation:描述一个类的一个方法,或者说一个.

2022-01-19 22:43:20 298

原创 浅谈动态代理

动态代理是实现AOP的基础,这篇文章向你说明什么是动态代理。在做日志、性能监控、权限检查等功能的时候,我们通常会用到AOP,AOP的底层是动态代理。动态代理的实现有两种方式:一种是基于JDK,一种是基于第三方库cglib。访问的时候,直接访问代理对象,再由代理对象对实际对象对象进行访问。我们熟悉的用Nginx反向代理也是这样的原理,请求会经过Nginx转发给后面的Tomcat服务。使用代理的好处是:我们可以在访问实际对象方法的前后添加处理逻辑,如:权限校验,而不用修改实际访问方法的逻辑。静态代理静.

2022-01-19 22:41:44 225

原创 Spring 源码阅读环境搭建

这篇文章记录下编译Spring-framework源码的过程中遇到的问题源码编译1、下载Spring源码:git clone https://github.com/spring-projects/spring-framework.git2、在IDEA中打开项目并切换到 tag = v5.2.13.RELEASE,然后新建一个分支git checkout -b v5.2.13.RELEASE3、在IDEA中的Terminal窗口中执行命令编译Spring源码:gradlew :sprin.

2022-01-19 22:38:18 134

原创 什么是JWT【译】

JWT常被用于认证、消息传输,来自官网的一篇文章介绍什么是JWT来自jwt.io的一篇文章对JWT进行介绍 原文点击这里什么是JWT(JSON Web Token)JSON Web Token(JWT) 是由开放标准(RFC 7519)定义的一种JSON对象,它被定义成紧凑且自包含的方式以用于在各方之间安全地传输信息。 由于JWT是经过数字签名的,因此可以被验证和信任。 可以使用密钥(使用HMAC算法)或者使用非对称加密(公钥/私钥)RSA或ECDSA对JWT进行签名。尽管JWT可以被加.

2022-01-19 22:36:51 2581

原创 HTTPS 与 SSL 证书

为什么使用 HTTPSHTTP协议传输数据都是明文传输,未经过加密的,而在因特网中进行消息的传送过程中,消息会经过多台计算机、路由器,最终到达目的主机,所以通过HTTP传输的信息很容易被截获窃取到明文消息。令一方面,用HTTP通信过程中服务器不会验证通信方的身份,所以有可能遭遇伪装。而HTTPS(HTTP over SSL)对消息进行了加密处理,用证书验证是否是可靠的通信方,可以有效的防止上述事件的发生。Nginx 配置 HTTPS在配置HTTPS之前,要向供应商申请 SSL 证书,以阿里云为例,.

2022-01-19 22:34:38 2677

原创 Docker 概念梳理

Docker 让开发者创建的应用脱离底层物理硬件的限制;能很方便通过网络进行传播,做到快速分发和部署。通过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用组件级别的"一次封装,到处运行"。解决了一旦需要服务器迁移,往往需要对每个应用都进行重新部署和调试的问题。基本概念镜像可以将它理解为一个只读的模板,描述一个镜像需要包括"名称+标签"信息。镜像自身是只读的。常用命令:拉取镜像:docker pull

2022-01-19 22:31:42 643

原创 使用 Docker 安装常用软件汇总

Docker 安装常用软件

2022-01-19 22:30:51 1880

原创 Spring Boot “国际化“ 探究

多语言功能的支持在一些网站中,需要提供多国语言支持的功能,这个功能的实现通常需要前后端的配合,其中一种做法是后端在设计表结构的时候设置英文字段,查询的时候提供给前端,前端设置多语言切换的按钮进行切换。如下图所示:但是来自后端的一些常用的业务提示消息要怎么设置语言切换呢?如登录验证的时候后端返回的提示信息。这时,可以使用Spring提供的国际化功能去实现。Spring主要通过org.springframework.web.servlet.i18n包下的AcceptHeaderLocaleResol.

2022-01-19 22:29:09 430

原创 Spring Security 应用实践

概述Spring Security 是 Spring 在安全方面的推出的框架,是采用责任链的设计模式,基于 Spring AOP 和 Servlet 过滤器进行实现。这篇文章记录认证授权的一些概念,以及如何使用其进行扩展保护我们的应用。认证与授权的概念认证:我是谁授权:有哪些访问权限在系统安全方面,我们面临的两个问题是:1、如何保护需要访问权限的资源?在 Java 中我们一般使用过滤器对我们的资源进行保护,使用拦截器对方法的访问进行控制。2、用户的登录状态要如何传递?如何让服务器意识到

2022-01-19 22:26:42 312

原创 Java 集合学习笔记

概述Java 集合框架主要包括两种类型的容器,一种是Collection,存储一个元素集合,另一种是Map,存储键/值对映射。Collection 接口又有根据容器的不同特点划分出 3 种子类型:List(按照顺序保存元素)、Set(集合:不保存重复的元素) 和 Queue(队列:先进先出),接下来用抽象类(实现了一些公共的逻辑(设计模式当中的模板模式)),最后是具体实现类。List:按照顺序保存元素ArrayList:底层用Object数组实现,随机访问性能好,可以直接根据数组的下标访问元素

2022-01-19 22:24:30 222

原创 Redis 学习总结

使用场景缓存、排行榜、消息队列、计数器(文章、视频浏览数根据浏览实时+1,避免频繁的进行IO)架构Redis 使用单线程架构和I/O多路复用模型。每一条命令从客户端达到服务端不会立刻被执行,所有命令都会进入一个队列,然后逐个被执行使用单线程还快速的原因纯内存访问非阻塞IO单线程避免了多线程上下文切换产生的消耗数据结构字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)常用命令可以参考:http://www.redi

2022-01-14 22:24:31 234

原创 Java 基础巩固

目录类集合Java I/O泛型并发反射注解类加载动态代理正则表达式函数式编程类接口接口声明了一组能力。一个接口可能对应多个实现类。接口方法不需要加修饰符,加与不加相当于都是public abstract。接口降低了耦合,提高了灵活性。使用接口的代码依赖的是接口本身,而非实现接口的具体类型,程序可以根据情况替换接口的实现,而不影响接口使用者在Java 8之前,接口中的方法都是抽象方法,都没有实现体,Java 8允许在接口中定义两类新方法:静态方法和默认方法,它们有实现体

2022-01-11 22:20:23 469

原创 Java8 特性小结

前言Java8提供了很多强大的功能,系统总结下函数式编程(面向声明、而非过程)在Java8中,会看到很多类似下面风格的代码:使用Labmda表达式。这种写法就是一种声明式的写法:告诉计算机要做什么,而不是怎么做。//我们通过函数声明式的过滤出我们想要的结果。而不是在写个for循环做条件判断,然后筛选结果(过程式)Arrays.asList(1, 3, 4, 5, 10).stream().filter(v -> v > 5).collect(Collectors.toList());

2022-01-11 22:08:28 75

原创 什么是Cookie、Session、Token

在开发中,最常使用的通信协议就是HTTP协议,用HTTP进行客户端与服务器的数据交换,每次HTTP请求由客户端(Web浏览器、手机App等)主动发起,服务器端被动接收并对请求进行处理后响应给客户端,但由于HTTP的请求是无状态的,即每次请求都是一个新的请求,如果没有在传输过程中携带附加的认证信息,服务器端是无法识别正在与其通信的客户端的。那么在用HTTP协议通信的过程中,识别通信客户端的方式都有哪些呢?一般可以在请求头中使用Cookie、Authorization等字段让服务器端知道是哪个客户端正在与之进行

2022-01-11 22:06:44 940

原创 GitHub 热点数据抓取

一个基于 Java 的小爬虫,用于在服务端抓取解析 GitHub Trending 数据并缓存,以提供给客户端快速(秒级)的查询接口。GitHub: github_trending_crawler简介相信很多开发者都有逛 GitHub 的习惯,会去看 GitHub Trending,关注每个时段 GitHub 上面的热门项目和热门的开发者,但是访问 GitHub 的时候可能会遇到速度比较慢的问题;另外,我们在开发第三方 GitHub 应用时,通常也需要展示 Trending 数据,由于 GitHu.

2022-01-11 21:57:32 456

原创 MyBatis 源码浅析之配置文件的解析

MyBatis是一款半自动化的ORM(Object Relational Mapping:对象关系映射)框架,能够将数据库中的记录转换为Java实体。框架会做帮我们做如下的一些映射:数据库的表(table) --> 类(class)记录(record,行数据)--> 对象(object)字段(field)--> 对象的属性(attribute)这篇文章会通过源码分析MyBatis配置文件的加载与解析流程。MyBatis配置及其使用回顾在分析具体的加载流程前,我们先来回顾一下

2022-01-11 21:53:42 154

原创 基于 Redis 的延迟队列的实现

业务场景我们常会遇见这样的一些业务场景:在延迟的一段时间后执行某个任务:当用户报名了某项活动,在活动开始的前一天自动发送短信提醒用户。当用户下了订单,如果超过半小时还未支则将订单设置成取消状态,不再让用户进行支付。…方案设计1、最简单的做法是用定时任务扫描业务表,发现符合相关的条件,则执行相关的业务逻辑。但是这样做的缺点是:(1)、需要不断的去查询数据库,频繁的进行IO。比如:要将超过半小时还未支付的订单状态该为已取消,可以设置每隔30秒查询出未支付的订单,并计算当前时间与订单创建时间的时

2022-01-11 21:50:38 2220

原创 服务限流的几种实现方案

这篇文章记录基于 Guava、Nginx的服务限流的实现。背景服务器能处理的请求数有限,如果瞬时流量过大可能会造成服务宕机,限流是通过对并发访问/请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务。限流算法限流算法主要有:令牌桶算法和漏桶算法。网上有很多文章都对两个算法进行了详细的解说,这里就不在介绍了。下面记录下基于 Guava 和 Nginx 限流的实现。基于 Guava 的 RateLimiter 实现限流注解:@Target(ElementType.METHOD)@Reten.

2022-01-11 21:48:53 1369

原创 HTTP 协议的演变历程

HTTP协议的演变之路&Nginx如何启用HTTP/2

2022-01-11 21:45:41 797

原创 从零开始 Spring Security OAuth2

伪类伪类选择器是CSS中已经定义好的选择器,不能随便起名

2021-11-28 22:25:49 295

原创 Linux学习笔记

书籍推荐笔者在该文章会对Linux知识做一个简单的总结软件包管理软件包管理是指系统中一种安装和维护软件的方法。大多数发行版分别属于两大包管理技术阵营: Debian 的”.deb”,和红帽的”.rpm”。软件包管理系统通常由两种工具类型组成:底层工具用来处理这些任务,比方说安装和删除软件包文件, 和上层工具,完成元数据搜索和依赖解析。我们下载的包一般都是从资源库当中获取。发行版底层工具上层工具Ubuntudpkgapt-get, aptitudeCentOSrpm

2020-12-01 11:37:22 81

原创 Go语言学习笔记

关于Go语言Go项目包括编程语言本身,附带了相关的工具和标准库。拥有自动垃圾回收、一个包系统、函数作为一等公民、词法作用域、系统调用接口、只读的UTF8字符串等。go携带的命令go build xx.go:生成可执行的二进制文件。go run xx.go:编译-链接-运行最终生成的可执行文件。基本的语法学习package main //定义文件所在包名import "fmt" //引入标准库中的包func main() { //main函数为程序执行的入口 fmt.Print("h

2020-11-28 23:28:24 107

原创 Spring Boot 缓存

简介CacheManager是Spring提供的各种缓存技术抽象接口,Cache接口包含缓存的常用操作:增加、删除、读取等。针对不同的缓存技术,需要实现不同的CacheManager。使用方法及原理Spring Cache的使用方法和原理类似于Spring对事务管理的支持,都是AOP的方式,提供了@Cacheable、@CachePut、@CacheEvict等注解,在方法上使用。其核心思想是:当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存放在缓存中,等到下次利用同样的参数来调

2020-11-28 13:24:42 76

原创 Spring Boot与定时任务

定时任务的应用定时消息的通知、业务数据的定时结算、缓存数据的定时更新等。实现方法使用Java自带的java.util.Timer类使用Quartz使用Spring框架自带的Schedule模块执行方式定时任务执行方式可分为:单线程(串行)和多线程(并行)。如何使用开启:启动类上增加一个@EnableScheduling注解来开启定时任务功能。Cron表达式简介...

2020-11-27 00:10:26 128

原创 【绘画练习】使用Ipad+precreate绘制插画

自由自在游动的金鱼:跃出海面的海豚:

2020-11-26 23:59:27 510 1

原创 Spring Boot 与 AOP

AOP的概念简单的说解剖开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为切面(Aspect),依赖注入(DI, Dependency Injection)有助于应用对象之间的解耦,而面向切面编程(AOP, Aspect OrientedPrograming)则有助于横切关注点与它们所影响的对象之间的解耦。应用日志记录、跟踪、优化和监控、事务、持久化、认证、权限管理、异常处理以及针对具体行业应用场景的横切行为相关的术语横切关注点:表示对哪些方法进行拦截,拦截后怎

2020-11-25 23:03:08 154 1

原创 Spring Boot整合WebSocket

WebSocket协议基于TCP的一种新的网络协议,它实现了浏览器与服务器全双工通信——允许服务器主动向客户端推送消息。目前很多浏览器已经实现了WebSocket协议,但是依旧存在着很多浏览器没有实现该协议,为了兼容那些没有实现该协议的浏览器,往往还需要通过STOMP协议来完成这些兼容。开发使用浏览器支持WebSocket协议1、引入依赖 <dependency> <groupId>org.springframework.boot</groupId&

2020-11-24 23:38:12 197

空空如也

空空如也

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

TA关注的人

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