задний план
Хотя горячее обновление кода в производственной среде не является хорошим поведением, оно может привести к: чем горячее, тем нерегулярнее, а у коллег две строчки слез.
Но часто нам нужно «горячее» обновление кода, например:
Я проверил проблему в Интернете и нашел идею исправления, но после перезапуска приложения сцена окружающей среды изменилась, и ее было трудно воспроизвести. Как проверить план ремонта?
Другой пример:
Местное развитие, компоненты с открытым исходным кодом нашли ошибку, хотите изменить проверку. Если это состоит в том, чтобы компилировать компоненты с открытым исходным кодом, а затем выпущены, процесс очень длинный, не обязательно успешно компилятен. Есть ли способ быстро тестировать?
Arthas — это инструмент диагностики Java-приложений Alibaba с открытым исходным кодом, который очень любят разработчики.
Ниже представлено использование версии Arthas 3.1.0.jad
/mc
/redefine
Единый доступ к горячему коду обновления.
- Arthas: GitHub.com/Alibaba/art…
- Джад команда:Alibaba.GitHub.IO/art has/JAD. …
- команда мк:Alibaba.GitHub.IO/art has/everytime.Также…
- переопределить команду:Alibaba.GitHub.IO/искусство/ спровоцировало…
Онлайн-учебник Артаса
Ниже показан процесс горячего обновления кода с помощью онлайн-руководства Arthas.
В примере посетите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. Пользователи также могут использовать другие инструменты для достижения того же эффекта.
Наконец, Артас напоминает вам:Десятки тысяч диагнозов, первый - норма, жара еще более нестандартная, а у коллеги две строчки слез.
Артасская практика серии
- Практика Алибабы Артаса — получите Spring Context и делайте все, что хотите
- Практика Артаса — быстрое устранение неполадок приложения Spring Boot 404/401
- Когда Даббо сталкивается с Артасом: устранение неполадок на практике
- Практика Артаса: используйте переопределение для устранения неполадок в приложениях со странными источниками журналов.
- Используйте Артаса, распутывающего журналы онлайн-приложений, чтобы устранять проблемы с игрой.
- Погрузитесь в Spring Boot: устранение неполадок NoSuchMethodError с помощью Arthas
публика
Добро пожаловать в колонку Hengyun Broken Ridge, посвященную Java, Spring Boot, Arthas, Dubbo.