前言在之前的图床开发中撸主曾使用了分布式文件服务FASTDFS和阿里云的OSS对象存储来存储妹子图。奈何OSS太贵,FASTDFS搭建配置又太繁琐,今天给大家推荐一款极易上手的高性能对象存储服务MinIO。简介MinIO是高性能的对象存储,兼容AmazonS3接口,充分考虑开发人员的需求和体验;支持分布式存储,具备高扩展性、高可用性;部署简单但功能丰富。官方的文档也很详细。它有多种不同的部署模式(单机部署,分布式部署)。为什么说MinIO简单易用,原因就在于它的启动、运行和配置都很简单。可以通过docker方式进行安装运行,也可以下载二进制文件,然后使用脚本运行。安装推荐使用docker一键安
前言阅读本文需要一定的前后端开发基础,前后端分离已成为互联网项目开发的业界标准使用方式,通过Nginx代理+Tomcat的方式有效的进行解耦,并且前后端分离会为以后的大型分布式架构、弹性计算架构、微服务架构、多端化服务(多种客户端,例如:浏览器,小程序,安卓,IOS等等)打下坚实的基础。这个步骤是系统架构从猿进化成人的必经之路。其核心思想是前端页面通过AJAX调用后端的API接口并使用JSON数据进行交互。原始模式开发者通常使用Servlet、Jsp、Velocity、Freemaker、Thymeleaf以及各种框架模板标签的方式实现前端效果展示。通病就是,后端开发者从后端撸到前端,前端只负
前言妹子图小程序上线以来,小伙伴们热情高涨,高峰时段达到了1500PV,当然时间粒度是小时。为了各位小伙伴们能有更好的体验,撸主决定给小程序接入redis缓存。方案pom.xml引入:<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.5.RELEASE</version><relativePath/></parent
前言前段时间做了一个图床的小项目,安全框架使用的是Shiro。为了使用户7x24小时访问,决定把项目由单机升级为集群部署架构。但是安全框架shiro只有单机存储的SessionDao,尽管Shrio有基于Ehcache-rmi的组播/广播实现,然而集群的分布往往是跨网段的,甚至是跨地域的,所以寻求新的方案。架构方案使用redis集中存储,实现分布式集群共享用户信息,这里我们采用第三方开源插件crazycake来实现,pom.xml引入:<dependency><groupId>org.springframework.boot</groupId><art
前言参数如何校验?撸主很久很久之前的项目都是在前端页面一个个ifelse的,后来就用了一系列的前端校验框架,比如layuiiview等等,几个样式属性就可以轻松搞定,的确是美滋滋。后端验证那么问题来了?前端已经验证了,后端还有必要验证吗?如果非要有个结果,答案只能是不安全的。虽然客户端自己对自己已经做了验证,但是你不能避免一些恶意用户人为的修改表单直接发送欺骗请求。所以说,从安全的角度来说,单纯的依靠前端验证,是不安全的,任何健壮的系统都必须在后端进行验证。当然,你也不必担心后台再写一坨ifelse,这里推荐大家一款参数校验神器Hibernate-Validator。SpringBoot的标配
前言异常怎么处理?撸主很久之前的项目都是在Controller层一个个try的,之后也曾自己写过AOP实现异常拦截处理。不过,这里给小伙伴推荐一款统一处理异常神器。代码案例微服务、前后端分离的时代,应该很少有小伙伴使用模板了吧,大多都是返回Json数据。墙裂推荐大家使用@RestControllerAdvice,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。异常处理器/***异常处理器*/@RestControllerAdvicepublicclassRrExceptionHandler{p
前言SpringBootAdmin就是将SpringBootActuator中提供的endpoint信息可视化表示,并且可以通过邮件、Telegram、Hipchat等发送告警消息。集成注意一定要版本对应,否则会出现意想不到的问题,建议使用SrpingBootAdmin2.0+以上版本,可以多语言切换。父项目pom.xml引入:<modules><module>admin-server</module><module>admin-client</module></modules><parent><grou
前言在项目开发中,内部服务通常我们会采用PRC的方式进行调用,消费者和提供者统一引入第三方开源框架Dubbo,然后再配置个注册中心,真香!然而,项目中经常也会调用一些外部服务,比如短信、天气或者是撸主小黄图中的鉴黄,这时候Dubbo就显得有点无能为力了。撸主之前用的是SpringBoot自带的RestTemplate,今天与大家来聊一聊SpringCloud家族的Feign。简介Feign是Netflix开发的声明式、模板化的HTTP客户端,Feign可帮助我们更加便捷、优雅地调用HTTPAPI。SpringCloud对Feign进行了增强,使其支持SpringMVC注解,另外还整合了Ribb
前言为了存我的小黄图,最近在做一款图床服务,集成了各种第三方云存储服务,目前正在内部测试阶段。项目是以Jar的形式运行在腾讯云上,不要问我为什么使用腾讯云了,因为阿里云老用户和狗不得入内。问题凸显因为内测期间代码逻辑会经常变动,这就免不了重新打包上传,虽然家庭是百兆带宽,奈何云服务器上行带宽有限制啊,总有那么几分钟不开心。瘦身之旅瘦身前,项目差不多得54MB的样子,以后可能越来越肥胖!!!那怎么办?程序员作为一个懒人职业,总会想到一些办法来搞定问题。首先我们正常打包,解压Jar包,把BOOT-INF目录下的lib目录拷贝出来,这个后面会用到。然后排除项目第三方依赖包,pom.xml引入:<
前言为了管理我的小黄图,特别安排了一个后台管理系统,权限管理当然是首选Shiro了。表设计至少需要以下几张表,具体如何设计要视自己的业务而定:sys_user:用户表sys_role:角色表sys_menu:菜单表sys_user_role:用户对应角色sys_role_menu:用户对应菜单整合pom.xml引入:<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-web-starter</artifactId><versio
前言开发这么多年,肯定还有不少小伙伴搞不清各种类型的参数是如何传递的,很多同学都是拿来即用,复制粘贴一把撸,遇到问题还是一脸懵逼。姿势学习参数传递的正确姿势,先说怎么做,再说为什么,本质上还是复制粘贴一把撸,问题是你想问不想问为什么!传递用户登录前端代码:varparam={"username":"admin","password":"admin"}$.ajax({url:"/sys/login",data:param,type:"post",dataType:"j
前言书接上回的《SpringBoot开发案例之微信小程序文件上传》,正常的业务流程是,口语测评需要学生通过前端微信小程序录入一段音频,通过调用第三方音频处理服务商进行评分,然后服务端对原始录音、标准录音以及评分信息进行存储,最终呈现给学生并用于复看以及复读。微信端index.wxml:<buttonbindtap="start"class='btn'>开始录音</button><buttonbindtap="pause"class='btn'>暂停录音</button><buttonbindtap=&
前言最近在做一个口语测评的小程序服务端,小程序涉及到了音频文件的上传,按理说应该统一封装一个第三方上传接口服务提供给前端调用,但是开发没有那么多道理,暂且为了省事就封装到后端服务中去了。这篇文章需要用到前面所讲的知识点《SpringBoot开发案例之配置静态资源文件路径》,请仔细阅读如何自定义静态资源路径,最好做到服务跟文件分离。文件上传前端小程序代码wx.uploadFile({url:'https://example.weixin.qq.com/upload',//示例,非真实的接口地址filePath:'/static/itstyle.mp3',//默认小程序内音频路径,也可以自己上传n
前言最近,被推送了不少秒杀架构的文章,忙里偷闲自己也总结了一下互联网平台秒杀架构设计,当然也借鉴了不少同学的思路。俗话说,脱离案例讲架构都是耍流氓,最终使用SpringBoot模拟实现了部分秒杀场景,同时跟大家分享交流一下。秒杀场景秒杀场景无非就是多个用户在同时抢购一件或者多件商品,专用词汇就是所谓的高并发。现实中经常被大家喜闻乐见的场景,一群大妈抢购打折鸡蛋的画面一定不会陌生,如此场面让服务员大姐很无奈,赶上不要钱了。业务特点瞬间高并发、电脑旁边的小哥哥、小姐姐们如超市哄抢的大妈一般,疯狂的点着鼠标库存少、便宜、稀缺限量,值得大家去抢购,如苹果肾,小米粉,锤子粉(理解万岁)用户规模用户规模可
前言最近在做邮件发送的服务,正常来说SpringBoot整合mail还是很方便的,然而来了新的需求:A请求使用邮箱C发送,B请求使用邮箱D发送,也就是说我们需要配置两套发送服务。单实例首先我们来看下单个服务的配置:spring.mail.host=smtp.mxhichina.comspring.mail.username=admin@52itstyle.comspring.mail.password=123456spring.mail.properties.mail.smtp.auth=truespring.mail.properties.mail.smtp.starttls.enable=
前言在之前的Dubbo服务开发中,我们一般使用Zookeeper作为注册中心,同时还需要部署Dubbo监控中心和管理后台。Nacos注册中心Nacos是阿里巴巴的开源的项目,全称NamingConfigurationService,专注于服务发现和配置管理领域。Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos生态图如Nacos全景图所示,Nacos无缝支持一些主流的开源生态,例如SpringCloudApacheDubboandDubboMeshTODOKubernetesandCNCFT
前言在开发过程中,通常我们会配置一些参数来实现某些功能,比如是否开启某项服务,告警邮件配置等等。一般会通过硬编码、配置文件或者数据库的形式实现。那么问题来了,如何更加优雅的实现?欢迎来到Nacos的世界!Nacos配置管理Nacos是阿里巴巴的开源的项目,全称NamingConfigurationService,专注于服务发现和配置管理领域。Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos生态图如Nacos全景图所示,Nacos无缝支持一些主流的开源生态,例如SpringCloudApac
前言在分布式系统中,为了提升系统性能,通常会对单体项目进行拆分,分解成多个基于功能的微服务,如果有条件,可能还会对单个微服务进行水平扩展,保证服务高可用。那么问题来了,如果使用传统管理Session的方式,我们会遇到什么样的问题?案例这里拿下单举例,用户小明在天猫上相中了一个的娃娃,觉得不错,果断购买,选尺寸,挑身高,然后确认选择,赶紧提交订单,然后就跳转到了登录页面!小明表示很郁闷,大写的问号???小明进入娃娃页面,此时请求通过代理服务发送到业务系统一。小明选尺寸,挑身高,此操作并没有对后端服务发送请求。小明提交订单,此时请求通过代理服务发送到业务系统二,然鹅,二系统此时并没有查询到小明的登
前言纯粹为了记录,如果,恰巧与你遇到的是一个问题,可以通过以下方法解决你的问题,那么对于你我来说都是一件非常开心的事情。问题内网IT部门给了一个邮箱账号,不需要使用密码就可以在内网发送邮件,当然只能发内部企业邮件,企鹅、163之类的是不可以的。发送邮件用的starter版本如下,请对号入座:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId><version>1.5.1
前言使用过SpringBoot的小伙伴都应该知道,SpringBoot通过引入一些Starter大大简化了项目配置。下面以邮件发送为例,来分析一下Starter是如何简化配置,并简要说明一下初始化加载方式。SpringMvc发送邮件首先,我们来看一下,在没使用SpringBoot之前,我们是如何发送邮件的。mail.properties配置:mail.host=smtp.52itstyle.vipmail.username=admin@52itstyle.vipmail.password=123456mail.from=345849402@qq.comspring.xml添加配置信息:<
前言最近在做工作流的事情,正好有个需求,要添加一个附件上传的功能,曾找过不少上传插件,都不是特别满意。无意中发现一个很好用的开源web文件管理器插件elfinder,功能比较完善,社区也很活跃,还方便二次开发。环境搭建软件地址SpringBoothttps://spring.io/projects/spring-boot/elFinderhttps://studio-42.github.io/elFinder/项目截图周末抽时间做了一个简单的案例,希望对大家有所帮助,下面是简单的项目截图。项目功能在线新建目录、文件、附件上传、下载、预览、在线打包,图片在线裁剪、编辑,实现列表试图、图标视图等等
前言在项目开发中,对于异常处理我们通常有多种处理方式,比如:控制层手动捕获异常,拦截器统一处理异常。今天跟大家分享一种注解的方式,统一拦截异常并处理。异常处理在spring3.2中,新增了@RestControllerAdvice注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。创建RRExceptionHandler,并添加@RestControllerAdvice注解,来这样就可以拦截所有控制层上抛出来的异常。/***异常处理器*创建时间2017年11月20日*/@RestContro
前言由于业务需要,需要在拦截器中操作Redis缓存,按照controller,service层配置发现无法注入,一直报空指针异常。解决方案@ConfigurationpublicclassMyWebAppConfigurerextendsWebMvcConfigurerAdapter{/***将自定义拦截器作为Bean写入配置*@return*/@BeanpublicSysInterceptorsysInterceptor(){returnnewSysInterceptor();}/***对拦截器注册*/@OverridepublicvoidaddInterceptors(Intercepto
前言在秒杀案例进入实际生产环境中,需要实时或定期监控服务的可用性。SpringBoot的actuator(健康监控)功能提供了很多监控所需的接口,可以对应用系统进行配置查看、相关功能统计等。集成pom.xml中引入以下:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>application.properties配置如下:#监控的HT
前言在SpringBoot很火热的时候,阿里巴巴的分布式框架Dubbo不知是处于什么考虑,在停更N年之后终于进行维护了。在之前的微服务中,使用的是当当维护的版本Dubbox,整合方式也是使用的xml配置方式。改造前之前在SpringBoot中使用Dubbox是这样的。先简单记录下版本,Dubbox-2.8.4、zkclient-0.6、zookeeper-3.4.6。项目中引入spring-context-dubbo.xml配置文件如下:<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns=&q
前言在实际生产环境中中,通常生产者和消费者会是两个独立的应用,这样才能通过消息队列实现了服务解耦和广播。因为此项目仅是一个案例,为了方便期间,生产和消费定义在了同一个项目中。安装说明参考:Docker学习之搭建ActiveMQ消息服务基础配置pom.xml添加依赖:<!--activemq--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-activemq</artifactId></dep
前言最近在做一款秒杀的案例,涉及到了同步锁、数据库锁、分布式锁、进程内队列以及分布式消息队列,这里对SpringBoot集成Kafka实现消息队列做一个简单的记录。Kafka简介Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的
前言前几篇文章着重介绍了后端服务数据库和多线程并行处理优化,并示例了改造前后的伪代码逻辑。当然了,优化是无止境的,前人栽树后人乘凉。作为我们开发者来说,既然站在了巨人的肩膀上,就要写出更加优化的程序。SpringBoot开发案例之JdbcTemplate批量操作SpringBoot开发案例之CountDownLatch多任务并行处理改造理论上讲,线程越多程序可能更快,但是在实际使用中我们需要考虑到线程本身的创建以及销毁的资源消耗,以及保护操作系统本身的目的。我们通常需要将线程限制在一定的范围之类,线程池就起到了这样的作用。程序逻辑一张图能解决的问题,就应该尽可能的少BB,当然底层原理性的东西还
前言最近在做一个原始成绩统计的功能,用户通过前台设置相关参数,后台实时统计并返回数据。相对来说统计功能点还是比较多的,这里大体罗列一下。个人排名本次测试的优良线、及格线、低分线各个班级的排名人数(1-25、26-50类比等等)各个班级的前X名人数统计(前10、前20类比等等)各个班级的分数段学生人数统计(150-140、139-130类比等等)最好的用户体验,就是每一个操作都可以实时的展示数据,3秒之内应该是用户的忍受范围之内的了,所以做一款产品不仅要考虑用户交互设计,后端的优化也是比不可少的。大家可以简单的看下以上这5项统计数据,总体来说,统计量还是不少的。最主要的还是要实时、实时、实时(重
前言在我们做后端服务Dao层开发,特别是大数据批量插入的时候,这时候普通的ORM框架(Mybatis、hibernate、JPA)就无法满足程序对性能的要求了。当然我们又不可能使用原生的JDBC进行操作,那样尽管效率会高,但是复杂度会上升。综合考虑我们使用Spring中的JdbcTemplate和具名参数namedParameterJdbcTemplate来进行批量操作。改造前在开始讲解之前,我们首先来看下之前的JPA是如何批量操作的。实体类User:publicclassAppStudent{privateIntegerid;privateIntegerclassId;privateStri