天行健,君子以自強(qiáng)不息;地勢(shì)坤,君子以厚德載物。
每個(gè)人都有惰性,但不斷學(xué)習(xí)是好好生活的根本,共勉!
文章均為學(xué)習(xí)整理筆記,分享記錄為主,如有錯(cuò)誤請(qǐng)指正,共同學(xué)習(xí)進(jìn)步。
spring cloud 相關(guān)組件搭建(建議順序):
- eureka(注冊(cè)中心服務(wù))spring cloud搭建(eureka)
- P-C service(服務(wù)提供者和服務(wù)調(diào)用者)spring cloud搭建(P-C service)
- feign(接口調(diào)用)spring cloud搭建(feign)
- hystrix(熔斷器)spring cloud搭建(hystrix)
- zuul(網(wǎng)關(guān)服務(wù))本篇
本篇基于前兩篇
一、zuul網(wǎng)關(guān)簡(jiǎn)介
Zuul是一個(gè)路由網(wǎng)關(guān)(GateWay)
有兩個(gè)作用:
- 路由:將外部請(qǐng)求轉(zhuǎn)發(fā)到指定的微服務(wù)實(shí)例上,實(shí)現(xiàn)外部訪問統(tǒng)一入口
- 過濾:對(duì)外部請(qǐng)求的處理過程進(jìn)行控制,實(shí)現(xiàn)請(qǐng)求校驗(yàn)、服務(wù)聚合等功能
應(yīng)用:
將zuul作為一個(gè)服務(wù)注冊(cè)到eureka中,同時(shí)從eureka中獲取其他服務(wù)信息,對(duì)微服務(wù)的訪問都通過zuul進(jìn)行跳轉(zhuǎn),即可實(shí)現(xiàn)所有服務(wù)請(qǐng)求統(tǒng)一入口管理,也可進(jìn)行請(qǐng)求校驗(yàn)等操作。
二、開發(fā)環(huán)境:
JDK版本:1.8
maven版本:3.9.0
開發(fā)工具:IDEA社區(qū)版ideaIC-2018.3
項(xiàng)目框架:spring boot 版本為 2.2.4.RELEASE springboot搭建傳送門spring cloud 版本為Hoxton.SR12為什么選擇這兩個(gè)版本,因?yàn)槭褂脄uul時(shí),用其他版本都報(bào)錯(cuò),目前只知道兩個(gè)版本一起用沒問題
以下均基于父項(xiàng)目和eureka子項(xiàng)目創(chuàng)建后的操作
父項(xiàng)目和eureka的配置請(qǐng)參考:
spring cloud搭建(eureka)
三、包結(jié)構(gòu)預(yù)覽
最后創(chuàng)建好的服務(wù)及包結(jié)構(gòu)如下
四、創(chuàng)建接口
在service1和service2中創(chuàng)建簡(jiǎn)單的請(qǐng)求接口注:這兩個(gè)服務(wù)只需要開啟eureka注冊(cè)服務(wù)即可,zuul會(huì)到注冊(cè)中心獲取兩個(gè)服務(wù)的信息
1. service1的請(qǐng)求控制類Service1ZuulController
Service1ZuulController.java
package com.service1.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassDescription: service1服務(wù)zuul調(diào)用的測(cè)試請(qǐng)求
* @Author:李白
* @Date:2023/6/2 14:06
*/
@RestController
@RequestMapping("/service1-pre")
public class Service1ZuulController {
@RequestMapping("/service1/zuul/test1/11")
public String service2Test1(){
return "service1-zuul-test1-11";
}
@RequestMapping("/service1/zuul/test2/22")
public String service2Test2(){
return "service1-zuul-test2-22";
}
}
2. service1的請(qǐng)求控制類Service2ZuulController
package com.service2.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassDescription: service2服務(wù)zuul調(diào)用的測(cè)試請(qǐng)求
* @Author:李白
* @Date:2023/6/2 14:11
*/
@RestController
@RequestMapping("/service2-pre")
public class Service2ZuulController {
@RequestMapping("/service2/zuul/test1/11")
public String service2Test1(){
return "service2-zuul-test1-11";
}
@RequestMapping("/service2/zuul/test2/22")
public String service2Test2(){
return "service2-zuul-test2-22";
}
}
五、創(chuàng)建子項(xiàng)目zuul
1. 創(chuàng)建zuul服務(wù)
此處省略,可參考本片目錄下方spring cloud搭建流程中的第一篇
2. 配置zuul的依賴
在zuul的pom.xml中配置zuul網(wǎng)關(guān)需要的依賴注:在zuul服務(wù)的pom中配置zuul的相關(guān)依賴時(shí),如果使用的其他版本出現(xiàn)依賴報(bào)錯(cuò),將父項(xiàng)目pom的相關(guān)依賴版本控制做一下修改,親測(cè)可用:
將spring boot的版本換為2.2.4.RELEASE將spring cloud的版本換為Hoxton.SR12
zuul服務(wù)的完整pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spring_cloud_demo</artifactId>
<groupId>com.cloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>spring_cloud_zuul</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--spring cloud eureka client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--spring cloud zuul-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
<version>2.2.10.RELEASE</version>
</dependency>
</dependencies>
</project>
因?yàn)閦uul依賴中包含spring-boot-starter-web所以可省略spring boot啟動(dòng)依賴的引入
3. zuul的yml文件配置
application.yml
server:
port: 8004
spring:
#服務(wù)相關(guān)信息
application:
#服務(wù)名稱 會(huì)出現(xiàn)在注冊(cè)中心
name: Zuul-app
#注冊(cè)中心
eureka:
client:
#默認(rèn)開啟 是否將本服務(wù)注冊(cè)到注冊(cè)中心
# register-with-eureka: ture
#默認(rèn)開啟 是否獲取注冊(cè)中心服務(wù)信息
# fetch-registry: true
#注冊(cè)中心服務(wù)地址
service-url:
#默認(rèn)地址
defaultZone: http://localhost:8001/eureka/
#服務(wù)實(shí)例相關(guān)
instance:
#點(diǎn)擊具體的微服務(wù),右下角是否顯示ip
prefer-ip-address: true
#顯示微服務(wù)的名稱(在注冊(cè)中心的別名)
instance-id: zuul-8004
#服務(wù)網(wǎng)關(guān)(路由)
zuul:
#請(qǐng)求前綴
# prefix: /service2-pre
#配置路由表
routes:
#配置所需路由的服務(wù)信息,配置多個(gè)服務(wù)信息時(shí)默認(rèn)最后一個(gè)有效,其余不可用
#對(duì)每個(gè)服務(wù)都可以指定一個(gè)唯一key,該值可以任意指定
service1-app:
#將以/user-service/開頭的請(qǐng)求映射到service1-app這個(gè)服務(wù)上
#被路由的服務(wù)請(qǐng)求路徑
# path: /service1-pre/**
path: /**
#路由接收的服務(wù)實(shí)例名稱,依賴于eureka,通過實(shí)例名來在eureka中獲取服務(wù)地址及端口,再進(jìn)行路由拼接訪問
serviceId: Service1-app
#如果不用實(shí)例名也可以用服務(wù)的具體url,使用url時(shí)是不依賴于eureka的,會(huì)根據(jù)url拼接路徑訪問跳轉(zhuǎn)
# url: http://localhost:8002/
#對(duì)每個(gè)服務(wù)都可以指定一個(gè)唯一key,該值可以任意指定
service2-app:
#將以/user-service/開頭的請(qǐng)求映射到service1-app這個(gè)服務(wù)上
#被路由的服務(wù)請(qǐng)求路徑
# path: /service2-pre/**
path: /**
#路由接收的服務(wù)實(shí)例名稱,依賴于eureka,通過實(shí)例名來在eureka中獲取服務(wù)地址及端口,再進(jìn)行路由拼接訪問
serviceId: Service2-app
#如果不用實(shí)例名也可以用服務(wù)的具體url,使用url時(shí)是不依賴于eureka的,會(huì)根據(jù)url拼接路徑訪問跳轉(zhuǎn)
# url: http://localhost:8003/
#ribbon:
#負(fù)載均衡時(shí)是否開啟eureka
# eureka:
# enable: false
# 添加ribbon的超時(shí)時(shí)間設(shè)置
# ReadTimeout: 3000
# ConnectTimeout: 3000
這里注釋可能有點(diǎn)多,不過根據(jù)注釋應(yīng)該都能知道每個(gè)參數(shù)的意思
4. zuul的啟動(dòng)項(xiàng)
需要在啟動(dòng)類上添加@EnableEurekaClient和@EnableZuulProxy開啟eureka客戶端和zuul代理來使用相關(guān)功能
ZuulApplication.java
package com.zuul;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
/**
* @ClassDescription: zuul啟動(dòng)類
* @Author:李白
* @Date:2023/5/31 9:55
*/
@EnableEurekaClient
@EnableZuulProxy
@SpringBootApplication
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
六、啟動(dòng)服務(wù)并查看注冊(cè)中心
1. 啟動(dòng)eureka
先啟動(dòng)eureka服務(wù),看如下紅框即是啟動(dòng)成功
2. 啟動(dòng)service1
3. 啟動(dòng)service2
4. 啟動(dòng)zuul
再啟動(dòng)zuul服務(wù),看到如下紅框即是啟動(dòng)成功
5. 訪問注冊(cè)中心地址
http://localhost:8001
6. 查看服務(wù)注冊(cè)信息
可看到三個(gè)服務(wù)均出現(xiàn)在注冊(cè)中心
七、測(cè)試zuul功能是否可用
首先使用postman分別直接調(diào)用service1和service2的接口,結(jié)果正常后,再使用zuul網(wǎng)關(guān)調(diào)用兩個(gè)服務(wù)的接口,如果正常返回則表示zuul網(wǎng)關(guān)功能可用。
1. service1接口測(cè)試
使用postman直接調(diào)用service1的接口進(jìn)行測(cè)試(service1的端口號(hào)是8002)
service1的test1 url:
http://localhost:8002/service1-pre/service1/zuul/test1/11
service1的test1 結(jié)果正常
2. service2接口測(cè)試
使用postman直接調(diào)用service2的接口進(jìn)行測(cè)試(service2的端口號(hào)是8003)
service2的test2 url
http://localhost:8003/service2-pre/service2/zuul/test2/22
service2的test2 結(jié)果正常
3. zuul請(qǐng)求service1接口postman請(qǐng)求調(diào)用,測(cè)試zuul功能
使用postman直接通過zuul調(diào)用service1的接口進(jìn)行測(cè)試(service1的端口號(hào)是8002,通過zuul調(diào)用就是將訪問地址中的端口號(hào)改為zuul的端口號(hào)8004)
zuul調(diào)用service1的test1 url
http://localhost:8004/service1-pre/service1/zuul/test1/11
zuul調(diào)用service1的test1 結(jié)果異常(404)
4. zuul請(qǐng)求service2接口postman請(qǐng)求調(diào)用,測(cè)試zuul功能
使用postman直接通過zuul調(diào)用service2的接口進(jìn)行測(cè)試(service2的端口號(hào)是8003,通過zuul調(diào)用就是將訪問地址中的端口號(hào)改為zuul的端口號(hào)8004)
zuul調(diào)用service2的test2 url
http://localhost:8004/service2-pre/service2/zuul/test2/22
zuul調(diào)用service2的test2 結(jié)果正常
5. 使用結(jié)論
- 使用zuul網(wǎng)關(guān)時(shí),依賴版本沖突嚴(yán)重,需要配指定的某些版本,局限性比不用zuul時(shí)的spring cloud更大。
- 配置的yml文件zuul相關(guān)參數(shù),routes下的服務(wù)名可隨意指定且可定義多個(gè),但經(jīng)過測(cè)試定義兩個(gè)時(shí)會(huì)默認(rèn)生效后者,前者無法生效(即文章中配置的zuul.routes.service1-app不可用,但service2-app正常)。如此一來便只能轉(zhuǎn)發(fā)一個(gè)服務(wù)了,這是有問題的,但目前還未發(fā)現(xiàn)問題出在哪里。
- service1-app下的path參數(shù)用拼接方式配置如/service1-pre/**這種前綴時(shí),不可用,只能用杠星星來使用,然后在routes同級(jí)上加prefix參數(shù),來指定路由前綴,這也是一個(gè)問題,但目前還未發(fā)現(xiàn)問題出在哪里。
- 跟path同級(jí)的serviceId參數(shù)是每個(gè)服務(wù)的spring.application.name參數(shù)值,也就是服務(wù)的別名,會(huì)展示在注冊(cè)中心,通過這個(gè)服務(wù)別名實(shí)現(xiàn)指定服務(wù)的轉(zhuǎn)發(fā),當(dāng)然也可以用服務(wù)的url,更直接,且不會(huì)受到eureka的局限,也就是說,使用serviceId來配置,必須有eureka才行,但配置rul,則有沒有eureka都可以,因?yàn)閡rl指定的是具體的服務(wù)地址,而非注冊(cè)中心的服務(wù)別名。
其中的一些問題還請(qǐng)知道如何解決的大佬留言指教一二,感謝。文章來源:http://www.zghlxwxcb.cn/news/detail-473325.html
以上就是zuul的使用了。文章來源地址http://www.zghlxwxcb.cn/news/detail-473325.html
到了這里,關(guān)于spring cloud搭建(zuul)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!