文章目录
前言
本文记录学习SpringCloud微服务学习的过程,通过B站视频《谷粒商城》项目进行学习。
技术架构为:
- 后端:
Springboot + SpringCloud + Docker - 前端:
Vue + Element-ui
一、什么是微服务?
1.微服务简介
将大型单体应用,基于业务进行服务拆分,每个服务独立部署运行,互不影响。
2.集群、分布式、节点
集群:
多台服务器,实现相同的业务
分布式:
将不同业务部署在不同的服务器上
分布式中的每一个节点,都可以做集群。而集群并不一定就是分布式
3.远程调用
在分布式系统中,由于不同服务部署在不同的地方,在服务之间需要进行通讯。
SpringCloud中使用HTTP+JSON的方式进行远程调用,可以通过不同语言不同平台进行传输,兼容性高。
4.负载均衡
在服务集群中,为了使集群中每个服务器充分利用,采用负载均衡的方式调用独立服务器。
常用负载均衡算法:
轮询:从服务器健康池中选择第一个服务器分配给第一个请求,然后按顺序依次向后选择,到最后以后从新开始循环。
最小连接:优先选择连接数最少的服务器,在会话时间较长优先选择该方式。
散列:相同IP地址连接相同的服务器,保证特定用户能连接到相同的服务器。如果应用需要处理状态而要求用户连接到相同的服务器,可以采用该方式。
5.服务注册/发现、注册中心
由于有很多的服务,避免调用到不可用(不在线)的服务,为了感知每个服务的状态,在服务上线时,会在注册中心注册这个服务。在调用某个业务服务时会在注册中心查询相关服务进行调用。
6.配置中心
每个业务都有大量的配置,而这个业务又会放在多个服务器形成集群,修改配置后需要在大量服务器上修改配置,这样及其不方便。因此才会有配置中心用来给服务进行管理服务配置。
7.服务熔断、服务降级
- 服务熔断
设置服务的超时,当被调用的服务经常失败达到某个阈值,启用断路保护机制,之后的请求不再去调用这个服务,本地直接返回默认数据。
- 服务降级
在运维期间,当系统处于高压状态,资源紧张,让非核心业务进行降级运行,被降级的业务将不处理或者简单处理(抛异常、返回NULL、调用Mock数据、调用Fallback处理逻辑)
8.API网关
对所有请求进行拦截并处理,保证服务的正常运行,其中处理包括:负载均衡、服务自动熔断、灰度发布、统一认证、限流流控、日志统计等公共功能,解决API管理困难。
二、项目架构
- 微服务架构图
- 微服务划分图
三、环境配置
配置开发环境,在虚拟机中进行,虚拟机采用centos9这个版本,在虚拟机中安装docker,在docker中安装mysql等软件。
- 安装虚拟机
我在VM中安装虚拟机,具体安装可网上查询,版本选择centos9这个版本
- 安装Docker-CE(社区版)
- Docker官网给了各种虚拟机的安装流程,我安装的是CentOS版本的
CentOS安装流程- 启动Docker
sudo systemctl start docker(这里sudo是以管理员身份启动,可以使用“su root”命令进入管理员模式)- 设置开机自启
sudo systemctl enable docker- 配置镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-‘EOF’ { “registry-mirrors”: [“https://82m9ar63.mirror.aliyuncs.com”]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
- 在Docker安装mysql
- docker pull mysql:5.7
- 创建实例并启动
docker run -p 3306:3306 --name mysql
-v /mydata/mysql/log:/var/log/mysql
-v /mydata/mysql/data:/var/lib/mysql
-v /mydata/mysql/conf:/etc/mysql
-e MYSQL_ROOT_PASSWORD=root
-d mysql:5.7
参数说明
-p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口
-v /mydata/mysql/conf:/etc/mysql:将配置文件夹挂载到主机
-v /mydata/mysql/log:/var/log/mysql:将日志文件夹挂载到主机
-v /mydata/mysql/data:/var/lib/mysql/:将配置文件夹挂载到主机
-e MYSQL_ROOT_PASSWORD=root:初始化 root 用户的密码- 配置自启动
docker update mysql --restart=always- 连接mysql
查看虚拟机ip使用命令 :ifconfig -a
然后我这里使用navicat连接数据库进行可视化
- 在Docker安装redis
- docker pull redi
- 创建实例并建立配置文件并启动实例
mkdir -p /mydata/redis/conf
touch /mydata/redis/conf/redis.conf
docker run -p 6379:6379 --name redis -v /mydata/redis/data:/data
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf
-d redis redis-server /etc/redis/redis.conf- 持久化储存(修改配置文件)
docker exec -it redis redis-cli
输入“i”进入插入模式
appendonly yes(开启持久化)
“ESC"输入”:wq"保存退出
exit (退出redis)- redis可视化
这里我是用IDEA的插件 “redis” 可以直接可视化redis
- 新建项目
JDK使用1.8,springboot使用2.7.8
后台管理使用码云开源项目“renren-fast"
前台使用”renren-fast-vue“
后台项目中给了sql的文件
- 微服务划分与创建
根据服务划分图创建对应服务,其中common为全局服务,储存公共bean和依赖等
- 利用码云开源项目"renren-generator"逆向出每个服务中表的CRUD功能
- 在配置文件中配置数据库信息
- 运行打开web页面后可选择对应表进行生成
- 将生成的代码替换完成代码生成
- 在配置文件配置数据源
spring: datasource: username: root password: root url: jdbc:mysql://192.168.8.124:3306/guli-pms driver-class-name: com.mysql.jdbc.Driver
- 配置mybatis-plus(关联xml文件和设置主键自增)
mybatis-plus: mapper-locations: classpath:/mapper/**/*.xml global-config: db-config: id-type: auto
- 主类扫描实体类
添加注解@MapperScan
@MapperScan(“com/smz/guli/product/dao”)- 启动服务