前言:無意中看到尚硅谷發佈了最新的微服務分佈式項目《穀粒商城》,剛好最近在學習微服務,所以,想要學習一下。
官方已經發布了相關的資料,但是,可惜的是,並沒有課件,只能跟着視頻教程一步一步的學習,所以,將目前學習的筆記整理,供自己日後複習,供大家參考。若有不足,還請指正。
gitee上倉庫地址:https://gitee.com/wolf623/gulimall
一、開發環境統一
0、安裝虛擬機、安裝MySQL、安裝Redis
因爲我不打算在我本地電腦上安裝這些,所以這條內容省略。
1、Maven
(1)使用阿里鏡像倉庫
<!-- 阿里鏡像倉庫-->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>
http://maven.aliyun.com/nexus/content/groups/public/
</url>
<mirrorOf>central</mirrorOf>
</mirror>
(2)使用jdk1.8編譯
<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>
2、安裝vscode,並安裝相關插件
3、安裝配置git
git我之前已經安裝過了,這裏就不說了。
跟視頻一樣吧,也使用碼雲,註冊就不說了。
不過,這裏要注意一個問題,也就是多個git ssh key 管理問題
不然,會提示:permission denied錯誤。
因爲我之前有其他git賬號的ssh key存在,比如GitHub,這裏在生成ssh key時,不能一路回車
ssh-keygen -t rsa -C "[email protected]" <<<這裏不能一路回車,第一個交互提示要輸入存放的路徑,不能用默認的,否則會覆蓋原來的其他的賬號key
下面說下,關於管理多個git ssh key的問題
在.ssh目錄創建config文本文件並完成相關配置(最核心的地方)
內容說明如下:
HostName 這個是真實的域名地址
IdentityFile 這裏是id_rsa的地址
PreferredAuthentications 配置登錄時用什麼權限認證--可設爲publickey,password publickey,keyboard-interactive等
User 配置使用用戶名
這裏我的是:
# 配置github.com
Host github.com
HostName github.com
IdentityFile C:\Users\abc\.ssh\github_rsa
PreferredAuthentications publickey
User myname
# 配置gitee.com
Host gitee.com
HostName gitee.com
IdentityFile C:\Users\abc\.ssh\gitee_rsa
PreferredAuthentications publickey
User myname
之後,通過這個命令來測試:ssh -T [email protected]
參考:
https://blog.csdn.net/weixin_36995644/article/details/81776412
https://www.cnblogs.com/popfisher/p/5731232.html
4.項目初始結構創建
在gitee上創建倉庫,並且在IDEA中clone,並創建member會員服務,ware倉儲服務,order訂單服務,product產品服務,coupon優惠券服務,修改.gitignore文件,增加以下內容忽略這些文件的修改。
**/mvnw
**/mvnw.cmd
**/.mvn
**/target/
.idea
**/.gitignore
最後,再把代碼提交到gitee倉庫中。
5.數據庫初始化
根據提供的SQL文件,分別創建gulimall各個表。
二、快速開發-使用人人開源搭建後臺管理系統
1.git clone下載renren-fast, renren-fast-vue,renren-generator倉庫代碼
https://gitee.com/renrenio/renren-fast.git
https://gitee.com/renrenio/renren-fast-vue.gi
https://gitee.com/renrenio/renren-generator.git
2.將renren-fast代碼放到gulimall工程目錄下面,並在總工程的pom.xml引入renren-fast module.
3.執行renren-fast模塊種的db文件下的mysql.sql語句
注意,創建的數據庫的基字符集使用utf8mb4。
4.修改renren-fast的application-dev.yml語句中的如下信息
url: jdbc:mysql://172.0.1.xx:3306/gulimall_admin
username: root
password: 123456
啓動renren-fast應用
注意,這裏遇到一個錯誤,就是application-dev.yml文件中的com.alibaba.druid.pool.DruidDataSource 顯示紅色,出錯。
另外,一個就是RenrenApplication.java中String標紅,顯示需要導入包。原來是這個module沒有設置對應的jdk,設置一下jdk8就沒問題了。
5.安裝Node.js,配置npm使用淘寶鏡像
npm config set registry http://registry.npm.taobao.org/
6.用vscode打開renren-fast-vue代碼,在終端執行:npm install 下載安裝依賴,
如果下載出錯,可以使用cnpm install 下載,在下載完成後,執行:npm run dev 啓動
7.renren-generator代碼導入到我們的項目,並啓動
8.使用renren-generator結合renren-fast-vue,根據數據庫,反向生成product模塊代碼,並把main文件copy覆蓋product下面的main文件夾。
9..新建gulimall-common模塊,把公共的API等信息放到common模塊中,並解決product中代碼引用包的問題。
10.如法炮製,依次使用人人開源產生代碼,覆蓋main,並導入gulimall-common這類。
11.使用MyBatis-Plus,測試數據庫讀寫問題
(1)導入依賴,在gulimall-common模塊的pom.xml中加入:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
(2)在gulimall-product的application.yml文件增加以下內容:
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://172.0.1.xx:3306/gulimall_pms?characterEncoding=UTF-8
driver-class-name: com.mysql.cj.jdbc.Driver
#driver-class-name: com.mysql.jdbc.Driver
mybatis-plus:
mapper-locations: classpath*:/mapper/**/*.xml
global-config:
db-config:
id-type: auto
(3)在GulimallProductApplicationTests.java中,如下:
@SpringBootTest
class GulimallProductApplicationTests {
@Autowired
BrandService brandService;
@Test
void contextLoads() {
// BrandEntity brandEntity = new BrandEntity();
// brandEntity.setBrandId(4L);
// brandEntity.setDescript("華爲");
// brandEntity.setName("華爲");
// brandService.save(brandEntity);
// System.out.println("保存成功...");
// brandService.updateById(brandEntity);
List<BrandEntity> list = brandService.list(new QueryWrapper<BrandEntity>().eq("brand_id", 4L));
list.forEach((item) -> {
System.out.println(item);
});
}
}
(4)啓動GulimallProductApplicationTests方法,依次測試上面的save方法,update方法,以及遍歷方法,可以看到數據庫中的數據是正確的。
(5)使用總結
/*
1、整合MyBatis-Plus
(1)、導入依賴
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
(2)、配置
1、配置數據源
1)、導入數據庫的驅動
2)、在application.yml配置數據源相關信息
2、配置Mybatis-Plus
1)、使用MapperScan
2)、告訴MyBatis-Plus,sql映射文件位置
*/
注意,這裏有兩個問題:
(1)啓動整個測試類,application.yml中的driver-class-name: com.mysql.jdbc.Driver 提示報警,應該使用driver-class-name: com.mysql.cj.jdbc.Driver
(2)數據庫寫入出現亂碼,應該把application.yml中的url改爲:
url: jdbc:mysql://172.0.1.xx:3306/gulimall_pms?characterEncoding=UTF-8
至此,整個項目基本環境已經弄好了。
三、引入SpringCloudAlibaba組件
1.SpringCloudAlibaba版本引用
在gulimall-common的pom.xml文件中引入spring-cloud-alibaba,如下:
<dependencyManagement>
<!-- spring cloud alibaba 2.1.0.RELEASE -->
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.引入Alibaba Nacos註冊中心
(1)引入Nacos Discovey,在gulimall-common的pom.xml文件中加上以下內容:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
(2)下載Nacos server,我下載的是1.1.4版本,解壓後,執行bin目錄下面的startup.cmd文件啓動。
(3)在應用中配置指定Nacos server註冊中心地址,以gulimall-coupon模塊說明,在application.yml文件中添加如下內容:
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
application:
name: gulimall-coupon
(4)使用@EnableDiscoveryClient註解開啓服務註冊於發現功能
(5)啓動gulimall-coupon服務(注意Nacos Server要先啓動),訪問本地連接:http://localhost:8848/nacos/#/serviceManagement?dataId=&group=&appName=&namespace=,會看到服務列表裏面出現gulimall-coupon
3.在gulimall-member遠程調用gulimall-coupon模塊的服務
(1)openfeign聲明式遠程調用引入,在gulimall-member模塊的pom.xml文件加入以下內容:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
(2)在CouponController.java加上遠程調用的方法實現
@RequestMapping("/member/list")
public R membercoupons() {
CouponEntity couponEntity = new CouponEntity();
couponEntity.setCouponName("滿100減50");
return R.ok().put("coupons", Arrays.asList(couponEntity));
}
(3)在gulimall-member模塊下,建立一個接口CouponFeignService.java,並寫上上面實現的遠程調用的API。
package com.atguigu.gulimall.member.feign;
import com.atguigu.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 這是一個聲明式的遠程調用
*/
@FeignClient("gulimall-coupon")
public interface CouponFeignService {
@RequestMapping("/coupon/coupon/member/list")
public R membercoupons();
}
(4)在GulimallMemberApplication.java中添加@EnableFeignClients(basePackages = "com.atguigu.gulimall.member.feign") ,這個註解的作用是讓springcloud掃描com.atguigu.gulimall.member.feign包下的所有接口
/**
* 1、想要遠程調用別的服務
* 1)、引入open-feign
* 2)、編寫一個接口,告訴SpringCloud這個接口需要調用遠程服務
* 1、聲明接口的每一個方法都是調用哪個遠程服務的那個請求
* 3)、開啓遠程調用功能
*/
@EnableFeignClients(basePackages = "com.atguigu.gulimall.member.feign")
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallMemberApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallMemberApplication.class, args);
}
}
(5)在gulimall-member模塊下的controller數據包寫一個測試方法來調用這個遠程服務API,比如:在MemberController.java中寫一個測試方法,如下:
@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"));
}
(6)啓動gulimall-coupon和gulimall-member這兩個微服務,訪問測試API的地址:http://localhost:8000/member/member/coupons,即可以看到能訪問到數據。
4.引入Alibaba Nacos配置中心
(1)導入Nacos配置中心,在gulimall-common的pom.xml文件中加上以下內容:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
(2)gulimall-coupon模塊西安的resource目錄下新建文件bootstrap.properties,內容如下:
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
(3)在gulimall-coupon模塊下的application.properties中加入以下配置:
coupon.user.name=zhangsan
coupon.user.age=18
(4)寫測試方法,在CouponController.java中加入以下內容:
@Value("${coupon.user.name}")
private String name;
@Value("${coupon.user.age}")
private Integer age;
@RequestMapping("/test")
public R test() {
return R.ok().put("name", name).put("age", age);
}
(5)啓動coupon服務,訪問鏈接:http://localhost:7000/coupon/coupon/test,即可以看到上面的配置
(6)但是,這種方法有一個問題,就是如果配置改變了,需要修改application.properties,並重啓coupon微服務,這是個不好的,所以我們引入了Nacos配置中心。根據啓動log,微服務可以從nacos讀取配置文件信息,默認的是:gulimall-coupon.properties。
(7)在http://localhost:8848/nacos的配置列表中,新建配置,Data Id爲:gulimall-coupon.properties,規則就是,應用名.properties,在裏面添加任意配置內容,比如:
coupon.user.name=zhangsan2
coupon.user.age=24
(8)在上面的test()方法所在的類上標註@RefreshScope,這樣,當Nacos配置中心的gulimall-coupon.properties配置內容修改了,微服務就可以動態的獲取到最新的配置信息,並且,這個優先級是高於微服務本身的配置的。
(9)使用Nacos作爲配置中心的使用總結如下:
/**
* 1、如何使用Nacos作爲配置中心統一管理配置
* 1)、引入依賴
* <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=127.0.0.1:8848
* 3)、需要給配置中心添加一個叫 數據庫集(Data Id)gulimall-coupon.properties,默認規則:yingyongming.properties
* 4)、給應用名.properties添加任何配置
* 5)、動態獲取配置。
* @RefreshScope:動態獲取並刷新配置
* @Value("${配置項的名}"):獲取到配置
* 如果配置中心和當前應用的配置文件都配置了相同的項,優先使用配置中心的配置
*
*/
5.Nacos作爲配置中心的更多細節用法
(1)爲了區分配置和隔離,Nacos引入了幾個概念:
- 命名空間,用作配置隔離,默認:public(保留空間):默認新增的所有配置都在public空間,開發,測試,生產:利用命名空間來做環境隔離,或者,每一個微服務之間相互隔離配置,每個微服務都創建自己的命名空間,只加載自己命名空間下的所有配置。
- 配置集以及配置ID,配置集就是所有配置的集合,配置集ID類似文件名,也就是Nacos 中的Data ID。
- 配置分組,默認所有的配置分組都屬於:DEFAULT_GROUP,當然,也指定自己的配置分組,比如1111雙十一,618之類的。
在之前已經提到,在默認public命名空間,以及使用默認的分組DEFAULT_GROUP裏面,創建Data ID:gulimall-coupon.properties,然後在bootstrap.properties文件裏面添加指定Nacos的地址,就可以訪問默認的gulimall-coupon.properties裏面的配置信息了,這個是默認的規則。
但是,如果我們想要用自己的,不是default默認的配置怎麼處理呢?
比如還是gulimall-coupon.properties這個Data ID,但是放在了另外一個命名空間,比如是coupon(對應微服務模塊的名稱,可以每個微服務建立一個對應的命名空間),而且放在了一個prod分組裏面(類似的,同一個coupon命名空間下面,還可以建立dev分組,test分組等),那麼如何在微服務裏面指定訪問這個配置呢?答案是:在bootstrap.properties裏面添加指定對應的namespace和group,如下:
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=9bc589c6-3f38-470b-af8d-fe84f04770ef
spring.cloud.nacos.config.group=prod
9bc589c6-3f38-470b-af8d-fe84f04770ef是Nacos上coupon命名空間對應的ID值。prod則對應prod這個配置分組,這樣,當微服務啓動時,如果要獲取的配置在Nacos配置中心有(也就是這裏的gulimall-coupon.properties)的話,那麼就優先使用配置中心的,否則,就會使用代碼中application.properties文件的配置。
(2)同時加載多個配置(新的知識點)
注意一下,我們之前是把所有的配置都放在了application.yml中,比如:
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://172.0.1.172:3306/gulimall_sms?characterEncoding=UTF-8
driver-class-name: com.mysql.cj.jdbc.Driver
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
application:
name: gulimall-coupon
mybatis-plus:
mapper-locations: classpath*:/mapper/**/*.xml
global-config:
db-config:
id-type: auto
server:
port: 7000
但是,如果配置很多的話,都同在同一個文件中的話,不好看,也不便於配置,所以,建議按照不同的作用寫到幾個配置文件中,而微服務也會從Nacos配置文件中讀取配置,並且Nacos也支持多配置文件讀取,那麼怎麼配置使用呢?
在上面我們提到了新建了coupon這個命名空間對應gulimall-coupon這個模塊,那麼我們把上面的application.yml配置按照不同的功能,拆分爲三個配置文件配置到Nacos中,放在coupon命名空間,dev配置分組下面,它們分別是:datasource.yml,內容如下:
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://172.0.1.xx:3306/gulimall_sms?characterEncoding=UTF-8
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis.yml文件,內容如下:
mybatis-plus:
mapper-locations: classpath*:/mapper/**/*.xml
global-config:
db-config:
id-type: auto
以及other.yml,內容如下:
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
application:
name: gulimall-coupon
server:
port: 7000
而使用的話,很簡單,在上面bootstrap.properties文件的基礎上增加一下內容:
spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].refresh=true
spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yml
spring.cloud.nacos.config.ext-config[1].group=dev
spring.cloud.nacos.config.ext-config[1].refresh=true
spring.cloud.nacos.config.ext-config[2].data-id=other.yml
spring.cloud.nacos.config.ext-config[2].group=dev
spring.cloud.nacos.config.ext-config[2].refresh=true
分別制定要導入的配置名稱,所在的配置分組group,已經是否動態刷新(refresh)。
最好,把application.yml中的配置全部註釋掉,啓動coupon微服務,來驗證配置。可以發現,微服務能夠正常讀取Nacos中的這三個配置文件。
對於這兩部分內容,總結起來就是:
/**
* 1、如何使用Nacos作爲配置中心統一管理配置
* 1)、引入依賴
* <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=127.0.0.1:8848
* 3)、需要給配置中心添加一個叫 數據庫集(Data Id)gulimall-coupon.properties,默認規則:yingyongming.properties
* 4)、給應用名.properties添加任何配置
* 5)、動態獲取配置。
* @RefreshScope:動態獲取並刷新配置
* @Value("${配置項的名}"):獲取到配置
* 如果配置中心和當前應用的配置文件都配置了相同的項,優先使用配置中心的配置
*
* 2、細節
* 1)、命名空間,配置隔離
* 默認:public(保留空間):默認新增的所有配置都在public空間
* 1、開發,測試,生產:利用命名空間來做環境隔離
* 注意,在bootstrap.properties 配置上,需要使用哪個命名空間下的配置。
* spring.cloud.nacos.config.namespace=32c4a90d-6ac4-4f04-b050-e09bbe7bd58f
* 2、每一個微服務之間相互隔離配置,每個微服務都創建自己的命名空間,只加載自己命名空間下的所
* 有配置
*
* 2)、配置集:所有配置的集合
*
* 3)、配置集ID:類似文件名
* Data ID: 類似文件名
*
* 4)、配置分組:
* 默認所有的配置集都屬於:DEFAULT_GROUP
* 1111,618
*
* 每個微服務創建自己的命名空間,使用配置分組區分環境,dev、test、prod
*
* 3、同時加載多個配置文件
* 1)、微服務任何配置信息,任何配置文件都可以放在配置中心中
* 2)、只需要在bootstrp.properties說明加載配置中心那些配置文件即可
* 3)、@Value、@ConfigurationProperties...
* 以上SprintBoot任何方法從配置文件中獲取值,都能使用
* 配置中心有的優先使用配置中心中的
*
*/
6.SpringCloud Gateway網關
(1)Gateway網關簡單介紹
網關作爲流量的入口,常用功能包括路由轉發、權限校驗、流量控制等,而SpringCloud gateway作爲SpringCloud官方推出的第二代網關框架,取代了Zuul網關。
簡單一句話總結:先斷言(判斷請求是否符合某個路由規則),(如果符合了某個路由規則)再路由到指定地方,但在路由之前要先過濾。
官方文檔:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.2.RELEASE/reference/html/
(2)引入gulimall-gateway模塊
新建gulimall-gateway模塊,用Spring Initaliz的方法,並導入gateway模塊,建好後,在pom.xml中導入gulimall-common的模塊依賴。
<dependency>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
gulimall-gateway模塊,同樣需要註冊到Nacos註冊中心和配置中心,下面先弄註冊到Nacos註冊中心的配置,需要在application.properties文件中指定Nacos註冊中心的地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=gulimall-gateway
server.port=88
而要使用Nacos配置中心,需要在bootstrap.properties文件中指定Nacos配置中心的地址:
spring.application.name=gulimall-gateway
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=7df3fe8a-4e08-46d5-8535-da50e6834bfb
這裏的7df3fe8a-4e08-46d5-8535-da50e6834bfb是指Nacos配置中心的gateway命名空間所對應的ID。
最後,在application.yml中寫上gateway使用的配置規則,比如路由,斷言,過濾等。比如:
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
訪問:http://localhost:88/hello?url=qq,就會轉到這qq個url地址:https://www.qq.com/hello,同樣的,訪問:http://localhost:88/hello?url=baidu,就會轉到百度的url地址.
至此,關於的SpringCloud Alibaba的基本使用告一段落。
接下來,就是前端的基本知識學習,由於篇幅的限制等原因,就另外開專門開一篇文章來做前端的筆記。
尚硅谷2020微服務分佈式電商項目《穀粒商城》(Alibaba+Vue)開發教程學習筆記(二)
https://blog.csdn.net/ok_wolf/article/details/105456170