穀粒商城 - 全棧開發篇
代碼:gulimall
一、項目簡介
1、項目背景
1、電商模式
市面上有5種常見的電商模式 B2B、B2C、 C2B、C2C、O2O
1、B2B 模式
B2B (Business to Business),是指商家與商家建立的商業關係。如: 阿里巴巴
2、B2C 模式
B2C (Business to Consumer),就是我們經常看到的供應商直接把商品賣給用戶,即"商對客”模式,也就是通常說的商業零售,直接面向消費者銷售產品和服務。如:蘇寧易購、京東、天貓、小米商城
3、C2B 模式
C2B (Customer to Business),即消費者對企業。先有消費者需求產生而後有企業生產,即先有消費者提出需求,後有生產企業按需求組織生產
4、C2C 模式
C2C (Customer to Consumer),客戶之間自己把東西放上網去賣,如:淘寶,閒魚
5、O2O 模式
O2O 即 Online To Ofline,也即將線下商務的機會與互聯網結合在了一起,讓互聯網成爲線下交易的前臺。線上快速支付,線下優質服務。如:餓了麼,美團,淘票票,京東到家
2、穀粒商城
穀粒商城是一個 B2C 模式的電商平臺,銷售自營商品給客戶。
2、項目架構圖
1、項目微服務架構圖
2、微服務劃分圖
3、項目技術&特色
- 前後分離開發,並開發基於 vue 的後臺管理系統
- SpringCloud 全新的解決方案
- 應用監控、限流、網關、熔斷降級等分佈式方案全方位涉及
- 透徹講解分佈式事務、分佈式鎖等分佈式系統的難點
- 分析高併發場景的編碼方式,線程池,異步編排等使用
- 壓力測試與性能優化
- 各種集羣技術的區別以及使用
- CI/CD 使用
- ......
4、項目前置要求
學習項目的前置知識
- 熟悉 SpringBbot 以及常見整合方案
- 瞭解 SpringCloud
- 熟悉 git,maven
- 熟悉 linux,redis,docker 基本操作
- 瞭解 html,css,js,vue
- 熟練使用 idea 開發項目
二、分佈式基礎概念
1、微服務
微服務架構風格,就像是把一個單獨的應用程序開發爲一套小服務,每個小服務運行在自己的進程中,並使用輕量級機制通信,通常是 HTTP API。 這些服務圍繞業務能力來構建,並通過完全自動化部署機制來獨立部署。這些服務使用不同的編程語言書寫,以及不同數據存儲技術,並保持最低限度的集中式管理。 簡而言之:拒絕大型單體應用,基於業務邊界進行服務微化拆分,各個服務獨立部署運行。
2、集羣 & 分佈式 & 節點
集羣是個物理形態,分佈式是個工作方式。
只要是一堆機器,就可以叫集羣,他們是不是一起協作着幹活,這個誰也不知道; 《分佈式系統原理與範型〉定義: “分佈式系統是若干獨立計算機的集合,這些計算機對於用戶來說就像單個相關係統” 分佈式系統(distributed system)是建立在網絡之上的軟件系統。
分佈式是指將不同的業務分佈在不同的地方。 集羣指的是將幾臺服務器集中在一起,實現同一業務。
例如。京東是一個分佈式系統,衆多業務運行在不同的機器,所有業務構成一個大型的業務集羣。每一個小的業務,比如用戶系統,訪問壓力大的時候一臺服務器是不夠的。我們就應該將用戶系統部署到多個服務器,也就是每一個業務系統也可以做集羣化;
分佈式中的每一個節點都可以做集羣。而集羣並不一定就是分佈式的。
節點:集羣中的一個服務器
3、遠程調用
在分佈式系統中,各個服務可能處於不同主機,但是服務之間不可避免的需要互相調用,我們稱爲遠程調用。
SpringCloud 中使用 HTTP + JSON 的方式完成遠程調用。
4、負載均衡
分佈式系統中,A 服務需要調用 B 服務,B 服務在多臺機器中都存在,A 調用任意一個服務器均可完成功能。
爲了使每一個服務器都不要太忙或者太閒,我們可以負載均衡的調用每一個服務器, 提升網站的健壯性。
常見的負載均衡算法:
輪詢:爲第一個請求選擇健康池中的第一個後端服務器,然後按順序往後依次選擇,直到最後一個,然後循環。
最小連接:優先選擇連接數最少,也就是壓力最小的後端服務器,在會話較長的情況下可以考慮採取這種方式。
散列:根據請求源的 IP 的散列 (hash) 來選擇要轉發的服務器。這種方式可以一定程度上保證特定用戶能連接到相同的服務器。如果你的應用需要處理狀態而要求用戶能連接到和之前相同的服務器,可以考慮採取這種方式。
5、服務註冊/發現 & 註冊中心
A 服務調用 B 服務,A 服務並不知道 B 服務當前在哪幾臺服務器有,哪些正常的,哪些服務已經下線。解決這個問題可以引入註冊中心;
如果某些服務下線,我們其他人可以實時的感知到其他服務的狀態,從而避免調用不可用的服務。
6、配置中心
每一個服務最終都有大量的配置,並且每個服務都可能部署在多臺機器上。我們經常需要變更配置,我們可以讓每個服務在配置中心獲取自己的配置。
配置中心用來集中管理微服務的配置信息。
7、服務熔斷 & 服務降級
在微服務架構中,微服務之間通過網絡進行通信,存在相互依賴,當其中一個服務不可用時,有可能會造成雪崩效應。要防止這樣的情況,必須要有容錯機制來保護服務。
1、服務熔斷
設置服務的超時,當被調用的服務經常失敗到達某個閾值,我們可以開啓斷路保護機制,後來的請求不再去調用這個服務。本地直接返回默認的數據
2、服務降級
在運維期間,當系統處於高峯期,系統資源緊張,我們可以讓非核心業務降級運行。降級:某些服務不處理,或者簡單處理 【拋異常、返回 NULL、調用 Mock 數據、調用 Fallback 處理邏輯】。
8、API 網關
在微服務架構中,API Gateway 作爲整體架構的重要組件,它抽象了微服務中都需要的公共功能同時提供了客戶端負載均衡,服務自動熔斷,灰度發佈,統認證,限流流控,日誌統計等豐富的功能,幫助我們解決很多 API 管理難題。
三、環境搭建
1、安裝 linux 虛擬機
- 可以使用 Oracle VM VirtualBox + Vagrant 實現
- 可以使用 VMware 實現
- 也可以直接使用雲服務器
-
下載安裝 VirtualBox https://www.virtualbox.org/ ,要開啓CPU虛擬化
-
下載安裝 Vagrant
-
打開 window cmd 窗口,運行 Vagrant init centos/7 ,即可初始化一個 centos7 系統
-
運行 vagrant up 即可啓動虛擬機(在電腦當前用戶目錄下有 Vagrantfile 文件)。系統 root 用戶的密碼是 vagrant
-
vagrant 其他常用命令
vagrant ssh
:自動使用 vagrant 用戶連接虛擬機vagrant upload source [destination][name|id]
:上傳文件
- vagrant 命令行 :https://www.vagrantup.com/docs/cli/init
-
默認虛擬機的 ip 地址不是固定 ip ,開發不方便
-
修改 Vagrantfile
config.vm.network "private_network",ip: "192.168.56.10" 這裏的 ip 需要在物理機下使用 ipconfig 命令找到 VirtualBox 的地址是 192.168.56.1 這裏我們選擇將 Vagrantfile ip 修改爲 192.168.56.10
-
重新使用
vagrant up
啓動機器即可。然後再vagrant ssh
連接機器
-
-
默認只允許 ssh 登錄方式,爲了後來操作方便,文件上傳等,我們可以配置允許賬號密碼登錄
Vagrant ssh 進去系統之後 vi /etc/ssh/sshd_config 修改 PasswordAuthentication yes/no 重啓服務 service sshd restart
-
以後可以使用提供的 ssh 連接工具直接連接
2、安裝 Docker
Docker 虛擬化容器技術。Docker 基於境像, 可以秒級啓動各種容器。每一種容器都是一個完整的運行環境,容器之間互相隔離。
Docker 安裝文檔:https://docs.docker.com/engine/install/centos/
1、卸載系統之前的 docker
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2、設置 Docker 存儲庫。之後,可以從存儲庫安裝和更新 Docker
$ 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、通過運行hello-world
映像來驗證是否正確安裝了 Docker Engine
$ sudo docker run hello-world
6、設置開機自啓
$ sudo systemctl enable docker
7、配置 docker 阿里雲鏡像加速
阿里雲-控制檯-容器鏡像服務-鏡像加速器-配置鏡像加速器
3、Docker 安裝 MySQL
1、下載鏡像文件
docker pull mysql:5.7
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 :將容器的3306端口映射到主機的3306端口
-v /mydata/mysql/conf:/etc/mysql :將配置文件夾掛載到主機
-v /mydata/mysql/log/mysql :將日誌文件夾掛載到主機
-v /mydata/mysql/data:/var/lib/mysql/ :將配置文件夾掛載到主機
-e MYSQL_ROOT_PASSWORD=root :初始化root用戶的密碼
啓動後,可以交互模式進入容器,查看mysql相關的目錄命令: whereis mysql
3、MySQL配置
vi /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=utf8mb4
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
注意:解決MySQL連接慢的問題
在配置文件中加入如下,並重啓MySQL
[mysqld]
skip-name-resolve
解析:
skip-name-resolve :跳過域名解析
4、設置 root 遠程訪問
5、進入容器文件系統
4、Docker 安裝 Redis
1、下載鏡像文件
docker pull redis
2、創建實例並啓動
mkdir -p /mydata/redis/conf
touch /mydata/redis/conf/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
redis 自描述文件:
https://raw.githubusercontent.com/antirez/redis/4.0/redis.conf
redis 官網配置文件 https://redis.io/topics/config
3、開啓redis持久化
vi /mydata/redis/conf/redis.conf
--輸入
appendonly yes
4、使用 redis 鏡像執行 redis-cli 命令連接
docker exec -it redis redis-cli
5、統一開發環境
1、Maven
//配置阿里雲鏡像
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</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>
2、idea & vscode
idea安裝插件
- lombok
- mybatisX
vscode安裝插件
- Auto Close Tag
- Auto Rename Tag
- Chinese
- ESLint
- HTML CSS Support
- HTML Snippets
- JavaScript ES6
- Live Server
- open in browser
- Vetur
3、安裝配置git
1、下載 Git :https://git-scm.com/
2、配置 Git :進入git bash
# 配置用戶名
git config -global user.name "usermame"I // (名字)
# 配置郵箱
git config -global user.email "[email protected]" // (註冊賬號時用的郵箱)
3、配置 ssh 免密登錄
https://gitee.com/help/articles/4191#article-header0
進入 git bash 使用: ssh-keygen -t rsa -C "[email protected]"命令。連續三次回車。
一般用戶目錄下會有
id_rsa
id_rsa.pub
或者 cat ~/.ssh/id_rsa.pub
登錄進入 gitee ,在設置裏面找到 SSH KEY 將 .pub 文件的內容粘貼進去
使用 ssh-T [email protected] 測試是否成功即可
4、逆向工程使用
1、導入項目逆向工程
2、下載人人開源後臺管理系統腳手架工程
- 導入工程,創建數據庫
- 修改工程 shiro 依賴爲 SpringSecurity
- 刪除部分暫時不需要的業務
3、下載人人開源後臺管理系統 vue 端腳手架工程
- yscode 導入前端項目
- 前後端聯調測試基本功能
6、創建項目微服務
商品服務、倉儲服務、訂單服務、優惠券服務、用戶服務
共同:
- web、openfeign
- 每一個服務,包名 com.atguigu.gulimall.xxx (product /order /ware /coupon /member)
- 模塊名:guliall-coupon
1、從 Gitee 初始化一個項目
在 Gitee 上創建一個倉庫,並拉取下來
2、創建各個微服務項目
創建項目模塊
7、數據庫初始化
四、快速開發
1、搭建後臺管理系統
使用人人開源(https://gitee.com/renrenio)的腳手架快速搭建後臺管理系統
- 腳手架 renren-fast :後臺管理系統後端項目
- 腳手架 renren-fast-vue :後臺管理系統前端項目
2、逆向工程搭建基本代碼
使用人人開源的逆向工程項目(renren-generator),根據數據庫表結構生成每個微服務的基本代碼:entity、xml、dao、service 代碼
3、配置&測試微服務CRUD功能
spring:
application:
name: gulimall-coupon
datasource:
url: jdbc:mysql://127.0.0.1:3306/gulimall_sms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 123456
jackson:
date-format: yyyy-MM-dd HH:mm:ss
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
global-config:
db-config:
id-type: auto
logic-delete-value: 1
logic-not-delete-value: 0
server:
port: 3000
logging:
level:
com.atguigu.gulimall: debug
五、分佈式組件
1、SpringCloud Alibaba 簡介
1)簡介
Spring Cloud Alibaba 致力於提供微服務開發的一站式解決方案。此項目包含開發分佈式應用微服務的必需組件,方便開發者通過 Spring Cloud 編程模型輕鬆使用這些組件來開發分佈式應用服務。
依託 Spring Cloud Alibaba,您只需要添加一些註解和少量配置,就可以將 Spring Cloud 應用接入阿里微服務解決方案,通過阿里中間件來迅速搭建分佈式應用系統。
https://github.com/alibaba/spring-cloud-alibaba
2)爲什麼用
Spring Cloud 的幾大痛點:
- Spring Cloud 部分組件停止維護和更新,給開發帶來不便
- Spring Cloud 部分環境搭建複雜,沒有完善的可視化界面,我們需要大量的二次開發和定製
- Spring Cloud 配置複雜,難以上手,部分配置差別難以區分和合理應用
Spring Cloud Alibaba 的優勢:
- 阿里使用過的組件經歷了考驗,性能強悍,設計合理,現在開源出來大家用
- 成套的產品搭配完善的可視化界面給開發運維帶來極大的便利
- 搭建簡單,學習曲線低
3)最終的技術搭配方案
- Spring Cloud Alibaba - Nacos:註冊中心 (服務發現/註冊)
- Spring Cloud Alibaba Nacos:配置中心 (動態配置管理)
- Spring Cloud - Ribbon:負載均衡
- Spring Cloud - Feign:聲明式 HTTP 客戶端 (調用遠程服務)
- Spring Cloud Alibaba - Sentinel:服務容錯 (限流、降級、熔斷)
- Spring Cloud - Gateway:API 網關 (weblux編程模式)
- Spring Cloud - Sleuth:調用鏈監控
- Spring Cloud Alibaba - Seata:原 Fescar ,即分佈式事務解決方案
4)版本選擇
由於 Spring Boot 1 和 Spring Boot 2 在 Actuator 模塊的接口和註解有很大的變更,且 spring-cloud-commons 從 1.x.x 版本升級到 2.0.0 版本也有較大的變更,因此我們採取跟 Spring Boot 版本號一致的版本:
- 1.5.x 版本適用於 Spring Boot 1.5.x
- 2.0.x 版本適用於 Spring Boot 2.0.x
- 2.1.x 版本適用於 Spring Boot 2.1.x
2、SpringCloud Alibaba Nacos 註冊中心
Nacos 是阿里巴巴開源的一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺。他是使用 java 編寫,需要依賴 java 環境。
Nacos 文檔地址: https://nacos.io/zh-cn/docs/quick-start.html
1)引入依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2)Nacos Server 啓動
具體參考官網:https://nacos.io/zh-cn/docs/quick-start.html
Nacos Server 啓動後,進入 http://localhost:8848 查看控制檯 (默認賬號名/密碼爲 nacos/nacos)
關於更多的 Nacos Server 版本,可以從 release 頁面 下載最新的版本
3)Nacos 基本配置
server.port=8081
spring.application.name=nacos-provider
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*
如果不想使用 Nacos 作爲您的服務註冊與發現,可以將 spring.cloud.nacos.discovery
設置爲 false
。
使用 @EnableDiscoveryClient
註解開啓服務註冊與發現功能
@SpringBootApplication
@EnableDiscoveryClient
public class CouponApplication {
public static void main(String[] args) {
SpringApplication.run(CouponApplication.class, args);
}
}
4)啓動應用
觀察 Nacos 控制檯 服務列表是否已經註冊上服務
注意:每一個應用都應該有名字,這樣才能註冊上去。修改 application.properties 文件
spring.application.name=service-provider
server.port=8000
3、SpringCloud OpenFeign 聲明式遠程調用
1)簡介
Feign 是一個聲明式的 HTTP 客戶端,它的目的就是讓遠程調用更加簡單。Feign 提供了 HTTP 請求的模板,通過編寫簡單的接口和插入註解,就可以定義好 HTTP 請求的參數、格式、地址等信息。
Feign 整合了 Ribbon (負載均衡) 和 Hystrix (服務熔斷),可以讓我們不再需要顯式地使用這兩個組件。
Spring Cloud Feign 在 Netfix Feign 的基礎上擴展了對 SpringMVC 註解的支持,在其實現下,我們只需創建一個接口並用註解的方式來配置它,即可完成對服務提供方的接口綁定。簡化了 Spring Cloud Ribbon 自行封裝服務調用客戶端的開發量。
2)使用
1、引入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、開啓 feign 功能
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.atguigu.gulimall.member.feign")
3、 編寫一個接口,告訴 Spring Cloud 這個接口需要調用遠程服務
聲明接口的每一個方法都是調用哪個遠程服務的那個請求
@FeignClient("gulimall-coupon")
public interface CouponFeignService {
/**
* 遠程調用的路徑寫全
*
* @return {@link R}
*/
@RequestMapping("/coupon/coupon/member/list")
public R memberCoupons();
}
4、編寫 controller
@Autowired
private CouponFeignService couponFeignService;
@GetMapping("/coupons")
public R test() {
MemberEntity memberEntity = new MemberEntity();
memberEntity.setNickname("don");
R memberCoupons = couponFeignService.memberCoupons();
return R.ok().put("member", memberEntity).put("coupons", memberCoupons.get("test"));
}
5、遠程服務編寫
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
@Autowired
private CouponService couponService;
/**
* 會員優惠券 測試
*
* @return {@link R}
*/
@RequestMapping("/member/list")
public R memberCoupons() {
return R.ok().put("test", "ok");
}
}
6、啓動兩個服務測試
訪問 http://localhost:4000/member/member/coupons
成功返回 json
{
"msg": "success",
"code": 0,
"coupons": "ok",
"member": {
"id": null,
"levelId": null,
"username": null,
"password": null,
"nickname": "don",
"mobile": null,
"email": null,
"header": null,
"gender": null,
"birth": null,
"city": null,
"job": null,
"sign": null,
"sourceType": null,
"integration": null,
"growth": null,
"status": null,
"createTime": null
}
}
4、SpringCloud Alibaba Nacos 配置中心
1)引入依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2)配置文件中配置
在應用的 /src/main/resources/bootstrap.properties
配置文件中配置 Nacos Config 元數據
spring.application.name=nacos-config-example
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
3)Nacos 控制檯配置
添加的配置的詳情如下
dataId 爲 gulimall-coupon.properties //默認規則,應用名.properties
group 爲 DEFAULT_GROUP
內容如下
user.id=1
user.name=don
user.age=17
4)啓動應用
應用會從 Nacos Config 中獲取相應的配置,並添加在 Spring Environment 的 PropertySources 中。這裏我們使用 @Value
註解來將對應的配置注入到 SampleController 的 userName 和 age 字段,並添加 @RefreshScope
打開動態刷新功能
@RefreshScope:動態獲取並刷新配置
@Value("${配置項的名}"):獲取到配置,如果配置中心和當前應用的配置文件中都配置了相同的項,優先使用配置中心的配置
5)配置中心-命名空間
用於進行租戶粒度的配置隔離。不同的命名空間下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用場景之一是不同環境的配置的區分隔離,例如開發測試環境和生產環境的資源(如配置、服務)隔離等。
/**
* 默認:public(保留空間);默認新增的所有配置都在public空間。
* 1、開發,測試,生產:利用命名空間來做環境隔離。
* 注意:在bootstrap.properties;配置上,需要使用哪個命名空間下的配置,
* spring.cloud.nacos.config.namespace=9de62e44-cd2a-4a82-bf5c-95878bd5e871
* 2、每一個微服務之間互相隔離配置,每一個微服務都創建自己的命名空間,只加載自己命名空間下的所有配置
*/
6)配置中心-配置集
一組相關或者不相關的配置項的集合稱爲配置集。在系統中,一個配置文件通常就是一個配置集,包含了系統各個方面的配置。例如,一個配置集可能包含了數據源、線程池、日誌級別等配置項。
7)配置中心-配置集ID
Nacos 中的某個配置集的 ID。配置集 ID 是組織劃分配置的維度之一。 Data lD 通常用於組織劃分系統的配置集。一個系統或者應用可以包含多個配置集,每個配置集都可以被一個有意義的名稱標識。Data lD 通常採用類 Java 包 ( 如 com.taobao.tc.refund.log.level ) 的命名規則保證全局唯一性。此命名規則非強制。
8)配置中心-配置分組
Nacos 中的一組配置集,是組織配置的維度之一。通過一個有意義的字符串(如 Buy 或 Trade )對配置集進行分組,從而區分 Data ID 相同的配置集。當您在 Nacos 上創建一個配置時,如果未填寫配置分組的名稱,則配置分組的名稱默認採用 DEFAULT_GROUP 。配置分組的常見場景:不同的應用或組件使用了相同的配置類型,如 database_url 配置和 MQ_topic 配置。
默認所有的配置集都屬於:DEFAULT_GROUP
該項目中的使用:每個微服務創建自己的命名空間,使用配置分組區分環境,dev,test,prod
9)配置中心-加載多配置集
將一個服務的配置文件,拆分成三部分:
1、在 coupon 命名空間下 新建配置
Data ID:datasource.yml
Group:dev
配置格式:YAML
配置內容:
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/gulimall_sms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 123456
2、在 coupon 命名空間下 新建配置
Data ID:mybatis.yml
Group:dev
配置格式:YAML
配置內容:
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
global-config:
db-config:
id-type: auto
logic-delete-value: 1
logic-not-delete-value: 0
3、在 coupon 命名空間下 新建配置
Data ID:other.yml
Group:dev
配置格式:YAML
配置內容:
spring:
application:
name: gulimall-coupon
jackson:
date-format: yyyy-MM-dd HH:mm:ss
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
server:
port: 3000
logging:
level:
com.atguigu.gulimall: debug
4、修改 coupon 服務的 bootstrap.yml
spring:
application:
name: gulimall-coupon
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
namespace: 29f44e4c-08ec-4f6b-b89c-2775fd72c275
group: dev
ext-config[0]:data-id: datasource.yml
ext-config[0].group: dev
ext-config[0].refresh: true
ext-config[1]:data-id: mybatis.yml
ext-config[1].group: dev
ext-config[1].refresh: true
ext-config[2]:data-id: other.yml
ext-config[2].group: dev
ext-config[2].refresh: true
5、註釋掉 application.yml 的配置
將 application.yml 配置註釋後,啓動服務
:: Spring Boot :: (v2.2.2.RELEASE)
2020-07-10 10:18:42.168 INFO 4620 --- [ restartedMain] c.a.c.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'datasource.yml', group: 'dev'
2020-07-10 10:18:42.174 INFO 4620 --- [ restartedMain] c.a.c.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'mybatis.yml', group: 'dev'
2020-07-10 10:18:42.178 INFO 4620 --- [ restartedMain] c.a.c.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'other.yml', group: 'dev'
2020-07-10 10:18:42.183 INFO 4620 --- [ restartedMain] c.a.c.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'gulimall-coupon.properties', group: 'dev'
2020-07-10 10:18:42.184 INFO 4620 --- [ restartedMain] b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-gulimall-coupon.properties'}, BootstrapPropertySource {name='bootstrapProperties-other.yml'}, BootstrapPropertySource {name='bootstrapProperties-mybatis.yml'}, BootstrapPropertySource {name='bootstrapProperties-datasource.yml'}]
2020-07-10 10:18:42.209 INFO 4620 --- [ restartedMain] c.a.gulimall.coupon.CouponApplication : No active profile set, falling back to default profiles: default
訪問:http://localhost:3000/coupon/coupon/test
{"msg":"success","useAge":"18","code":0,"useName":"don"}
訪問:http://localhost:3000/coupon/coupon/list
後臺打印:
2020-07-10 10:21:41.372 DEBUG 4620 --- [nio-3000-exec-5] c.a.g.coupon.dao.CouponDao.selectPage : ==> Preparing: SELECT id,min_point,note,amount,coupon_name,code,member_level,num,enable_end_time,use_type,enable_start_time,coupon_type,publish,receive_count,start_time,use_count,end_time,coupon_img,publish_count,per_limit FROM sms_coupon
2020-07-10 10:21:41.399 DEBUG 4620 --- [nio-3000-exec-5] c.a.g.coupon.dao.CouponDao.selectPage : ==> Parameters:
2020-07-10 10:21:41.417 DEBUG 4620 --- [nio-3000-exec-5] c.a.g.coupon.dao.CouponDao.selectPage : <== Total: 0
返回結果:
{"msg":"success","code":0,"page":{"totalCount":0,"pageSize":10,"totalPage":0,"currPage":1,"list":[]}}
5、SpringCloud- Gateway 網關
1)簡介
網關作爲流量的入口,常用功能包括路由轉發、權限校驗、限流控制等。而 spring cloud gateway 作爲 Spring Cloud 官方推出的第二代網關框架,取代了 Zuul 網關。
網關提供 API 全託管服務,豐富的 API 管理功能,輔助企業管理大規模的 API,以降低管理成本和安全風險,包括協議適配、協議轉發、安全策略、防刷、流量、監控日誌等功能。
Spring Cloud Gateway 旨在提供一種簡單而有效的方式來對 API 進行路由,併爲他們提供切面,例如:安全性,監控/指標和彈性等。
官方文檔地址:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.3.RELEASE/reference/html/
2)核心概念
路由
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.
斷言
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.
過濾器
Filter: These are instances of Spring Framework GatewayFilter that have been constructed with a specific factory. Here, you can modify requests and responses before or after sending the downstream request.
3)使用
1、HelloWorld
創建模塊 gulimall-gateway
引入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
開啓服務註冊發現 @EnableDiscoveryClient
配置 nacos 的註冊中心地址
bootstrap.yml
spring:
application:
name: gulimall-gareway
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
namespace: d6a49c61-7ff2-41fa-a2df-1d0783b118f6
group: dev
application.properties
server.port=88
spring.application.name=gulimall-gareway
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
編寫網關配置文件
application.yml
spring:
cloud:
gateway:
routes: # 數組
- id: baidu_route # 數組1
uri: https://www.baidu.com
predicates:
- Query=url,baidu
- id: qq_route # 數組2
uri: https://www.qq.com
predicates:
- Query=url,qq
啓動服務測試
http://localhost:88/hello?url=qq
http://localhost:88/hello?url=baidu
2、斷言 (predicates)
3、過濾器 (filters)