最新文章微服务框架学习笔记
微服务微服务是一种软件架构风格,它是以专注于单一职责的很多小型项目为基础,组合出复杂的大型应用。
微服务拆分什么时候拆分?
创业型项目:先采用单体架构,快速开发,快速试错。随着规模扩大,逐渐拆分。
确定的大型项目:资金充足,目标明确,可以直接选择微服务架构,避免后续拆分的麻烦。
怎么拆分?从拆分目标来说,要做到:
高内聚:每个微服务的职责要尽量单一,包含的业务相互关联度高、完整度高。
低耦合:每个微服务的功能要相对独立,尽量减少对其它微服务的依赖。
从拆分方式来说,一般包含两种方式:
纵向拆分:按照业务模块来拆分
横向拆分:抽取公共服务,提高复用性
黑马商城以黑马商城为例,原来所有业务都在一个单体项目里,现在我们可以把他拆分为以下五个微服务
用户服务
商品服务
订单服务
购物车服务
支付服务
下面是拆分完毕的项目结构,这里因为测试了负载均衡,所以启动了两个商品微服务实例
注册中心在微服务远程调用的过程中,包括两个角色:
服务提供者:提供接口供其它微服务访问,比如item-service
服务消费者:调用其它微服务提供的接口,比如cart-service
在大型微 ...
总结SpringBoot文件上传的几种方式
写在前面应用开发过程中,文件上传是一个基础的扩展功能,本文梳理一下在SpringBoot当中文件上传所涉及的技术及实现,内容主要包括两部分,上传到服务器本地,以前的文章已经写得比较详细了,包括了单文件、多文件的上传,可以跳转至SpringBoot随记了解,另一部分是使用对象存储服务(比如阿里OSS、MinIO等)来存储上传的文件,也是比较主流的一种方式,本站就是使用了腾讯云的对象存储服务搭建的静态网站,还有现在写了一半的一个外卖平台项目,其中菜品的图片资源就存储在阿里OSS上,项目仓库:xg-take-out。
MinIOMinIO是一款高性能高可用的文件系统服务。
可以使用下面的命令在本地的Docker部署一下
后台管理端口9090,文件上传端口9000
docker run -p 9000:9000 -p 9090:9090 --name minio -d -e "MINIO_ROOT_USER=xxxxx" -e "MINIO_ROOT_PASSWORD=xxxxx" -v C:/DockerVolumes/minio/data:/data -v C:/DockerVolumes ...
关于解决docker中nginx反向代理请求后端的502错误
场景在本地docker上用nginx部署项目前端的时候遇到的一个问题
页面可以正常预览,但是反向代理向后端发起请求时报502 Bad Gateway,如图
先看一下我nginx的配置
解决思路使用宿主机的postman直接测试后端接口是没问题的
确保后端服务正常运行的情况下,又去容器内部再测试了一下,发现无法向宿主机目标端口发出请求
观察日志可以发现使用docker部署时,127.0.0.1指向的是容器内部的ip
看了一下宿主机的ip地址是192.168.0.100,那么可以修改一下反向代理的配置
location /api/ {
proxy_pass http://192.168.0.100:8080/admin/;
tcp_nodelay on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-F ...
Linux随记
配置信息
Linux镜像:CentOS-7-x86_64-DVD-2009.iso
FinalShell:4.0.1 官网地址
VMware 17 Pro:仅做个人学习使用
本文主要根据黑马笔记,做了一定增删
前言前段时间一直在学习EE和deeplearning(没什么成效),今天开始换换口味学习一下Linux常用的命令,本文只对Linux部分常用的命令和指令进行记录,不涉及开发环境和软件的安装(建议移步CSDN)
配置VM固定IP修改子网IP和NAT设置中的网关IP
修改文件:vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static" # 改为static,固定IP
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no" ...
SpringSecurity学习笔记
前言上篇文章也说了,这两天我又把SpringSecurity看了一遍,记得之前看的时候就只看到加密然后被一个bug卡了一天就去看别的了,现在重新看顺便把之前没做完的笔记补一补,下面基本是根据三更草堂的笔记整理过来的
完整流程图
SpringSecurity的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤器
UsernamePasswordAuthenticationFilter:负责处理我们在登陆页面填写了用户名密码后的登陆请求。入门案例的认证工作主要有它负责。
ExceptionTranslationFilter:处理过滤器链中抛出的任何AccessDeniedException和AuthenticationException 。
FilterSecurityInterceptor:负责权限校验的过滤器。
Authentication接口: 它的实现类,表示当前访问系统的用户,封装了用户相关信息。
AuthenticationManager接口:定义了认证Authentication的方法
UserDetailsService接口:加载用户特定数据的核心接口。里面定义了 ...
关于从Redis中取缓存用户信息时报错ClassCastException
写在前面因为之前没有系统的看过SpringSecurity,而且之前在写微人事的时候没有采用JWT的认证方式,所以最近打算把SpringSecurity再重新看一遍,顺便熟悉一下怎么使用JWT的认证方式(不知道为什么是重新,之前好像也没怎么看过
demo介绍简单介绍一下,问题主要出在下面这两个地方
自定义的登录接口
调用ProviderManager的方法进行认证,如果认证通过生成jwt
把用户信息存入redis中,这里键值对中的键是"login:" + userid,值即是用户认证信息
认证部分没什么问题就略过不放了,存入redis核心代码如下
LoginUser loginUser = (LoginUser) authenticate.getPrincipal();
String userid = loginUser.getUser().getId().toString();
String jwt = JwtUtil.createJWT(userid);
redisCache.setCacheObject("login:" + userid, loginU ...
微人事复盘和前后端分离项目部署
项目原作者:江南一点雨
项目原地址:https://github.com/lenve/vhr
Github仓库:https://github.com/dongzhengru/vhr
演示地址:http://vhr.zhengru.top
本文是对于开发vhr中遇到的一些问题记录一下解决的思路,当然很多内容都来自于项目原作者,以及第一次部署前后端分离项目的记录
项目介绍微人事是一个前后端分离的人力资源管理系统,项目采用 SpringBoot+Vue 开发,项目加入常见的企业级应用所涉及到的技术点,例如 Redis、RabbitMQ 等。
项目技术栈后端技术栈
Spring Boot
Spring Security
MyBatis
MySQL
Redis
RabbitMQ
Spring Cache
WebSocket
...
前端技术栈
Vue
ElementUI
axios
vue-router
Vuex
WebSocket
vue-cli4
...
发现、解决的问题下面是一些我在开发过程当中发现了原作者的一些bug
权限组删除问题删除角色的时候,如果角色还有权限,那么权限并不会 ...
高数(下)公式
多元函数
空间几何向量
二重积分
曲线积分
格林公式
无穷级数
微分方程
关于接口请求地址末尾斜杠的问题
在做vhr的时候遇到的一个问题
先看一下,这是一个获取职位信息的接口
地址是/system/basic/pos
我们在postman中不加斜杠调用这个接口
可以发现报了404
如果末尾加上斜杠,才能获取到职位信息
在HTTP中,URL的结尾没有斜杠(/)时,表示请求的是一个具体的资源,比如一个HTML文件或一个图片
而如果URL以斜杠结尾,表示请求的是一个目录或者一个文件夹。
在Postman中,如果在请求URL的末尾没有加上斜杠,则Postman将其解释为文件资源而不是目录资源
因此,如果请求的是一个API接口,而且没有在末尾添加斜杠,则Postman会认为你要请求的是一个文件资源而不是API接口,因此就会返回404错误
而在浏览器中,如果请求URL的末尾没有斜杠,浏览器会自动添加斜杠并重新发送请求,即使你没有在URL的末尾添加斜杠,浏览器也可以正确地请求API接口
SpringSecurity随记
看的是B站三更草堂的课,包括下面的笔记基本上也都整理自UP给出的资料
SpringSecurity完整流程图中只展示了核心过滤器,其它的非核心过滤器并没有在图中展示
UsernamePasswordAuthenticationFilter
处理登陆页面用户名密码的登陆请求
ExceptionTranslationFilter
处理过滤器链中抛出的任何AccessDeniedException和AuthenticationException
FilterSecurityInterceptor
负责权限校验的过滤器
思路分析
登录
自定义登录接口
调用ProviderManager的方法进行认证 如果认证通过生成jwt
把用户信息存入redis中
自定义UserDetailsService
在这个实现类中去查询数据库
校验
定义Jwt认证过滤器
获取token
解析token获取其中的userid
从redis中获取用户信息
存入SecurityContextHolder
工具类添加工具配置类
实现核心代码实现创建一个类实现 ...