Несколько дней назад я написал в блоге о новой функциональности Composer для IBM Cloud Functions, созданной на основе Apache OpenWhisk. Это невероятно крутая версия, и я постараюсь продемонстрировать ее в течение следующих нескольких недель. В сегодняшней статье я расскажу о том, на что похож этот процесс. Под этим я подразумеваю, как мне перейти от идеи к фактическому ее использованию и тестированию. Это не будет сильно отличаться от документов, но я полагаю, что людям все же может быть полезно понять, как я его использую. (И, конечно же, я ожидаю, что мое использование со временем изменится.) Обратите внимание, что код, который я буду использовать для этого поста, будет максимально тривиальным, потому что я хочу больше сосредоточиться на процессе, чем на реальной демонстрации. Хорошо, с этим покончено, давайте начнем.

Демо

Как я уже сказал, демонстрация довольно тривиальна, но давайте все же рассмотрим ее, чтобы у нас был контекст для того, что создается. Демо-версия превратит случайное Правило приобретения Феранги в поросячью латынь. Итак, логика такова:

  • Выберите случайное правило
  • Возьмите текст и переведите его на поросячью латынь.

Создание бессерверного приложения — старый способ

Я начну с описания того, каким был процесс до появления Composer. Чтобы было ясно, «старый способ» ни в коем случае не означает пренебрежение. OpenWhisk всегда позволял мне создавать действительно крутые штуки, а Composer делает их еще лучше.

Сначала я создам действие «выбрать случайное правило». Вот листинг кода с удаленным встроенным очень списком правил. (Вы можете увидеть полный исходный код на GitHub — я поделюсь этой ссылкой в ​​конце.)

function main(args) {
    /*
    This is a very, very long string. Not a good idea.

    Source: http://www.ferengirules.com
    */
    let rules = ["1. Once you have their money, never give it back.", 
    "2. You can't cheat an honest customer, but it never hurts to try.", 
    "3. Never spend more for an acquisition than you have to.", 
    "4. Sex and profit are the two things that never last long enough.", 
    "5. If you can't break a contract, bend it.", 
    "6. Never let family stand in the way of opportunity."]

    let chosen = rules[Math.floor(Math.random() * rules.length)];

    return {
        rule:chosen
    };

}

Я создал это как действие, называемое safeToDelete/rule. (Напоминаю, что я использую пакет под названием «safeToDelete» для хранения действий, которые я создаю для сообщений в блоге, и таких действий, которым не нужно оставаться в живых.)

wsk action create safeToDelete/rule rules.js

Затем я проверил, чтобы убедиться, что это работает:

wsk action invoke safeToDelete/rule -b -r

И результат:

{ "rule": "72. Never let the competition know, what you're thinking." }

Затем я создал правило Pig Latin на основе этого репозитория от пользователя GitHub montanaflynn:

// source: https://github.com/montanaflynn/piglatin
 function piglatin(text) {
  var words = text.split(/\W+/)
  var piggish = ""
  for (var i = 0; i < words.length; i++) {
    var word = words[i]
    var firstLetter = word.charAt(0)
    if (word.length > 2) {
      piggish = piggish + word.substring(1) + firstLetter + "ay "
    } else {
      piggish = piggish + word + " "
    }
  }
  return piggish.toLowerCase().trim();
}

function main(args) {
    let result = piglatin(args.input);
    return { result:result};
}

Затем я поднял его:

wsk action create safeToDelete/pig pig.js

И проверено:

wsk action invoke safeToDelete/pig -b -r -p input "My name is Ray"

С этим результатом:

{ "result": "my amenay is ayray" }

Хорошо. Итак, чтобы сделать последовательность, у меня есть проблема. Результатом действия правила является переменная с именем rule. Входные данные для свиньи требуют параметра с именем input. Чтобы создать последовательность, мне понадобится действие «соединитель». Вот тот, который я построил:

function main(args) {

    //remove 1.
    let text = args.rule.replace(/[0-9]+\. /,'');

    return {
        input:text
    }

}

