天天看點

谷粒商城之中間件Nacos和Gateway的搭建

目錄

谷粒商城最終的技術搭配方案:

alibaba各元件之間的版本、與SpringBoot的版本對應關系:

搭建Nacos注冊中心

遠端服務調用

搭建Nacos配置中心

Nacos配置中心動态重新整理配置

Nacos命名空間與配置分組

Nacos配置多配置集

搭建gateway網關

谷粒商城最終的技術搭配方案:

SpringCloud Alibaba-Nacos:注冊中心和配置中心

SpringCloud Alibaba-Gateway:API網關

SpringCloud Alibaba-Openfeign:服務之間的調用

SpringCloud Alibaba-Sentinel:服務容錯

SpringCloud Alibaba-Sleuth:調用鍊監控

SpringCloud Alibaba-Seata:分布式事務解決方案

alibaba各元件之間的版本、與SpringBoot的版本對應關系:

版本對應說明位址:版本說明 · alibaba/spring-cloud-alibaba Wiki · GitHub

谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建

 服務中使用的boot是2.3.7版本,cloud使用的是Hoxton.SR9,應該要去使用alibaba2.2.7的版本

谷粒商城之中間件Nacos和Gateway的搭建

Nacos下載下傳的位址:Nacos 快速開始

谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建

 先在Windows作業系統上使用Nacos

谷粒商城之中間件Nacos和Gateway的搭建

點選startup.cmd啟動nacos

谷粒商城之中間件Nacos和Gateway的搭建

通路下面的位址進入它的圖形使用者界面,預設使用者名和密碼都是:nacos

http://localhost:8848/nacos
           
谷粒商城之中間件Nacos和Gateway的搭建

Nacos使用指南:Spring Cloud Alibaba Reference Documentation 

搭建Nacos注冊中心

①在common的pom檔案中導入依賴管理

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.7.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
</dependencyManagement>
           

②在common的pom檔案中導入nacos的依賴

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
           

③在yml配置檔案中配置注冊中心的位址和服務名稱

谷粒商城之中間件Nacos和Gateway的搭建

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  application:
    name: gulimall-product
           

④在啟動類中添加@EnableDiscoveryClient

谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建

遠端服務調用

member服務要調用coupon服務的擷取會員優惠券的方法,需要使用open-feign進行遠端的服務調用

谷粒商城之中間件Nacos和Gateway的搭建

 ①pom檔案中導入open-feign的依賴,建立服務的時候已經選擇

谷粒商城之中間件Nacos和Gateway的搭建

②建立接口

谷粒商城之中間件Nacos和Gateway的搭建

        1)、告訴接口需要調用的服務名

谷粒商城之中間件Nacos和Gateway的搭建

        2)、 告訴接口調用服務的那個方法

谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建

③啟動open-feign,告訴需要掃描的包

谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建

open-feign的執行流程:

①先掃描需要調用服務的包

②擷取服務名到注冊中心找相應的服務,如果存在則調用指定的方法,否則調用失敗 

搭建Nacos配置中心

指南:Spring Cloud Alibaba Reference Documentation

①在common的pom檔案中導入Nacos作為配置中心的依賴

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
           
谷粒商城之中間件Nacos和Gateway的搭建

②建立bootstrap.properties配置檔案,并且配置配置中心的位址和服務名

spring.application.name=gulimall-member
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
           

谷粒商城之中間件Nacos和Gateway的搭建

Nacos配置中心動态重新整理配置

以前我們擷取配置檔案中的配置項使用下面的方式:

谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建

 缺陷十分明顯,當我們需要修改配置檔案時,需要重新打包再釋出

解決方案:Nacos動态更新

谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建

并沒有動态更新,原因是沒有使用動态更新注解 

谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建

服務會預設去配置中心找 服務名.properties的配置檔案,如果服務中心配置檔案和配置檔案中的配置檔案有相同的配置項,則預設優先加載配置中心的配置檔案的配置項 

谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建

Nacos命名空間與配置分組

1.命名空間

作用:配置隔離

說明:Nacos配置中心預設的指令空間是public,釋出的配置檔案預設也是在public指令空間下的

谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建

使用一:将命名空間分為開發(dev)、生産(prod)、測試(test),将開發、測試、生産之間配置隔離

