普通安裝linux虛擬機太麻煩,可以利用一款開源虛擬機軟件VirtualBox 。 VirtualBox會開放一個創建虛擬機的接口,Vagrant會利用這個接口創建虛擬機,並且通過Vagrant來管理,配置和自動安裝虛擬機。他有一個鏡像倉庫,vagtrant hub。
1.下載並安裝virtualbox
下載地址:https://www.virtualbox.org/wiki/Downloads
安裝過程很簡單,傻瓜式的一步一步點下去。下載安裝之后,要開啟cpu虛擬化,在計算機開機時F2進入Bios中,在configration中找到Intel Vitualization Technology,之后重啟電腦。
2.下載並安裝vagrant
下載地址:https://www.vagrantup.com/downloads.html
.驗證cmd中輸入vagrant驗證是否安裝成功。之后初始化centos/7系統(https://app.vagrantup.com/centos/boxes/7)。
常用命令:
初始化環境 vagrant init centos/7
啟動環境:vagrant up
連接vm:vagrant ssh
重啟環境:vagrant reload
查看vm 的Ip: ip addr
成功之后:會自動添加到VM中
3.虛擬機設置 :
虛擬機是采用網絡地址轉換-接口轉發的方式,這樣每在linux里安一個軟件都要進行端口映射,不方便。 默認虛擬機的ip不是固定的ip。主機與虛擬機之間的交互希望通過ip進行相互的訪問。
虛擬機固定ip配置: ipconfig 找到虛擬機的ip地址
修改文件 Vagrantfile中: config.vm.network "private_network", ip: "192.168.33.10",其中IP配置:為192.168.56.10之后 互相ping一下虛擬機的ip與本地主機上的ip,是否相通。
4.docker安裝
安裝文檔: https://docs.docker.com/engine/install/centos/
docker 官網: https://www.docker.com/products/docker-hub
docker虛擬化容器技術:docker的國外鏡像市場docker hub: https://hub.docker.com/
簡介: Docker 是一個開源的應用容器引擎,基於 Go 語言 並遵從 Apache2.0 協議開源。
Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。
容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。
docker的 鏡像加速用阿里雲: https://www.aliyun.com/ 產品與服務-> 容器鏡像服務->鏡像工具->鏡像加速器

1 #移除本機上的老版本
2 sudo yum remove docker \
3 docker-client \
4 docker-client-latest \
5 docker-common \
6 docker-latest \
7 docker-latest-logrotate \
8 docker-logrotate \
9 docker-engine
10
11 #配置倉儲
12 sudo yum install -y yum-utils
13 sudo yum-config-manager \
14 --add-repo \
15 https://download.docker.com/linux/centos/docker-ce.repo
16
17 #安裝docker Engine
18 sudo yum install docker-ce docker-ce-cli containerd.io
19
20 #開啟
21 sudo systemctl start docker
22
23 #開啟測試hello-world容器
24 sudo docker run hello-world
25
26 # 設置開機自啟動
27 sudo systemctl enable docker
28
29 #aliyun鏡像加速
30 找到centos 下的命令,直接執行
docker 中的目錄掛載:
簡介: 我們可以在創建容器的時候,將宿主機的目錄與容器內的目錄進行映射,這樣我們就可以實現宿主機和容器目錄的雙向數據自動同步
作用:我們cp命令來實現數據傳遞,這種方式比較麻煩;
我們通過容器目錄掛載,能夠輕松實現代碼上傳,配置修改,日志同步等需求
docker中使用的常見命令:
版本: docker –v,
檢索鏡像:docker images ,
其中的開機自啟動:sudo systemctl enable docker
超管命令:sudo
進入root:su root
重啟:docker restart mysql
查看所有運行中的鏡像: docker ps
刪除某個容器:docker rm mysql(名稱)
進入到某個容器中: docker exec -it mysql bin/bash
查看當前目錄下的所有文件:ls
查看文件中的內容 : cat my.cnf(文件名)
修改配置文件: vi redis.conf(文件名)
查詢地址: whereis mysql(名稱)
到目錄上一級:cd ..
進入目錄下一級:cd 文件名(/var/log, mysql/ )
刪除文件中的所有文件夾(級聯):rm -rf mysql(文件名)
退出:exit
清屏:clear,cls
文本編輯退出:esc按鍵 :wq
創建文件目錄mkdir -p /mydata/redis/conf
創建文件:touch /mydata/redis/conf/redis.conf
5.docker 安裝mysql
mysql鏡像地址 :https://hub.docker.com/_/mysql?tab=tags&page=1&ordering=last_updated
安裝參考文檔:https://www.runoob.com/docker/docker-install-mysql.html

1 #拉取 MySQL 鏡像
2 sudo docker pull mysql:5.7
3
4 #開啟容器
5 sudo docker run -p 3306:3306 --name mysql \
6 -v /mydata/mysql/log:/var/log/mysql \
7 -v /mydata/mysql/data:/var/lib/mysql \
8 -v /mydata/mysql/conf:/etc/mysql \
9 -e MYSQL_ROOT_PASSWORD=root \
10 -d mysql:5.7
11
12 #查看本地鏡像
13 docker images
14
15 #修改配置文件
16 vi /mydata/mysql/conf/my.conf
17
18 (i進入插入模式)
19 [client]
20 default-character-set=utf8
21 [mysql]
22 default-character-set=utf8
23 [mysqld]
24 init_connect='SET collation_connection = utf8_unicode_ci'
25 init_connect='SET NAMES utf8'
26 character-set-server=utf8
27 collation-server=utf8_unicode_ci
28 skip-character-set-client-handshake
29 skip-name-resolve
30 (:wq 退出)
31
32 #進行重啟
33 docker restart mysql
下載客戶端Navicat ,測試連接時:需要開放mysql遠程權限,要不然會報錯。
參考文檔:
https://jingyan.baidu.com/article/2fb0ba4069797441f2ec5fa7.html
https://blog.csdn.net/qq_34885405/article/details/93041509
https://blog.csdn.net/qq_33743572/article/details/106630950
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
其中的執行命令: 之后重新連接測試就可以了
6.安裝redis
安裝參考文檔:https://www.runoob.com/docker/docker-install-redis.html

1 #取最新版的 Redis 鏡像
2 docker pull redis:latest
3
4 #運行容器
5
6 # 1.創建文件
7 mkdir -p /mydata/redis/conf
8 touch /mydata/redis/conf/redis.conf
9 #2.運行容器
10 docker run -p 6379:6379 --name redis \
11 -v /mydata/redis/data:/data \
12 -v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
13 -d redis redis-server /etc/redis/redis.conf
14
15 # 查看鏡像
16 docker images
17
18 # 直接進入redis客戶端。
19 docker exec -it redis redis-cli
20
21 #測試redis
22 set a 123
23 get a
24
25 #redis 持久化
26 vi /mydata/redis/conf/redis.conf
27 (i: 插入模式)
28 appendonly yes
29 (:wq 退出)
30 #重啟
31 docker restart redis
7.IDEA開發環境
7.1 開發環境的搭建
Docker命令: Java –version 版本信息
mvn–version maven的版本信息
maven中的配置文件修改: 在maven文件夾下的settings.xml中添加 修改 兩個配置節點
1.配置aliyun鏡像
找到<mirrors>節點,在mirrors節點中,添加:
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
2.配置jdk1.8 編譯項目:修改jdk 版本信息為本機的jdk版本信息

<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>
Idea 中setting 配置maven的地址設置
7.2 Intellij Idea 中添加插件 Lombok,mybatisx
Lombok:Lombok項目是一個Java庫,它會自動插入編輯器和構建工具中,Lombok提供了一組有用的注釋,用來消除Java類中的大量樣板代碼。僅五個字符(@Data)就可以替換數百行代碼從而產生干凈,簡潔且易於維護的Java類。
mybatisx:(mybatis-plus的擴展)是一款基於 IDEA 的快速開發插件(mapper與xml之間的操作),為效率而生。支持XML跳轉,生成代碼,JPA提示
參考文檔:https://baomidou.com/guide/mybatisx-idea-plugin.html#%E5%8A%9F%E8%83%BD
8.Java 前端開發工具用 vscode
下載地址(官網太慢,用這個比較快):https://pc.qq.com/detail/16/detail_22856.html
之后安裝插件:
Auto Close Tag
Auto Rename Tag
Chinese
ESlint
HTML CSS Support
HTML Snippets
JavaScript ES6
Live Server
open in brower
Vetur
9.環境配置git-ssh
Git簡介: Git 是一個開源的分布式版本控制系統,用於敏捷高效地處理任何或小或大的項目;
git代碼托管平台(gitee或者github):https://gitee.com/
Git管理工具下載地址:https://git-scm.com/
tortoisegit (Git代碼圖形化的界面)下載地址https://tortoisegit.org/download/
1.安裝完成之后桌面右鍵鼠標: 看到
2.安裝完成之后,在git Bash 中添加基本配置
Git常見操作help:https://gitee.com/help/
配置用戶名與密碼,免登陸操作

# 配置用戶名
git config --global user.name "username" //(名字,為提交代碼時候的顯示可以與注冊名稱不一致)
# 配置郵箱
git config --global user.email "username@qq.com" // 注冊賬號時用的郵箱
# 配置ssh免密登錄: https://gitee.com/help/articles/4181#article-header0
ssh-keygen -t rsa -C "xxxxx@xxxxx.com"
三次回車后生成了密鑰:公鑰私鑰
ssh -T git@gitee.com
復制生成后的 ssh key,通過倉庫主頁 「管理」->「部署公鑰管理」->「添加部署公鑰」 ,添加生成的 public key 添加到倉庫中。
# 測試免密登錄配置是否成功
ssh -T git@gitee.com
測試成功,就可以無密給碼雲推送倉庫了
10.項目搭建
Git上創建倉儲:https://gitee.com/help/articles/4120
要創建5個模塊的微服務
-
- 商品服務product(pms)
- 存儲服務ware(wms)
- 訂單服務order(oms)
- 優惠券服務coupon(sms)
- 用戶服務member(ums)
微服務創建的公共特點如下
1) 微服務模塊創建new——Module下使用Spring Initializr(Spring初始化向導)。
之后導入兩個基礎組件: web ——spring web, Spring Cloud Routing——Openfeign
2) 包名與組織名,模塊名之間的命名方式如下
包名: com.atguigu.gulimall.XXX(product/order/ware/coupon/member)
組織名:com.atguigu.gulimall
模塊名:gulimall-XXX(product/order/ware/coupon/member)
其中包名的命名規范

