主页

55.前后端分离时代,Java 程序员的变与不变!

事情的起因是这样的,有个星球的小伙伴向邀请松哥在知乎上回答一个问题,原题是: 前后端分离的时代,Java后台程序员的技术建议? 松哥认真看了下这个问题,感觉对于初次接触前后端分离的小伙伴来说,可能都会存在这样的疑问,于是决定通过这篇文章和大家聊一聊这个话题。 我这里还是尽量从一个 Java 程序员的角度来说说这个问题,这样大家可能更好理解。 55.1 从一个题外话开始 很多小伙伴可能知道,松哥本科是经管学院的,亚当•斯密的《国富论》多多少少还是了解一点。书中提到人类社会的本质就是分工协作,亚当•斯密认为人类之间的专业分工可以极大的提高生产力、创造财富,专业分工也是工业革命的基础。人类社会的发展过程就是一个专业分工不断细化、不断深化的过程,从最早的农牧分家到手工业农业分...

阅读更多

54.简化微人事部署,Flyway 搞起来

虽然我之前录了一个微人事部署视频(新版微人事部署教程来啦),但是由于这次升级涉及到了 Redis 和 RabbitMQ,所以在本地跑微人事还是一件比较麻烦的事情,有的小伙伴甚至部署失败,所以我也一直在尝试简化部署步骤,这两天给项目加了 Flyway,数据库准备这块算是得到了一定程度简化。 今天就和大家来大致说说 Flyway 的用法,以及如何在微人事中使用 Flyway。 54.1 什么是 Flyway 我们在公司做开发时,由于项目需求的变化,或者前期设计缺陷,导致在后期需要修改数据库,这应该是一个比较常见的事情,如果项目还没上线,你可能把表删除了重新创建,但是如果项目已经上线了,就不能这样简单粗暴了,我们需要通过 SQL 脚本在已有数据表的基础上进行升级。 目前 Java 这...

阅读更多

53.Spring Boot 整合 RabbitMQ,消息重复消费怎么办?

昨天跟小伙伴们分享了如何在 RabbitMQ 中确保消息发送可靠性的问题(我是如何在微人事项目中提高RabbitMQ消息可靠性的?),我们主要是两个思路: 开启消息发送失败回调,路由失败回调 开启定时任务巡查,发现有发送失败的消息自动重新投递 双管齐下,我们确保了消息发送的可靠性。 但是,在这样的机制下,又带来了新的问题,就是消息可能会重复投递,进而导致,消息重复消费,例如一个员工入职了,结果收到了两封入职欢迎邮件,这是不对的,所以,今天松哥又给大家带来了一个新的视频,聊一聊如何确保一条消息只消费一次。 说到这个话题,我们就不得不先来说说消息幂等性。 53.1 简单说说幂等性 幂等性本身是数学上的概念,即使公式:f(x)=f(f(x)) 能够成立的数学性质。在开...

阅读更多

52.如何在微人事中提高消息中间件RabbitMQ可靠性的

hello 各位小伙伴大家好,松哥在最新版的微人事中集成进来了消息中间件 RabbitMQ,结合 RabbitMQ 搭建了独立的邮件服务器 mailserver。 当 hr 向系统中录入一个员工时,录入成功后,系统会自动向消息中间件 RabbitMQ 发送一条消息,这条消息包含了新入职员工的基本信息,然后 mailserver 则专门用来从 RabbitMQ 上消费消息,根据收到的消息,自动的发送一封入职欢迎邮件。 由于邮件发送是一个耗时操作,在旧版微人事里边我当时为了省事直接上的多线程,但是这种方式不易扩展,无法解耦,用过就知道这有多么不方便了。引入 RabbitMQ 之后,有效的实现了系统的解耦,在未来你可能有更多的地方需要发送邮件、短信等,把这些邮件发送、短信发送的服务拎出来...

阅读更多

51.前后端分离以及Vue.js入门

松哥的书里边,其实有涉及到 Vue,但是并没有详细说过,原因很简单,Vue 的资料都是中文的,把 Vue.js 官网的资料从头到尾浏览一遍该懂的基本就懂了,个人感觉这个是最好的 Vue.js 学习资料 ,因此在我的书里边就没有多说。但是最近总结小伙伴遇到的问题,感觉很多人对前后端分离开发还是两眼一抹黑,所以今天松哥想和大家聊一下前后端分离以及 Vue.js 的一点事,算是一个简单的入门科普吧。 51.1 前后端不分 后端模板:Jsp、FreeMarker、Velocity 前端模板:Thymeleaf 前后端不分,Jsp 是一个非常典型写法,Jsp 将 HTML 和 Java 代码结合在一起,刚开始的时候,确实提高了生产力,但是时间久了,大伙就发现 Jsp 存在的问...