Обратите внимание, что на самом деле это делает две вещи. Он сопоставляет ввод, а также изменяет текст, чтобы удалить число перед правилом. Я отправил это в OpenWhisk так:

wsk action create safeToDelete/pigrule pigrule.js

Итак, последний шаг — создать последовательность:

wsk action create --sequence safeToDelete/ruleToPig safeToDelete/rule,safeToDelete/pigrule,safeToDelete/pig --web true

Это длинная команда, но не так уж плохо. Обычно я создавал сценарий оболочки/летучей мыши, чтобы автоматизировать обновление каждого отдельного правила и последовательности одним быстрым вызовом. Я возьму URL-адрес следующим образом:

wsk action get safeToDelete/ruleToPig --url

Что дает мне: https://openwhisk.ng.bluemix.net/api/v1/web/rcamden%40us.ibm.com_My%20Space/safeToDelete/ruleToPig

Чтобы проверить это, просто добавьте .json в конец. Вы можете увидеть это здесь.

И, наконец, примерный результат:

{ result: "evernay ivegay wayaay orfay reefay hatway ancay be oldsay" }

Честно говоря, это просто нечитабельно, но кого это волнует. Давайте двигаться дальше.

Создание бессерверного приложения — с помощью Composer

Итак, я предполагаю, что вы уже следовали инструкциям по установке и можете безопасно запустить fsh в своем терминале.

Первое, с чем вы столкнетесь, это то, что Composer использует немного другую терминологию. Вместо последовательностей вы создадите приложение. Честно говоря, это не 100% корреляция один к одному, но я думаю, что сейчас можно мысленно сопоставить их.

Далее — вы определите свое приложение в коде, в файле. (Вы тоже можете использовать графическую оболочку, но я этого не делаю.) Итак, для начала я создам новый файл с именем — pigruleapp.js.

Этот файл будет содержать инструкции, составляющие мою композицию. Вот с чего я начал:

composer.sequence(
    'safeToDelete/rule',
    'safeToDelete/pigrule',
    'safeToDelete/pig'
);

Заметьте, я не определяю композитор. Мне не нужно, так как система справится с этим за меня. Все, что я делаю, это определяю свою логику. В этом случае я использую функцию sequence композитора и определяю, что запускать. По сути, я определил точно такую ​​же последовательность, которую использовал раньше. (Я собираюсь сделать это лучше через мгновение.)

Для создания приложения я буду использовать:

fsh app create ruleToPigFsh ./pigruleapp.js

Если мне нужно внести какие-либо изменения, я бы использовал вместо этого fsp app update. Далее я проверю это с помощью:

fsh app invoke ruleToPigFsh

И — работает как положено:

{ result: "evernay etlay a emalefay in lothescay loudcay ouryay ensesay of rofitpay" }

Хорошо, но давайте поднимем его на ступеньку выше. Во-первых, я могу визуализировать свое приложение так:

fsh app preview pigruleapp.js

Что дает мне это:

Вы можете игнорировать сообщение «еще не развернуто» сверху. По сути, оболочка сообщает вам, что вы просматриваете локальный файл, а не развернутый экземпляр приложения. Так что да, технически он развернут. Во всяком случае, на снимке экрана не видно, что вы можете навести указатель мыши на синие поля, чтобы получить подробную информацию. Так, например, при наведении курсора на rule отображается action | safeToDelete\rule. Вы также можете дважды щелкнуть элемент, чтобы увидеть исходный код. Это удобно, если вы забудете:

Представление JSON — это просто то, как Composer преобразует ваш код в формат JSON. Вот что он сделал с моим кодом:

{
    "Entry": "action_0",
    "States": {
        "action_0": {
            "Type": "Task",
            "Action": "safeToDelete/rule",
            "Next": "action_1"
        },
        "action_1": {
            "Type": "Task",
            "Action": "safeToDelete/pigrule",
            "Next": "action_2"
        },
        "action_2": {
            "Type": "Task",
            "Action": "safeToDelete/pig"
        }
    },
    "Exit": "action_2"
}