個體項目(individual),指個人發起,但非自己獨自完成的項目,可公開或私有項目,copyright主要屬於發起者。
包名為“indi.發起者名.項目名.模塊名……”
onem :
單人項目(one-man),推薦用indi,指個人發起,但非自己獨自完成的項目,可公開或私有項目,copyright主要屬於發起者。
包名為“onem.發起者名.項目名.模塊名……”
pers :
個人項目(personal),指個人發起,獨自完成,可分享的項目,copyright主要屬於個人。
包名為“pers.個人名.項目名.模塊名.……”
priv :
私有項目(private),指個人發起,獨自完成,非公開的私人使用的項目,copyright屬於個人。
包名為“priv.個人名.項目名.模塊名.……”
team:
團隊項目,指由團隊發起,並由該團隊開發的項目,copyright屬於該團隊所有。
包名為“team.團隊名.項目名.模塊名.……”
com :
公司項目,copyright由項目發起的公司所有。
包名為“com.公司名.項目名.模塊名.……”
3) 總項目管理: 在總項目中添加新的pom文件,此pom文件用來管理每個微服務,之后在maven中把總項目管理的pom添加進去(root)。
對root 進行清理,編譯,就是對所有微服務的全部操作。

<?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>
4) 項目gitignore 在項目版本控制中剔除不需要提交的文件(編譯生成文件等)。
剔除文件:
**/mvnw
**/mvnw.cmd
**/.mvn
**/target/
.idea
**/.gitignore
剔除總結:
-
- 總文件名(as:idea)。
- **/文件名(mvnw,mvnwcmd,.mvn,target,.gitignore)
剩下文件(右鍵)全部添加到版本控制(Add to vas)中
11. 數據庫初始化創建(在虛擬機mysql中創建表)
數據庫管理工具PowerDesigner,可以打開整個項目的數據表設計;所有的數據庫數據再復雜也不建立外鍵,因為在電商系統里,數據量大,做外鍵關聯很耗性能。其中在powerdesigner 中(database->generate-database->preview)可以查看表的所有信息。
把數據庫表存儲在docker虛擬機容器中的mysql中。
操作方式:連接sql服務器 192.168.56.10:3306 用root 用戶進行登錄
連接不成功:dos命令進入vagrant進行排除問題
啟動虛擬機:Vagrant up
連接虛擬機:Vagrant ssh
查看所有運行中的鏡像:sudo docker ps
查看所有已安轉的鏡像:sudo docker ps –a
把鏡像設置成開機啟動(虛擬機重啟):
sudo docker update redis --restart=always
sudo docker update mysql --restart=always
檢查開機啟動是否設置成功。
創建數據庫:字符集選utf8mb4,他能兼容utf8且能解決一些字符亂碼的問題
gulimall-oms
gulimall-pms
gulimall-sms
gulimall-ums
gulimall-wms
12.人人開源項目(框架用人人,搭建自己的項目)
12.1后台管理系統中添加(renren-fast)
使用人人開源項目(https://gitee.com/renrenio)的框架,來搭建谷粒多后台管理系統。renren-fast(后台管理系統),renren-fast-vue(前端頁面),renren-generator(代碼生成器)。
1).renren-fast 下載下來,git文件刪除,之后添加到gulimall項目中,修改總項目的pom文件(<module>renren-fast</module>)。
2).新建數據庫(gulimall-admin)把renren-fast中db下的mysql.sql 文件中內容執行。
3).修改配置文件 : 查看 src\main\resources\application.yml下,數據庫環境的配置文件為dev,之后修改src\main\resources\application-dev.yml的數據源配置地址、數據庫名、用戶名、密碼。
4).測試連接:找到renren-fast 下面的main文件,編譯運行,看是否有問題。gulimall\renrenfast\src\main\java\io\renren\RenrenApplication.java,運行main函數,之后在http://localhost:8080/renren-fast/ 中是否返回{“msg”:“invalid token”,“code”:401}。
其中編譯之后(String 函數報紅的情況:jdk版本沒有設置(項目結構中可以設置))
12.2前端項目用(renren-fast-vue)在vs code 中打開項目
1)、前端開發node.js:Node.js 就是運行在服務端的 JavaScript , 一個基於Chrome JavaScript 運行時建立的一個平台, 是一個事件驅動I/O服務端JavaScript環境,基於 Google的V8引擎,V8引擎執行Javascript的速度非常快,性能非常好。下載地址:https://nodejs.org/en/
2)、node.js包管理工具npm,新版的nodejs已經集成了npm,相當於java中的maven,net中的nuget,通過命令"npm -v" 來測試是否成功安裝,node –v 檢測node是否安裝成功。
3)、配置npm的淘寶鏡像,默認的為國外的網站,下載速度慢。執行命令npm config set registry http://registry.npm.taobao.org/。
4)、首次運行下載現在的項目,需要把項目中包都下載下來,在控制台->終端中執行”npm install” 即可,注意在運行失敗時,可以嘗試重啟vscode,或者以管理員的身份進行運行。(安裝系統異常,python要安裝)
5)、”npm run dev” 運行前端項目,前端項目運行的時候,后端搭建的服務一塊運行。之后點擊驗證碼,在后端的console 中可以看到執行的sql語句。user/pwd: admin/admin 登錄系統,進行權限的認證。
12.3快速開發-逆向工程--------代碼生成器(renren-generator)
1)、renren-generator下載下來,git文件刪除,之后添加到gulimall項目中,修改總項目的pom文件(<module>renren-generator</module>)。
2)、修改application.yml 中的連接數據的連接地址與用戶名密碼、默認開啟的端口號

