網關
網管是程式或者系統之間的連接配接節點,扮演者程式或系統之間的門戶,允許它們之前通過通訊協定交換資訊,它們可能是同構或異構系統
例如
- REST API網關
- WebServices網關
使用場景
- 監控(Monitoring)
- 測試 (Testing)
- 動态路由(Dynamic Routing)
- 服務整合(Service Integeation)
- 負荷減配(Load Shedding)
- 安全(Security)
- 靜态資源處理(Static Resources handling)
- 活躍流量管理(Active traffic management)
資料來源
- 服務發現
- 服務注冊
通訊方式
- 協定:二進制、文本
- 方式:同步、異步

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調用鍊
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
-
-
-
-