Spring Cloud Sidecar 簡介
一、概述
Spring Cloud 帶來了廣泛的特性和庫,例如客戶端負載均衡、服務註冊/發現、並發控制和配置服務器。另一方面,在微服務世界中,使用不同的語言和框架編寫多語言服務是一種常見的做法。那麼,如果我們想在整個生態系統中利用 Spring Cloud 呢? Spring Cloud Netflix Sidecar 是這裡的解決方案。
在本教程中,我們將通過工作示例了解有關 Spring Cloud Sidecar 的更多信息。
2、什麼是Spring Cloud Sidecar?
Cloud Netflix Sidecar 受到Netflix Prana的啟發,可用作實用程序來簡化以非 JVM 語言編寫的服務的服務註冊表的使用,並提高 Spring Cloud 生態系統中端點的互操作性。
使用 Cloud Sidecar,可以在服務註冊表中註冊非 JVM 服務。此外,該服務還可以使用服務發現來查找其他服務,甚至可以通過主機查找或 Zuul Proxy 訪問配置服務器。能夠集成非 JVM 服務的唯一要求是具有可用的標準健康檢查端點。
3. 樣品申請
我們的示例用例包含 3 個應用程序。為了展示 Cloud Netflix Sidecar 的優點,我們將在 NodeJS 中創建一個/hello
端點,然後通過一個名為 sidecar 的 Spring 應用程序將其公開給我們的生態系統。我們還將開發另一個 Spring Boot 應用程序,以使用服務發現和 Zuul 來響應/hello
端點響應。
在這個項目中,我們的目標是涵蓋請求的兩個流程:
- 用戶在 echo Spring Boot 應用程序上調用 echo 端點。 echo 端點使用
DiscoveryClient
從 Eureka 中查找 hello 服務 URL,即指向 NodeJS 服務的 URL。然後 echo 端點調用 NodeJS 應用程序上的 hello 端點 - 用戶在 Zuul Proxy 的幫助下直接從 echo 應用程序調用 hello 端點
3.1。 NodeJS 你好端點
讓我們從創建一個名為hello.js
的 JS 文件開始。我們使用express
來處理我們的 hello 請求。在我們的hello.js
文件中,我們引入了三個端點——默認的“/”端點、 /hello
端點和/health
端點,以滿足 Spring Cloud Sidecar 的要求:
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.get('/health', (req, res) => {
res.send({ "status":"UP"})
})
app.get('/hello/:me', (req, res) => {
res.send('Hello ' + req.params.me + '!')
})
app.listen(port, () => {
console.log(`Hello app listening on port ${port}`)
})
接下來,我們將安裝express
:
npm install express
最後,讓我們開始我們的應用程序:
node hello.js
隨著應用程序的啟動,讓我們curl
hello 端點:
curl http://localhost:3000/hello/baeldung
Hello baeldung!
然後,我們測試健康端點:
curl http://localhost:3000/health
status":"UP"}
當我們為下一步準備好節點應用程序時,我們將對其進行 Springify。
3.2.邊車應用
首先,我們需要啟動一個 Eureka Server。 Eureka Server啟動後,我們可以訪問:http: //127.0.0.1 :8761
讓我們添加spring-cloud-netflix-sidecar
作為依賴項:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-sidecar</artifactId>
<version>2.2.10.RELEASE</version>
</dependency>
需要注意的是,此時spring-cloud-netflix-sidecar
的最新版本是2.2.10.RELEASE
,並且只支持 spring boot 2.3.12.RELEASE
。因此,目前最新版本的 Spring Boot 不兼容 Netflix Sidecar。
然後讓我們在啟用 sidecar 的情況下實現我們的 Spring Boot 應用程序類:
@SpringBootApplication
@EnableSidecar
public class SidecarApplication {
public static void main(String[] args) {
SpringApplication.run(SidecarApplication.class, args);
}
}
下一步,我們必須設置連接到 Eureka 的屬性。此外,我們使用 NodeJS hello 應用程序的端口和健康 URI 設置 sidecar 配置:
server.port: 8084
spring:
application:
name: sidecar
eureka:
instance:
hostname: localhost
leaseRenewalIntervalInSeconds: 1
leaseExpirationDurationInSeconds: 2
client:
service-url:
defaultZone: http://127.0.0.1:8761/eureka
healthcheck:
enabled: true
sidecar:
port: 3000
health-uri: http://localhost:3000/health
現在我們可以啟動我們的應用程序了。在我們的應用程序成功啟動後,Spring 在 Eureka Server 中註冊了一個名為“hello”的服務。
要檢查它是否有效,我們可以訪問端點: http://localhost:8084/hosts/sidecar 。
@EnableSidecar
不僅僅是向 Eureka 註冊輔助服務的標記。它還導致添加@EnableCircuitBreaker
和@EnableZuulProxy
,隨後,我們的 Spring Boot 應用程序從 Hystrix 和 Zuul 中受益.
現在,我們已經準備好 Spring 應用程序,讓我們進入下一步,看看我們生態系統中服務之間的通信是如何工作的。
3.3. Echo 應用程序也打招呼!
對於 echo 應用程序,我們將在服務發現的幫助下創建一個調用 NodeJS hello 端點的端點。此外,我們將啟用 Zuul 代理來顯示這兩個服務之間通信的其他選項。
首先,讓我們添加依賴項:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
<version>2.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.10.RELEASE</version>
</dependency>
為了與 sidecar 應用程序保持一致,我們在 echo 應用程序中對[spring-cloud-starter-netflix-zuul](https://search.maven.org/artifact/org.springframework.cloud/spring-cloud-starter-netflix-zuul)
和[spring-cloud-starter-netflix-eureka-client](https://search.maven.org/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-client/2.2.10.RELEASE/jar)
netflix-eureka-client 2.2.10.RELEASE for
。
然後讓我們創建 Spring Boot 主類並啟用 Zuul Proxy:
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class EchoApplication {
// ...
}
然後,我們像在上一節中所做的那樣配置 Eureka 客戶端:
server.port: 8085
spring:
application:
name: echo
eureka:
instance:
hostname: localhost
leaseRenewalIntervalInSeconds: 1
leaseExpirationDurationInSeconds: 2
client:
service-url:
defaultZone: http://127.0.0.1:8761/eureka
...
接下來,我們啟動我們的 echo 應用程序。啟動後,我們可以檢查兩個服務之間的互操作性。
要檢查 sidecar 應用程序,讓我們查詢 echo 服務的元數據:
curl http://localhost:8084/hosts/echo
然後為了驗證 echo 應用程序是否可以調用 sidecar 應用程序暴露的 NodeJS 端點,讓我們使用 Zuul Proxy 的魔力並 curl 這個 URL:
curl http://localhost:8085/sidecar/hello/baeldung
Hello baeldung!
由於我們已經驗證一切正常,讓我們嘗試另一種方式來調用 hello 端點。首先,我們將在 echo 應用程序中創建一個控制器並註入DiscoveryClient.
然後我們添加一個GET
端點,它使用DiscoveryClient
來查詢 hello 服務並使用RestTemplate:
@Autowired
DiscoveryClient discoveryClient;
@GetMapping("/hello/{me}")
public ResponseEntity<String> echo(@PathVariable("me") String me) {
List<ServiceInstance> instances = discoveryClient.getInstances("sidecar");
if (instances.isEmpty()) {
return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).body("hello service is down");
}
String url = instances.get(0).getUri().toString();
return ResponseEntity.ok(restTemplate.getForObject(url + "/hello/" + me, String.class));
}
讓我們重新啟動 echo 應用程序並執行此 curl 以驗證從 echo 應用程序調用的 echo 端點:
curl http://localhost:8085/hello/baeldung
Hello baeldung!
或者為了讓它更有趣一點,從 sidecar 應用程序中調用它:
curl http://localhost:8084/echo/hello/baeldung
Hello baeldung!
4。結論
在本文中,我們了解了 Cloud Netflix Sidecar,並使用 NodeJS 和兩個 Spring 應用程序構建了一個工作示例,以展示它在 Spring 生態系統中的用法。
與往常一樣,示例的完整代碼可在 GitHub 上獲得。