大話微服務中的邊車模式


(以下故事純屬虛構,如有雷同純屬巧合)

概念

自從微服務的浪潮席卷了煙哥的公司之后,煙哥的領導內心蠢蠢欲動,指派煙哥去將公司的傳統服務架構改成微服務架構!於是煙哥就喊上了小劉到了一個僻靜的角落探討如何實施!

煙哥:"小劉啊,去把公司那套天霸動霸Tua系統整整,接入注冊中心,熔斷器什么的,整成微服務架構!領導發話了,就用java里的spring cloud那些組件來做,有沒有問題?"

只見小劉眼角閃過一絲淚花,說道:"有一個大大的問題!天霸動霸Tua系統中的動霸Tua應用是08年開發的,是用php寫的!你讓我怎么接入那些java的注冊中心、熔斷器啊..."
接下來自然就是:

煙哥瞪了瞪眼,說道:"小劉啊,你知道什么是邊車(SideCar)嘛?"

小劉說:"知道啊,就是如果只是單獨一輛自行車只能坐一個人,可以給自行車加一個邊車(SideCar),擴展一下現有的功能,像下面這樣"

"嗯嗯,其實這個模式在微服務中也可以用的!你想啊,我們給動霸Tua應用做一個代理,然后呢,服務注冊、鑒權、限流啊...這些功能都做在代理里,然后呢我們不要直接調動霸Tua應用,調的是動霸Tua應用的代理,這里代理就是所謂的邊車(SideCar),大概部署圖是下面這樣的!"

說到,這里小劉的眼神中似乎露出了滿臉的期待,像下面這樣

煙哥很裝13了停了停,然后繼續說道:"說到這里,我們基本可以明白!要將一個應用改成微服務架構,基本有兩種方式:"

  • 以改FrameWork的方式,直接在原來的項目代碼里頭進行修改!
  • 邊車(SideCar)模式的方式,通過邊車(SideCar)進行轉發請求!

"小劉你瞅啊,邊車(SideCar)模式這種方式,不僅對原來的應用代碼零侵入,而且不限制原來應用的語言,特別適合這種異構微服務的場景!另外,以后你的邊車(SideCar)要升級了,是可以獨立升級的,不用重新打包原來的應用!聽起來是不是很完美?"

 煙哥回答道:"嗯嗯,你看啊!缺點主要有下面幾點:" - 服務之間的調用多了**一跳**,如果兩個微服務都是邊車模式,那就是多了**兩跳**,如果使用邊車模式的微服務接口調用非常頻繁,記得思考一下能否接受這種延遲開銷! - 因為你的`邊車(SideCar)`集成了微服務的通用功能、如果`邊車(SideCar)`進行重試調用,會對你的系統造成額外的影響么?也就是保證你的接口冪等性! - 剛說到了使用`邊車(SideCar)`后,邊車是可以獨立升級的!那這也帶來了一個問題,你的原程序要進行升級或`邊車(SideCar)`要進行升級如何協同來保證請求的正常處理或轉發,可以理解為如何進行優雅上下線,這些要考慮清楚!

小劉問道:"那具體怎么做呢?"

"嗯,聽好啦"

怎么做

(由於我們的技術棧是Spring Cloud,因此只能說明在該技術棧下是怎么做的!)
SpringCloud中有一個組件叫spring-cloud-netflix-sidecar是提供了邊車模式的支持的!
自己搭建一個microservice-sidecar的工程也非常簡單,maven中的dependencies依賴如下

<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-netflix-sidecar</artifactId> </dependency> </dependencies> 

然后,在Application中加上@EnableSidecar注解,像下面這樣

import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.sidecar.EnableSidecar; @SpringBootApplication @EnableSidecar public class Application { public static void main(String[] args) { SpringApplication.run(SidecarApplication.class, args); } } 

最后就是修改你的配置文件,像下面這樣

server:  port: 8070 spring:  application:  name: microservice-sidecar-node-service eureka:  client:  service-url:  defaultZone:http://localhost:8761/eureka/  instance:  prefer-ip-address: true sidecar: # 你的PHP微服務的端口  port: 8060 # PHP微服務的健康檢查URL  health-uri:http://localhost:8060/health.json# 

然后你就可以通過sidecar來訪問了

http://localhost:8070/

拓展

過了幾天,小劉又來找我了!只見小劉說道:"能不能給所有的微服務都搭一個邊車(SideCar),然后用一個平台將邊車(SideCar)管理起來,像下面這樣"

煙哥回答道:“可以的!這就是去年年初被炒的火熱的服務網格(ServiceMesh)模式!”
請看下回《大話微服務中的服務網格》



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM