看完前篇文章《gateway的基礎知識點》我們知道了gateway一些相關的基礎知識
接下來我們要對這些基礎知識進行梳理,我們看源碼目錄
我們發現gateway實現的四個RouteDefinitionLocator分別散落在不同目錄下,這個讓我很不理解。
那麼這裏有個最爲特殊的DiscoveryClientRouteDefinitionLocator,因爲他的所有信息均來源於註冊中心,所以這個spring默認集成了一個開關,也就是DiscoveryLocatorProperties 屬性類中的enable屬性,只需要配置這個屬性就是開啓了這個DiscoveryClientRouteDefinitionLocator
spring.cloud.gateway.discovery.locator.enabled=true
那麼這個Locator中還可以設置哪些內容呢,讓我們來看下源碼
@ConfigurationProperties("spring.cloud.gateway.discovery.locator")
public class DiscoveryLocatorProperties {
/** 標誌是否啓用discoveryLocator */
private boolean enabled = false;
/**
* 路由id前綴,默認取 discoveryClient.getClass().getSimpleName()
* + "_". 服務id拼接成routeId
*/
private String routeIdPrefix;
/**
* 判斷是否包含SpEL表達式
* 默認判斷
*/
private String includeExpression = "true";
/**
* 路由的url的SpEl表達式, 默認爲: 'lb://'+serviceId.
*/
private String urlExpression = "'lb://'+serviceId";
/**
* 是否在predicate和filter中將 serviceid 轉成小寫, 默認 false. Useful
* 在eureka中服務id是大寫的像 MYSERIVCE, 將會匹配成如下形式
* /myservice/**
*/
private boolean lowerCaseServiceId = false;
//配置predicates
private List<PredicateDefinition> predicates = new ArrayList<>();
//配置過濾器
private List<FilterDefinition> filters = new ArrayList<>();
}
上面很清晰的將所有配置列出來了有了這份配置表我們就可以很輕鬆的對discoveryRouteDefinitonLocator進行更精細的配置了
以下配置請寫在bootstrap.yml中,複雜的在properties中都不知道怎麼寫了,用轉換工具轉換後在properties中報錯,啓動無效。
spring.cloud.gateway.discovery.locator.predicates[0].name: Path
spring.cloud.gateway.discovery.locator.predicates[0].args[pattern]: "'/'+serviceId+'/**'"
spring.cloud.gateway.discovery.locator.predicates[1].name: Host
spring.cloud.gateway.discovery.locator.predicates[1].args[pattern]: "'**.foo.com'"
spring.cloud.gateway.discovery.locator.filters[0].name: Hystrix
spring.cloud.gateway.discovery.locator.filters[0].args[name]: serviceId
spring.cloud.gateway.discovery.locator.filters[1].name: RewritePath
spring.cloud.gateway.discovery.locator.filters[1].args[regexp]: "'/' + serviceId + '/(?<remaining>.*)'"
spring.cloud.gateway.discovery.locator.filters[1].args[replacement]: "'/${remaining}'"