Spring Cloud Gateway 整合 Nacos,測試負載均衡


當初我學習時候就是參考這位大佬的博客: Nacos集成Spring Cloud Gateway 基礎使用
現在學習到spring cloud alibaba 使用nacos做服務中心,dubbo做通信,大體流程就是:

  • ​ 先將制定好的接口打包上傳到雲,或者本地jar包。提供者和消費者都依賴這個接口包

  • ​ 而后新建提供者模塊來實現接口,再將服務注冊到nacos上面

  • ​ 新建消費者模塊來使用接口,消費者去nacos上面尋找提供者根據服務名

  • ​ 消費者到nacos和nacos到提供者都是使用dubbo通信實現。

本篇博客只介紹網關到消費者。首先先創建消費者如下:

1. 新建maven模塊nacos-consumer1添加pom依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!--nacos注冊發現依賴-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!--如果使用本地nacos,此依賴可以省略,因為雲端nacos啟動時候會檢測雲端配置-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2. 在resources下新建文件bootstrap.yml文件

注:nacos是區分yaml和yml格式的,雖然本地加載時候不區分,但是使用雲端配置時候就得嚴格要求yml文件類型,而且本地yaml文件是沒有代碼提醒的。至於application.yml、application.properties和bootstrap.yml的區別可以百度了解。

server:
  port: 8011  #consumer2的端口是8012

spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: 5467517c-4121-4275-b459-b92a7a12f508 
        #nacos上面新建命名空間的id
      config:   #本地一般不需要配置中心,如果使用雲nacos會報找不到配置的錯誤
                #這時候需要配置上,或者config.enable: false關閉即可
        server-addr: 127.0.0.1:8848
        namespace: 5467517c-4121-4275-b459-b92a7a12f508

consumer2配置只是端口不一樣,服務名nacos-consumer是一樣的,為了測試負載均衡。

3. 創建controller類com.example.controller.HelloController.java

@RestController
@RequestMapping("/testhello")
public class HelloController {

    @GetMapping("/hello")
    public String HelloController(){
        // consumer2則修改返回值為consumer2
        return "This is nacos-consumer1";
    }
}

4. 創建啟動類com.example.NacosConsumerOneApplication

@SpringBootApplication
public class NacosConsumerOneApplication {
		// consumer創建Two,有區分即可
    public static void main(String[] args) {
        SpringApplication.run(NacosConsumerOneApplication.class, args);
    }
}

5. 接下來創建網關模塊nocas-gateway,引入pom依賴

<!--gateway依賴-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
    <version>2.2.8.RELEASE</version>
</dependency>

<!--nacos注冊發現依賴-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!--如果使用本地nacos,此依賴可以省略,因為雲端nacos啟動時候會檢測雲端配置-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

6. 然后在resources下面創建bootstrap.yml文件

server:
  port: 8001

spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: 5467517c-4121-4275-b459-b92a7a12f508
        #nacos上面新建命名空間的id
      config:   #本地一般不需要配置中心,如果使用雲nacos會報找不到配置的錯誤
        #這時候需要配置上,或者config.enable: false關閉即可
        server-addr: 127.0.0.1:8848
        namespace: 5467517c-4121-4275-b459-b92a7a12f508

    gateway:
      discovery:
        locator:
          enabled: true               #默認false,開啟后可以通過ip:port/服務名稱/接口地址進行服務轉發
                                      # 即: localhost:8001/nacos-consumer/testhello/hello
          lower-case-service-id: true #把服務名轉換為小寫,Eureka 中默認都是大寫
                                      #但是nacos不會自動全部轉換為大寫,除非手動寫成大寫,也可以不寫。
      routes:                         #路由轉發:最重要的地方
        - id: nacos-gateway-provider  #路由的ID,沒有固定規則但要求唯一,建議配合服務名
          uri: lb://nacos-consumer    #匹配后提供服務的路由地址,lb代表負載均衡
          predicates:
            - Path=/testhello/hello   #斷言,路徑相匹配的進行路由轉發

比起消費者來說,網關這里就多了gateway部分,那么將其中可以省略的地方省去就是添加:

server:
  port: 8001

spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: 5467517c-4121-4275-b459-b92a7a12f508
        # nacos上面新建命名空間的id
      config:   # 本地一般不需要配置中心,如果使用雲nacos會報找不到配置的錯誤,
        #這時候需要配置上,或者config.enable: false關閉即可
        server-addr: 127.0.0.1:8848
        namespace: 5467517c-4121-4275-b459-b92a7a12f508

    gateway:
      routes:                         #路由轉發:最重要的地方
        - id: nacos-gateway-provider  #路由的ID,沒有固定規則但要求唯一,建議配合服務名
          uri: lb://nacos-consumer    #匹配后提供服務的路由地址,lb代表負載均衡
          predicates:
            - Path=/testhello/hello   #斷言,路徑相匹配的進行路由

7. 接下來創建com.example.NacosGatewayApplication.java

@SpringBootApplication
public class NacosGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosGatewayApplication.class, args);
    }
}

8. 啟動兩個消費者,一個網關測試端口

  • 本地nacos登錄 http://127.0.0.1:8848/nacos/index.html ,賬號密碼都是nacos就可以看到配置和服務.

  • 可以通過 http://localhost:8011 和 8012/testhello/hello 測試消費者,就是兩個普通的controller

  • 網關啟動后通過網關 localhost:8001.testhello/hello 能轉發到上面其中一個

  • 測試 http://localhost:8001/testhello/hello 並且不斷刷新顯示內容會在兩個消費者之間相互切換。這就是負載均衡,當然是默認的負載均衡算法,我們也可以自定義。

9. 在標題6中若開啟了gateway.discovery.locator.enabled=true

那么網關可以將 http://localhost:8001/nacos-consumer/testhello/hello 識別轉發,若關閉則404.

image

這就是gateway+nacos最基礎的配置方法,之后會大概寫謂詞predicates中的內容和過濾器filter的筆記。


學無止境,代碼與生活,誰也不能虧待了。 2021-05-12 22:48:40 星期三


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM