eShopOnContainers — часть 1 (Docker Compose)

eShopOnContainers — эталонное приложение для .NET Core, разработанное Microsoft, в котором используется упрощенная архитектура микрослужб и контейнеры Docker. В этой статье я стремлюсь заполнить некоторые информационные пробелы в их документации. Среди содержимого репозитория есть два внешних веб-приложения, webmvc и webspa, и я предоставлю исчерпывающий обзор сквозного процесса webmvc.

поток.PNG

Приведенная ниже вики-ссылка на репозиторий eShopOnContainers описывает шаги по настройке Docker Desktop в Windows.

Настройка Docker Compose для Windows

Если вы, как и я, отключились от MVC, эти четыре видеоролика (каждое по 20–30 минут) помогут вам ознакомиться с основными концепциями MVC, такими как RenderBody, Layout, Partial View, RenderPartial и другими.

ViewStart в MVC
Представление макета в MVC
Частичные представления в MVC
HTML Render и Render Partial в MVC

Кроме того, в следующем видео объясняется, как работает Envoy Proxy. Хотя Envoy обычно ассоциируется с сервисной сеткой Istio, в данном случае он используется как автономный сервис, а не как дополнительный.

Шлюз API с Envoy

Важно отметить еще один важный момент, прежде чем мы начнем отладку приложения: контейнер предоставляет внешние и внутренние порты, которые указаны как (внешний:внутренний).

контейнер-порты.PNG

Внешний порт полезен для доступа за пределы Docker compose для индивидуального тестирования сервиса. Службы в Docker compose никогда не используют внешний порт для связи, вместо этого он использует внутренний порт.

Точно так же localhost никогда не используется в docker-compose в качестве сетевого адреса. Это может сбить вас с толку логикой — если к контейнеру можно получить доступ, используя локальный хост на внешнем порту, то почему другой контейнер в сети докеров не может получить доступ к другим службам, используя локальный хост на внешнем порту? Итак, еще раз подчеркнем, если вы хотите подключиться из одной службы к другим службам в рамках docker-compose, используйте имя контейнера/службы. Сеть Docker имеет прекрасную возможность сопоставлять имена контейнеров/сервисов с правильным IP-адресом.

Сеть под названием мост это специальная сеть. Если вы не укажете иначе, Docker всегда запускает ваши контейнеры в этой сети. А если вы хотите узнать, в какой сети работает ваше приложение? Проверьте приложение, чтобы убедиться, что оно работает в мостовой сети по умолчанию.

$ docker inspect --format="{{json .NetworkSettings.Networks}}"  <container>

Пример:

сеть-1.PNG

Вы также можете получить эти данные в консоли Visual Studio.
сеть-3.PNG

Запускайте eShopOnContainers локально (среда разработки)

докер-compose.yml: Этот файл содержит определение всех образов, необходимых для запуска eShopOnContainers.
докер-compose.override.yml: Этот файл содержит базовую конфигурацию для всех образов предыдущего файла.

Стандартный способ запуска eShopOnContainers из CLI:

docker-compose -f docker-compose.yml -f docker-compose.override.yml

Это запустит eShopOnContainers со всеми контейнерами, работающими локально, и это среда разработки по умолчанию.

Отладка и пошаговое руководство по коду

Откройте файл eShopOnContainers-ServicesAndWebApps.sln в Visual Studio. Убедитесь, что Docker Compose является стартовым проектом, а затем начните отладку. Это откроет приложение webmvc в браузере (локальный: 5100).

Я сохраняю точки останова на нескольких строках решения. Приведенная ниже строка кода указывает, что маршрут по умолчанию MVC является контроллером каталога приложения MVC.

1.png

Итак, он обращается к контроллеру индекса каталога и вызывает службу каталогов для получения данных.

2.png

Теперь наступает интересный момент, он показывает, что MVC пытается подключиться к webshoppingapigw для получения данных. Если вы просматриваете данный URL-адрес на своем локальном компьютере, он не будет работать, однако, если вы используете внешний порт localhost и webshoppingapigw, это вернет дату.

3.png

Второй важный момент на приведенном выше снимке экрана — откуда берется PurchaseUrl, потому что он недоступен в appsetting.json.

4.png

Ответ: PurchaseUrl передается в webmvc как переменная среды.

5.png

Теперь вы можете подумать, что такого приложения, как веб-шопингapigw, не существует. Тогда что это за URL? Ответ заключается в том, что это контейнер с прокси-сервером envoy —

6.png

Ниже вы можете увидеть порт «5202:80», это конфигурация листнера. Вы можете использовать 5202 для тестирования на локальном хосте, но контейнер будет использовать порт 80 для подключения.

7.png

Если вы знаете envoy, вы можете понять, что мы определяем \c\ как маршрут к кластеру каталога.

8.png

И кластер определен для использования catalog-api:80 в качестве адреса сокета.

9.png

Достаточно платы за проезд, теперь он попадает в CatalogController в Catalog.API —

10.png

И API возвращает приведенные ниже данные в webMVC:

11.png

И получая то же самое в webMVC —

12.png

Теперь данные доступны для представления MVC. У нас есть следующие снимки экрана, которые используются для возврата HTML для отображения в браузере.

Следующие файлы cshtml используются для рендеринга html:

13.png

RenderBody определен в Index.cshtml.

14.png

Страница _viewStart.cshtml — это специальная страница представления, содержащая объявление инструкции для включения страницы макета. Вместо объявления страницы Layout на каждой странице просмотра мы можем использовать страницу _ViewStart.

15.png

RenderBody — это место, где размещается содержимое index.cshtml.

16.png

Ниже приведен пример частичного просмотра.

17.png

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *