Наша платформа SAP Cloud Platform предоставляет возможность разрабатывать и запускать мультитенантные приложения. Мультитенантные приложения позволяют изолированно обслуживать нескольких клиентов из разных организаций в рамках одного решения, предоставляемого провайдером. Каждый клиент называется арендатором. Он обращается к приложению через выделенный URL-адрес конкретного тенанта – таким образом достигается изолированность пользователей друг от друга.

В нескольких статьях мы расскажем о следующих темах:
Часть 1. Мультитенантность в SAP Cloud Platform, обзор сценария
Часть 2. Загрузка решения в формате MTAR в платформу, привязка базы данных и создание подписок для арендаторов, конфигурация субаккаунта провайдера
Часть 3. Сервис хранения данных (Persistence Service) – инициализация и изоляция данных
Часть 4. Управление идентификацией с помощью «Identity Authentication» – настройка тенанта сервиса
Часть 5. SAP Cloud Connector – настройка и конфигурация сервиса для подключения к локальной системе
Часть 6. Настройка сервиса «Connectivity» и тестирование мультитенантного приложения
Часть 7. Fiori Launchpad – использование сервиса «Portal», конфигурация плитки для мультитенантного приложения
Примечание:
В данной статье использована глобальная (продуктивная) учетная запись SAP Cloud Platform. Для выполнения сценария в учетной записи дополнительно должны быть подключены следующие сервисы:
Часть 1. Мультитенантность в SCP и обзор решения
SAP Cloud Platform является платформой для разработки и запуска облачных приложений, в том числе и приложений с множеством арендаторов, поэтому ее сервисы поддерживают мультитенантность.
Как думаете, обрадуются ли клиенты, если данные, которые они хранят в вашем SaaS приложении, будут доступны для других клиентов? Это явное нарушение изолированности данных.
Такая проблема решается путем предоставления каждому клиенту уникального идентификатора тенанта (tenant id). Так как приложение развернуто непосредственно у провайдера, то для получения доступа к нему клиент должен быть подписан на это приложение. Это означает, что клиенту не нужно копировать приложение в свою учетную запись, достаточно просто подписаться на него, после чего клиент получает специальный URL-адрес для конкретного тенанта. Таким образом, при запуске приложения через этот выделенный URL происходит идентификация пользователя по уникальному идентификатору тенанта.
Преимущества мультитенантных приложений:
Рассмотрим разницу между субаккаунтами клиента и провайдера внутри глобального аккаунта SCP:

Как показано на диаграмме, внутри глобального аккаунта SCP развернуты два субаккаунта – субаккаунт провайдера и субаккаунт клиента.
Субаккаунт провайдера содержит в себе бизнес-логику приложения, его интерфейс, а также базу данных, которая хранит данные клиентов, изолированные друг от друга. Приложения фактически работают в этой учетной записи.
Как уже было сказано, доступ клиента к приложению осуществляется с помощью подписки на него. Обратите внимание, что приложения не копируются и не запускаются внутри учетной записи пользователя. Внутри субаккаунта клиента есть возможность добавлять конфигурации, которые применяются только к этому потребителю. Например, можно настроить поставщика удостоверений клиента (Identity Provider) в качестве хранилища пользователей для приложений облачной платформы. Или настроить пути назначения, которые могут указывать на внутренние службы, работающие в ландшафте клиента (например, можно осуществить доступ к данным локальной системы).
Теперь поговорим о мультитенантности в сервисах SCP.
а) Persistence Service
Есть три способа достижения мультитенантности в этом сервисе:

1. Колонка-разделитель. Этот метод использует определенный столбец в таблице для обеспечения изоляции данных. В этом случае пользователям доступна одна и та же схема. Но данные различаются с помощью специального выделенного идентификатора тенанта для каждого клиента. Чтобы обеспечить разделение данных в приложении, каждый SQL-оператор должен включать идентификатор тенанта.
2. Таблица(-ы) в одной схеме. Этот метод позволяет клиентам приложения изолировать свои данные в одной или нескольких таблицах конкретных тенантов. Это достигается путем создания таблицы или схемы в базе данных для каждого клиента. Дискриминатор таблиц клиента определяет, как различать эти таблицы от таблиц других клиентов. Таблицы могут быть в одной и той же схеме и использовать префикс или суффикс, чтобы отличить их; или они могут быть в отдельной схеме, используя дискриминатор таблицы клиента схемы.
3. Разделение по схемам. Изолированность данных клиентов в этом случае достигается путем хранения таблиц в разных схемах.
б) Identity Authentication

Сервис Identity Authentication – это облачное решение для управления жизненным циклом приложений SCP и, при необходимости, локальных приложений. Он позволяет осуществлять настройки аутентификации, единого входа для пользователей и так далее. При подключении сервиса администратору учетной записи предоставляется тенант, внутри которого происходит конфигурация приложений и управление авторизацией пользователей. Данный сервис предоставляет провайдера идентификаций для SCP.
Суббакаунт клиента настроен на определенного провайдера, внутри которого определены пользователи, настроены роли, а также настроен доступ к приложению провайдера, на которое подписан клиент. Роли описаны в приложении провайдера. Таким образом достигается изолированность пользователей.
в) Connectivity

Клиент может настроить доступ к данным локальной системы. С помощью такого средства, как SAP Cloud Connector, осуществляется безопасное подключение к локальному приложению или системе, предоставляющей определенные данные. Внутри своего субаккаунта клиент настраивает путь назначения к локальной системе, описанной в Cloud Connector. В приложении провайдера обозначено имя пути назначения – таким образом, при обращении клиента к приложению данные от локальной системы клиента передаются в приложение и визуализируются.
Перейдем к обзору сценария, описание реализации которого будет происходить в рамках этой статьи.
У SAP существует надежная партнерская компания, специализирующаяся на предоставлении решений для нефтегазовой отрасли. Будем называть ее ITeLO Consulting. Эта компания использует платформу SAP Cloud Platform для создания и запуска своих облачных приложений. ITeLO Consulting предпочитают предоставлять свои приложения как SaaS. В такой модели программное обеспечение предоставляется в виде услуги и доступно для клиентов через интернет.
Компания разработала панель мониторинга загрязнения, которая помогает компаниям нефтегазового сектора сопоставлять уровни загрязнения воздуха на заводе и в городе. Это решение вызвало интерес у некоторых нефтегазовых компаний, желающих принять меры по профилактическому предотвращению загрязнения.
ABC PetroCorp и XYZ EnergyCorp – две нефтегазовые компании, которые покупают это решение у ITeLO.
В ITeLO Consulting работает Роберт, который является архитектором этого проекта. Компания купила пакет платформы SAP Cloud Platform с услугами, необходимыми для создания этого приложения. Сценарий Роберта состоит в том, чтобы разработать мультитенантное SaaS приложение и предоставить его в пользование своим клиентам – ABC PetroCorp и XYZ EnergyCorp». Эмили является сотрудником IT-отдела ABC PetroCorp. Ей поручено работать над этим проектом с Робертом.
Архитектура решения представлена ниже:

