1. 程式人生 > >spring-cloud-gateway動態路由

spring-cloud-gateway動態路由

# 概述 線上專案釋出一般有以下幾種方案: 1. 停機發布 2. 藍綠部署 3. 滾動部署 4. 灰度釋出 **停機發布** 這種釋出一般在夜裡或者進行大版本升級的時候釋出,因為需要停機,所以現在大家都在研究 `Devops` 方案。 **藍綠部署** 需要準備兩個相同的環境。一個環境新版本,一個環境舊版本,通過負載均衡進行切換與回滾,目的是為了減少服務停止時間。 **滾動部署** 就是在升級過程中,並不一下子啟動所有新版本,是先啟動一臺新版本,再停止一臺老版本,然後再啟動一臺新版本,再停止一臺老版本,直到升級完成。基於 `k8s` 的升級方案預設就是滾動部署。 **灰度釋出** 也叫金絲雀釋出,灰度釋出中,常常按照使用者設定路由權重,例如 90%的使用者維持使用老版本,10%的使用者嚐鮮新版本。不同版本應用共存,經常與 A/B 測試一起使用,用於測試選擇多種方案。 上邊介紹的幾種釋出方案,主要是引出我們接下來介紹的 `spring-cloud-gateway` 動態路由,我們可以基於動態路由、負載均衡和策略載入去實現 `灰度釋出`。當然現在有很多開源的框架可以實現 `灰度釋出`,這裡只是研究學習。 # 動態路由 `spring-cloud-gateway` 預設將路由載入在記憶體中。具體可以參見 `InMemoryRouteDefinitionRepository` 類的實現。 這裡我們基於 `Redis` 實現動態路由。基礎專案見 [spring-cloud-gateway 簡介](https://mp.weixin.qq.com/s/nGlIREVZ13qQ3CvaftmYaA) ## 1. 將 actuator 的端點暴露出來。 ```yaml management: endpoints: web: exposure: include: "*" ``` ## 2. redis 配置 ```java @Configuration public class RedisConfig { @Bean(name = {"redisTemplate", "stringRedisTemplate"}) public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) { StringRedisTemplate redisTemplate = new StringRedisTemplate(); redisTemplate.setConnectionFactory(factory); return redisTemplate; } } ``` ## 3. 將原記憶體路由持久化到 redis ```java @Component public class RedisRouteDefinitionRepository implements RouteDefinitionRepository { /** * hash儲存的key */ public static final String GATEWAY_ROUTES = "gateway_dynamic_route"; @Resource private StringRedisTemplate redisTemplate; /** * 獲取路由資訊 * @return */ @Override pub