【原創】大話微服務中的邊車模式

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

概念

自從微服務的浪潮席捲了煙哥的公司以後,煙哥的領導心裏蠢蠢欲動,指派煙哥去將公司的傳統服務架構改爲微服務架構!因而煙哥就喊上了小劉到了一個僻靜的角落探討如何實施!java

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

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

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

小劉說:"知道啊,就是若是隻是單獨一輛自行車只能坐一我的,能夠給自行車加一個邊車(SideCar),擴展一下現有的功能,像下面這樣"架構

"嗯嗯,其實這個模式在微服務中也能夠用的!你想啊,咱們給動霸Tua應用作一個代理,而後呢,服務註冊、鑑權、限流啊...這些功能都作在代理裏,而後呢咱們不要直接調動霸Tua應用,調的是動霸Tua應用的代理,這裏代理就是所謂的邊車(SideCar),大概部署圖是下面這樣的!"
app

說到,這裏小劉的眼神中彷佛露出了滿臉的期待,像下面這樣
maven

煙哥很裝13了停了停,而後繼續說道:"說到這裏,咱們基本能夠明白!要將一個應用改爲微服務架構,基本有兩種方式:"ide

  • 以改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)模式!」 請看下回《大話微服務中的服務網格》

相關文章
相關標籤/搜索