使用二:每一個服務一個命名空間,服務之間的配置隔離

谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建

出現問題:點選确定之後卡着不動了 

出現原因:之前使用過低版本的nacos,需要清空一下浏覽器的緩存

解決方案:

參考文章:https://github.com/alibaba/nacos/issues?q=customNamespaceId

 ①建立服務的命名空間

谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建

② 在bootstrap.properties檔案中配置命名空間

spring.cloud.nacos.config.namespace=47353e14-12d9-420f-b82c-249f760ff794
           
谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建

2.資料集ID(Data Id):類似于檔案名

3.配置分組

說明:配置中心預設分組為:DEFAULT_GROUP

谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建

 在bootstrap.properties配置檔案中配置命名空間和分組:

spring.application.name=gulimall-member
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=4c819c0a-d055-4bc8-9cbc-dee92aca56d2
spring.cloud.nacos.config.group=test
           
谷粒商城之中間件Nacos和Gateway的搭建

谷粒商城中的一個服務對應一個命名空間達到服務之間的配置隔離,配置分組來區分開發、測試、生成環境

Nacos配置多配置集

當我們服務越來越複雜,配置項越來越多的時候,我們希望進行一個配置劃分,例如配置資料源一個配置檔案,配置mybatis架構的一個檔案...

谷粒商城之中間件Nacos和Gateway的搭建

 建立資料源配置檔案

谷粒商城之中間件Nacos和Gateway的搭建

 建立mybatis配置檔案

谷粒商城之中間件Nacos和Gateway的搭建

 建立其它配置項配置檔案

谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建
spring.application.name=gulimall-member
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=4c819c0a-d055-4bc8-9cbc-dee92aca56d2
#spring.cloud.nacos.config.group=dev
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

spring.cloud.nacos.config.extension-configs[2].data-id=other.yml 
spring.cloud.nacos.config.extension-configs[2].group=dev
#配置動态重新整理
spring.cloud.nacos.config.extension-configs[2].refresh=true
           

 先加載DEFAULT_GROUP 服務名.properties配置檔案

谷粒商城之中間件Nacos和Gateway的搭建

由于沒有DEFAULT_GROUP下的 服務名.properties配置檔案,是以加載了服務中的配置檔案

谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建

然後再去加載擴充的配置檔案

谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建

配置檔案生效: 

谷粒商城之中間件Nacos和Gateway的搭建

搭建gateway網關

學習文檔:Spring Cloud Gateway

網關的組成:

谷粒商城之中間件Nacos和Gateway的搭建

網關的執行流程: 

谷粒商城之中間件Nacos和Gateway的搭建

簡而言之:請求到達網關,網關通過斷言判斷是否符合路由規則,如果符合将請求發送給對應的服務,不過在這之前需要進行過濾的。

谷粒商城之中間件Nacos和Gateway的搭建

routes:是個數組,可以配置多個路由 

uri:請求的目的地

predicates:數組,可以配置多個,具體配置可以參考學習文檔

谷粒商城之中間件Nacos和Gateway的搭建

filters: 數組,可以添加多個

谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建

添加一個請求頭,X-Request-red對應的值為blue 

接下來開始搭建網關并進行簡單的測試:

①使用spring初始化向導建立gateway服務

谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建

②導入common依賴,因為gateway需要注冊到nacos中,common中已經有了nacos的依賴 

谷粒商城之中間件Nacos和Gateway的搭建

③編寫配置檔案

谷粒商城之中間件Nacos和Gateway的搭建
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  application:
    name: gulimall-gateway
server:
  port: 88
           

④啟動類中添加開啟服務注冊的注解@EnableDiscoveryClient,由于common中還有資料源的依賴,是以需要排除資料源的依賴

谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建

簡單測試:

通路網關,請求路徑攜帶qq或者百度,由網關路由到qq或者百度首頁面

谷粒商城之中間件Nacos和Gateway的搭建
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    gateway:
      routes:
        - id: baidu_route
          uri: https://www.baidu.com
          predicates:
            - Query=url,baidu
        - id: qq_route
          uri: https://www.qq.com
          predicates:
            - Query=url,qq
  application:
    name: gulimall-gateway
server:
  port: 88
           
谷粒商城之中間件Nacos和Gateway的搭建
谷粒商城之中間件Nacos和Gateway的搭建