//修改默認端口號,80端口容易被占用
server:
port: 8002
# mysql
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
#MySQL配置
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.56.10:3306/gulimall-wms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
3)、修改generator.properties 中的包名(mainPath,package),模塊名(moduleName),作者(author,email),表前綴(tablePrefix)等信息

mainPath=com.atguigu
#\u5305\u540D
package=com.atguigu.gulimall
moduleName=product
#\u4F5C\u8005
author=xbx
#Email
email=xbx@gmail.com
#\u8868\u524D\u7F00(\u7C7B\u540D\u4E0D\u4F1A\u5305\u542B\u8868\u524D\u7F00)
tablePrefix=pms_
4)、在main下的RenrenApplication下的main方法直接執行。之后打開站點http://localhost:8002/,直接生成相應的代碼
12.4 代碼生成器生成代碼問題與項目兼容
創建公共類common (new modules— maven—然后在name上輸入gulimall-common),公共類添加到所有的pom文件中。
maven倉庫(可以搜索任意的插件): https://mvnrepository.com/

<!--插件 mybatis-plas -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<!--公用注解 lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>compile</scope>
</dependency>
<!--公共類包 -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.13</version>
<scope>compile</scope>
</dependency>
1)先解決dao與entity 中異常問題。
mybits-plus:https://mp.baomidou.com/guide/install.html#release
配置mybatis-plus 的pom文件
lombok:https://projectlombok.org/setup/maven
2)解決service中的異常
從renren-fast中copy出需要的公共類(PageUtils,Query,R),到common中的com.atguigu.common.utils; 以及xss中的全部文件,到com.atguigu.common.xss 中。
之后解決在common 中的包引用,
3)解決controller 中的異常。
在模板文件中renren-generator\src\main\resources\template\Controller.java.vm
@RequiresPermissions這些注解掉在代碼器的模板中暫時注釋掉。
以及 相對應的引用//importorg.apache.shiro.authz.annotation.RequiresPermissions;
12.5 數據庫驅動配置與測試項目搭建情況
1)數據庫驅動配置 :整合mybatis-plus:https://mp.baomidou.com/guide/install.html#release

