整合RabbitMQ实现延迟消息
写在前面本文将在第七篇《整合MongoDB实现用户商品浏览记录》的基础上整合RabbitMQ,实现延迟消息这一功能。
RabbitMQAMQP简介AMQP (Advanced Message Queuing Protocol ,高级消息队列协议)是一个线路层的协议规范,而不是API 规范(例如JMS)。由于AMQP 是一个线路层协议规范,因此它天然就是跨平台的,就像SMTP、HTTP等协议一样,只要开发者按照规范的格式发送数据,任何平台都可以通过AMQP进行消息交互。像目前流行的StormMQ、RabbitMQ等都实现了AMQP协议。
RabbitMQ简介RabbitMQ是一个实现了AMQP的开源消息中间件,使用高性能的Erlang编写。RabbitMQ具有可靠性、支持多种协议、高可用、支持消息集群以及多语言客户端等特点,在分布式系统中存储转发消息,具有不错的性能表现。
RabbitMQ的安装第一步,安装Erlang,可点击 这里 进行下载,然后进行安装。
第二步,安装RabbitMQ,可点击 这里 进行下载,然后进行安装。
第三步,以管理员身份打开终端,并切换到RabbitMQ安装目 ...
整合MongoDB实现用户商品浏览记录
写在前面本文将在第六篇《使用ElasticSearch实现商品复杂搜索》的基础上整合MongoDB,实现用户商品浏览记录这一功能。
MongoDBMongoDB简介MongoDB是一个为快速开发互联网Web应用而构建的数据库系统,其数据模型和持久化策略就是为了构建高读/写吞吐量和高自动灾备伸缩性的系统。
安装MongoDB服务第一步,点击 这里 下载MongoDB的安装包;
第二步,自定义MongoDB的安装路径:
第三步,在MongoDB安装路径下创建data\db和data\log这两个文件夹:
第四步,在MongoDB安装路径下创建mongod.cfg配置文件,里面的配置信息如下:
12345systemLog: destination: file path: E:\Application\MongoDB\data\log\mongod.logstorage: dbPath: E:\Application\MongoDB\data\db
第五步,进入到MongoDB安装路径下的bin目录,里面有两个exe文件,分别是客户端和服务端运行程序:
然后以管理员身 ...
使用ElasticSearch实现商品复杂搜索
写在前面本文将在第五篇《整合ElasticSearch实现商品搜索》的基础上,使用ElasticSearch实现商品复杂搜索这一功能。
中文分词器由于商品搜索涉及到中文搜索,因此ElasticSearch需要安装分词器才可以支持。前面我们安装的分词器是IKAnalyzer,接下来简单学习如何使用它。
默认分词器使用默认分词器,只是将中文逐字进行分割,并不符合我们的要求:
12345GET /pms/_analyze{ "text": "华为手机使用较为丝滑", "tokenizer": "standard"}
输出结果:
中文分词器使用中文分词器后,可以将中文文本按照语境进行分隔,可以满足我们的要求:
12345GET /pms/_analyze{ "text": "华为手机使用较为丝滑", "tokenizer": "ik_max_word"}
输出结果:
其实在前一文中,我 ...
整合ElasticSearch实现商品搜索
写在前面本文将在第四篇《整合SpringSecurity和JWT实现认证与授权》的基础上整合ElasticSearch,实现商品搜索这一功能。
ElasticSearch简介ElasticSearch是一个分布式、可扩展、实时的搜索与数据分析引擎,它能从项目一开始就赋予你的数据以搜索、分析和探索的能力,在日常工作和学习中扮演着非常重要的角色。关于ElasticSearch的学习,可以参考笔者的其他文章。注意本篇使用的ElasticSearch版本为6.8.6。
Kibana作为访问ElasticSearch的客户端,可以很方便的提供开发者可视化方式操作ES。
在整合前,请确保ElasticSearch和Kibana都已经正确安装并启动,且ElasticSearch的分词器也已经安装。
Spring Data ElasticsearchSpring Data Elasticsearch是Spring提供的一种以Spring Data风格来操作数据存储的方式,可以避免开发者编写大量的样板代码,提升代码质量。
Spring Data Elasticsearch常用注解@Document@Do ...
整合SpringSecurity和JWT实现认证与授权
写在前面本文将在第三篇《整合Redis实现数据缓存》的基础上整合SpringSecurity和JWT,实现认证与授权这一功能。
使用的框架简介SpringSecuritySpringSecurity是一个强大的可高度定制的认证与授权框架,对于Spring应用来说它是一套Web安全标准。SpringSecurity注重于为Java应用提供认证和授权功能,像所有的Spring项目一样,它对自定义需求具有强大的扩展性。关于SpringSecurity的学习,可以参考笔者的其他文章。
JWTJWT简介JWT是JSON WEB TOKEN的缩写,它是基于RFC 7519 标准定义的一种可以安全传输的的JSON对象,由于使用了数字签名,所以是可信任和安全的。
JWT组成JWT由三部分组成:header、playload和signature,JWT token的格式为header.payload.signature。
其中header中用于存放签名的生成算法:
1{"alg": "HS512"}
payload中用于存放用户名、token的 ...
整合Redis实现数据缓存
写在前面本文将在第二篇《整合Swagger-UI实现在线API文档》的基础上整合Redis,实现数据缓存这一功能。
Redis简介Redis是一个使用C语言开发的高性能键值对数据库,可用于数据缓存,以实现大量数据的高并发负载访问。
点击 这里 下载Redis,选择3.2.100的版本进行下载:
下载之后解压到指定目录:
接着打开终端,切换到上述解压目录,执行redis启动命令:
1redis-server.exe redis.windows.conf
可以看到此时redis就已经启动成功了。
整合Redis第一步,复制一份shop-swagger-ui源码,将其名字修改为shop-redis,然后对应包和文件中的信息也记得修改,本篇后续所有操作均在shop-redis这一Module中进行。
第二步,在shop-redis的POM文件中新增如下依赖:
12345<!--redis依赖配置--><dependency> <groupId>org.springframework.boot</groupId> <artifactI ...
整合Swagger-UI实现在线API文档
写在前面本文将在第一篇《项目骨架搭建》的基础上整合Swagger-UI,实现可以在线阅读API文档这一功能。
Swagger-UI简介Swagger-UI是HTML、CSS和Javascript的一个集合,可以动态地根据注解生成在线API文档,本篇将要整合的Swagger-UI版本为2系列。
Swagger-UI常用的一些注解如下所示:(1)@Api:用于修饰Controller类,可生成Controller相关的文档信息;(2)@ApiOperation:用于修饰Controller类中的方法,可生成接口方法相关的文档信息;(3)@ApiParam:用于修饰接口中方法的参数,可生成接口参数相关的文档信息;(4)@ApiModelProperty:用于修饰实体类的属性,当实体类是请求参数或返回结果时,会直接生成相关的文档信息。
关于Swagger-UI的详细介绍,可以参阅笔者其他的文章,此处不做过多介绍。
整合Swagger-UI第一步,复制一份shop-basic源码,将其名字修改为shop-swagger-ui,然后对应包和文件中的信息也记得修改,本篇后续所有操作均在shop-sw ...
项目骨架搭建
写在前面本文介绍如何通过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分为服务端和客户端,一般阿里开源的程序都是这 ...