Субаккаунтом провайдера в данном случае будет ITeLO Consulting, а субаккаунтами клиентов, осуществляющих подписку на приложение, будут ABC PetroCorp и XYZ EnergyCorp. Настройки внутри субаккаунтов клиентов будут аналогичными, поэтому будем рассматривать только конфигурацию для клиента ABC PetroCorp.
Описание учетных записей:
1) ITeLO Consulting – учетная запись провайдера, в которой запущена база данных, приложения бизнес-логики и пользовательского интерфейса.
База данных:
Сведения о загрязнении воздуха каждого завода хранятся в базе данных SAP HANA. Данные разных клиентов хранятся отдельно с помощью применения функции изоляции тенантов, предоставляемой JPA.
Бизнес-логика:
Бизнес-логика определена в приложении Java, запущенного в субаккаунте провайдера. Экземпляр приложения Java используется разными клиентами. Каждый пользователь создает подписку на это Java-приложение и получает уникальный URL-адрес для доступа к приложению. Так как доступ к приложению осуществляется с помощью этого URL-адреса, SCP извлекает идентификатор тенанта, который используется в логике приложения.
Пользовательский интерфейс:
Логика пользовательского интерфейса определена в приложении HTML5, запущенного в субаккаунте провайдера. Как и в случае с Java-приложением, экземпляр приложения HTML5 запускается для разных клиентов. Доступ клиента к приложению осуществляется с использованием уникального URL-адреса для доступа к приложению.
2) ABC PetroCorp – субаккаунт клиента, в котором создаются подписки, и создаются конкретные конфигурации провайдера идентификаций (IdP) и осуществляется доступ к локальным службам.
Java и HTML5 приложения не развернуты и не скопированы в эту учетную запись.
Управление идентификацией и доступом:
Доступ к приложениям должен быть только у сотрудников компании ABC PetroCorp. У «ABC PetroCorp» есть собственный провайдер идентификаций (SAP Identity Authentication), который содержит информацию о сотрудниках компании (имя, электронная почта, организация, роль и т.д.). Он настроен специально для субаккаунта ABC PetroCorp, так что приложениям, на которые осуществлена подписка, могут обращаться только их сотрудники.
Сервисы Connectivity:
У компании ABC PetroCorp есть запущенные локально службы, которые предоставляют информацию об их заводах – количество сотрудников на заводе, место расположения завода и т.д. Вся эта информация должна извлекается из их ландшафта и предоставляется приложению с помощью SAP Cloud Connector.
Часть 2. Загрузка решения в формате MTAR в платформу, привязка базы данных и создание подписок для арендаторов, конфигурация субаккаунта провайдера
Мультитенантное приложение должно быть запущено в субаккаунте провайдера. Роберт из компании ITeLO Consulting является администратором учетной записи, и ему нужно выполнить следующие шаги по установке приложения:
Предварительные настройки:
Примечание: создание нескольких субаккаунтов внутри глобального аккаунта SCP невозможно для триального (пробного) аккаунта.
Для установки мультитетантного приложения в этой статье будет использована такая функция SCP, как «Solutions» (загрузка решений). В качестве альтернативы в платформу можно загружать модули приложения по отдельности.
Исходный код приложения для мониторинга загрязнения («Pollution Monitoring») находится в GitHub.
Сначала мы клонируем проект и загружаем его в рабочую область Eclipse. После успешной установки проект появится в рабочей области, его структура будет выглядеть вот так:

Приложение состоит из нескольких модулей, разработанных с использованием различных технологий. Эти модули должны быть установлены в разные среды выполнения (например, Java, HTML5). Вместо того, чтобы создавать и загружать модули отдельно, SCP поддерживает создание единого приложения, которое содержит разные модули в одном архиве.
Как было показано в архитектуре приложения, бизнес-логика определена в приложении Java, а логика пользовательского интерфейса определена в приложении HTML5. И сейчас мы в лице Роберта создадим архив многомодульного (или многоцелевого) приложения (MTA), чтобы упаковать приложение в удобный для загрузки в платформу формат.
Чтобы создать архив с несколькими модулями приложения, нужно загрузить «mta.jar» и настроить «MTA archive builder» (ссылка на описание установки «MTA archive builder» указана выше в предварительных настройках).
Модули многоцелевого приложения описаны в файле-дескрипторе MTA (mta.yaml), этот файл находится в корневой папке проекта.

Файл «mta.yaml» содержит информацию о модулях Java и HTML5, которые будут созданы в процессе сборки приложения. Откроем файл и привяжем базу данных SAP HANA к Java-приложению, указав идентификатор базы данных в поле «id».

Здесь id – это идентификатор базы данных, запущенной в субаккаунте провайдера. Его можно найти в панели управления SCP учетной записи «ITeLO Consulting» в меню Persistence -> Databases Systems.

В нашем случае идентификатор базы данных в «mta.yaml» будет обозначен следующим образом:

Сохраняем изменения и, открыв командную строку, переходим в папку с проектом «pollutionmonitoring» и вводим такую команду:

Эта команда запустит процесс сборки приложения в архив MTA.
После успешной сборки в папке с проектом будет сгенерирован файл MTA-архива (pollutionmonitoring.mtar).

