项目骨架搭建
写在前面本文介绍如何通过SpringBoot+Mybatis来搭建一个电商系统的基本骨架,并以商品品牌管理为例来实现基本的CRUD操作,以及通过PageHelper实现分页查询。
使用的框架简介SpringBoot一个基于Spring的快速搭建Java企业级应用的开发框架。
Mybatis generatorMybatis代码生成器,可根据数据库生成对应的model、mapper.xml、mapper接口以及Example,这样一般的单表查询不用再手写mapper。
PagerHelperMyBatis分页插件,只需几行简单事务代码就能实现分页功能。如果你使用的是SpringBoot,那么只要整合了PagerHelper就自动整合了MyBatis:
12345PageHelper.startPage(pageNum, pageSize);//之后进行查询操作将自动进行分页List<PmsBrand> brandList = brandMapper.selectByExample(new PmsBrandExample());//通过构造PageInfo对象获取分页信息,如当 ...
如何优雅的记录你的日志
最近在给老系统添加日志管理模块,主要记录用户的操作日志。操作日志不同于系统日志,它要求内容简洁且易读,同时日志管理要求做到三点:(1)不侵入业务逻辑;(2)可作为组件独立使用;(3)支持权限管理和可视化查询。因此本篇将从上述三个要求出发,学习和实践如何记录操作日志。
操作日志使用场景操作日志与系统日志区别当对某个对象进行新增、修改和查询操作后,通常需要记录对象的新旧状态,这其实就是操作日志,一般而已操作日志都是给用户查阅的,因此可读性要求较高。最常见的就是物流信息的更新,这其实是针对该快递对象的更新记录,里面会告诉用户包裹转到何时何地。
而系统日志通常是作为开发人员排查和解决问题的依据,一般记录在指定的日志文件中,由于是给开发人员使用的,所以可读性要求不高,里面只记录一些重点信息,如代码当前输出的信息。
操作日志分类一般来说,操作日志分类分为三类,下面依次进行简要学习:(1)单纯的文本记录。举个例子,2021-12-01 10:00:00 用户登录。时间是动态但与其他内容关,其他信息都是固定值。(2)简单的动态文本记录。举个例子,2021-12-01 10:00:00 用户:张三,创建 ...
SpringBoot整合Canal实现数据增量同步
写在前面在实际工作中经常会遇到需要同步数据的场景,在业务和数据量比较小的情况下,我们会在项目中通过编写一些定时任务来同步数据。但是随着业务系统的迭代、数据量的增多以及多种复杂场景下的分库分表实现,使得数据同步变得越来越具挑战性。针对这种情况,笔者决定使用阿里开源的Canal这一中间件来解决数据同步问题。
CanalCanal简说Canal是阿里巴巴开源的一款基于MySQL数据库的增量日志解析中间件,提供增量数据的订阅和消费功能。由于它是基于MySQL的日志进行的增量解析,因此对原有的业务代码完全不侵入。
Canal的工作原理是解析MySQL的binlog日志,提供增量数据的订阅和消费功能,具体包括:数据库镜像、数据库实时备份、业务缓存刷新、带业务逻辑的增量数据处理以及索引构建和实时维护(拆分异构索引和倒排索引)。
Canal官方文档,点击 这里 进行查阅。
Canal如何传输数据下图是Canal官方展示的Canal传输数据架构图,可以看到Canal支持RabbitMQ、RocketMQ或者ES等常用的消息中间件:
从上图中可以知道Canal分为服务端和客户端,一般阿里开源的程序都是这 ...
在完整Kubernetes集群上部署微服务
写在前面接下来我们尝试在完整集群上部署微服务,首先来复习之前的一些命令以及学习一个新的命令,了解这些对于学习和熟悉Kubernetes有非常大的帮助。
新的命令首先查看一下当前其他节点的运行状态信息,可以看到它们都是Ready状态:
1234[root@server02 ~]# kubectl get nodeNAME STATUS ROLES AGE VERSION192.168.51.121 Ready <none> 4h v1.9.0192.168.51.123 Ready <none> 4h v1.9.0
再来查看一下services,可以看到这里有一个Kubernetes默认的services:
123[root@server02 ~]# kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP ...
Kubernetes完整集群搭建
完整集群部署本篇尝试对之前使用的基础集群进行改造和升级,使其成为一个比较完整的Kubernetes集群。
理解认证授权为什么要认证想理解认证,我们得从认证用于解决什么问题、防止什么问题的发生入手?防止什么问题呢?是防止有人入侵你的集群,root你的机器后我们集群依然安全吗?不是吧,root都到手了,那就为所欲为,防不胜防了。
其实网络安全本身就是为了解决在某些假设成立的条件下如何防范的问题。比如一个非常重要的假设就是两个节点或者ip之间的通讯网络是不可信任的,可能会被第三方窃取,也可能会被第三方篡改。就像我们上学时候给心仪的女孩传纸条,传送的过程可能会被别的同学偷看,甚至内容可能会从我喜欢你修改成我不喜欢你了。当然这种假设不是随便想出来的,而是从网络技术现状和实际发生的问题中发现、总结出来的。kubernetes的认证也是从这个问题出发来实现的。
概念梳理为了解决上面说的问题,kubernetes并不需要自己想办法,毕竟是网络安全层面的问题,是每个服务都会遇到的问题,业内也有成熟的方案来解决。这里我们一起了解一下业内方案和相关的概念。(1)对称加密/非对称加密。(2)SSL/TLS。
...
Kubernetes简易环境使用
写在前面接下来我们开始在Kubernetes简易环境中,来练习和使用一些常用的kubectl的命令,了解这些对于后续熟练和使用kubernetes有非常大的帮助。笔者将kubectl命令安装在了主节点上,因此接下来就在主节点上执行对应的kubectl命令。
(1)使用kubectl version命令查看k8s的版本信息:
123[root@server02 target]# ·Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2017-12-15T21:07:38Z", GoVersion:"go1.9.2", Compiler:"gc", Platfo ...
Kubernetes基础知识
Kubernetes简介Kubernetes,简称K8s,是用8代替名字中间的8个字符“ubernete”而成的缩写。是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理,用于管理云平台中多个主机上的容器化的应用。Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了应用部署,规划,更新,维护的一种机制。
在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。
Kubernetes集群Kubernetes 协调一个高可用计算机集群,每个计算机作为独立单元互相连接工作。Kubernetes 以更高效的方式跨集群自动分发和调度应用容器。一个Kubernetes集群包含两种类型的资源:Master(调度整个集群)和Nodes(负责运行应用)。
Master调度整个集群Master协调集群中的所有活动 ...
Kubernetes基础知识
Kubernetes简介Kubernetes,简称K8s,是用8代替名字中间的8个字符“ubernete”而成的缩写。是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理,用于管理云平台中多个主机上的容器化的应用。Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了应用部署,规划,更新,维护的一种机制。
在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。
Kubernetes集群Kubernetes 协调一个高可用计算机集群,每个计算机作为独立单元互相连接工作。Kubernetes 以更高效的方式跨集群自动分发和调度应用容器。一个Kubernetes集群包含两种类型的资源:Master(调度整个集群)和Nodes(负责运行应用)。
Master调度整个集群Master协调集群中的所有活动 ...
SpringBoot轻松实现接口加解密
写在前面最近负责一个前后端分离架构下新项目的搭建工作,需要考虑到后台接口的加密与解密工作。其实接口的加密与解密是一个很常见的需求,开发者可以自定义过滤器,将请求和响应分别拦截并进行相应的解密与加密操作。可以看到这种方式简单粗暴,灵活度高,适应性强。不过呢,本篇决定使用另一种思录,即使用SpringMVC提供的@RequestBodyAdvice和@ResponseBodyAdvice注解来对请求和响应进行增强处理(预处理)。
本篇尝试利用@RequestBodyAdvice和@ResponseBodyAdvice注解来对请求和响应进行增强处理,并在此基础上对请求和响应进行解密和加密操作,接着将其制作成一个starter并发布到jitPack中,最后新建一个项目来尝试使用该starter。
编写加解密场景启动器第一步,新建一个名为encrypt-spring-boot-starter的SpringBoot项目,在其POM文件中新增如下依赖:
1234567891011121314151617<dependencies> <dependency> ...
SpringBoot实现图形验证码
写在前面在实际生活中,我们经常会遇到在登陆的时候,需要输入图形验证码这样的场景,验证码不仅可以防止爬虫的抓取,还可以限制接口短时间内被访问的次数,可以说也是一种限流措施。本篇来学习如何在前后端分离架构下,基于SpringBoot实现图形验证码这一功能。
实战项目初始化第一步,新建一个名为verify-code的SpringBoot项目,并在其POM文件中添加如下依赖:
12345678910111213141516171819202122<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</gr ...