1、整合MyBatis-Plus
1)、導入依賴
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
2)、配置
1、配置數據源;
1)、導入數據庫的驅動 my sqlconnector (用那個版本,需要根據mysql 中的版本信息定驅動信息 )。https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-versions.html
2)、在application.yml配置數據源相關信息
2、配置MyBatis-Plus;
1)、spring Boot 啟動類中添加 @MapperScan 注解,掃描 Mapper 文件夾
2)、告訴MyBatis-Plus,sql映射文件位置
2)數據庫配置文件 application.yml (新建-文件-application.yml),配置信息如下:

#數據庫連接配置
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://192.168.56.10:3306/gulimall-pms
driver-class-name: com.mysql.jdbc.Driver
# 告訴mybatis, sql的文件位置
mybatis-plus:
mapper-locations: classpath*:/mapper/**/*.xml
# classpath* 不只掃描自己的類路徑,還包括引用的其他java包中的類路徑
# 設置數據實體中的主鍵ID為自增長
global-config:
db-config:
id-type: auto
其中 :classpath 和 classpath* 區別:
classpath:只會到你的class路徑中查找文件;
classpath*:不僅包含class路徑,還包括jar包中(class路徑)進行查找
classpath*的使用:當項目中有多個classpath路徑,並同時加載多個classpath路徑下(此種情況多數不會遇到)的文件,*就發揮了作用,如果不加*,則表示僅僅加載第一個classpath路徑。
3) 通過測試類來測試聯通性,測試代碼如下:

