Перейти к основному содержимому

Введение в Spring Cloud Sidecar

· 6 мин. чтения

1. Обзор

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, мы создадим конечную точку /hello в NodeJS, а затем предоставим ее через приложение Spring, называемое sidecar, в нашу экосистему. Мы также разработаем еще одно приложение Spring Boot для отражения ответов конечной точки /hello с использованием обнаружения служб и Zuul.

В этом проекте мы стремимся охватить два потока запросов:

  • пользователь вызывает конечную точку эха в эхо-приложении Spring Boot. Конечная точка эха использует DiscoveryClient для поиска URL-адреса службы приветствия от Eureka, т. е. URL-адреса, указывающего на службу NodeJS. Затем конечная точка эха вызывает конечную точку приветствия в приложении NodeJS.
  • пользователь вызывает конечную точку hello непосредственно из эхо-приложения с помощью Zuul Proxy

3.1. Конечная точка NodeJS Hello

Начнем с создания файла JS с именем hello.js . Мы используем экспресс для обслуживания наших приветственных запросов. В нашем файле 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}`)
})

Далее мы установим экспресс :

npm install express

И, наконец, давайте запустим наше приложение:

node hello.js

Когда приложение заработает, давайте свернем конечную точку hello:

curl http://localhost:3000/hello/foreach
Hello foreach!

Затем мы проверяем конечную точку работоспособности:

curl http://localhost:3000/health
status":"UP"}

Поскольку наше приложение узла готово к следующему шагу, мы собираемся его Springify.

3.2. Приложение коляски

Во-первых, нам нужно запустить сервер Eureka . После запуска 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 , и она поддерживает только весеннюю загрузку 2.3.12.RELEASE . Поэтому последняя версия Spring Boot на данный момент несовместима с Netflix Sidecar.

Затем давайте реализуем наш класс приложения Spring Boot с включенным sidecar:

@SpringBootApplication
@EnableSidecar
public class SidecarApplication {
public static void main(String[] args) {
SpringApplication.run(SidecarApplication.class, args);
}
}

На следующем шаге мы должны установить свойства для подключения к Eureka. Кроме того, мы устанавливаем конфигурацию sidecar с портом и URI работоспособности нашего приложения NodeJS hello:

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 регистрирует службу с заданным именем «hello» на сервере Eureka.

Чтобы проверить, работает ли это, мы можем получить доступ к конечной точке: http://localhost:8084/hosts/sidecar .

@EnableSidecar — это больше, чем маркер для регистрации побочного сервиса в Eureka. Это также приводит к добавлению @EnableCircuitBreaker и @EnableZuulProxy , и, следовательно, наше приложение Spring Boot получает преимущества от Hystrix и Zuul .

Теперь, когда наше приложение Spring готово, давайте перейдем к следующему шагу и посмотрим, как работает связь между сервисами в нашей экосистеме.

3.3. Приложение Echo также передает привет!

Для эхо-приложения мы создадим конечную точку, которая вызывает конечную точку приветствия NodeJS с помощью обнаружения службы. Кроме того, мы включим Zuul Proxy для отображения других вариантов связи между этими двумя службами.

Сначала добавим зависимости:

<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, мы используем в эхо-приложении одну и ту же версию 2.2.10.RELEASE для обеих зависимостей от spring-cloud-starter-netflix-zuul и spring-cloud-starter-netflix-eureka-client .

Затем создадим основной класс 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
...

Далее мы запускаем наше эхо-приложение. После его запуска мы можем проверить совместимость между нашими двумя сервисами.

Чтобы проверить приложение sidecar, давайте запросим у него метаданные эхо-сервиса:

curl http://localhost:8084/hosts/echo

Затем, чтобы проверить, может ли эхо-приложение вызывать конечную точку NodeJS, предоставленную приложением sidecar, давайте воспользуемся магией Zuul Proxy и свернем этот URL-адрес:

curl http://localhost:8085/sidecar/hello/foreach
Hello foreach!

Поскольку мы убедились, что все работает, давайте попробуем другой способ вызова приветственной конечной точки. Во-первых, мы создадим контроллер в эхо-приложении и внедрим DiscoveryClient. Затем мы добавляем конечную точку GET , которая использует DiscoveryClient для запроса службы приветствия и вызывает ее с помощью 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));
}

Давайте перезапустим эхо-приложение и выполним этот curl, чтобы проверить конечную точку эха, вызываемую из эхо-приложения:

curl http://localhost:8085/hello/foreach
Hello foreach!

Или, чтобы сделать его немного интереснее, вызовите его из приложения sidecar:

curl http://localhost:8084/echo/hello/foreach
Hello foreach!

4. Вывод

В этой статье мы узнали о Cloud Netflix Sidecar и создали рабочий образец с NodeJS и двумя приложениями Spring, чтобы продемонстрировать его использование в экосистеме Spring.

Как всегда, полный код примеров доступен на GitHub . ``