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