天天看點

Spring Cloud服務網關整合

網關

網管是程式或者系統之間的連接配接節點,扮演者程式或系統之間的門戶,允許它們之前通過通訊協定交換資訊,它們可能是同構或異構系統

例如

  • REST API網關
  • WebServices網關

使用場景

  • 監控(Monitoring)
  • 測試 (Testing)
  • 動态路由(Dynamic Routing)
  • 服務整合(Service Integeation)
  • 負荷減配(Load Shedding)
  • 安全(Security)
  • 靜态資源處理(Static Resources handling)
  • 活躍流量管理(Active traffic management)

資料來源

  • 服務發現
  • 服務注冊

通訊方式

  • 協定:二進制、文本
  • 方式:同步、異步
Spring Cloud服務網關整合

Spring Cloud Zuul

1.增加依賴

<!-- 依賴 Spring Cloud Netflix Zuul -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
        </dependency>           

2.建立zuul代理應用

package com.segumentfault.spring.cloud.lesson11.zuul.proxy;

import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

/**
 * Zuul 代理引導類
 *
 */
@EnableZuulProxy
@SpringCloudApplication
public class ZuulProxyApplication {

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

}           

3.配置zuul應用

application.properties

## Zuul 代理應用
spring.application.name = zuul-proxy

## 服務端口
server.port = 6060


           

4.配置zuul路由規則

## 指定 user-service-provider
zuul.routes.user-service-provider = /user-service/**

## 配置 ribbon
user-service-provider.ribbon.listOfServers = http://localhost:9090/

## http://localhost:8080/user-service/* => http://localhost:9090/*           

5.配合HTTP用戶端

注意:實際配置Ribbon底層HTTP調用用戶端,并非zuul獨享此功能

  • 預設用戶端:HttpClient

    裝配類:HttpClientRibbonConfiguration

  • 配置用戶端:OkHttpClient

    裝配類:OkHttpRibbonConfiguration

激活配置:ribbon.okhttp.enabled=ture

Spring Cloud整合

服務端口資訊

端口資訊

​ zuul-proxy : 6060

​ config-server : 7070

​ user-service-client: 8080

​ user-service-provider : 9090

​ eureka-server : 10000

服務依賴關系

eureka先啟然後user-service-provider然後config-server然後user-service-client然後zuul-proxy

config-server配置zuul-proxy資訊

configs/zuul-config.properties

## Zuul Proxy 配置内容

## 指定 user-service-provider
zuul.routes.user-service-provider = /user-service/**
## 指定 user-service-client
zuul.routes.user-service-client = /user-client/**
           

zuul-proxy作為配置用戶端

1.增加config client依賴

<!-- 依賴 Spring Cloud Config Client -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
           

配置config client資訊

bootstrap.properties

## Zuul 代理應用
spring.application.name = zuul-proxy

## 配置用戶端應用關聯的應用
## spring.cloud.config.name 是可選的
## 如果沒有配置,采用 ${spring.application.name}
spring.cloud.config.name = zuul-config
## 關聯 profile
spring.cloud.config.profile = default
## 關聯 label
spring.cloud.config.label = master
## 激活 Config Server 服務發現
spring.cloud.config.discovery.enabled = true
## Config Server 伺服器應用名稱
spring.cloud.config.discovery.serviceId = config-server
## Spring Cloud Eureka 用戶端 注冊到 Eureka 伺服器
eureka.client.serviceUrl.defaultZone = http://localhost:10000/eureka
           

zuul-proxy激活服務發現

增加 eureka Client依賴

<!-- 依賴 Spring Cloud Netflix Eureka -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>           

下面知識隻做了解

ZuulFilter調用鍊

Spring Cloud服務網關整合
RequestContext context = RequestContext.getCurrentContext();
            context.setZuulEngineRan();

            try {
                preRoute();
            } catch (ZuulException e) {
                error(e);
                postRoute();
                return;
            }
            try {
                route();
            } catch (ZuulException e) {
                error(e);
                postRoute();
                return;
            }
            try {
                postRoute();
            } catch (ZuulException e) {
                error(e);
                return;
            }
           

Zuul自動裝配

ZuulServletFilter使用範圍更大,可以攔截所有的Servlet,包括ZuulServlet

ZuulServlet會有URL比對的模式,url-pattern

Zuul有兩種的激活模式:

  • @EnableZuulProxy

    導入ZuulProxyMarkerConfiguration,随後生成一個ZuulProxyMarkerConfiguration.Marker()Bean,這個Bean作為ZuulProxyAutoConfiguration的裝配前置條件。

請注意:ZuulProxyMarkerConfiguration擴充了ZuulServerAutoConfiguration,是以ZuulServlet和ZuulController會被自動裝配

ZuulController有DispatcherServlet來在控制,它的映射位址是:“/*”,DispatcherServlet中注冊一個ZuulHandlerMapping,它控制映射到ZuulController,可以參考ZuulServerAutoConfiguration:

@Bean
    public ZuulController zuulController() {
        return new ZuulController();
    }

    @Bean
    public ZuulHandlerMapping zuulHandlerMapping(RouteLocator routes) {
        ZuulHandlerMapping mapping = new ZuulHandlerMapping(routes, zuulController());
        mapping.setErrorController(this.errorController);
        return mapping;
    }
           

通過源碼分析,

ZuulController

将請求委派給

ZuulServlet

,是以所有的

ZuulFilter

執行個體都會被執行。

是以,通路 http://localhost:6060/user-service-client/user/find/all

,實際将請求遞交給 DispatcherServlet

發送請求"/user-service-client/user/find/all"

  • DispatcherServlet

    • ZuulHandlerMapping

      • ZuulController

        • ZuulServlet

          • RibbonRoutingFilter

  • @EnableZuulServer

導入

ZuulServerMarkerConfiguration

,随後生成一個

ZuulServerMarkerConfiguration.Marker()

Bean ,主要用作引導裝配

ZuulServerAutoConfiguration

ZuulServerAutoConfiguration

與 父類

ZuulProxyAutoConfiguration

差別:

父類

ZuulProxyAutoConfiguration

提供了

RibbonRoutingFilter

調用層次:

  • DispatcherServlet

    • ZuulHandlerMapping

      • ZuulController

        • ZuulServlet

          • ZuulFilter