每天學點SpringCloud(七):路由器和過濾器-Zuul

爲什麼要使用Zuul

先來看一下下方這個圖

假如現在我們具有四個微服務,分別是用戶、訂單、支付、催收微服務,它們的調用方式分別是使用http、restful、thrift、kafka。這個時候如果我們在客戶端直接調用的話感覺是不是太費勁了,客戶端需要維護這幾種調用方式的客戶端,如果後期新增微服務或者減少或者更換調用方式等,都需要修改客戶端。那麼我們來看一下加入Zuul以後是什麼樣子的呢

 

Zuul呢就負責了所有的調用,解耦了客戶端和微服務。也符合我們設計的單一職責原則。

 

使用Zuul

 

首先呢,我們在原先的父項目下新增一個cloud-demo-zuul模塊,引入依賴

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

創建包cn.org.zhixiang,在此包下新建啓動類CloudDemoZuulApplication

@SpringBootApplication
@EnableZuulProxy
public class CloudDemoZuulApplication {
    public static void main(String[] args) {
        SpringApplication.run(CloudDemoZuulApplication.class, args);
    }
}

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

@EnableZuulProxy就是開啓Zuul的註解

 

接下來看一下application.yml

spring:
  application:
    name: zuul-demo

server:
  port: 8093
eureka:
  client:
    register-with-eureka: true
    service-url:
      defaultZone: http://root:root@localhost:8761/eureka

  application:
    name: zuul-demo

server:
  port: 8093
eureka:
  client:
    register-with-eureka: true
    service-url:
      defaultZone: http://root:root@localhost:8761/eureka

這個配置其實是跟我們以往的服務消費者的配置是一樣的,爲什麼要這樣配置呢,因爲在這個之前我們需要先複習一下以往的知識點,沒有看過以往博客的小夥伴可以先參考這個:https://zhixiang.org.cn

 

首先啓動我們的Eureka服務,然後啓動一個提供者cloud-demo-provider。我們知道這個時候我們直接訪問http://localhost:8078/user/getUser/2是可以獲得數據的對吧,那麼我的Zuul是怎麼使用的呢。我們啓動一下我們的Zuul。

 

這個時候我們訪問http://localhost:8093/provider-demo/user/getUser/2獲得的數據是一樣的,也就是說我們的Zuul做了一個路由轉發。我們可以看到這個url中有一個provider-demo,這個呢是提供者的spring.application.name的值,那麼如果我們不想使用這個呢,比如說現在我知道這是user微服務,我就想如果訪問user微服務我就使用http://localhost:8093/user/user/getUser/2怎麼辦呢。

配置

我們需要在yml中加上一個配置。

zuul:
  routes:
    provider-demo: /user/**

  routes:
    provider-demo: /user/**

這個配置呢就是把服務id爲provider-demo的微服務項目地址映射爲/user/**.注意最後是兩個*,爲什麼是兩個呢,如果是一個*只能匹配/user/a,/user/b這種路徑,而匹配不了/user/a/b這種。而我們配兩個*的話不僅可以匹配/user/a/b,還能匹配/user/a/b/c/d等。

 

這個時候我們訪問http://localhost:8093/user/user/getUser/2的時候就可以得到數據了。

 

其實還有別的寫法。我們來看一下

1.

zuul:
  routes:
    demo:
      path: /user/**
      serviceId: provider-demo

  routes:
    demo:
      path: /user/**
      serviceId: provider-demo

2.

zuul:
  routes:
    demo:
      path: /user/**
      url: http://localhost:8078/


  routes:
    demo:
      path: /user/**
      url: http://localhost:8078/

 

上方這兩種方式都是可以的,那個demo呢其實是自定義的,只要不是重複就行。然後path呢就是網頁上我們訪問的url。這兩種方式就是分別將這哥path映射到serviceId或者一個url。

 

負載均衡

 

剛纔我們探討的一直都是單個服務的情況,那麼當我們有多個微服務的時候應該怎麼操作呢

 

zuul:
  routes:
    demo:
      path: /user/**
      serviceId: provider-demo
provider-demo:
  ribbon:
      listOfServers: http://localhost:8078,http://localhost:8079

  routes:
    demo:
      path: /user/**
      serviceId: provider-demo
provider-demo:
  ribbon:
      listOfServers: http://localhost:8078,http://localhost:8079

使用這種方式以後,我們再啓動一下我們原先的cloud-demo-provider-2項目,然後啓動Zuul訪問時會發現已經實現了負載均衡

 

文件上傳

 

我們使用zuul做路由的時候可能會碰到上傳文件的需求,上傳小文件到是沒事,但是如果大文件的話是無法上傳呢,這兒呢就有一個辦法來繞過SpringMVC的DispatchServlet。

 

例如我們上傳文件的接口爲http://localhost:8093/user/user/uploadFile 那麼我們在上傳的時候就可以訪問http://localhost:8093/zuul/user/user/uploadFile來實現上傳大文件

 

GitHub:https://github.com/2388386839/spring-cloud-demo

碼雲:https://gitee.com/zhixiang_blog/spring-cloud-demo

 

如果對您有所幫助,請記得幫忙點一個star哦

 

 

 

 

 

 

本文出自https://zhixiang.org.cn,轉載請保留。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章