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 . ``