项目简介
项目背景
1)电商模式
2)谷粒商城
是一个B2C模式的电商平台,销售自营商品给客户。
架构图
1)项目微服务架构图
客户端->nginx集群->网关集群
2)微服务划分图
项目特色
- 前后端分离开发,并开发基于vue的后台管理系统
- SpringCloud全新的解决方案
- 应用监控、限流、网关、熔断降级等分布式方案,全方位涉及
- 透彻讲解分布式事务、分布式锁等分布式系统的难点
- 分析高并发场景点编码方式,线程池,异步编排等使用
- 压力测试与性能优化
- 各种集群技术等区别以及使用
- CI/CD使用
项目前置要求
- 熟悉SpringBoot以及常见整合方案
- 了解SpringCloud
- 熟悉git、maven
- 熟悉linux,redis,docker基本操作
- 了解html,css,js,vue
- 熟练使用idea开发项目
分布式基础概念
微服务
微服务架构风格,就像是把一个单独的应用程序开发为一套小服务,每个小服务运行在自己的进程中,并使用轻量级通信机制,通常是HTTP API,这些服务围绕业务能力来构建,并通过完全自动化部署机制来独立部署。这些服务使用不同的语言编写,以及不同的数据存储技术,并保持最低限度的集中式管理。
拒绝大型单体应用,基于业务边界进行服务微化拆分,各个服务独立部署允许
集群、分布式、节点
集群是个物理状态,分布式是个工作方式。
只要是一堆机器,就可以叫做集群,他们是不是一起协作干活,这个谁也不知道
《分布式系统原理与范型》定义:
分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个系统,分布式系统是建立在网络之上的软件系统。
分布式是指将不同的业务分布在不同的地方。
集群是指将几台服务器集中在一起,实现同一业务。
例如:京东是一个分布式系统,众多业务运行在不同的机器,所有业务构成一个大型的业务集群。
每个业务系统可以单独进行扩缩容,做集群。
分布式中每个节点,都可以做集群,而集群并不一定就是分布式。
节点:集群中的一个服务器。
远程调用
分布式系统各个服务可能处于不同的主机,但是服务之间不可避免的需要互相调用,就是远程调用。
Spring Cloud默认使用HTTP+JSON的方式完成远程调用
负载均衡
分布式系统中,A服务需要调用B服务,B服务在多台机器都存在,A调用任意一个服务器均可完成功能。
为了使每个服务器都不要太忙或太闲,我们可以负载均衡调用每一个服务器,提升网站的健壮性。
常见负载均衡算法:
轮询
最小连接
散列
服务注册/发现&注册中心
对服务上下线感知,服务发现,从而避免调用不可用的服务
配置中心
配置集中管理,变更动态配置,实时生效
集中管理微服务的配置信息
服务熔断降级
微服务架构中,微服务之间通过网络通信,存在相互依赖,当其中一个服务不可用时,有可能会造成雪崩效应,要防止这样的情况,必须要有容错机制来保护服务。
1)服务熔断
设置服务的超时,当被调用的服务经常失败达到某个阈值,我们可以开启断路器保护机制,后来的请求不再去调用这个服务。本地直接返回默认的数据。
2)服务降级
在运维期间,当系统处于高峰期,系统资源紧张,我们可以让非核心业务降级运行。
降级:某些服务不处理,或者简单处理(抛异常、返回NULL、调用Mock数据、调用Fallback处理逻辑)
API网关
提供客户端负载均衡,服务自动熔断,灰度发布,统一认证,限流流控,日志统计等功能。解决API管理难题。
环境搭建
下载安装Centos7
阿里云镜像下载地址https://mirrors.aliyun.com/centos/7.8.2003/isos/x86_64/
安装过程省略
配置仓库:
1)备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
2)下载新的 CentOS-Base.repo 到 /etc/yum.repos.d/
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
3)运行 yum makecache 生成缓存
参考阿里云Centos镜像配置
https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.3e221b11lumMFr
安装Docker
官网参考地址:https://docs.docker.com/engine/install/centos/
1)写在旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2)设置仓库
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
3)安装DOCKER ENGINE
sudo yum install docker-ce docker-ce-cli containerd.io
4)运行Docker
sudo systemctl start docker
5)开机启动Docker
sudo systemctl enable docker
配置Docker阿里云镜像加速
https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.3e221b11qdbJJS
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://q10nwbtl.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker安装MySQL
1)下载镜像文件
sudo docker pull mysql:5.7
查看下载的镜像文件docker images
2)创建实例并启动
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
端口映射 -
--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
以后台方式启动,以mysql:5.7
镜像启动
- 查看运行的容器
docker ps
- 进入容器内部
docker exec -it 容器id/容器名 /bin/bash
docker exec -it mysql /bin/bash
- 从宿主机连mysql容器
运行mysql容器后,可以在宿主机上连mysql
首先查看CentOS的IP
使用mysql客户端工具连接mysql server
配置字符集
在/mydata/mysql/conf
目录新建文件my.cnf,内容如下:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
重启mysql容器
docker restart mysql
参数mysql是容器的别名
查看所有容器
docker container ls -a
Docker安装Redis
1)下载镜像文件
docker pull redis
2)创建实例并启动
mkdir -p /mydata/redis/conf
cd /mydata/redis/conf
touch 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