Следующим шагом будет установка MTA-архива (pollutionmonitoring.mtar) в субаккаунт ITeLO Consulting. Это можно сделать с помощью функции «Solutions», представленной в панели управления SCP. Для этого переходим во вкладку «Solutions» и нажимаем на кнопку «Deploy».

В появившемся диалоговом окне переходим к месту расположения файла «pollutionmonitoring.mtar», нажав кнопку «Browse» у поля «MTA Archive», и выбираем его, после чего нажимаем «Deploy».

После успешной загрузки MTA-архива в панели управления учетной записи ITeLO Consulting можно будет увидеть следующее:
• Во вкладке «Java Applications» появится запущенное Java-приложение «pollutionmonitoring»;

• Будет автоматически произведена привязка базы данных к Java-приложению. Для проверки перейдите в Java-приложение и выберете вкладку «Configuration» -> «Data Sourсe Bindings»;

• Во вкладке «HTML5 Applications» появится запущенное HTML5-приложение «pollutionmonitoringui».

Теперь Роберту нужно создать субаккаунт с названием ABC Petro Corp для клиента.
Перейдем в глобальный аккаунт SCP и во вкладке «Subaccounts» выберем «New Subaccount».

В появившемся диалоговом окне вводим имя субаккаунта, выбираем среду (Neo) и регион, в котором расположен глобальный аккаунт и, соответственно, субаккаунт провайдера. После чего нажимаем «Create».

Теперь в глобальном аккаунте появится еще один субаккаунт – субаккаунт клиента.
Следующим шагом будет создание подписки внутри учетной записи клиента ABC Petro Corp на приложения, запущенные в учетной записи провайдера. Для этого воспользуемся консольным клиентом для среды Neo. Как его установить, описано здесь.
В консольном клиенте для Neo введем такую команду:
Идентификатор субаккаунта можно найти во вкладке «Overview» -> «Subaccount information».

Идентификатор пользователя обозначен во вкладке «User Information», которая расположена в выпадающем меню в верхнем правом углу панели управления SCP.

Хосты для всех регионов среды Neo описаны в документации.
Для подписки на HTML5 приложение воспользуемся панелью управления SCP. Перейдем в субаккаунт клиента ABC Petro Corp и выберем вкладку «Subscriptions» -> «New Subscription» (для HTML5).

В диалоговом окне выбираем субаккаунт провайдера и HTML5-приложение внутри него, после чего нажимаем «Save».

Теперь клиент подписан на Java и HTML5 приложения, предоставляемые провайдером, и это отображено в панели управления учетной записи ABC Petro Corp.

Приложение для мониторинга загрязнения позволяет выводить данные о загрязнении завода и города.
Данные о загрязнении завода находятся в локальной системе клиента. Сведения об уровне загрязнения города можно получить через службу с открытым исходным кодом, доступную через сеть Интернет. Такой службой может быть OpenAQ. Приложение для мониторинга загрязнения может получить доступ к этой службе с помощью описания пути назначения в панели управления SCP.
Этот сервис будет использоваться ABC Petro Corp и другими потенциальными клиентами, поэтому адрес назначения будет добавлен в учетную запись провайдера ITeLo Consulting.
Для Java-приложения путь назначения под названием «openaq–api–dest» описан в файле «web.xml».

Этот путь назначения обозначен в классе «PollutionDataService» (файл «PollutionDataService.java»).

После того, как поиск пути назначения будет выполнен, все вызовы от Java-кода к службе OpenAQ запускаются через него.
Файл пути назначения «open-api-dest» находится внутри папки «Destinations-Provider», расположенной внутри проекта «pollutionmonitoring».

Этот файл содержит URL к сервису OpenAQ.

Данный путь назначения нужно загрузить в субаккаунт провайдера ITeLo Consulting. Для этого направляемся в субаккаунт ITeLo Consulting, переходим во вкладку «Java Applications» и выбираем приложение «pollutionmonitoring».
Далее выбираем вкладку «Configuration» → «Destinations» и нажимаем на кнопку «Import Destination».

В появившемся диалоговом окне указываем путь к файлу «open-api-dest». После чего будет произведена конфигурация пути назначения в панели управления SCP. Нажимаем кнопку «Save». Путь назначения будет выглядеть в облачной платформе следующим образом:

Этот сервис доступен через https, поэтому нужно установить безопасное соединение. Это можно сделать с помощью сервиса «хранения ключей» для SCP. В проекте «pollutionmonitoring», скачанном из GitHub, уже имеются файлы с ключами: «jssecacerts.jks» и «cacerts.jks». Их нужно загрузить в субаккаунт клиента ABC Petro Corp.
Для этого снова воспользуемся консольным клиентом для среды Neo.
В консольном клиенте для Neo введем такие команды:
Эти файлы («jssecacerts.jks» и «cacerts.jks») находятся в папке «KeyStore Services» проекта «pollutionmonitoring».
Часть 3. Сервис хранения данных (Persistence Service) — инициализация и изоляция данных
Приложением ITeLO Consulting заинтересованы несколько клиентов. Настоящее мультитенантное приложение должно гарантировать, что данные ABC PetroCorp полностью изолированы от данных других клиентов в базе данных (например, от данных XYZ EnergyCorp). Это очень важно для обеспечения безопасности данных клиента и приложения.
Роберт из ITeLO Consulting хочет, чтобы его приложение изолировало хранение данных своих клиентов, и он интересуется, как этого можно достичь.
Для достижения изолированности данных нам необходимо определить степень изоляции, т.е. изоляция на уровне таблицы (хранить данные в разных таблицах в одной схеме), на уровне схемы (хранить данные клиентов в разных схемах), на уровне тенанта (хранить данные клиента в разных тенантах БД). Сервис хранения данных (Persistence Service) SAP Cloud Platform в сочетании с JPA (Java Persistence API) и EclipseLink поддерживает реализацию этих методов изоляции данных.
Существует три способа достижения мультитенантности на уровне базы данных. Эти способы мы рассмотрели в части 1.
Во второй части мы сосредоточимся на способе под названием «колонка-разделитель». Именно он будет использован Робертом для изоляции данных на уровне БД в его решении.
Использование колонки-разделителя:
В этом подходе одна схема БД распределяется между всеми пользователями приложения. Идентификатор тенанта (tenant id) может использоваться как значение в колонке-разделителе. Фрагмент кода представлен ниже.