阅读更多

50.使用 Nginx 部署前后端分离项目,解决跨域问题

前后端分离这个问题其实松哥和大家聊过很多了,上周松哥把自己的两个开源项目部署在服务器上以帮助大家可以快速在线预览(喜大普奔,两个开源的 Spring Boot + Vue 前后端分离项目可以在线体验了),然后群里就有小伙伴想让松哥来聊聊如何结合 Nginx 来部署前后端分离项目?今天我们就来聊一聊这个话题。 50.1 不得不说的跨域 很多人对前后端分离部署感到困惑,其实主要是困惑跨域问题怎么解决。因为前后端分离项目在开发的时候,前端通过 nodejs 来运行,需要一个单独的端口,后端通过 Tomcat 或者 Jetty 来运行,也需要端口,两个不同的端口,就造成了跨域。 但是松哥之前多次和大家聊过这个问题,这种跨域并不是我们传统开发中真正的跨域,这个所谓的跨域只在开发环境中存在,...

阅读更多

49.前后端分离开发中动态菜单的两种实现方案

关于前后端分离开发中的权限处理问题,松哥之前写过一篇文章和大家聊这个问题: Spring Boot + Vue 前后端分离开发,权限管理的一点思路 但是最近有小伙伴在学习微人事项目时,对动态菜单这一块还是有疑问(即不同用户登录成功后会看到不同的菜单项),因此松哥打算再来写一篇文章和大家聊一聊前后端分离开发中的动态菜单问题。 49.1 一个原则 做权限管理,一个核心思想就是后端做权限控制,前端做的所有工作都只是为了提高用户体验,我们不能依靠前端展示或者隐藏一个按钮来实现权限控制,这样肯定是不安全的。 就像用户注册时需要输入邮箱地址,前端校验之后,后端还是要校验,两个校验目的不同,前端校验是为了提高响应速度,优化用户体验,后端校验则是为了确保数据完整性。权限管理也是如此,...

阅读更多

48.Spring Boot+Vue 如何避免前端页面 404

问题倒不难,但是这个问题之前被松哥忽略了。前两天有小伙伴提出这个疑问,我觉得有必要写篇文章和大家捋一捋这个问题。 先来看一个简短的视频: 一个简单的配置就解决掉 404 问题了,接下来,我再来把这件事的来龙去脉和大家仔细捋一捋。 48.1 职责划分 在传统的前后端不分的开发中,权限管理主要通过过滤器或者拦截器来进行(权限管理框架本身也是通过过滤器链来实现功能),如果用户不具备某一个角色或者某一个权限,则无法访问某一个页面。 但是在前后端分离中,页面的跳转统统交给前端去做,后端只提供数据,这种时候,权限管理不能再按照之前的思路来。 首先要明确一点,前端是展示给用户看的,所有的菜单显示或者隐藏目的不是为了实现权限管理,而是为了给用户一个良好的体验(把用户没有权限的按钮隐藏起...

阅读更多

47.Spring Security 登录成功后获取不到用户信息?

有好几位小伙伴小伙伴曾向松哥求助过这个问题。 一开始我觉得这可能是一个小概率 BUG,但是当问的人多了,我觉得这个问题对于新手来说还有一定的普遍性,有必要来写篇文章跟大家仔细聊一聊这个问题,防止小伙伴们掉坑。 47.1 问题复现 如果使用了 Spring Security,当我们登录成功后,可以通过如下方式获取到当前登录用户信息: SecurityContextHolder.getContext().getAuthentication() 在 Controller 的方法中,加入 Authentication 参数 这两种办法,都可以获取到当前登录用户信息。具体的操作办法,大家可以看看松哥之前发布的教程:Spring Security 如何动态更新已登录用户信息?...

阅读更多

46.前后端分离中,使用 JSON 格式登录

流程做微人事的小伙伴(https://github.com/lenve/vhr),应该都发现了在微人事中有一个极为特殊的请求,那就是登录。 登录请求是一个 POST 请求,但是数据传输格式是 key/value 的形式。整个项目里就只有这一个 POST 请求是这样,其他 POST 请求都是 JSON 格式的数据。 为什么做成这个样子呢?还是懒呗。 因为 Spring Security 中默认的登录数据格式就是 key/value 的形式,一直以来懒得改。最近刚好在录 Spring Security,就抽空把这里调整了下,这样前后端就能统一起来了。 好了,我们一起来看下怎么实现。 46.1 服务端接口调整 首先大家知道,用户登录的用户名/密码是在 UsernamePasswo...

阅读更多