通過Acutator和SpringCloudConfig完成"灰度部署"——動態刷新網關路由配置
先聲明下,我這個可能是冒牌的灰度部署,技術有限,純粹個人筆記分享。
前段時間接到了頭頭給我的一個任務,讓我研究下“灰度部署”,說是保證一個服務要升級的時候,不能停掉服務。操作步驟是,比如老版本的服務端口號是9002,新版本的服務是9003。在運行9002的時候,啟動9003,修改網關路由配置9002→9003,確保流量走到9003后成功運行,停掉9002服務,這就算大功告成了。
接下來分享下我通過學習實踐后可行的兩種方案 1. 通過SpringCloudConfig配置分布式配置中心,連接GitHub、GitLab加上Acutator來實現刷新技術。 2. 輕量級——通過Acutator來刷新,拋棄SpringCloudConfig。僅僅本地修改就OK,不用去Git上修改。
方式一:通過SpringCloudConfig搭建分布式配置中心
概要:這種方式呢,就是通過一個服務(配置中心),連接上GitHub或者GitLab(因為公司是用lab管理代碼的)的倉庫,然后讀取里面的配置文件(各個服務的各種配置文件都在這里放着),運維人員或者其他人吧,就可以在倉庫在線修改配置文件。然后通過例如github、lab的WebHook;Actoator監控工具(手動刷新)的技術等完成刷新。這樣就不用重啟服務了。
1.創建一個項目,作為這個配置中心服務。 引入對應依賴。
1 <!-- springCloud Config --> 2 <dependency> 3 <groupId>org.springframework.cloud</groupId> 4 <artifactId>spring-cloud-config-server</artifactId> 5 </dependency> 6 7 <!-- 圖形化監控 --> 8 <dependency> 9 <groupId>org.springframework.boot</groupId> 10 <artifactId>spring-boot-starter-actuator</artifactId> 11 </dependency>
2. 然后創建application.yml配置文件。配置示例如下:
這個服務的端口號是3344,其次通過配置可以看出。連接git的uri是如下(這就是你的git倉庫的地址),如果是私有的或者有權限的就在下面不上username和password,和uri並列就可以了。
server:
port: 3344
spring:
application:
name: microservicecloud-config
cloud:
config:
server:
git:
uri: https://github.com/*********r-repo.git
3.目前為止分布式配置中心的搭建基本就差不多了,但是別忘了去啟動類加上啟用的注解。(@EnabledConfigServer)
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.config.server.EnableConfigServer; @EnableConfigServer @SpringBootApplication public class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); } }
4.截止到這里分布式配置中心已經搭建完成。
5.將網關服務的配置文件放置在GitHub或者GitLab上的倉庫上(就是上面剛剛配置的git地址)。
6.這時候分布式配置中心的服務端配置完了,改配置客戶端了,這里網關服務就相當於客戶端。所以我就在網關服務中添加如下依賴:
acutator是用來刷新監控的,config是客戶端,注意上面服務端的依賴是-server。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
7. 在網關(配置中心客戶端)添加bootstrap.yml,這個配置文件將優先於application.yml,因為它是配置中心的文件,它需要連接服務端,以及獲取倉庫中的文件路徑等詳細信息去在倉庫中茫茫多的文件讀取到屬於自己的配置文件。
下面是網關項目的bootstrap.yml配置文件,name是指你想讀取的配置文件的名稱(當然還有指定路徑的配置,具體就不詳細了,現在就當做是一級目錄下的文件),label是指master節點,uri自然就是git的地址,如果出現權限等問題記得加上username,password。
spring:
cloud:
config:
name: zuulConfig
label: master
uri: https://github.com/*********r-repo.git
8. 到此SpringCloudConfig的配置就結束了,當修改git上的配置文件后,通過手動刷新(或者綁定webhook,這里就不提了)后,服務就更新成最新的配置了。手動刷新的方式是利用Actuator,在下面的方式最后一起描述。當然這里的關於Actuator的配置文件也應該寫在application.yml或者bootstrap.yml中。
方式二:利用Actuator實現動態更新配置文件
1. 導入依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
2. 配置文件
這里展示properties格式的,最簡單的就是加入include = refresh,因為默認是沒有refresh的,這里就用"*"都導入了,第二行的配置是指用什么路徑,原路徑/acutator/refresh,經過配置后/manager/refresh,如果本地端口失效等問題還可以加上server.port設置端口,用這個端口再試試....
management.endpoints.web.exposure.include=*
management.endpoints.web.base-path=/mannager
3. 配置Java代碼(這里只是關心網關的配置的刷新,至於其他的,自行百度或者 加上@RefreshScope注解等)
第一段代碼主要是配置的一個接口,調用這個接口可以查看當前網關的配置文件信息,和咱們這個動態刷新沒什么大的關系。
主要是第二段代碼,首先@Primary等那幾個注解都是必須的,別問為什么,初學的我也是看別人博客這么說的....其次就是哪里要刷新哪里用@RefreshScope
@Configuration @Lazy(value = false) @EnableZuulProxy @EnableConfigurationProperties({ZuulProperties.class}) @RestController public class ZuulConfig { @Autowired ZuulProperties p; @GetMapping("/config") public Map<String, ZuulProperties.ZuulRoute> config() { return p.getRoutes(); } }
@EnableZuulProxy @SpringBootApplication @EnableConfigurationProperties({ZuulProperties.class}) public class ZuulServiceApplication { public static void main(String[] args) { SpringApplication.run(ZuulServiceApplication.class, args); } @Bean(name = "zuul.CONFIGURATION_PROPERTIES") @RefreshScope @ConfigurationProperties("zuul") @Primary public ZuulProperties zuulProperties() { ZuulProperties p = new ZuulProperties(); return p; } }
4.到這里簡單的動態刷新監聽配置就完成了。
操作步驟:
調用/config接口查看網關配置信息,在發布目錄(targer)下的配置文件里修改配置信息,然后調用/manager/refersh接口,會返回給你修改了的配置信息的key,然后調用/config接口你會發現你修改的配置信息已經刷新了。當然如果覺得不可信,可以修改端口號啊等等,這也算是“灰度部署”了吧,可能有點粗糙,因為流量是直接全部導向新服務的。
做個筆記吧,以后可能還會用上,可能有很多說錯的地方....hah