В качестве подготовительного шага мы также инициализируем данные, которые будут использованы в приложении мониторинга загрязнения.
Шаг 1: Проверка наличия описания колонки-разделителя в коде приложения
На этом этапе мы посмотрим, как как модель данных приложения используется для обеспечения мультитенантности на уровне БД.
Для этого обратимся к скачанному с GitHub проекту, который уже загружен в рабочую область Eclipse.
Далее мы будем просматривать некоторые файлы проекта. Это можно сделать либо через среду Eclipse, либо скачать проект, разархивировать его в удобное для вас место и открывать файлы по отдельности. Мы воспользуемся вторым вариантом.
Разархивированный проект выглядит следующим образом:

Перейдем к файлу «BaseObject.java» проекта, расположенного по пути «/pollutionmonitoring/java/src/main/java/com/sap/hana/cloud/samples/pollutionmonitoring/model/BaseObject.java», и откроем его с помощью редактора (например, Notepad++).

В этом файле проверяем описание метода «Колонка-разделитель». Вот как это выглядит:

Теперь обратимся к файлу «web.xml», расположенному по пути «/pollutionmonitoring/java/src/main/webapp/WEB-INF/web.xml».

Убедимся, что источник данных (база данных) привязан к приложению в качестве стандартного источника (Default DB). В файле «web.xml» это выглядит следующим образом:

Этот пример показывает, как реализована мультитенантность в приложении для мониторинга загрязнения.
Шаг 2: Проверка настройки сервлета инициализации данных
Роберт знает, что клиентам его приложения потребуется загрузить данные для их использования. Поэтому он создал сервлет для инициал��зации данных, которым могут воспользоваться клиенты (например, Эмили) для ввода данных в приложение для мониторинга загрязнения.
На этом этапе мы посмотрим, как произведена настройка публикации сервлета инициализации данных.
Сервлет описан в файле «DataInitializationServlet.java», который расположен в проекте по пути «/pollutionmonitoring/java/src/main/java/com/sap/hana/cloud/samples/pollutionmonitoring/api/DataInitializationServlet.java».

Способ его публикации обозначен в файле «web.xml» («/pollutionmonitoring/java/src/main
/webapp/WEB-INF/web.xml»).

Откроем этот файл и убедимся, что сервлет для загрузки данных в приложение мониторинга загрязнения был опубликован по URL-пути «/initialize». Выглядит это следующим образом:

Шаг 3. Использование сервлета для инициализации данных о загрязнении для «ABC PetroCorp» (клиент)
Эмили из ABC PetroCorp может обращаться к приложению мониторинга загрязнения, используя созданную подписку.
Приложение «Pollution Monitoring» использует два типа данных:
Данные об уровне загрязнения (Pollution Data): считываются из таких источников, как внешние API, датчики загрязнения и т.д.
Данные о заводе (Plant Data), как правило, считываются из локальных систем клиента — таких как ERP-системы.
1) На этом этапе мы создадим данные о загрязнении с помощью сервлета инициализации данных, расположенного в проекте. Эти данные будут храниться в базе данных HANA в SAP CP, которая привязана к приложению в учетной записи провайдера.
2) Данные о заводе считываются приложением из локальной системы, то есть они не хранятся в базе данных HANA в SAP CP. Это будет рассмотрено в пятой части статьи «SAP Cloud Connector — настройка и конфигурация сервиса для подключения к локальной системе».
На этом этапе мы загрузим данные о загрязнении в приложение «по подписке». Для этого будет использоваться сервлет «Data Initialization», который находится в проекте и может быть использован для ввода подготовленных данных в базу данных HANA.
Посмотрим, как выглядят подготовленные данные и как их можно инициализировать с помощью сервлета. Для этого снова обратимся к файлу «DataInitializationServlet.java», который расположен в проекте по пути «/pollutionmonitoring/java/src/main/java/com/sap/hana/cloud/samples/pollutionmonitoring/api/DataInitializationServlet.java», и откроем его.
Здесь мы можем увидеть подготовленные данные как для «ABC PetroCorp», так и для другого клиента («XYZ EnergyCorp»).

Инициализируем данные об уровне загрязнения для ABC PetroCorp, вызвав сервлет «Data Initialization».
Перейдем в панель управления субаккаунта клиента ABC PetroCorp. В нашем случае глобальный аккаунт расположен в регионе Europe(Rot), доступ к нему осуществляется по этой ссылке.

В панели управления субаккаунта переходим на вкладку «Applications -> Subscriptions» и выбираем Java-приложение, на которое подписан клиент.

Во вкладке «Overview» будет обозначен URL-приложения, копируем его.

Открываем новое окно браузера, вставляем скопированный URL приложения и добавляем к нему «/initialize?company=ABC PetroCorp». После чего инициализация будет завершена и на экране должны появиться данные, которые будут отправлены в приложение.

Теперь мы инициализировали данные о загрязнении для ABC PetroCorp в приложении мониторинга загрязнения от ITeLO.
В следующей статье мы расскажем об управлении идентификацией с помощью Identity Authentication — настройки тенанта сервиса.

