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

爲什麼要使用Zuul
先來看一下下方這個圖

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

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

使用Zuul

首先呢,我們在原先的父項目下新增一個cloud-demo-zuul模塊,引入依賴br/>創建包cn.org.zhixiang,在此包下新建啓動類CloudDemoZuulApplication
@SpringBootApplication
@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
這個配置其實是跟我們以往的服務消費者的配置是一樣的,爲什麼要這樣配置呢,因爲在這個之前我們需要先複習一下以往的知識點,沒有看過以往博客的小夥伴可以先參考這個: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/
這個配置呢就是把服務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
2.
zuul:
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
使用這種方式以後,我們再啓動一下我們原先的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/shiyujun/spring-cloud-demo

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

本文出自https://zhixiang.org.cn/#/blog/read/ae383e8b-93b9-4c52-9987-bb6801e87301,轉載請保留。

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