А представление «Код» — это просто мой файл.

Еще одно изменение, которое может вас смутить, — это сеансы. Вместо активации вызов приложения Composer создает сеанс. Таким образом, вы можете использовать fsh session list, чтобы увидеть свои недавние тесты. Или мой любимый, возьмите последний с: fsh session get --last.

Мне чертовски обожаю этот вид. Обратите внимание, что время для этого теста (21,5 секунды) было случайным. Все еще идет некоторая настройка производительности, так что это абсолютно не то, что вы обычно ожидаете. Детали здесь потрясающие и легко читаемые. Вот след:

Мне нравится, как я могу видеть время каждого шага. Еще раз напомню — итоги здесь случайность, а не норма, но вы действительно видите, насколько это удобно для выявления «болевых точек» ваших приложений.

Вкладка необработанных данных очень похожа на отчет об активации:

{
    "duration": 21525,
    "name": "ruleToPigFsh",
    "subject": "[email protected]",
    "activationId": "0f941893b60a4331941893b60a633167",
    "publish": false,
    "annotations": [{
            "key": "limits",
            "value": {
                "timeout": 60000,
                "memory": 256,
                "logs": 10
            }
        },
        {
            "key": "path",
            "value": "[email protected]_My Space/ruleToPigFsh"
        }
    ],
    "version": "0.0.65",
    "response": {
        "result": {
            "result": "aithfay ovesmay ountainsmay of nventoryiay"
        },
        "success": true,
        "status": "success"
    },
    "end": 1508339185192,
    "logs": [
        "0f941893b60a4331941893b60a633167",
        "b44c2a1e9f4842408c2a1e9f48924084",
        "fbd917d800ab4be69917d800ab6be6b8",
        "0210c42b372242a090c42b372262a018",
        "4ccd2c65559e410a8d2c65559e410a40",
        "8504691d89f04df084691d89f0bdf072",
        "42f3b1096f9d40edb3b1096f9da0ed53"
    ],
    "start": 1508339163667,
    "namespace": "[email protected]_My Space",
    "originalActivationId": "42f3b1096f9d40edb3b1096f9da0ed53",
    "prettyType": "session"
}

В Session Flow все становится еще интереснее. По сути, это та же блок-схема, которую вы видели в предварительном просмотре выше, но посмотрите, что вы получите, наведя курсор мыши:

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

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

Мне это нравится. Нет, правда, мне это очень нравится.

Сделать его лучше!

Давайте действительно улучшим ситуацию, избавившись от этого простого действия «объединения». Это новое приложение, которое я создал (называется pigruleapp2.js):

composer.sequence(
    'safeToDelete/rule',
    args => ({input: args.rule.replace(/[0-9]+\. /,'')}),
    'safeToDelete/pig'
);

Все, что я сделал, это заменил это среднее действие встроенной функцией. Затем я подтолкнул его так:

fsh app create ruleToPigFsh2 pigruleapp2.js

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

Если вам интересно, вот как меняется предварительный просмотр:

Последнее замечание. В настоящее время интерфейс командной строки не сообщает вам, как получить URL-адрес вашего приложения. Это было зарегистрировано как проблема. Вы можете сделать это с помощью команды webbify:

fsh webbify ruleToPigFsh2

Который выдает URL: https://openwhisk.ng.bluemix.net/api/v1/web/[email protected]_My%20Space/default/ruleToPigFsh2.json

И вы можете нажать на эту ссылку, чтобы проверить это самостоятельно.

Заворачивать

Поэтому я надеюсь, что это имело смысл, а если нет, просто оставьте мне комментарий ниже. Напомню, что fsh CLI не в настоящее время работает в WSL (подсистема Windows для Linux), поэтому, если вы используете Windows, переключитесь на Powershell при его использовании. Вы можете найти исходный код, использованный для этой демонстрации, здесь: https://github.com/cfjedimaster/Serverless-Examples/tree/master/fshruledemo

Первоначально опубликовано на www.raymondcamden.com 18 октября 2017 г.