Мальчик, ты хочешь обновить код онлайн?

Java

задний план

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

Но часто нам нужно «горячее» обновление кода, например:

Я проверил проблему в Интернете и нашел идею исправления, но после перезапуска приложения сцена окружающей среды изменилась, и ее было трудно воспроизвести. Как проверить план ремонта?

Другой пример:

Местное развитие, компоненты с открытым исходным кодом нашли ошибку, хотите изменить проверку. Если это состоит в том, чтобы компилировать компоненты с открытым исходным кодом, а затем выпущены, процесс очень длинный, не обязательно успешно компилятен. Есть ли способ быстро тестировать?

Arthas — это инструмент диагностики Java-приложений Alibaba с открытым исходным кодом, который очень любят разработчики.

Ниже представлено использование версии Arthas 3.1.0.jad/mc/redefineЕдиный доступ к горячему коду обновления.

Онлайн-учебник Артаса

Ниже показан процесс горячего обновления кода с помощью онлайн-руководства Arthas.

arthas-online-hotswap

В примере посетитеcurl http://localhost/user/0, вернет ошибку 500:

{
    "timestamp": 1550223186170,
    "status": 500,
    "error": "Internal Server Error",
    "exception": "java.lang.IllegalArgumentException",
    "message": "id < 1",
    "path": "/user/0"
}

Далее следует изменить эту логику путем горячего обновления кода.

Код защиты от компиляции JAD

декомпилироватьUserController,Сохранить в/tmp/UserController.javaФайл.

jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java

Изменить декомпилируемый код

Редактировать с помощью текстового редактора/tmp/UserController.java, Чтобы вызвать исключение вместо обычного возврата:

    @GetMapping(value={"/user/{id}"})
    public User findUserById(@PathVariable Integer id) {
        logger.info("id: {}", (Object)id);
        if (id != null && id < 1) {
            return new User(id, "name" + id);
            // throw new IllegalArgumentException("id < 1");
        }
        return new User(id.intValue(), "name" + id);
    }

sc найти загруженный ClassLoader UserController

$ sc -d *UserController | grep classLoaderHash
 classLoaderHash   1be6f5c3

Можно обнаружить, что это весенняя загрузкаLaunchedURLClassLoader@1be6f5c3загружен.

код компиляции памяти mc

держать правильно/tmp/UserController.javaПосле этого используйте команду mc (Memory Compiler) для компиляции и передайте-cспецификация параметраClassLoader:

$ mc -c 1be6f5c3 /tmp/UserController.java -d /tmp
Memory compiler output:
/tmp/com/example/demo/arthas/user/UserController.class
Affect(row-cnt:1) cost in 346 ms

переопределить код горячего обновления

Затем используйте команду переопределить, перезагрузите новый скомпилированныйUserController.class:

$ redefine /tmp/com/example/demo/arthas/user/UserController.class
redefine success, size: 1

Проверка результатов горячего обновления

посетить сноваcurl http://localhost/user/0, вернется нормально:

{
    "id": 0,
    "name": "name0"
}

Суммировать

Артасjad/mc/redefineУниверсальный онлайн-код горячего обновления очень мощный, но также очень опасный, и управление правами должно быть сделано хорошо.

Например, учетная запись запуска онлайн-приложения — admin, когда пользователь может переключиться на admin, затем

  • Пользователь может изменить и получить любое значение памяти приложения (будь то приложение Java или нет).
  • Пользователь может прикрепить JVM
  • После подключения jvm API использует сам jvm, чтобы переопределить класс

так:

  • Безопасность приложения в основном зависит от управления правами пользователя.
  • Arthas в основном упрощает переопределение jvm. Пользователи также могут использовать другие инструменты для достижения того же эффекта.

Наконец, Артас напоминает вам:Десятки тысяч диагнозов, первый - норма, жара еще более нестандартная, а у коллеги две строчки слез.

Артасская практика серии

публика

Добро пожаловать в колонку Hengyun Broken Ridge, посвященную Java, Spring Boot, Arthas, Dubbo.

横云断岭的专栏