В нескольких статьях мы расскажем о следующих темах:
Часть 1. Мультитенантность в SAP Cloud Platform, обзор сценария
Часть 2. Загрузка решения в формате MTAR в платформу, привязка базы данных и создание подписок для арендаторов, конфигурация субаккаунта провайдера
Часть 3. Сервис хранения данных (Persistence Service) – инициализация и изоляция данных
Часть 4. Управление идентификацией с помощью «Identity Authentication» – настройка тенанта сервиса
Часть 5. SAP Cloud Connector – настройка и конфигурация сервиса для подключения к локальной системе
Часть 6. Настройка сервиса «Connectivity» и тестирование мультитенантного приложения
Часть 7. Fiori Launchpad – использование сервиса «Portal», конфигурация плитки для мультитенантного приложения
Примечание:
В данной статье использована глобальная (продуктивная) учетная запись SAP Cloud Platform. Для выполнения сценария в учетной записи дополнительно должны быть подключены следующие сервисы:
- Для субаккаунта провайдера приложения – SAP HANA, SAP Cloud Platform Portal – должна быть выделена хотя бы одна квота для запуска Java-приложения (Java-квота);
- Для субаккаунта клиента: SAP Cloud Platform Portal, SAP Cloud Platform Identity Authentication.
Часть 1. Мультитенантность в SCP и обзор решения
SAP Cloud Platform является платформой для разработки и запуска облачных приложений, в том числе и приложений с множеством арендаторов, поэтому ее сервисы поддерживают мультитенантность.
Как думаете, обрадуются ли клиенты, если данные, которые они хранят в вашем SaaS приложении, будут доступны для других клиентов? Это явное нарушение изолированности данных.
Такая проблема решается путем предоставления каждому клиенту уникального идентификатора тенанта (tenant id). Так как приложение развернуто непосредственно у провайдера, то для получения доступа к нему клиент должен быть подписан на это приложение. Это означает, что клиенту не нужно копировать приложение в свою учетную запись, достаточно просто подписаться на него, после чего клиент получает специальный URL-адрес для конкретного тенанта. Таким образом, при запуске приложения через этот выделенный URL происходит идентификация пользователя по уникальному идентификатору тенанта.
Преимущества мультитенантных приложений:
- Снижение совокупной стоимости владения (TCO): благодаря распределению вычислительных ресурсов и расходов на эксплуатацию между клиентами, совокупная стоимость владения для такого приложения понижается. Экономия средств возрастает по мере увеличения количества клиентов, обслуживаемых мультитенантным приложением;
- Эксплуатационная эффективность: обновление приложений и исправление ошибок распространяется на всех арендаторов путем обновления экземпляра приложения у поставщика;
- Масштабируемость: быстрое предоставление услуг клиентам. Чтобы получить доступ к приложению, новому клиенту нужно только создать подписку на него;
- Конфигурируемость: позволяет клиентам настраивать свой резерв пользователей, которые смогут использовать приложение, собственные бэкэнд-услуги и т.д., как того требует приложение.
Рассмотрим разницу между субаккаунтами клиента и провайдера внутри глобального аккаунта SCP:

Как показано на диаграмме, внутри глобального аккаунта SCP развернуты два субаккаунта – субаккаунт провайдера и субаккаунт клиента.
Субаккаунт провайдера содержит в себе бизнес-логику приложения, его интерфейс, а также базу данных, которая хранит данные клиентов, изолированные друг от друга. Приложения фактически работают в этой учетной записи.
Как уже было сказано, доступ клиента к приложению осуществляется с помощью подписки на него. Обратите внимание, что приложения не копируются и не запускаются внутри учетной записи пользователя. Внутри субаккаунта клиента есть возможность добавлять конфигурации, которые применяются только к этому потребителю. Например, можно настроить поставщика удостоверений клиента (Identity Provider) в качестве хранилища пользователей для приложений облачной платформы. Или настроить пути назначения, которые могут указывать на внутренние службы, работающие в ландшафте клиента (например, можно осуществить доступ к данным локальной системы).
Теперь поговорим о мультитенантности в сервисах SCP.
а) Persistence Service
Есть три способа достижения мультитенантности в этом сервисе:

1. Колонка-разделитель. Этот метод использует определенный столбец в таблице для обеспечения изоляции данных. В этом случае пользователям доступна одна и та же схема. Но данные различаются с помощью специального выделенного идентификатора тенанта для каждого клиента. Чтобы обеспечить разделение данных в приложении, каждый SQL-оператор должен включать идентификатор тенанта.
2. Таблица(-ы) в одной схеме. Этот метод позволяет клиентам приложения изолировать свои данные в одной или нескольких таблицах конкретных тенантов. Это достигается путем создания таблицы или схемы в базе данных для каждого клиента. Дискриминатор таблиц клиента определяет, как различать эти таблицы от таблиц других клиентов. Таблицы могут быть в одной и той же схеме и использовать префикс или суффикс, чтобы отличить их; или они могут быть в отдельной схеме, используя дискриминатор таблицы клиента схемы.
3. Разделение по схемам. Изолированность данных клиентов в этом случае достигается путем хранения таблиц в разных схемах.
б) Identity Authentication

Сервис Identity Authentication – это облачное решение для управления жизненным циклом приложений SCP и, при необходимости, локальных приложений. Он позволяет осуществлять настройки аутентификации, единого входа для пользователей и так далее. При подключении сервиса администратору учетной записи предоставляется тенант, внутри которого происходит конфигурация приложений и управление авторизацией пользователей. Данный сервис предоставляет провайдера идентификаций для SCP.
Суббакаунт клиента настроен на определенного провайдера, внутри которого определены пользователи, настроены роли, а также настроен доступ к приложению провайдера, на которое подписан клиент. Роли описаны в приложении провайдера. Таким образом достигается изолированность пользователей.
в) Connectivity

Клиент может настроить доступ к данным локальной системы. С помощью такого средства, как SAP Cloud Connector, осуществляется безопасное подключение к локальному приложению или системе, предоставляющей определенные данные. Внутри своего субаккаунта клиент настраивает путь назначения к локальной системе, описанной в Cloud Connector. В приложении провайдера обозначено имя пути назначения – таким образом, при обращении клиента к приложению данные от локальной системы клиента передаются в приложение и визуализируются.
Перейдем к обзору сценария, описание реализации которого будет происходить в рамках этой статьи.
У SAP существует надежная партнерская компания, специализирующаяся на предоставлении решений для нефтегазовой отрасли. Будем называть ее ITeLO Consulting. Эта компания использует платформу SAP Cloud Platform для создания и запуска своих облачных приложений. ITeLO Consulting предпочитают предоставлять свои приложения как SaaS. В такой модели программное обеспечение предоставляется в виде услуги и доступно для клиентов через интернет.
Компания разработала панель мониторинга загрязнения, которая помогает компаниям нефтегазового сектора сопоставлять уровни загрязнения воздуха на заводе и в городе. Это решение вызвало интерес у некоторых нефтегазовых компаний, желающих принять меры по профилактическому предотвращению загрязнения.
ABC PetroCorp и XYZ EnergyCorp – две нефтегазовые компании, которые покупают это решение у ITeLO.
В ITeLO Consulting работает Роберт, который является архитектором этого проекта. Компания купила пакет платформы SAP Cloud Platform с услугами, необходимыми для создания этого приложения. Сценарий Роберта состоит в том, чтобы разработать мультитенантное SaaS приложение и предоставить его в пользование своим клиентам – ABC PetroCorp и XYZ EnergyCorp». Эмили является сотрудником IT-отдела ABC PetroCorp. Ей поручено работать над этим проектом с Робертом.
Архитектура решения представлена ниже:

