谷粒商城--微服務分布式電商項目學習筆記


項目簡介

項目背景

1)電商模式

2)谷粒商城

是一個B2C模式的電商平台,銷售自營商品給客戶。

架構圖

1)項目微服務架構圖

image-20200725075045044

客戶端->nginx集群->網關集群

2)微服務划分圖

image-20200725090220739

項目特色

  • 前后端分離開發,並開發基於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 

將文件中,關於監聽端口、監聽地址前的 # 號去除

image-20200726091401137

開啟允許遠程登錄

image-20200726091435495

開啟使用用戶名密碼來作為連接驗證

image-20200726091500309

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

image-20200725221819330

1)下載鏡像文件

sudo docker pull mysql:5.7

查看下載的鏡像文件docker images

image-20200725222021079

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

參數說明:

  1. -p 3306:3306 端口映射

  2. --name mysql 容器別名

  3. 目錄掛載

-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
  1. -e MYSQL_ROOT_PASSWORD=root 初始化參數

  2. -d mysql:5.7以后台方式啟動,以mysql:5.7鏡像啟動

  • 查看運行的容器

docker ps

image-20200725225402152

  • 進入容器內部

docker exec -it 容器id/容器名 /bin/bash

docker exec -it mysql /bin/bash

  • 從宿主機連mysql容器

運行mysql容器后,可以在宿主機上連mysql

首先查看CentOS的IP

image-20200725225925017

使用mysql客戶端工具連接mysql server

image-20200725225959266

配置字符集

/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

image-20200726094802895

完整的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

image-20200726200352603

運行成功后,自動在瀏覽器打開

輸入用戶名密碼和驗證碼,用戶名密碼都是admin

image-20200726200514164

逆向工程使用

下載代碼生成器項目

https://gitee.com/renrenio/renren-generator.git

整合進項目中

拷貝到我們項目根目錄,刪除renren-generator根目錄下的.git目錄

右鍵點擊renren-generator,Add as Maven Project

image-20200726201746246

加入聚合項目的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的數據庫配置

主要是這兩個文件

image-20200726214646070

image-20200726214618107

image-20200726214739572

啟動啟動類

訪問http://localhost:8082/

image-20200726215002964

將所有數據展示在一頁,然后點擊生成代碼按鈕,會下載一個壓縮包

默認會生成Java代碼和Vue代碼

我們先將所有main下的內容拷貝到product模塊的main目錄下,和已有目錄合並。

測試product模塊

數據庫驅動

mysql驅動選擇,我們的數據庫安裝的是5.7,5.7的數據庫驅動官網建議使用8.0

image-20200726215912866


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM