1. 程式人生 > >Spring Cloud系列教程 | 第六篇:Spring Cloud Zuul作為API閘道器實現請求路由轉發教程

Spring Cloud系列教程 | 第六篇:Spring Cloud Zuul作為API閘道器實現請求路由轉發教程

推薦 Spring Cloud 視訊:

Spring Cloud Zuul作為API閘道器實現請求路由轉發教程

     當我們的架構實現前後端分離以後,前端和後端之間互動就是通過API閘道器進行,API閘道器兩個職責:

1.設計上的適配層,或稱Facade模式,後端微服務可能過於細粒度,通過API閘道器進行內外適配,前後端轉換,如果220v轉換成110v一樣。

2.執行階段:將外部請求路由分發到內部各個微服務,負載平衡和路由策略是需要的。

API閘道器,即邊緣服務,為一組微服務提供統一的介面,以便客戶無需瞭解微服務內部的所有細節。但是,在微服務架構中使用API​​閘道器模式有一些優缺點。
優點:

  • 為客戶提供更簡單的介面
  • 可用於防止將內部微服務結構暴露給客戶端
  • 允許重構微服務而不強制客戶端重構消耗邏輯
  • 可以集中安全,監控,速率限制等交叉問題

缺點:

  • 如果不採取適當措施使其具有高可用性,它可能會成為單點故障
  • 各種微服務API的知識可能會滲透到API閘道器中

Spring Cloud提供類似於Nginx的代理 Zuul,可用於建立API閘道器。最新版本已經使用非堵塞的Spring Cloud Gateway替代了Zuul,當然我們還是能通過Zuul方便使用瞭解學習API閘道器。本文看看Zuul如何將前端請求轉發到後端的微服務。

現在我們已經掌握了一個規律,建立一個Springcloud專案,一般主要首先是Maven的配置,然後就是元註解,第三就是application.properties,按照這個開發步驟:

第一步, pom.xml配置如下,也可以使用idea的新模組導航,選擇Spring.io進行一步步設定,生成如下配置:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</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>

這裡引入zuul庫包是不奇怪的,那麼為什麼引入註冊伺服器呢?這個問題很好,本文我們將展示通過或不通過註冊伺服器兩種應用場景:

  1. 如果我們在application.properties配置
zuul.routes.producer.url=http://localhost:2111

這是將前端請求/producer/****都轉發到埠2111上,這個功能就非常類似Nginx了,這種情況當然不需要服務註冊伺服器,因為沒有有關服務資訊,只是純url資訊。

2.如果我們在application.properties配置:

zuul.routes.peng.path=/producer/**
zuul.routes.peng.serviceId=PengProducerService

application.properties中Zuul路由的配置遵循以下模式:zuul.routes.+服務名稱.+path或serviceId。這裡我們隨便取了服務名稱peng,主要是為了辨識這個伺服器名稱在執行時是否起作用,當然實際中最好與服務名稱一致,zuul.routes.peng.path=/producer/**就是將前端請求/producer/****都轉發到zuul.routes.peng.serviceId=中定義的PengProducerService,這個服務在哪裡呢?就需要服務註冊器了,那麼我們需要在pom.xml中配置eureka。

好了,除了以上兩種情況的不同配置,我們在application.properties中還要配置:

spring.application.name=zuulrouter
server.port=8080
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/

這是常例配置,如果不需要eurake就去除,埠是開在8080,這裡直接面對前端的埠,正式環境可以是80埠,這類似Nginx作用。

第三步看看元註解:

@SpringBootApplication
@EnableZuulProxy
public class ZuulrouterApplication {

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

@EnableZuulProxy是需要的。

好了我們完成開發配置,下面可以執行測試,我們也分兩種情況:

  1. 先啟動模組producer,測試第一種情況純粹url轉發:

這個請求將被Zuul路由轉發到2111埠的producer,訪問其中/articles。

2.再啟動eureka註冊伺服器,再啟動producer,測試第二種情況:

這是根據服務Id進行轉發的。

為了測試兩種情況對應註冊伺服器是否啟動,可以對application.properties裡面配置錯配,比如使用服務Id轉發,如果不啟動註冊伺服器,則無法訪問成功。
附:API閘道器能夠實現Nginx +Lua複雜的路由分發邏輯,包括動靜網頁分離,許可權檢查等,下面是application.yml格式的配置案例,學完以上教程以後應該能看懂:

logging:
  level:
    org.springframework.security: DEBUG
    org.springframework.cloud: DEBUG
    org.springframework.web: WARN
    
server:
  port: 8080
  
spring:
  aop:
    proxy-target-class: true
  
zuul:  
  routes:    
    startpage:
      path: /**
      url: http://localhost:8081
    resource:      
      path: /resource/**
      url: http://localhost:9001/resource
    user:
      path: /user/**
      url: http://localhost:9999/uaa/user

security:
  oauth2:    
    client:
      accessTokenUri: http://localhost:9999/uaa/oauth/token
      userAuthorizationUri: http://localhost:9999/uaa/oauth/authorize
      clientId: ui1
      clientSecret: ui1-secret   
    resource:
      userInfoUri: http://localhost:9999/uaa/user
      preferTokenInfo: false  
  sessions: ALWAYS

專家推薦

“隨著微服務架構的發展,Spring Cloud 使用得越來越廣泛。馳狼課堂http://www.chilangedu.com (QQ群:348039381) Spring Boot 快速入門,Spring Boot 與Spring Cloud 整合,docker+k8s,大型電商商城等多套免費實戰教程可以幫您真正做到快速上手,將技術點切實運用到微服務專案中。”

關注公眾號,每天精彩內容,第一時間送達!
在這裡插入圖片描述