Субаккаунтом провайдера в данном случае будет ITeLO Consulting, а субаккаунтами клиентов, осуществляющих подписку на приложение, будут ABC PetroCorp и XYZ EnergyCorp. Настройки внутри субаккаунтов клиентов будут аналогичными, поэтому будем рассматривать только конфигурацию для клиента ABC PetroCorp.
Описание учетных записей:
1) ITeLO Consulting – учетная запись провайдера, в которой запущена база данных, приложения бизнес-логики и пользовательского интерфейса.
База данных:
Сведения о загрязнении воздуха каждого завода хранятся в базе данных SAP HANA. Данные разных клиентов хранятся отдельно с помощью применения функции изоляции тенантов, предоставляемой JPA.
Бизнес-логика:
Бизнес-логика определена в приложении Java, запущенного в субаккаунте провайдера. Экземпляр приложения Java используется разными клиентами. Каждый пользователь создает подписку на это Java-приложение и получает уникальный URL-адрес для доступа к приложению. Так как доступ к приложению осуществляется с помощью этого URL-адреса, SCP извлекает идентификатор тенанта, который используется в логике приложения.
Пользовательский интерфейс:
Логика пользовательского интерфейса определена в приложении HTML5, запущенного в субаккаунте провайдера. Как и в случае с Java-приложением, экземпляр приложения HTML5 запускается для разных клиентов. Доступ клиента к приложению осуществляется с использованием уникального URL-адреса для доступа к приложению.
2) ABC PetroCorp – субаккаунт клиента, в котором создаются подписки, и создаются конкретные конфигурации провайдера идентификаций (IdP) и осуществляется доступ к локальным службам.
Java и HTML5 приложения не развернуты и не скопированы в эту учетную запись.
Управление идентификацией и доступом:
Доступ к приложениям должен быть только у сотрудников компании ABC PetroCorp. У «ABC PetroCorp» есть собственный провайдер идентификаций (SAP Identity Authentication), который содержит информацию о сотрудниках компании (имя, электронная почта, организация, роль и т.д.). Он настроен специально для субаккаунта ABC PetroCorp, так что приложениям, на которые осуществлена подписка, могут обращаться только их сотрудники.
Сервисы Connectivity:
У компании ABC PetroCorp есть запущенные локально службы, которые предоставляют информацию об их заводах – количество сотрудников на заводе, место расположения завода и т.д. Вся эта информация должна извлекается из их ландшафта и предоставляется приложению с помощью SAP Cloud Connector.
Часть 2. Загрузка решения в формате MTAR в платформу, привязка базы данных и создание подписок для арендаторов, конфигурация субаккаунта провайдера
Мультитенантное приложение должно быть запущено в субаккаунте провайдера. Роберт из компании ITeLO Consulting является администратором учетной записи, и ему нужно выполнить следующие шаги по установке приложения:
- Создать архив приложения, содержащий все его артифакты;
- Загрузить архив приложения в учетную запись ITeLO Consulting;
- Осуществить подписку клиента «ABC PetroCorp» на приложение, запущенное в субаккаунте провайдера;
- Настройка пути к открытой службе, запущенной в сети интернет.
Предварительные настройки:
- У вас установлен Java 8;
- Установлен Eclipse Neon с плагинами для SAP CP;
- В Eclipse установлен плагин EGit;
- Скачана и распакована последняя версия SAP CP Java Web Tomcat 8 SDK;
- Скачан и установлен MTA Archive Builder;
- В учетной записи SCP подключена база данных SAP HANA (для субаккаунта провайдера);
- В субаккаунте провайдера ITeLO Consulting выделена квода для запуска Java-приложений (хотя бы одна неиспользуемая вычислительная единица, подробнее о выделении квоты здесь).
Примечание: создание нескольких субаккаунтов внутри глобального аккаунта SCP невозможно для триального (пробного) аккаунта.
Для установки мультитетантного приложения в этой статье будет использована такая функция SCP, как «Solutions» (загрузка решений). В качестве альтернативы в платформу можно загружать модули приложения по отдельности.
Исходный код приложения для мониторинга загрязнения («Pollution Monitoring») находится в GitHub.
Сначала мы клонируем проект и загружаем его в рабочую область Eclipse. После успешной установки проект появится в рабочей области, его структура будет выглядеть вот так:

Приложение состоит из нескольких модулей, разработанных с использованием различных технологий. Эти модули должны быть установлены в разные среды выполнения (например, Java, HTML5). Вместо того, чтобы создавать и загружать модули отдельно, SCP поддерживает создание единого приложения, которое содержит разные модули в одном архиве.
Как было показано в архитектуре приложения, бизнес-логика определена в приложении Java, а логика пользовательского интерфейса определена в приложении HTML5. И сейчас мы в лице Роберта создадим архив многомодульного (или многоцелевого) приложения (MTA), чтобы упаковать приложение в удобный для загрузки в платформу формат.
Чтобы создать архив с несколькими модулями приложения, нужно загрузить «mta.jar» и настроить «MTA archive builder» (ссылка на описание установки «MTA archive builder» указана выше в предварительных настройках).
Модули многоцелевого приложения описаны в файле-дескрипторе MTA (mta.yaml), этот файл находится в корневой папке проекта.

Файл «mta.yaml» содержит информацию о модулях Java и HTML5, которые будут созданы в процессе сборки приложения. Откроем файл и привяжем базу данных SAP HANA к Java-приложению, указав идентификатор базы данных в поле «id».

Здесь id – это идентификатор базы данных, запущенной в субаккаунте провайдера. Его можно найти в панели управления SCP учетной записи «ITeLO Consulting» в меню Persistence -> Databases Systems.

В нашем случае идентификатор базы данных в «mta.yaml» будет обозначен следующим образом:

