一、项目简介
1、项目背景
- 电商模式:市面上有 5 种常见的电商模式
B2B
、B2C
、C2B
、C2C
、O2O
;B2B
模式:B2B
(Business to Business
), 是指商家与商家建立的商业关系。 如:阿里巴巴B2C
模式:B2C
(Business to Consumer
), 就是我们经常看到的供应商直接把商品卖给用户,即“商对客” 模式,也就是通常说的商业零售,直接面向消费者销售产品和服务。如:苏宁易购、京东、 天猫、小米商城C2B
模式:C2B
(Customer to Business
),即消费者对企业。先有消费者需求产生而后有企业生产,即先有消费者提出需求,后有生产企业按需求组织生产C2C
模式:C2C
(Customer to Consumer
),客户之间自己把东西放上网去卖,如:淘宝,闲鱼O2O
模式:O2O
(Online To Offline
),也即将线下商务的机会与互联网结合在了一起,让互联网成为线下交易的前台。线上快速支付,线下优质服务。如:饿了么,美团,淘票票,京东到家
2 、谷粒商城
谷粒商城是一个 B2C
模式的电商平台,销售自营商品给客户。
3、项目架构图
-
项目微服务架构图
项目前后端分离开发,分为
内网部署
和外网部署
。-
外网部署
面向公众访问,部署前端项目,包括手机APP和电脑Web网站。
-
内网部署
整个后台服务集群。
公众使用客户端完成相应功能,比如登录、注册等,都需要通过客户端给后台服务发送请求。
-
-
微服务划分图
-
项目技术和特色
- 前后分离开发,并开发基于
vue
的后台管理系统 SpringCloud
全新的解决方案- 应用监控、限流、网关、熔断降级等分布式方案 全方位涉及
- 透彻讲解分布式事务、分布式锁等分布式系统的难点
- 分析高并发场景的编码方式,线程池,异步编排等使用
- 压力测试与性能优化
- 各种集群技术的区别以及使用
- CI/CD 使用
- …
- 前后分离开发,并开发基于
4、项目前置要求
学习项目的前置知识
- 熟悉
SpringBoot
以及常见整合方案 - 了解
SpringCloud
- 熟悉
git
,maven
- 熟悉
linux
,redis
,docker
基本操作 - 了解
html
,css
,js
,vue
- 熟练使用 idea 开发项目
二、分布式基础概念
1、微服务
微服务架构风格,就像是把一个单独的应用程序开发为一套小服务,每个小服务运行在自 己的进程中,并使用轻量级机制通信,通常是 HTTP API
。这些服务围绕业务能力来构建, 并通过完全自动化部署机制来独立部署。这些服务使用不同的编程语言书写,以及不同数据存储技术,并保持最低限度的集中式管理。
简而言之:拒绝大型单体应用,基于业务边界进行服务微化拆分,各个服务独立部署运行。
2、集群&分布式&节点
集群是个物理形态,分布式是个工作方式。
只要是一堆机器,就可以叫集群,他们是不是一起协作着干活,这个谁也不知道;
分布式与集群的区别:
分布式:将不同的业务分布在不同的地方。
- 不同业务
- 不同地方
- 业务拆分
集群:将几台服务器集中在一起,实现同一业务。
- 多个机器
- 同一业务
- 同一地方
例如:京东是一个分布式系统,众多业务运行在不同的机器,所有业务构成一个大型的业务集群。每一个小的业务,比如用户系统,访问压力大的时候一台服务器是不够的。我们就 应该将用户系统部署到多个服务器,也就是每一个业务系统也可以做集群化;
分布式中的每一个节点,都可以做集群。而集群并不一定就是分布式的。
节点:集群中的一个服务器
3、远程调用
在分布式系统中,各个服务可能处于不同主机,但是服务之间不可避免的需要互相调用,我 们称为远程调用。
SpringCloud
中使用 HTTP+JSON
的方式完成远程调用
优势:天然的跨平台性。HTTP请求与JSON在任何平台都可以使用。
4、负载均衡
分布式系统中,A 服务需要调用 B 服务,B 服务在多台机器中都存在,A 调用任意一个服务器均可完成功能。
为了使每一个服务器都不要太忙或者太闲
,我们可以负载均衡的调用每一个服务器,提升网站的健壮性。
- 常见的负载均衡算法:
- 轮询: 为第一个请求选择健康池中的第一个后端服务器,然后按顺序往后依次选择,直 到最后一个,然后循环。
- 最小连接: 优先选择连接数最少,也就是压力最小的后端服务器,在会话较长的情况下 可以考虑采取这种方式。
- 散列: 根据请求源的
IP
的散列(hash)来选择要转发的服务器。这种方式可以一定程度上保证特定用户能连接到相同的服务器。如果你的应用需要处理状态而要求用户能连接到和之前相同的服务器,可以考虑采取这种方式。
5、服务注册/发现&注册中心
A 服务调用 B 服务,A 服务并不知道 B 服务当前在哪几台服务器有,哪些正常的,哪些服务已经下线。解决这个问题可以引入注册中心;
如果某些服务下线,我们其他人可以实时的感知到其他服务的状态,从而避免调用不可用的服务。
- 流程
- 服务上线 — 注册到注册中心
- 服务调取 — 从注册中心中发现所需服务
注册中心集中管理服务列表清单
6、配置中心
每一个服务最终都有大量的配置,并且每个服务都可能部署在多台机器上。我们经常需要变更配置,我们可以让每个服务在配置中心获取自己的配置。
配置中心用来集中管理微服务的配置信息
7、服务熔断&服务降级
在微服务架构中,微服务之间通过网络进行通信,存在相互依赖,当其中一个服务不可用时,
有可能会造成雪崩效应。要防止这样的情况,必须要有容错机制来保护服务。
-
服务熔断:
设置服务的超时,当被调用的服务经常失败到达某个阈值,我们可以开启断路保护机制,后来的请求不再去调用这个服务,本地直接返回默认的数据。
多次调用某服务失败后,不再调用,返回默认数据。
-
服务降级
在运维期间,当系统处于高峰期,系统资源紧张,我们可以让非核心业务降级运行。降级:某些服务不处理,或者简单处理【抛异常、返回 NULL、调用 Mock 数据、调用 Fallback 处理逻辑】。
系统高峰期非核心业务不在处理或简单处理。
8、API网关
在微服务架构中,API Gateway
作为整体架构的重要组件,它 抽象了微服务中都需要的公共功能 ,同时提供了 客户端负载均衡,服务自动熔断,灰度发布,统一认证,限流流控,日志统计等丰富的功能,帮助我们解决了很多API管理难题。
三、环境搭建
1、安装 linux 虚拟机
-
开启CPU虚拟化。
这里以Dell台式机为例,开机F2进入BIOS系统,如图勾选设置即可。
-
下载&安装 VirtualBox (前提条件:完成第一步开启CPU虚拟化。)
-
下载VirtualBox,我这里下载6.1版本的。
-
选择Windows hosts即可。
-
下载完成后安装即可。
-
运行VirtualBox
-
-
下载&安装&使用 Vagrant
Vagrant可以结合VirtualBox快速搭建虚拟机,不在需要下载镜像。
-
下载Vagrant
-
下载完成后安装即可。
-
验证是否安装完成。
cmd 通过 命令
vagrant
来验证是否安装成功。
-
-
打开 window cmd 窗口,运行 Vagrant init centos/7,即可初始化一个 centos7 系统
使用命令
vagrant init centos/7
初始化虚拟机。注意:
vagrant init
后跟的名称必须与Vagrant官方镜像仓库中的名称一致才可以。 -
运行
vagrant up
即可启动虚拟机。系统 root 用户的密码是 vagrant -
vagrant 其他常用命令
-
vagrant ssh:自动使用 vagrant 用户连接虚拟机。
使用命令
vagrant ssh
连接虚拟机,默认用户名为vagrant,可以使用linux命令。 -
vagrant reload:重启虚拟机
-
vagrant upload source [destination] [name|id]:上传文件
-
使用命令
exit;
退出与虚拟机连接 -
Vagrant 命令行
-
-
可以在VirtualBox中对虚拟机进行管理
-
注意:在命令行中使用vagrant命令时,需要确保所在文件夹有Vagrantfile文件。
-
默认虚拟机的 ip 地址不是固定 ip,开发不方便
-
修改 Vagrantfile,查询本机IP,查询VirtualBox网关,将配置文件中IP的前三位与网关改为一致。
-
重新使用 vagrant up 启动机器即可,然后再 vagrant ssh 连接机器。
使用命令
ip addr
来查看虚拟机IP网络地址 -
windows和linux互相ping测试均可ping通
-
-
默认只允许 ssh 登录方式,为了后来操作方便,文件上传等,我们可以配置允许账号密码登录
-
Vagrant ssh 进去系统之后
- vi /etc/ssh/sshd_config
- 修改 PasswordAuthentication yes/no
- 重启服务 service sshd restart
-
以后可以使用提供的 ssh 连接工具直接连接
-
-
注意:VirtualBox 会与包括但不限于如下软件冲突,需要卸载这些软件,然后重启电脑; 冲突的软件:红蜘蛛,360,净网大师(有可能)等
-
vagrant创建的root账户密码默认为vagrant,可以使用
$ su root
切换用户为root,以免后续命令无权限。
2、安装 docker
-
Docker简介
-
相关网址
Docker 安装文档
Docker软件镜像网址
-
安装过程
-
卸载系统之前的 docker
$ sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
-
安装依赖包
$ sudo yum install -y yum-utils
-
确定安装地址
$ sudo yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo
-
安装Docker-CE
$ sudo yum install docker-ce docker-ce-cli containerd.io
-
-
启动Docker
$ sudo systemctl start docker
-
检查是否安装成功
-
查看Docker版本
docker -v
-
列出本地镜像
sudo docker images
-
-
设置开机启动
$ sudo systemctl enable docker
-
配置镜像加速
docker默认下载是从docker hub进行下载,由于是国外网站,速度较慢。
可以配置国内镜像加速:
依次执行以下命令
-
创建配件夹
sudo mkdir -p /etc/docker
-
配置镜像加速地址
sudo tee /etc/docker/daemon.json <<-'EOF' {"registry-mirrors": ["https://9t35rfn5.mirror.aliyuncs.com"] } EOF
-
重启docker伴随线程
sudo systemctl daemon-reload
-
重启docker服务
sudo systemctl restart docker
-
3、docker 安装 mysql
-
下载镜像文件
$ docker pull mysql:5.7
使用
sudo docker images
查看镜像 -
创建实例并启动
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 ps
查看正在运行中的容器创建成功后,可以通过Navicat或其他MySQL连接工具进行连接MySQL测试
-
-
docker容器文件挂载与端口映射
-
docker run:创建新容器。
docker run
一下,就会启动一个容器,容器与容器之间相互隔离,互不影响。(容器其实就是一个完整的linux系统)。 -
-p 3306:3306:将MySQL容器的3306端口映射到Linux系统的3306端口。:MySQL被安装到了
MySQL容器
中,MySQL默认端口为3306,但是3306端口为MySQL容器
的3306端口,如果想使用MySQL,需要把MySQL容器的3306端口映射到Linux中。在命令中,前一个3306为宿主机(这里为Linux)端口号,后一个3306为MySQL容器端口号。-p IP:HOSTPORT:CONTAINERPORT
-
–name mysql:为容器起别名。
-
-v:目录挂载。MySQL配置文件、日志文件等在日常开发中经常使用,通过
-v
命令,可以将MySQL容器中的目录文件夹挂载到Linux目录中。-v Linux映射目录:容器目录
挂载完成后,可以在Linux对应目录查看文件变化。
-
-e:指定root用户密码。
-
-d:后台运行容器,并返回容器ID。
-
-
MySQL 配置
修改MySQL字符编码,改为utf8
编辑配置文件
vi /mydata/mysql/conf/my.cnf
-
进入/mydata/mysql/conf目录
-
使用命令
vi my.cnf
命令编辑配置文件 -
敲击键盘
i
进入插入模式 -
将配置信息复制到文件中
[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
-
Esc
后使用:wq
命令退出 -
使用命令
docker restart mysql
重启MySQL容器 -
可以进入MySQL容器查询源文件内容
-
-
解决MySQL连接慢的问题
在配置文件中加入如下,并重启 mysql
[mysqld]skip-name-resolve
解释:
skip-name-resolve:跳过域名解析>
-
通过容器的 mysql 命令行工具连接
docker exec -it mysql mysql -uroot -proot
-
设置 root 远程访问
grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option; flush privileges;
-
进入容器文件系统
docker exec -it mysql /bin/bash
4、docker 安装 redis
-
下载redis镜像
docker pull redis
-
创建实例并启动
-
首先自己创建文件目录以及对应配置文件
mkdir -p /mydata/redis/conf touch /mydata/redis/conf/redis.conf
-
创建redis实例并启动
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
**注意:**这里指定了redis将会加载/etc/redis/redis.conf目录下的配置文件
-
使用
docker ps
检查是否创建成功 -
使用 redis 镜像执行 redis-cli 命令连接
docker exec -it redis redis-cli
-
-
对redis做持久化存储
-
进入配置文件目录
-
编辑配置文件
redis配置文件
-
按
i
进入插入模式 -
设置redis的aof持久化保存方式
-
保存
:wq
-
重启redis
docker restart redis
-
-
可以使用软件RedisDesktopManager对redis进行可视化管理。
5、开发环境统一
-
Maven
-
查询Maven和jdk版本
-
Maven配置阿里云镜像
-
找到Maven目录下的配置文件
-
配置镜像,将以下代码放到对应位置即可
<mirrors><mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url></mirror> </mirrors>
-
配置JDK1.8编译项目,将以下代码放到对应位置即可。
<profiles><profile><id>jdk-1.8</id><activation><activeByDefault>true</activeByDefault><jdk>1.8</jdk></activation><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion></properties></profile> </profiles>
-
-
-
Idea & VSCode
-
Idea
-
指定Maven安装目录和配置文件
-
安装插件:
lombok
&MyBatisX
-
lombok:简化JavaBean开发
-
MyBatisX:MyBatisPlus开发,快速从mapper定位到xml文件
-
-
-
VSCode安装插件
- Vetur —— 语法高亮、智能感知、Emmet 等包含格式化功能, Alt+Shift+F (格式化全文),Ctrl+K Ctrl+F(格式化选中代码,两个 Ctrl需要同时按着)
- EsLint —— 语法纠错
- Auto Close Tag —— 自动闭合 HTML/XML 标签
- Auto Rename Tag —— 自动完成另一侧标签的同步修改
- JavaScript(ES6) code snippets — — ES6 语法智能提示以及快速输入, 除 js 外还支持.ts,.jsx,.tsx,.html,.vue,省去了配置其支持各种包含 js 代码文件的时间
- HTML CSS Support —— 让 html 标签上写 class 智能提示当前项目所支持的样式
- HTML Snippets —— html 快速自动补全
- Open in browser —— 浏览器快速打开
- Live Server —— 以内嵌服务器方式打开
- Chinese (Simplified) Language Pack for Visual Studio Code —— 中文语言包
-
-
安装配置git
-
下载Giteegit下载地址
-
配置 git,进入 git bash
# 配置用户名 git config --global user.name "username" //(名字) # 配置邮箱 git config --global user.email "username@email.com" //(注册账号时用的邮箱)
-
配置 ssh 免密登录
-
生成/添加SSH公钥
-
配置
进入 git bash;使用:
ssh-keygen -t rsa -C "xxxxx@xxxxx.com"
命令。 连续三次回车。一般用户目录下会有
或者
cat ~/.ssh/id_rsa.pub
登录进入 gitee,在设置里面找到 SSH KEY 将.pub 文件的内容粘贴进去使用
ssh -T git@gitee.com
测试是否成功即可
-
-
Git + 码云教程
-
-
逆向工程使用
- 导入项目逆向工程
- 下载人人开源后台管理系统脚手架工程
- 导入工程,创建数据库
- 修改工程 shiro 依赖为 SpringSecurity
- 删除部分暂时不需要的业务
- 下载人人开源后台管理系统 vue 端脚手架工程
- vscode 导入前端项目
- 前后端联调测试基本功能
6、创建项目微服务
商品服务、仓储服务、订单服务、优惠券服务、用户服务
共同点:
-
都需要导入Web、OpenFeign依赖
-
包名的组织名要统一,最后单独名称不同。
com.atguigu.gulimall.xxx(product/order/ware/coupon/member)
-
模块名要统一:**gulimao-**coupon
步骤:
-
从Gitee初始化一个项目
-
新建仓库
-
编辑仓库信息
-
项目克隆到本地
-
创建版本控制项目
-
填写项目地址
-
默认目录结构
-
-
-
创建微服务模块
以商品服务模块为例,其他相同
-
新建模块
-
使用Spring的初始化向导
-
编写模块信息
-
引入必要依赖
-
Spring Web
-
互相调用支持
-
-
next—finish完成创建
所有服务模块建完后项目结构
-
-
将gulimall设置为总项目,聚合子模块
-
gulimall
根目录下新建pom.xml
-
新建的pom.xml中添加如下代码
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.atguigu.gulimall</groupId><artifactId>gulimall</artifactId><version>0.0.1-SNAPSHOT</version><name>gulimall</name><description>聚合服务</description><packaging>pom</packaging><modules><module>gulimall-coupon</module><module>gulimall-member</module><module>gulimall-order</module><module>gulimall-product</module><module>gulimall-ware</module></modules> </project>
-
在Maven管理中,将gulimall的配置文件添加到项目中
-
效果如下,可以发现gulimall为root,负责聚合其他子模块
-
-
修改总项目中的
gitignore
,将子模块中的无用文件进行忽略- **/mvnw:忽略任意路径下的mvnw文件都忽略掉
修改后gitignore为:target/pom.xml.tagpom.xml.releaseBackuppom.xml.versionsBackuppom.xml.nextrelease.propertiesdependency-reduced-pom.xmlbuildNumber.properties.mvn/timing.properties.mvn/wrapper/maven-wrapper.jar**/mvnw**/mvnw.cmd**/.mvn**/target/.idea**/.gitignore
- **/mvnw:忽略任意路径下的mvnw文件都忽略掉
-
版本控制
-
将所有需要提交的文件加入到版本控制中
-
安装Gitee插件进行版本控制
-
将代码提交到本地仓库
-
commit and push
-
push推送
-
码云查看
-