@RunWith(SpringRunner.class)
@SpringBootTest
public class GulimallProductApplicationTests {
@Autowired
BrandService brandService;
@Test
public void contextLoads() {
//進行插入操作
// BrandEntity brandEntity=new BrandEntity();
// brandEntity.setName("huahua");
// brandService.save(brandEntity);
// System.out.println("輸出操作");
//更新操作
BrandEntity brandEntity=new BrandEntity();
brandEntity.setBrandId(1401564792235810818L);
brandEntity.setDescript("ceshi");
brandService.updateById(brandEntity);
}
}
12.6 依次生成其他模塊
修改12.3 中的每個模塊的配置,同時為每個模塊配置端口信息
gulimall-oms oms order
gulimall-pms pms product
gulimall-sms sms coupon
gulimall-ums ums member
gulimall-wms wms ware
13.搭建分布式系統的基本環境
13.1分布式系統中的基本概念
注冊中心:每個微服務上線都需要把它自己注冊到注冊中心,這樣服務之間相互調用的時候就不需要關注被調用服務當前在哪幾台服務器有、那些是正常的、那些服務已經 下線。所有調用都是通過注冊中心作為中轉。
配置中心:各個微服務的統一管理配置中心,修改配置中心的配置,可到達修改所有機器上的該微服務配置的修改。
網關:客戶端發送請求到服務器,設置一個網關,請求都先到達網關,網關對
請求進行統一認證(鑒權、過濾、路由、限流、統計等)。
13.2分布式組件的選型:
SpringCloud 家族參考官網:https://spring.io/projects/spring-cloud
1).Spring Cloud Netflix 組件
Eureka: 注冊中心
Zuul: 網關
Hystrix: 斷路保護
2).Spring Cloud Config 組件:配置中心
13.3、目前使用SpringCloud Alibaba系列分布式組件:
Spring Cloud Alibaba 致力於提供微服務開發的一站式解決方案。此項目包含開發分布式應用微服務的必需組件,方便開發者通過 Spring Cloud 編程模型輕松使用這些組件來開發分布式應用服務。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以將 Spring Cloud 應用接入阿里微服務解決方案,通過阿里中間件來迅速搭建分布式應用系統。
1)參考地址:
Spring中的地址:https://spring.io/projects/spring-cloud-alibaba
Github地址文檔:https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
2)技術選型:
Spring Cloud Netflix 下的Eureka停止維護,
SpringCloud的痛點:
1.SpringCloud 部分組件停止維護與更新,給開發帶來不便
2.SpringCloud 部分環境搭建復雜,沒有完善的可視化界面,我們需要大量的二次開發與定制
3. SpringCloud配置復雜,難以上手,部分配置差別難以區分與合理應用。
SpringCloud Alibaba 的優勢:
阿里使用過的組件經歷了考驗,性能強悍,設計合理,現在開源出來大家用成套的產品搭配完善的可視化界面給開發運維帶來極大的便利,搭建簡單,學習曲線低。
結合SpringCloud Alibaba我們最終的技術搭配方案:
SpringCloud Alibaba –Nacos:注冊中心(服務發現/注冊)
SpringCloud Alibaba –Nacos:配置中心(動態配置管理)
SpringCloud-Ribbon :負載均衡
SpringCloud-Feign:聲明式HTTP客戶端(調用遠程服務)
SpringCloud Alibaba-Sentinel服務熔斷(限流,降級、熔斷)
SpringCloud-Gateway:API網關(webflux 編程模式)
SpringCloud-Sleuth:調用鏈監控
SpringCloud Alibaba- Seata:原Fescar,分布式事務解決方案
13.4、SpringCloud 引用項目中
其中alibaba阿里倉庫地址中,搜索版本信息:https://maven.aliyun.com/mvn/search
添加的common中的pom文件中