Сохраняем изменения и, открыв командную строку, переходим в папку с проектом «pollutionmonitoring» и вводим такую команду:
java -jar [путь к mta.jar] –build-target=NEO build

Эта команда запустит процесс сборки приложения в архив MTA.
После успешной сборки в папке с проектом будет сгенерирован файл MTA-архива (pollutionmonitoring.mtar).

Следующим шагом будет установка MTA-архива (pollutionmonitoring.mtar) в субаккаунт ITeLO Consulting. Это можно сделать с помощью функции «Solutions», представленной в панели управления SCP. Для этого переходим во вкладку «Solutions» и нажимаем на кнопку «Deploy».

В появившемся диалоговом окне переходим к месту расположения файла «pollutionmonitoring.mtar», нажав кнопку «Browse» у поля «MTA Archive», и выбираем его, после чего нажимаем «Deploy».

После успешной загрузки MTA-архива в панели управления учетной записи ITeLO Consulting можно будет увидеть следующее:
• Во вкладке «Java Applications» появится запущенное Java-приложение «pollutionmonitoring»;

• Будет автоматически произведена привязка базы данных к Java-приложению. Для проверки перейдите в Java-приложение и выберете вкладку «Configuration» -> «Data Sourсe Bindings»;

• Во вкладке «HTML5 Applications» появится запущенное HTML5-приложение «pollutionmonitoringui».

Теперь Роберту нужно создать субаккаунт с названием ABC Petro Corp для клиента.
Перейдем в глобальный аккаунт SCP и во вкладке «Subaccounts» выберем «New Subaccount».

В появившемся диалоговом окне вводим имя субаккаунта, выбираем среду (Neo) и регион, в котором расположен глобальный аккаунт и, соответственно, субаккаунт провайдера. После чего нажимаем «Create».

Теперь в глобальном аккаунте появится еще один субаккаунт – субаккаунт клиента.
Следующим шагом будет создание подписки внутри учетной записи клиента ABC Petro Corp на приложения, запущенные в учетной записи провайдера. Для этого воспользуемся консольным клиентом для среды Neo. Как его установить, описано здесь.
В консольном клиенте для Neo введем такую команду:
neo subscribe –account <<идентификатор субаккаунта ABC_PetroCorp>> -application <<идентификатор субаккаунта ITeLO_consulting>>:pollutionmonitoring -user <<идентификатор пользователя>> -host <<хост региона>>
Идентификатор субаккаунта можно найти во вкладке «Overview» -> «Subaccount information».

Идентификатор пользователя обозначен во вкладке «User Information», которая расположена в выпадающем меню в верхнем правом углу панели управления SCP.

Хосты для всех регионов среды Neo описаны в документации.
Для подписки на HTML5 приложение воспользуемся панелью управления SCP. Перейдем в субаккаунт клиента ABC Petro Corp и выберем вкладку «Subscriptions» -> «New Subscription» (для HTML5).

В диалоговом окне выбираем субаккаунт провайдера и HTML5-приложение внутри него, после чего нажимаем «Save».

Теперь клиент подписан на Java и HTML5 приложения, предоставляемые провайдером, и это отображено в панели управления учетной записи ABC Petro Corp.

Приложение для мониторинга загрязнения позволяет выводить данные о загрязнении завода и города.
Данные о загрязнении завода находятся в локальной системе клиента. Сведения об уровне загрязнения города можно получить через службу с открытым исходным кодом, доступную через сеть Интернет. Такой службой может быть OpenAQ. Приложение для мониторинга загрязнения может получить доступ к этой службе с помощью описания пути назначения в панели управления SCP.
Этот сервис будет использоваться ABC Petro Corp и другими потенциальными клиентами, поэтому адрес назначения будет добавлен в учетную запись провайдера ITeLo Consulting.
Для Java-приложения путь назначения под названием «openaq–api–dest» описан в файле «web.xml».

Этот путь назначения обозначен в классе «PollutionDataService» (файл «PollutionDataService.java»).

После того, как поиск пути назначения будет выполнен, все вызовы от Java-кода к службе OpenAQ запускаются через него.
Файл пути назначения «open-api-dest» находится внутри папки «Destinations-Provider», расположенной внутри проекта «pollutionmonitoring».

Этот файл содержит URL к сервису OpenAQ.

Данный путь назначения нужно загрузить в субаккаунт провайдера ITeLo Consulting. Для этого направляемся в субаккаунт ITeLo Consulting, переходим во вкладку «Java Applications» и выбираем приложение «pollutionmonitoring».
Далее выбираем вкладку «Configuration» → «Destinations» и нажимаем на кнопку «Import Destination».

В появившемся диалоговом окне указываем путь к файлу «open-api-dest». После чего будет произведена конфигурация пути назначения в панели управления SCP. Нажимаем кнопку «Save». Путь назначения будет выглядеть в облачной платформе следующим образом:

Этот сервис доступен через https, поэтому нужно установить безопасное соединение. Это можно сделать с помощью сервиса «хранения ключей» для SCP. В проекте «pollutionmonitoring», скачанном из GitHub, уже имеются файлы с ключами: «jssecacerts.jks» и «cacerts.jks». Их нужно загрузить в субаккаунт клиента ABC Petro Corp.
Для этого снова воспользуемся консольным клиентом для среды Neo.
В консольном клиенте для Neo введем такие команды:
neo upload-keystore –account <<идентификатор субаккаунта ABC_PetroCorp>> –user <<идентификатор пользователя>> –location <<путь к файлу jssecacerts.jks>> –host <<хост региона>>
neo upload-keystore –account << идентификатор субаккаунта ABC_PetroCorp >> –user << идентификатор пользователя >> –location << путь к файлу cacerts.jks>> –host << хост региона >>
Эти файлы («jssecacerts.jks» и «cacerts.jks») находятся в папке «KeyStore Services» проекта «pollutionmonitoring».
Часть 3. Сервис хранения данных (Persistence Service) — инициализация и изоляция данных
Приложением ITeLO Consulting заинтересованы несколько клиентов. Настоящее мультитенантное приложение должно гарантировать, что данные ABC PetroCorp полностью изолированы от данных других клиентов в базе данных (например, от данных XYZ EnergyCorp). Это очень важно для обеспечения безопасности данных клиента и приложения.
Роберт из ITeLO Consulting хочет, чтобы его приложение изолировало хранение данных своих клиентов, и он интересуется, как этого можно достичь.
Для достижения изолированности данных нам необходимо определить степень изоляции, т.е. изоляция на уровне таблицы (хранить данные в разных таблицах в одной схеме), на уровне схемы (хранить данные клиентов в разных схемах), на уровне тенанта (хранить данные клиента в разных тенантах БД). Сервис хранения данных (Persistence Service) SAP Cloud Platform в сочетании с JPA (Java Persistence API) и EclipseLink поддерживает реализацию этих методов изоляции данных.
Существует три способа достижения мультитенантности на уровне базы данных. Эти способы мы рассмотрели в части 1.
Во второй части мы сосредоточимся на способе под названием «колонка-разделитель». Именно он будет использован Робертом для изоляции данных на уровне БД в его решении.
Использование колонки-разделителя:
В этом подходе одна схема БД распределяется между всеми пользователями приложения. Идентификатор тенанта (tenant id) может использоваться как значение в колонке-разделителе. Фрагмент кода представлен ниже.

