功能开关在业务中的实践
写在前面之前搞过一个报名送油卡的活动,这个活动不定期举办,因此需要考虑可配置性,起初考虑后台做个时间配置框,根据指定的时间来生效,但是后续发现这样有个弊端,即只能针对一个活动或者相同时间的多个活动生效,而实际上我们的活动有多个,权衡再三决定使用功能开关来实现。
功能开关功能开关其实是一种代码可配置性的实践,说到底就是通过控制开关的状态来实现对功能的决定控制。
功能开关的实现有很多种方式,可以使用MySQL或者Redis等数据库,出于对后续数据扩展和对存储容量的考量,此处使用Bit数组来实现。
Bit数组原理既然是数组,那么下标必然从0开始,bit只有两种取值,要么为0,要么为1:
而0和1正好对应开关的关闭和启用,即ON和OFF状态。之后开发者只需定义好每个开关所在的Bit数组的索引号和状态即可,这样后续就可以通过判断开关的状态来实现对功能的控制:
可以看到使用这种方式所占用的内存空间非常少,理论上只需占用2n位的内存,n为开关的数量。
实战演示Java中对于Bit数组可以使用BitSet来实现 ,里面有很多方法,这里我们摘几个用到的方法:
12345678public class ...
使用Jenkins+Gitlab一键打包部署SpringBoot应用
写在前面在前面我们已经学会了如何通过使用Maven插件或者Dockerfile的方式,来将SpringBoot应用构建为Docker镜像并运行。当我们的应用数量较多时,还可以使用Docker Compose的方式,但是毫无疑问上面的种种还都只是手动部署,本篇来学习如何使用Jenkins和Gitlab来实现一键打包部署SpringBoot应用。
GitLabGitLab简介GitLab是一款开源的基于Git的版本仓库管理工具,开发者可以使用它来搭建属于自己的Git仓库。
GitLab安装第一步,下载GitLab的docker镜像:
1docker pull gitlab/gitlab-ce
第二步,创建对应目录:
123mkdir -p /mydata/gitlab/configmkdir -p /mydata/gitlab/logsmkdir -p /mydata/gitlab/data
第三步,启动GitLab服务:
1234567docker run -p 10443:443 -p 1080:80 -p 1022:22 \--name gitlab \--restart alway ...
使用Docker Compose部署SpringBoot应用
写在前面在前面我们已经学会了如何通过使用Maven插件或者Dockerfile的方式,来将SpringBoot应用构建为Docker镜像并运行,但是当我们的应用数量较多时,上述两种方式似乎变得很不友好。
此时可以使用Docker Compose来解决上述问题,Docker Compose是一个用于定义和运行多个docker容器应用的工具。使用Compose允许开发者使用YAML文件来配置应用服务,之后使用一个命令,就可以部署配置的所有服务。
安装Docker Compose下载Docker Compose使用如下命令来下载Docker Compose:
1curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
修改下载文件的权限将下载文件的权限设置为可执行:
1chmod +x /usr/local/bin/docker-compose
确认Docker C ...
使用Dockerfile为SpringBoot应用构建Docker镜像
写在前面在部署第一篇中,我们学习了如何使用通过docker-maven-plugin来构建docker镜像,遗憾的是此方式需要依赖自建的Registry镜像仓库,这在实际开发过程中还是有困难的。
鉴于此,本篇来学习另一种方式,使用Dockerfile来构建docker镜像。注意此方式不需要依赖自建的镜像仓库,只需应用的jar包和一个Dockerfile文件。
本篇在第二篇《整合Swagger-UI实现在线API文档》的基础上,使用Dockerfile为SpringBoot应用构建Docker镜像。
Dockerfile常用指令FROMFROM用于指定所需依赖的基础镜像,格式如下:
1FROM <image>:<tag>
举个例子,如某个镜像需要依赖java8的镜像:
1FROM java:8
注意FROM命令必须放在Dockerfile文件的第一行。
MAINTAINERMAINTAINER用于指定镜像维护者的名字,格式如下:
1MAINTAINER <name>
举个例子,如某个镜像的维护者为kenbings:
1MAINTAINER kenbin ...
使用Maven插件为SpringBoot应用构建Docker镜像
写在前面本篇在第二篇《整合Swagger-UI实现在线API文档》的基础上,使用Maven插件为SpringBoot应用构建Docker镜像,并上传至私有镜像仓库Docker Registry中。
Docker Registry开发者可以使用Docker提供的registry这一镜像来搭建属于自己的私有仓库,这里选择版本为2的镜像即可,先将其下载到本地:
1docker pull registry:2
这里有它的快速使用方法,其实就是一条命令:
执行下面的命令即可创建一个私有仓库:
1docker run -d -p 5000:5000 --restart=always --name registry2 registry:2
Docker开启远程API打开docker.service文件:
1vi /usr/lib/systemd/system/docker.service
将其中的如下代码:
1ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
修改为如下所示:
1Exec ...
整合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的 ...