<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
dependencyManagement依賴管理,相當於以后再dependencies里引spring cloud alibaba就不用寫版本號
14. Nacos作為注冊中心使用:
一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平台。
14.1接入
a.Nacos的pom文件引入,在common中添加公共的引用;
b.在應用application.yml 配置文件中配置,服務器地址名稱與唯一服務名
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
application: name: gulimall-member
c. 使用 @EnableDiscoveryClient 注解開啟服務注冊與發現功能
14.2啟動 Nacos Server
Nacos下載: https://github.com/alibaba/nacos/releases
單機模式運行:startup.cmd -m standalone
集群模式(默認雙擊startup.cmd),需要添加額外的配置:https://www.cnblogs.com/xiaoyao-001/p/11925867.html
注意事項:默認雙擊startup.cmd 為集群模式,沒有集群模式的配置,會直接報錯。切換集群模式到單機模式,startup.cmd用notepad++打開,之后修改里面的模式為單機模式 set MODE="standalone"。啟動成功之后顯示,cmd命令窗口不能關閉,關閉之后可視化站點打不開,服務默認關閉。
之后可視化站點查看(本機ID+端口號+/nacos)(此站點既包含注冊中心服務的管理也包含配置中心的管理): http://192.168.1.8:8848/nacos/index.html#/login
賬號密碼nacos
服務管理中可以看到注冊的各個服務
14.3測試服務之間的調用需要支持open-Feign的引用
在coupon中調用member中的服務,來測試連通性,是否走注冊中心
a.在CouponController中添加測試方法
@RequestMapping("/member/list")
public R membercoupons(){
CouponEntity couponEntity = new CouponEntity();
couponEntity.setCouponName("滿100減10");
return R.ok().put("coupons",Arrays.asList(couponEntity));
}
b.在member服務中添加一個聲明式的遠程調用
//這是一個聲明式的遠程調用
@FeignClient("gulimall-coupon")
public interface CouponFeignService {
@RequestMapping("/coupon/coupon/member/list")
public R membercoupons();
}
c.在MemberController中添加調