В качестве подготовительного шага мы также инициализируем данные, которые будут использованы в приложении мониторинга загрязнения.
Шаг 1: Проверка наличия описания колонки-разделителя в коде приложения
На этом этапе мы посмотрим, как как модель данных приложения используется для обеспечения мультитенантности на уровне БД.
Для этого обратимся к скачанному с GitHub проекту, который уже загружен в рабочую область Eclipse.
Далее мы будем просматривать некоторые файлы проекта. Это можно сделать либо через среду Eclipse, либо скачать проект, разархивировать его в удобное для вас место и открывать файлы по отдельности. Мы воспользуемся вторым вариантом.
Разархивированный проект выглядит следующим образом:

Перейдем к файлу «BaseObject.java» проекта, расположенного по пути «/pollutionmonitoring/java/src/main/java/com/sap/hana/cloud/samples/pollutionmonitoring/model/BaseObject.java», и откроем его с помощью редактора (например, Notepad++).

В этом файле проверяем описание метода «Колонка-разделитель». Вот как это выглядит:

Теперь обратимся к файлу «web.xml», расположенному по пути «/pollutionmonitoring/java/src/main/webapp/WEB-INF/web.xml».

Убедимся, что источник данных (база данных) привязан к приложению в качестве стандартного источника (Default DB). В файле «web.xml» это выглядит следующим образом:

Этот пример показывает, как реализована мультитенантность в приложении для мониторинга загрязнения.
Шаг 2: Проверка настройки сервлета инициализации данных
Роберт знает, что клиентам его приложения потребуется загрузить данные для их использования. Поэтому он создал сервлет для инициал��зации данных, которым могут воспользоваться клиенты (например, Эмили) для ввода данных в приложение для мониторинга загрязнения.
На этом этапе мы посмотрим, как произведена настройка публикации сервлета инициализации данных.
Сервлет описан в файле «DataInitializationServlet.java», который расположен в проекте по пути «/pollutionmonitoring/java/src/main/java/com/sap/hana/cloud/samples/pollutionmonitoring/api/DataInitializationServlet.java».

Способ его публикации обозначен в файле «web.xml» («/pollutionmonitoring/java/src/main
/webapp/WEB-INF/web.xml»).

Откроем этот файл и убедимся, что сервлет для загрузки данных в приложение мониторинга загрязнения был опубликован по URL-пути «/initialize». Выглядит это следующим образом:

Шаг 3. Использование сервлета для инициализации данных о загрязнении для «ABC PetroCorp» (клиент)
Эмили из ABC PetroCorp может обращаться к приложению мониторинга загрязнения, используя созданную подписку.
Приложение «Pollution Monitoring» использует два типа данных:
Данные об уровне загрязнения (Pollution Data): считываются из таких источников, как внешние API, датчики загрязнения и т.д.
Данные о заводе (Plant Data), как правило, считываются из локальных систем клиента — таких как ERP-системы.
1) На этом этапе мы создадим данные о загрязнении с помощью сервлета инициализации данных, расположенного в проекте. Эти данные будут храниться в базе данных HANA в SAP CP, которая привязана к приложению в учетной записи провайдера.
2) Данные о заводе считываются приложением из локальной системы, то есть они не хранятся в базе данных HANA в SAP CP. Это будет рассмотрено в пятой части статьи «SAP Cloud Connector — настройка и конфигурация сервиса для подключения к локальной системе».
На этом этапе мы загрузим данные о загрязнении в приложение «по подписке». Для этого будет использоваться сервлет «Data Initialization», который находится в проекте и может быть использован для ввода подготовленных данных в базу данных HANA.
Посмотрим, как выглядят подготовленные данные и как их можно инициализировать с помощью сервлета. Для этого снова обратимся к файлу «DataInitializationServlet.java», который расположен в проекте по пути «/pollutionmonitoring/java/src/main/java/com/sap/hana/cloud/samples/pollutionmonitoring/api/DataInitializationServlet.java», и откроем его.
Здесь мы можем увидеть подготовленные данные как для «ABC PetroCorp», так и для другого клиента («XYZ EnergyCorp»).

Инициализируем данные об уровне загрязнения для ABC PetroCorp, вызвав сервлет «Data Initialization».
Перейдем в панель управления субаккаунта клиента ABC PetroCorp. В нашем случае глобальный аккаунт расположен в регионе Europe(Rot), доступ к нему осуществляется по этой ссылке.

В панели управления субаккаунта переходим на вкладку «Applications -> Subscriptions» и выбираем Java-приложение, на которое подписан клиент.

Во вкладке «Overview» будет обозначен URL-приложения, копируем его.

Открываем новое окно браузера, вставляем скопированный URL приложения и добавляем к нему «/initialize?company=ABC PetroCorp». После чего инициализация будет завершена и на экране должны появиться данные, которые будут отправлены в приложение.

Теперь мы инициализировали данные о загрязнении для ABC PetroCorp в приложении мониторинга загрязнения от ITeLO.
В следующей статье мы расскажем об управлении идентификацией с помощью Identity Authentication — настройки тенанта сервиса.