Sidecar模式助力Spring Cloud,實現跨語言微服務高效協同
環境:SpringBoot2.7.18 + Spring Cloud Alibaba Sidecar
1. 簡介
Spring Cloud Alibaba Sidecar(以下簡稱:SCA Sidecar)能夠有效地整合異構微服務,解決在微服務架構中由于技術棧、語言或平臺差異導致的兼容性和通信問題。在什么場景下需要使用Sidecar呢?以下總結4點:
- 多語言微服務整合:當微服務架構中涉及多種編程語言和框架時,Spring Cloud Alibaba Sidecar可以作為代理服務,實現不同語言微服務之間的通信和協調。
- 跨平臺服務集成:對于部署在不同平臺或容器化環境中的微服務,Sidecar能夠提供一個統一的接口和協議,簡化跨平臺的服務調用和集成。
- 服務治理與監控:Sidecar可以協助實現服務的注冊與發現、負載均衡、熔斷降級等治理功能,并提供統一的監控和日志收集機制,提高系統的可觀測性。
- 老項目整合:那些由于版本限制或其他原因不適合引入整個如Nacos這樣的注冊中心的項目,Spring Cloud Alibaba Sidecar成為了一個非常合適的解決方案。通過使用Sidecar,解決了老項目在微服務化過程中的兼容性和集成難題。
2. SCA SideCar原理
- SCA Sidecar根據配置的異構微服務的IP、端口等信息,將異構微服務的IP/端口注冊到服務發現組件上 。
- SCA Sidecar實現了 健康檢查 ,SCA Sidecar會定時檢測異構微服務是否健康。如果發現異構微服務不健康,SCASidecar會自動將代表異構微服務的SCASidecar實例下線;如果異構微服務恢復正常,則會自動上線。
使用要求:
- 【必須】你的異構微服務需使用HTTP通信。這一點嚴格來說不算要求,因為Spring Cloud本身就是基于HTTP的;
- 【可選】如果微服務配置了
sidecar.health-check-url
,則表示開啟健康檢查,此時,你的異構微服務需實現健康檢查(可以是空實現,只要暴露一個端點,返回類似 {"status": "UP"} 的字符串即可)。
3. 實戰案例
3.1 準備異構項目
為了簡單起見,我也不用其它語言實現一個服務了,還是用SpringBoot項目做試驗,大家可以使用其它語言如:NodeJS,C#等語言實現。
該服務非常簡單就提供一個業務接口,和一個健康檢查所需要的接口,如下:
業務接口
@RestController
@RequestMapping("/users")
public class UsersController {
@GetMapping("normal")
public Object index() {
return "正常請求" ;
}
}
健康檢查接口
該接口的作用:上線 / 下線 該異構服務(我這當前就是SpringBoot服務)。
@RestController
@RequestMapping("/health")
public class HealthController {
@GetMapping("")
public Object health() {
// 該打印是為了一會測試看效果
System.out.println("服務狀態...") ;
Map<String, Object> status = new HashMap<>() ;
// 注意:這里必須是status,value必須是大寫的UP
status.put("status", "UP") ;
return status ;
}
}
配置文件
server.port=8080
該異構服務并沒有依賴Spring Cloud相關的任何組件就是一個非常普通的項目。
3.2 準備Sidecar服務
引入依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sidecar</artifactId>
</dependency>
服務配置
spring:
application:
name: pack-car
---
spring:
cloud:
nacos:
server-addr: localhost:8848
username: nacos
password: xxxooo
discovery:
enabled: true
group: cloudApp
---
management:
health:
sidecar:
enabled: true
---
# 這里的配置就是我們異構服務的相關信息
sidecar:
ip: localhost
port: 8088
# 間隔多久進行一次監控檢查,單位ms
health-check-interval: 5000
# 監控檢查的URL,上面3.1中定義的接口
health-check-url: http://${sidecar.ip}:${sidecar.port}/health
以上就做完了關于Sidecar服務的所有工作,我們只需要配置不需要任何的代碼。 注意:上面配置的nacos服務發現端口和ip都會被修改為Sidecar配置的ip及端口,Sidecar內部實現的,有興趣可以研究下源碼非常簡單。
接下來就可以分別啟動上面兩個服務測試,我們首先啟動Sidecar服務,控制臺將輸出如下信息:
請求了我們的異構服務,但是我們的異構服務并沒有啟動所以是失敗狀態。
啟動異構服務,再次查看Sidecar控制臺輸出
成功了,再查看異構服務控制臺
圖片
查看Nacos控制臺
圖片
成功注冊異構服務,注意查看端口。
3.3 調用異構服務接口
接下來我們還需要一個服務,該服務也需要注冊到nacos中,然后我們在這個服務中調用異構服務接口。
相關的依賴配置就不說了非常簡單,下面我們就看能否通過服務發現成功調用異構服務的接口。
該服務的服務名為
spring.appliation.name=myapp
server.port=8100
啟動服務查看服務是否成功注冊到Nacos
圖片
服務成功注冊。
配置RestTemplate
@Bean
@LoadBalanced
RestTemplate lbRestTemplate(RestTemplateBuilder builder) {
return builder.build() ;
}
通過RestTemplate調用上異構服務/users接口。
@Resource
private RestTemplate lbRestTemplate ;
@GetMapping("/lb")
@ResponseBody
public Object lb() {
// 通過服務名請求
return this.lbRestTemplate.getForObject("http://pack-car/users/normal", String.class) ;
}
圖片
請求成功。
到此就完成了通過Sidecar整合異構系統。