在上篇中介紹了SpringCloud Config的完美使用版本,本篇則介紹基於SpringCloud(基於SpringBoot2.x,.SpringCloud Finchley版)中的路由網關(SpringCloud Zuul)的使用教程。git
Spring Cloud Zuul 主要的功能是提供負載均衡、反向代理、權限認證、動態路由、監控、彈性、安全等的邊緣服務。其主要做用是爲微服務架構提供了前門保護的做用,同時將權限控制這些較重的非業務邏輯內容遷移到服務路由層面,使得服務集羣主體可以具有更高的可複用性和可測試性。github
通俗一點來講,就是對服務提供一層保護,對外界的請求進行過濾轉發到後端服務中。
這裏咱們能夠經過幾張簡單的示例圖來進行了解.。web
不使用路由網關的示例圖:spring
使用路由網關的示例圖:後端
使用路由網關而且加上註冊中心的示例圖:瀏覽器
從上述的示例圖中,咱們發現加了路由網關以後,其實是將一對多的關係轉變成了一對一的關係,這樣的好處是咱們能夠在網關層進行數據合法校驗、權限認證、負載均衡等統一處理,這樣能夠在很大的程度上節省的人力和物力,可是這種方式也有必定的弊端,就是之後新增了服務或者在服務中新增方法,就會使得網關層可能須要進行改動。幸虧在Spring Cloud 有 Zuul 這樣一個組件,經過eureka將網關和微服務之間相互關聯起來,都會在eureka上進行註冊,這樣Zuul就能感知到哪些服務在線,而且能夠經過配置路由規則將請求自動轉發到指定的後端微服務上,這樣即便後續新增了服務或者在服務中新增了某些方法,那麼只需在Zuul層進行簡單配置便可。安全
開發環境架構
注:不必定非要用上述的版本,能夠根據狀況進行相應的調整。須要注意的是SpringBoot2.x之後,jdk的版本必須是1.8以上!app
因爲咱們這裏是使用的第三種模式,因此須要使用到Eureka註冊中心,所以這裏咱們也順便弄一個註冊中心服務。
註冊中心這塊配置和代碼和以前springcloud-config配置基本同樣便可。註冊中心新項目的的名稱爲springcloud-zuul-eureka
。負載均衡
註冊中心pom
配置、application.properties
配置和代碼以下:
pom:
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
application.properties:
spring.application.name=springcloud-zuul-eureka server.port=8006 eureka.client.register-with-eureka=false eureka.client.fetch-registry=false eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
代碼:
@EnableEurekaServer @SpringBootApplication public class ZuulApplication { public static void main(String[] args) { SpringApplication.run(ZuulApplication.class, args); System.out.println("zuul註冊中心服務啓動..."); } }
註冊中心服務配置完成以後,咱們在新增一個Zuul服務,該服務的名稱爲springcloud-zuul-gateway
,該服務的 pom
配置、application.properties
配置和代碼以下:
pom:
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> </dependencies>
application.properties:
spring.application.name=springcloud-zuul-gateway server.port = 9009 eureka.client.serviceUrl.defaultZone=http://localhost:8006/eureka/ zuul.routes.hello.path = /hello/** zuul.routes.hello.url = http://localhost:9010/hello zuul.routes.hi.path = /hi/** zuul.routes.hi.url = http://localhost:9011/hi
配置說明:
注:上述的zuul.routes.{route}.path
和zuul.routes.{route}.url
通常來講是做爲傳統的方式進行配置,是不依賴於Eureka,是屬於一對一的配置。例如,訪問:http://localhost:9009/hello/pancm
的話就會跳轉到http://localhost:9010/hello/pancm
地址上。
代碼:
@SpringBootApplication @EnableDiscoveryClient @EnableZuulProxy public class ZuulApplication { public static void main(String[] args) { SpringApplication.run(ZuulApplication.class, args); System.out.println("zuul 服務啓動..."); } }
這裏咱們也須要建立兩個客戶端服務,來進行驗證Zuul路由網關是否生效。
建立兩個客戶端服務,名稱分別爲springcloud-zuul-server1
和springcloud-zuul-server2
,兩個pom文件的配置以下:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies>
兩個application.properties
配置文件也基本相同,除了名稱和端口不一致。
springcloud-zuul-server1
的application.properties配置:
spring.application.name=springcloud-zuul-server1 server.port=9010 eureka.client.serviceUrl.defaultZone=http://localhost:8006/eureka/
springcloud-zuul-server2
的application.properties配置:
spring.application.name=springcloud-zuul-server2 server.port=9011 eureka.client.serviceUrl.defaultZone=http://localhost:8006/eureka/
springcloud-zuul-server1
服務的代碼:
主類
@SpringBootApplication @EnableDiscoveryClient public class ZuulServerApplication1 { public static void main(String[] args) { SpringApplication.run(ZuulServerApplication1.class, args); System.out.println("zuul 第一個服務啓動..."); } }
控制層:
@RestController
public class ConsumerController {
@RequestMapping("/hello/{name}") public String index(@PathVariable String name) { return name+",Hello World!"; }
}
springcloud-zuul-server2
服務的代碼:
主類
@SpringBootApplication @EnableDiscoveryClient public class ZuulServerApplication2 { public static void main(String[] args) { SpringApplication.run(ZuulServerApplication2.class, args); System.out.println("zuul 第二個服務啓動..."); } }
控制層:
@RestController public class ConsumerController { @RequestMapping("/hi") public String index(@RequestParam String name) { return name+",hi!"; } }
注:這裏故意將兩個服務的接口參數請求和返回值弄成不同,以便對Zull的功能進行多方面測試。
完成上述的代碼開發後,咱們來進行測試springcloud-zuul
是否能夠地址過濾轉發功能。
首先依次啓動springcloud-zuul-eureka
、springcloud-zuul-gateway
、springcloud-zuul-server1
和springcloud-zuul-server2
這四個項目。其中9009是服務springcloud-zuul-gateway
的端口,9010是第一個客戶端springcloud-zuul-server1
的端口,9011是第二個客戶端springcloud-zuul-server2
的端口。
啓動成功以後,在瀏覽器輸入:
http://localhost:9010/hello/pancm
界面返回:
pancm,hello world!!
在瀏覽器輸入:
http://localhost:9011/hi?name=pancm
界面返回:
pancm,hi!
能夠看出程序正常啓動,而且客戶端的接口返回正確!
那麼咱們再來使用一樣路徑來訪問zuul,由於是在本地進行測試,所以只須要更改下端口就能夠了,將上述在瀏覽器訪問的地址的端口自都改爲9009。
在瀏覽器輸入:
http://localhost:9009/hello/pancm
界面返回:
pancm,Hello World!
在瀏覽器輸入:
http://localhost:9009/hi?name=pancm
界面返回:
pancm,hi!
示例圖:
從上述示例中,咱們能夠得出zuul路由網關已經生效了,成功的幫咱們的請求進行了轉發!
本篇文章主要介紹了關於zuul的基本使用,使用的方式也是單例的,一個路由規則對應一個地址,按照上述的三幅示例圖來講,主要是介紹了第二種。介於篇幅問題,經過Eureka註冊中心方式實現、zuul的詳細配置、 以及zuul的核心模塊過濾器還未講解,這些留在下一篇再來說解。
基於SpringBoot2.x、SpringCloud的Finchley版本開發的地址:https://github.com/xuwujing/springcloud-study
若是感受項目不錯,但願能給個star,謝謝!
這首純音樂聽起來有種似曾相識的感受,但仔細聽下來,又並不是是本身熟悉的一首。不過真是由於這樣,纔有感受吧。
原創不易,若是感受不錯,但願留言推薦!您的支持是我寫做的最大動力! 版權聲明: 做者:虛無境 博客園出處:http://www.cnblogs.com/xuwujing CSDN出處:http://blog.csdn.net/qazwsxpcm 我的博客出處:http://www.panchengming.com