@Autowired
CouponFeignService couponFeignService;
@RequestMapping("/coupons")
public R test(){
MemberEntity memberEntity = new MemberEntity();
memberEntity.setNickname("張三");
R membercoupons = couponFeignService.membercoupons();
return R.ok().put("member",memberEntity).put("coupons",membercoupons.get("coupons"));
}
d.member服務與coupon服務啟動,注冊到注冊中心中,之后調用
調用服務:http://localhost:8000/member/member/coupons
返回:
調用異常問題處理:
調用過程中如果出現構建失敗的可以參考: https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E,檢查自己的SpringCloud,Spring Boot,Spring Cloud Alibaba之間的版本的是否兼容。
應為包版本問題導致的問題可以參考:https://blog.csdn.net/weixin_45729934/article/details/110310119
15. Feign聲明式遠程調用
15.1pom文件引入open-feign引用

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>3.0.3</version>
</dependency>
15.2 編寫一個接口,告訴SpringCloud這個接口需要調用遠程服務
添加Feign文件包,在里面添加接口接口服務類
15.3開啟遠程調用功能
GulimallMemberApplication啟動類上添加注解@EnableFeignClients(basePackages = "com.atguigu.gulimall.member.feign")
16. Nacos作為配置中心的使用:
16.1pom文件接入在commom中
16.2在應用的 /src/main/resources/bootstrap.properties 配置文件中配置 Nacos Config 元數據
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
16.3 @Value值用來注入,@RefreshScope 打開動態刷新功能
16.4測試驗證

