1. 程式人生 > 其它 >SpringCloud的Zuul路由閘道器

SpringCloud的Zuul路由閘道器

Zull路由閘道器

什麼是zuul?

Zull包含了對請求的路由(用來跳轉的)和過濾兩個最主要功能:

其中路由功能負責將外部請求轉發到具體的微服務例項上,是實現外部訪問統一入口的基礎,而過濾器功能則負責對請求的處理過程進行干預,是實現請求校驗,服務聚合等功能的基礎。Zuul和Eureka進行整合,將Zuul自身註冊為Eureka服務治理下的應用,同時從Eureka中獲得其他服務的訊息,也即以後的訪問微服務都是通過Zuul跳轉後獲得。

注意:Zuul 服務最終還是會註冊進 Eureka

提供:代理 + 路由 + 過濾 三大功能!

Zuul 能幹嘛?

  • 路由
  • 過濾

官方文件:https://github.com/Netflix/zuul/

入門案例

修改hosts檔案

由於要模擬真實的閘道器訪問,因此在windows系統環境下我們需要修改下hosts檔案(C:\Windows\System32\drivers\etc):

匯入依賴

新建springcloud-zuul模組,並匯入依賴

<dependencies>
    <!--匯入zuul依賴-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-zuul</artifactId>
        <version>1.4.6.RELEASE</version>
    </dependency>
    <!--Hystrix依賴-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-hystrix</artifactId>
        <version>1.4.6.RELEASE</version>
    </dependency>
    <!--dashboard依賴-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-hystrix-dashboar</artifactId>
        <version>1.4.6.RELEASE</version>
    </dependency>
    <!--Ribbon-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-ribbon</artifactId>
        <version>1.4.6.RELEASE</version>
    </dependency>
    <!--Eureka-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
        <version>1.4.6.RELEASE</version>
    </dependency>
    <!--實體類+web-->
    <dependency>
        <groupId>com.haust</groupId>
        <artifactId>springcloud-api</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--熱部署-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>
</dependencies>

編寫yaml

application.yml

server:
  port: 9527
spring:
  application:
    name: springcloud-zuul
eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
  instance:
    instance-id: zuul9527.com
    prefer-ip-address: true



info:
  app.name: kuang-springcloud
  company.name: blog.kuangstudy.com


zuul:
  routes:
  	# 路由相關配置
  	# 原來訪問路由 http://www.kuangstudy.com:9527/springcloud-provider-dept/dept/get/1 
  	# zull路由配置後訪問路由 http://www.kuangstudy.com:9527/kuang/mydept/dept/get/1
    mydept.serviceId: springcloud-provider-dept
    mydept.path: /mydept/** #通過閘道器訪問springcloud-provider-dept這個服務時用mydept代替
  #ignored-services: springcloud-provider-dept  # 通過閘道器訪問的時候忽略服務名,不能再使用這個服務名訪問跟上面的routes配置配合使用
  ignored-services: "*" #通過閘道器訪問的時候忽略隱藏所有的服務名
  prefix: /kuang #設定公共的字首:通過閘道器訪問的時候都要帶上這個公共字首,與上面ignored-services配合使用

主啟動類

/**
 * @Auther: csp1999
 * @Date: 2020/05/20/20:53
 * @Description: Zull路由閘道器主啟動類
 */
@SpringBootApplication
@EnableZuulProxy // 開啟Zuul
public class ZuulApplication_9527 {
    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication_9527.class,args);
    }
}

測試

可以看出Zull路由閘道器被註冊到Eureka註冊中心中了!

上圖是沒有經過Zull路由閘道器配置時,服務介面訪問的路由,可以看出直接用微服務(服務提供方)名稱去訪問,這樣不安全,不能將微服務名稱暴露!

所以經過Zull路由閘道器配置後,訪問的路由為:

我們看到,微服務名稱被替換並隱藏,換成了我們自定義的微服務名稱mydept,同時加上了字首kuang,這樣就做到了對路由訪問的加密處理!

詳情參考springcloud中文社群zuul元件 :https://www.springcloud.cc/spring-cloud-greenwich.html#_router_and_filter_zuul

衍生問題

上面zuul做的路由跟過濾,其實還有一個問題就是:它並沒有保證我只能從閘道器入口去訪問裡面的服務,我可以直接訪問微服務的ip訪問服務,那這個問題怎麼解決?實際生產中如果是外網環境我們可以只將閘道器的埠暴露出來,其他微服務的埠關閉 ;而如果是內網環境就更好辦了,只需要把閘道器埠暴露在外網就可以了!