項目簡介
項目背景
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
配置ssh
1)查看是否安裝了ssh
yum list installed | grep openssh-server
2)安裝ssh
yum install openssh-server
3)修改ssh配置
sudo vi /etc/ssh/ssh_config
將文件中,關於監聽端口、監聽地址前的 # 號去除
開啟允許遠程登錄
開啟使用用戶名密碼來作為連接驗證
4)啟動sshd服務
sudo service sshd start
5)檢查 sshd 服務是否已經開啟
ps -e | grep sshd
或者檢查 22 號端口是否開啟監聽
netstat -an | grep 22
6)開啟開機自啟動
sudo systemctl enable sshd
7)檢查是否加入了開機自啟動
systemctl list-unit-files | grep sshd
安裝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
3)交互模式,連接redis容器,運行redis客戶端
docker exec -it redis redis-cli
4)設置aof持久化
vi redis.conf
添加內容:
appendonly yes
5)宿主機中使用客戶端連接redis
完整的redis配置
https://raw.githubusercontent.com/redis/redis/6.0/redis.conf
開機自啟動容器
sudo docker update redis --restart=always
sudo docker update mysql --restart=always
開發環境配置
maven
git(ssh-keygen)
idea
idea插件(Mybatis插件)
vscode
vscode插件
創建項目
商品服務、倉儲服務、訂單服務、優惠券服務、用戶服務
數據庫設計
不建立外鍵
使用renren-fast快速開發后台管理系統
克隆項目到本地(包括前后端)
https://gitee.com/renrenio/renren-fast.git
https://gitee.com/renrenio/renren-fast-vue.git
將renren-fast加入聚合工程里
- 右鍵點擊
pom.xml
,然后選擇add as maven project
- 刪除
renren-fast
工程里的.git
目錄 - 修改數據庫連接信息
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://10.211.55.11:3306/gulimall_admin?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: root
initial-size: 10
max-active: 100
min-idle: 10
max-wait: 60000
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
#Oracle需要打開注釋
#validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
stat-view-servlet:
enabled: true
url-pattern: /druid/*
#login-username: admin
#login-password: admin
filter:
stat:
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: false
wall:
config:
multi-statement-allow: true
創建數據庫並導入sql腳本到數據庫
db/mysql.sql
啟動后台項目
運行RenrenApplication
瀏覽器訪問swagger
http://localhost:8080/renren-fast/swagger-ui.html
安裝node
brew install node@10
echo 'export PATH="/usr/local/opt/node@10/bin:$PATH"' >> ~/.zshrc
配置npm淘寶源
echo '\n#alias for cnpm\nalias cnpm="npm --registry=https://registry.npm.taobao.org \
--cache=$HOME/.npm/.cache/cnpm \
--disturl=https://npm.taobao.org/dist \
--userconfig=$HOME/.cnpmrc"' >> ~/.zshrc && source ~/.zshrc
使配置生效
source .zshrc
安裝前端依賴
進入renren-fast-vue根目錄
運行
npm install chromedriver --chromedriver_cdnurl=http://cdn.npm.taobao.org/dist/chromedriver
再運行npm install
啟動前端項目
npm run dev
運行npm run dev
可能會遇到一些問題,也記錄一下,畢竟浪費了時間
錯誤1:
ENOENT: no such file or directory, scandir '/Users/kim/IdeaProjects/atguigu/renren-fast-vue/node_modules/node-sass/vendor'
原因:網絡原因,需要借助鏡像或者XX手段
解決方法:
node-sass的github主頁有方案:
npm install -g mirror-config-china --registry=http://registry.npm.taobao.org
npm install node-sass
錯誤2:
No parser no filepath given
解決方法:
指定parser,
在node_modules/vue-loader/lib/template-compiler/index.js文件中,指定parser
運行成功后,自動在瀏覽器打開
輸入用戶名密碼和驗證碼,用戶名密碼都是admin
逆向工程使用
下載代碼生成器項目
https://gitee.com/renrenio/renren-generator.git
整合進項目中
拷貝到我們項目根目錄,刪除renren-generator根目錄下的.git目錄
右鍵點擊renren-generator,Add as Maven Project
加入聚合項目的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>
<module>renren-fast</module>
<module>renren-generator</module>
</modules>
</project>
使用
公共依賴的導入
首先在common模塊中引入一些公共依賴和公共類,因為renren-generator生成的類對這些類有依賴,這些類和依賴在renren-fast項目中。
由於內容較多,直接切換到master分支上tag為common的版本,然后:
-
導入com.atguigu.common包下所有內容
-
復制common模塊下的pom.xml所有內容
改renren-generator的數據庫配置
主要是這兩個文件
啟動啟動類
訪問http://localhost:8082/
將所有數據展示在一頁,然后點擊生成代碼按鈕,會下載一個壓縮包
默認會生成Java代碼和Vue代碼
我們先將所有main下的內容拷貝到product模塊的main目錄下,和已有目錄合並。
測試product模塊
數據庫驅動
mysql驅動選擇,我們的數據庫安裝的是5.7,5.7的數據庫驅動官網建議使用8.0