@RefreshScope
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
@Autowired
private CouponService couponService;
@Value("${coupon.user.name}")
String userName;
@Value("${coupon.user.age}")
int age;
@RequestMapping("/test")
public R test(){
return R.ok().put("userName",userName).put("age",age);
}
}
輸入測試網址: http://localhost:7000/coupon/coupon/test
返回:{"msg":"success","code":0,"userName":"james","age":17}
16.5在已經啟動的啟動 Nacos Server中添加配置
在測試網址中返回:{"msg":"success","code":0,"userName":"james2","age":20}
結論:如果配置中心和當前應用的配置文件中都配置了相同的項,優先使用配置中心的配置。
16.6配置中心的進階
1)、命名空間:配置隔離
默認:public(保留空間);默認新增的所有配置都在public空間。
a.開發,測試,生產:利用命名空間來做環境隔離。 在可視化配置界面的命名空間中添加。添加成功之后每個命名空間會自動生成一個UUID,在項目配置文件中直接配置這個UUID。
注意:在bootstrap.properties;配置上,需要使用哪個命名空間下的配置,
spring.cloud.nacos.config.namespace=9de62e44-cd2a-4a82-bf5c-95878bd5e871
b.每一個微服務之間互相隔離配置,每一個微服務都創建自己的命名空間,只加 載自己命名空間下的所有配置
2)、配置集:所有配置的集合
例如一個yml文件。
3)、配置集ID:類似文件名
其中Data ID:類似文件名。例如一個yml文件的名稱。
4)、配置分組:
默認所有的配置集都屬於:DEFAULT_GROUP;可以自定義配置比如:1111,618,1212。在項目中的使用:
每個微服務創建自己的命名空間,使用配置分組區分環境,dev,test,prod。在bootstrap.properties上添加配置spring.cloud.nacos.config.group=dev
測試地址中執行的結果:
{"msg":"success","code":0,"userName":"dev","age":21}
5)、同時加載多個配置集
a.微服務任何配置信息,任何配置文件都可以放在配置中心中
b.只需要在bootstrap.properties說明加載配置中心中哪些配置文件即可
spring.cloud.nacos.config.extension-configs[0].data-id=datasource.yml
spring.cloud.nacos.config.extension-configs[0].group=dev
spring.cloud.nacos.config.extension-configs[0].refresh=true
spring.cloud.nacos.config.extension-configs[1].data-id=mybatis.yml
spring.cloud.nacos.config.extension-configs[1].group=dev
spring.cloud.nacos.config.extension-configs[1].refresh=true
c.@Value,@ConfigurationProperties。。。
以前SpringBoot任何方法從配置文件中獲取值,都能使用。
配置中心有的優先使用配置中心中的
d.測試用例中的測試結果
測試用例1(配置中心): http://localhost:7000/coupon/coupon/test
結果:{"msg":"success","code":0,"userName":"dev","age":21}
測試用例2(數據庫連接):http://localhost:7000/coupon/coupon/list
結果:{"msg":"success","code":0,"page":{"totalCount":0,"pageSize":10,"totalPage":0,"currPage":1,"list":[]}}
17. 網關 Spring Cloud Gateway
參考官網址:https://docs.spring.io/spring-cloud-gateway/docs/2.2.8.RELEASE/reference/html/
參考博文:https://www.cnblogs.com/crazymakercircle/p/11704077.html
17.1網關中的基本概念:
-
- Route: The basic building block of the gateway. It is defined by an ID, a destination URI, a collection of predicates, and a collection of filters. A route is matched if the aggregate predicate is true.路由是由一個ID,一個目的URl,一個斷言集合,一個過濾器集合組成。當一個斷言滿足條件,才能命中該路由規則。
-
- Predicate: This is a Java 8 Function Predicate. The input type is a Spring Framework
ServerWebExchange
. This lets you match on anything from the HTTP request, such as headers or parameters. 就是java里的斷言函數,匹配請求里的任何信息,包括請求頭或者參數 - Filter: These are instances of
GatewayFilter
that have been constructed with a specific factory. Here, you can modify requests and responses before or after sending the downstream request. 可以在發送下游請求之前或之后修改請求和響應 - 常見的使用規則如下:
- 轉發規則(predicates),假設 轉發uri都設定為http://localhost:9023
規則 實例 說明 Path - Path=/gate/,/rule/ ## 當請求的路徑為gate、rule開頭的時,轉發到http://localhost:9023服務器上 Before - Before=2017-01-20T17:42:47.789-07:00[America/Denver] 在某個時間之前的請求才會被轉發到 http://localhost:9023服務器上 After - After=2017-01-20T17:42:47.789-07:00[America/Denver] 在某個時間之后的請求才會被轉發 Between - Between=2017-01-20T17:42:47.789-07:00[America/Denver],2017-01-21T17:42:47.789-07:00[America/Denver] 在某個時間段之間的才會被轉發 Cookie - Cookie=chocolate, ch.p 名為chocolate的表單或者滿足正則ch.p的表單才會被匹配到進行請求轉發 Header - Header=X-Request-Id, \d+ 攜帶參數X-Request-Id或者滿足\d+的請求頭才會匹配 Host - Host=www.hd123.com 當主機名為www.hd123.com的時候直接轉發到http://localhost:9023服務器上 Method - Method=GET 只有GET方法才會匹配轉發請求,還可以限定POST、PUT等請求方式
- Predicate: This is a Java 8 Function Predicate. The input type is a Spring Framework
過濾器規則(Filter):
過濾規則 | 實例 | 說明 |
---|---|---|
PrefixPath | - PrefixPath=/app | 在請求路徑前加上app |
RewritePath | - RewritePath=/test, /app/test | 訪問localhost:9022/test,請求會轉發到localhost:8001/app/test |
SetPath | SetPath=/app/{path} | 通過模板設置路徑,轉發的規則時會在路徑前增加app,{path}表示原請求路徑 |
RedirectTo | 重定向 | |
RemoveRequestHeader | 去掉某個請求頭信息 |
注:當配置多個filter時,優先定義的會被調用,剩余的filter將不會生效
17.2使用原理如下:
當客戶端請求到達網關,網關根據斷言判斷請求是否符合某個路由規則,對於符合規則的,經過過濾器到達請求的服務。
17.3創建項目作為API網關
1)新建項目:
New- modules—Spring Initializr(SDK 1.8)。
組織名:com.atguigu.gulimall;
模塊名:gulimall-gateway;包名:com.atguigu.gulimall.gateway 。之后在下一步的依賴中添加(Gateway)的引用。
2)添加引用包:
a. Spring Cloud Boot,Spring Cloud,gulimall-common 排除包Mybatis的引用
pom中排除引用排包的方式:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</exclusion>
</exclusions>
</dependency>
在gateway的pom中排除mybatis-plus的引用:
<dependency>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</exclusion>
<exclusion>
<artifactId>mysql-connector-java</artifactId>
<groupId>mysql</groupId>
</exclusion>
</exclusions>
</dependency>
注解排包方式: @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
b.Nacos 注冊中心,配置中心。其中在bootstrap.properties 中添加nacos的配置:
注冊中心:注冊服務名字,應用名,開啟服務的注冊與發現(@EnableDiscoveryClient)。
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=gulimall-gateway
配置中心:命名空間,所屬組織,應用名。
spring.cloud.nacos.config.namespace=baf42f2f-955c-48e4-bc80-5eac322ab469
spring.cloud.nacos.config.group=dev
server.port= 88
3)測試作為API路由功能(在application.yml中添加路由規則):

spring:
cloud:
gateway:
routes:
- id: test_route
uri: https://www.baidu.com
predicates:
- Query= url,baidu
- id: qq_route
uri: https://www.qq.com
predicates:
- Query= url,qq
啟動gulimall-gateway;