0601-Zuul構建API Gateway-API gateway簡介
一、API Gateway簡介
參看:http://www.cnblogs.com/bjlhx/p/8794437.html
二、zuul簡介【路由器和過濾器:Zuul】
在微服務架構的組成部分進行路由。例如,/可能映射到您的Web應用程序,/ api / users映射到用戶服務,並且/ api / shop映射到商店服務。Zuul是Netflix提供的基於JVM的路由器和服務器端負載均衡器。
Netflix使用Zuul進行以下操作:
認證、洞察、壓力測試、金絲雀測試、動態路由、服務遷移、加載脫落、安全、靜態響應處理、主動/主動流量管理
Zuul的規則引擎允許使用基本上任何JVM語言編寫規則和過濾器,並支持Java和Groovy。
註意1:配置屬性zuul.max.host.connections已被兩個新屬性zuul.host.maxTotalConnections和zuul.host.maxPerRouteConnections取代,默認值分別為200和20。
註意2:所有路由的默認Hystrix隔離模式(ExecutionIsolationStrategy)為SEMAPHORE。如果此隔離模式為首選,則zuul.ribbonIsolationStrategy可以更改為THREAD。
2.1、嵌入式Zuul反向代理
Spring Cloud已經創建了一個嵌入式Zuul代理來緩解UI應用程序希望將調用代理調用到一個或多個後端服務的非常常見的用例的開發。此特性對於用戶界面代理其所需的後端服務非常有用,從而避免需要獨立管理所有後端的CORS和身份驗證問題。
要啟用它,使用@EnableZuulProxy註釋一個Spring Boot主類,並且將本地調用轉發給相應的服務。按照慣例,具有ID“用戶”的服務將接收來自位於/ users的代理的請求(剝離了前綴)。代理使用功能區找到要通過Ribbon轉發的實例,並且所有請求都在hystrix命令中執行,因此故障將顯示在Hystrix指標中,一旦斷路器打開,代理不會嘗試聯系服務。
註意:Zuul啟動器不包含發現客戶端,所以對於基於服務ID的路由,您需要在類路徑中提供其中的一個(例如,Eureka是一種選擇)。
2.1.1、使用
pom引用
<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>
啟動類增加@EnableZuulProxy
@SpringBootApplication @EnableZuulProxy public class ZuulApplication { public static void main(String[] args) { SpringApplication.run(ZuulApplication.class, args); } }
配置文件
spring: application: name: microservice-gateway-zuul server: port: 8040 eureka: client: serviceUrl: defaultZone: http://user:a123@localhost:8761/eureka/ instance: prefer-ip-address: true
開始啟動Eureka項目,在啟動user-provider項目,在啟動Zuul項目
通過zuul訪問:http://192.168.199.211:8040/microservice-provider-user/sample/1
2.1.2、路由規則
1、簡化微服務名稱
將microservice-provider-user路由成user
zuul: routes: microservice-provider-user: /user/**
2、只想反向代理 microservice-provider-user用戶服務,其他不代理
zuul:
ignoredServices: ‘*‘
routes:
users: /myusers/**
或者忽略具體的,使用“,”分隔
3、為了更好地控制路由,您可以獨立指定路徑和serviceId:
zuul:
routes:
user-controller: #名稱任意
path: /user/**
serviceId: microservice-provider-user
這意味著http調用“/ myusers”被轉發到“users_service”服務。路由必須有一個可以指定為ant樣式的“路徑”,因此“/myusers/*”只匹配一個級別,但“/myusers/**”分層次匹配。
4、可以將後端的位置指定為“serviceId”(對於來自發現的服務)或“url”(對於物理位置)
zuul:
routes:
user-controller: #名稱任意
path: /user/**
url: http://127.0.0.1:7900/
5、負載均衡
這些簡單的url路由不會作為HystrixCommand執行,也不會使用Ribbon來負載多個URL。
方法一、為了達到這個目的,你可以用一個靜態的服務器列表來指定一個serviceId:
zuul:
routes:
echo: #名稱任意
path: /microservice/**
serviceId: microservice-provider-user
stripPrefix: true
hystrix:
command:
microservice-provider-user:
execution:
isolation:
thread:
timeoutInMilliseconds: 10000
microservice-provider-user: #微服務的ID
ribbon:
NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
ListOfServers: http://localhost:7900,http://localhost:7901
ConnectTimeout: 1000
ReadTimeout: 3000
MaxTotalHttpConnections: 500
MaxConnectionsPerHost: 100
方法二、另一種方法是指定一個服務路由並為serviceId配置一個Ribbon客戶端(這需要禁用功能區中的Eureka支持:有關詳細信息,請參閱上文)。
ribbon:
eureka:
enabled: false
zuul:
routes:
user-controller: #名稱任意
path: /user/**
serviceId: microservice-provider-user
microservice-provider-user: #微服務的ID
ribbon:
listOfServers: http://localhost:7900,http://localhost:7901
註:前6個參考代碼:https://github.com/bjlhx15/spring-cloud/tree/master/microservice-gateway-zuul
6、使用正則配置
您可以使用regexmapper在serviceId和路由之間提供約定。它使用正則表達式命名組從serviceId提取變量並將它們註入路由模式。@Bean public PatternServiceRouteMapper serviceRouteMapper() { return new PatternServiceRouteMapper("(?<name>^.+)-(?<version>v.+$)", "${version}/${name}"); }
這意味著serviceId“myusers-v1”將被映射為路由“/ v1 / myusers / **”。任何正則表達式都被接受,但所有已命名的組必須存在於servicePattern和routePattern中。如果servicePattern與serviceId不匹配,則使用默認行為。
參看代碼:https://github.com/bjlhx15/spring-cloud/tree/master/microservice-gateway-zuul-reg-exp
7、 映射前綴
要為所有映射添加前綴,請將zuul.prefix設置為值,例如/ api。代理前綴在請求被默認轉發之前從請求中剝離(使用zuul.stripPrefix = false關閉此行為)。您還可以關閉從單個路由中剝離服務特定的前綴,例如
設置前綴:
zuul:
prefix: /api
請求地址:http://192.168.199.211:8040/api/v1/microservice-provider-user/sample/1
剝離前綴
zuul: routes: users: path: /myusers/** stripPrefix: false
zuul.stripPrefix特別適用於zuul.prefix,是全局的;zuul.routes.<route> .stripPrefix適用於zuul.routes.<route> .path,是局部的
註意:zuul.stripPrefix僅適用於在zuul.prefix中設置的前綴。它對給定路徑路徑中定義的前綴沒有任何影響。
日誌跟蹤代碼
logging:
level:
com.netflix: debug
8、忽略具體路徑
zuul: ignoredPatterns: /**/admin/** routes: users: /myusers/**
這意味著諸如“/ myusers / 101”的所有呼叫都將被轉發到“用戶”服務上的“/ 101”。但包括“/ admin /”的調用不會解決。
9、針對某個服務使用路由,其他不適用
zuul: routes: users: path: /myusers/** legacy: path: /**
針對用戶路由使用/myusers/**;其他使用/**
註意:如果您需要您的順序以保留其優先級,則需要使用YAML文件,因為使用屬性文件會丟失優先級。
0601-Zuul構建API Gateway-API gateway簡介