【項目學習】穀粒商城學習記錄1
1、linux虛擬機安裝
- 安裝VirtualBox: virtualbox安裝地址
- 安裝Vagrant:Vagrant安裝地址
- Vagrant倉庫:Vagrant倉庫地址
- 使用Vagrant安裝centos7,並進行虛擬機網絡設置:
2、linux安裝docker
- docker倉庫:docker hub 用於下載各種鏡像
- 參考博客:
- 配置阿里雲鏡像加速參考:CentOS安裝Docker
- centos7安裝Docker詳細步驟(無坑版教程)
- docker安裝mysql:
- docker安裝redis:
- redis Desktop Manager安裝:Redis Desktop Manager(Redis可視化工具)安裝及使用教程
3、開發環境配置
- IDEA安裝:-省略
- git安裝使用:-省略
- 項目結構創建:-就是springboot cloud那些,創捷一些module,最後改一下maven倉庫,改一下pom文件就行
- 數據庫初始化:穀粒商城sql 注意裏面有的sql後面採用
- 快速開發:
- 人人開源 首先把renren-fast項目clone到我們的gulimall項目中,修改renren-fast模塊爲gulimall的子模塊
- 數據庫運行renren-fast項目下的mysql.sql,安裝相關表
- 修改application.yml,修改數據庫連接信息
- 安裝前端相關工具:nodejs。
- 下載renren-fast-vue項目,vscode打開,運行npm install安裝依賴。我的node和npm版本: (不需要完全一樣,差不多就行) 如果報錯可以多嘗試幾次,我好像用的huaweiyun的依賴庫,比較nice。
- 下載renren-generator: 這部分沒什麼坑
- 整合mybatis-plus加測試:
- @Test報錯:
- 自己加上如下依賴在pom中
<dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.3.2</version> <scope>test</scope> </dependency>
- P18集報錯:Caused by: java.lang.IllegalStateException
- 解決參考: Application run failed——p18集做穀粒商城時遇到的測試類啓動不起來,報錯:Caused by: java.lang.IllegalStateException, 穀粒商城P18運行測試代碼(GulimallProductApplicationTests)出現問題彙總, 穀粒商城-商品服務測試啓動報錯
- 其實很多問題都是因爲照着視頻直接將生成的main合併到自己項目中導致的,可見這個代碼生成相當差勁。你最好仔細檢查下自己生成的文件,是否有合併後多了或者少了的情況。我的是Dao文件和xml文件對應不上,這主要因爲我第二次只把main中的product文件夾合併了,沒有重新更正xml文件。最好先將原文件夾中內容刪除,再放入新內容
- 還有個問題:在yml文件中將數據庫表名後面加上
?useUnicode=true&characterEncoding=utf8&useSSL=false
- 生成一個微服務相關逆向代碼步驟:
-
- 首先修改renren-generator模塊中的generator.properties 文件: 修改
package=com.atguigu.gulimall
,moduleName=xxx
(xxx表示模塊名),author
和email
隨便寫寫,tablePrefix=xx_
(xx_是模塊xxx對應數據庫表中的前綴,這樣寫在生成文件時可以忽略掉這些前綴)
- 首先修改renren-generator模塊中的generator.properties 文件: 修改
-
- 修改application.yml中的mysql配置,將
url
改成jdbc:mysql://192.168.56.10:3306/gulimall_xxx?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
(xxx是當前模塊名)
- 修改application.yml中的mysql配置,將
-
- 運行Renrenapplication.java文件,瀏覽器打開localhost:80端口頁面,全選文件並生成代碼(注意將所有文件顯示在1頁才能正常全選)。使用下載的生成代碼中的main文件夾,替換目標模塊文件夾下的main(最好先刪除原main文件夾,再解壓生成的文件夾到目標模塊目錄下,不容易出錯)。
-
- IDEA中打開pom.xml文件,添加
gulimall-common
依賴。我由於前面的問題,還得添加junit jupiter api
依賴。由於我前面是刪除main再解壓,所以還得手動添加上各模塊下的GulimallXxxApplication.java文件。
- IDEA中打開pom.xml文件,添加
-
- 添加resources/application.yml文件, 配置mysql信息。
-
- 運行Application文件,使用8080端口+方法調用來驗證。
-
4、分佈式組件
- spring cloud alibaba官方文檔:地址
- 組件1:註冊中心Nacos:
-
- 修改gulimall-common的pom.xml 文件,引入 Nacos Discovery Starter。
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
-
- docker拉一個nacos:參考地址 (最好拉
nacos/nacos-server:1.1.3
) . 運行後訪問ip:8848/nacos
訪問nacos
- docker拉一個nacos:參考地址 (最好拉
-
- 註冊一個服務需要修改兩處:
- 在微服務配置文件中配置
spring.cloud.nacos.discovery.server-addr:ip地址:8848
和服務名spring.application.name:gulimall-xxx
- 在Application.java文件添加註解
@EnableDiscoveryClient
,然後啓動服務就行
-
- 組件2:Feign 聲明式遠程調用:
- 以member組件調用coupon的membercoupons()爲例:
- 全局要引入feign依賴:gulimall-common引入依賴
<!--Feign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
- 服務端(即被調用方法端):不需要操作,只需要實現要調用的方法就行。
@RequestMapping("/member/list") public R membercoupons() { CouponEntity couponEntity = new CouponEntity(); couponEntity.setCouponName("買100-10"); return R.ok().put("coupons", Arrays.asList(couponEntity)); }
- 調用端想要調用別的服務:
- 1.開啓feign功能:Application.java添加
@EnableFeignClients(basePackages = "com.atguigu.gulimall.member.feign")
註解 - 2.聲明遠程接口:(一般遠程調用都放在feign包下)編寫一個CouponFeignService接口,告訴SpringCloud這個接口需要調用遠程服務。
@FeignClient("gulimall-coupon") public interface CouponFeignService { //把要調用的遠程方法的頭部複製過來就行 @RequestMapping("coupon/coupon/member/list") public R membercoupons(); }
- 1.開啓feign功能:Application.java添加
- 測試:在任意controller中寫下如下測試代碼,通過調用member模塊下的couponFeignService.membercoupons()遠程接口方法來遠程調用Coupon模塊下的membercoupons()方法。
@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")); }
- Nacos 作爲配置中心: 官方地址
- 1、全局gulimall-common導入依賴
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
- 2、新建bootstrap.properties文件,進行相關配置
# 配置發現名 spring.application.name=gulimall-coupon # 配置中心地址 spring.cloud.nacos.config.server-addr=ip地址:8848
- 3、爲配置中心默認添加數據集(Data id) gulimall-coupon.properties,默認規則:
應用名.properties
。我們可以將配置添加到應用名.properties
中
- 4、動態獲取配置:
- @RefreshScope: 動態獲取並刷新配置
- @Value("${配置項名稱}"): 獲取配置值
- 配置中心中配置優先級 > 本地配置文件中配置
- 5、細節
-
命名空間:用於配置隔離,默認是public(保留空間),默認新增的配置都在public中
- 1、開發,測試,生產:利用命名空間實現環境隔離。
注意:要在bootstrap.properties文件中配置使用的命名空間:
舉例:新建三個新的命名空間,然後再prop環境中添加之前的gulimall-coupon.properties配置,並修改上面的配置文件,使用prop命名空間。重啓會發現輸出結果變成了prop環境下的配置信息。spring.cloud.nacos.config.namespace=44856f1b-4db1-438c-8c42-0d4019346b4e
- 2、每一個微服務直接實現隔離配置: 每個微服務創建自己的命名空間,每個微服務只加載自己命名空間下的配置
- 1、開發,測試,生產:利用命名空間實現環境隔離。
-
配置集:所有配置的集合
-
配置集id: 類似於配置文件名, nacos中是
Data id
-
配置分組:默認所有配置集屬於
DEFAULT_GROUP
, 相當於實現了再同一命名空間下,對同一配置文件進行不同分組的區別。同樣在使用時需要在配置文件中說明使用哪個配置分組spring.cloud.nacos.config.group=1111
-
每個微服務創建自己的命名空間,再使用配置分組區分環境
-
同時加載多個配置集:
- 微服務任何配置信息,任何配置文件都可以放在配置中心中
- 只需要在bootstrp.properties中說明加載配置中心中的哪些配置文件即可
- 以前任何springboot獲取配置文件中配置註解都能用在配置中心上。
-
- 1、全局gulimall-common導入依賴
- 組件3:Gateway網關:
- 1、新建一個Module:gulimall-gateway, 要選擇gateway服務,然後配置好pom.xml文件。
- 2、開啓服務註冊發現(添加註解,配置nacos註冊中心地址)
- 3、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