為什麼要使用Zuul 先來看一下下方這個圖 假如現在我們具有四個微服務,分別是用戶、訂單、支付、催收微服務,它們的調用方式分別是使用http、restful、thrift、kafka。這個時候如果我們在客戶端直接調用的話感覺是不是太費勁了,客戶端需要維護這幾種調用方式的客戶端,如果後期新增微服務或者 ...
為什麼要使用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>
創建包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/2388386839/spring-cloud-demo
碼雲:https://gitee.com/zhixiang_blog/spring-cloud-demo
如果對您有所幫助,請記得幫忙點一個star哦
本文出自https://zhixiang.org.cn/#/blog/read/ae383e8b-93b9-4c52-9987-bb6801e87301,轉載請保留。