Про использование AspectJ Scripting для модификации существующего java приложения без его перекомпиляции и пересборки.
Основные преимущества:
* написание аспектов только за счет конфигурации агента на java подобном языке MVEL;
* использовании в скриптах любых классов и ресурсов из maven репозитариев с их динамической загрузкой во время выполнения;
* возможность загрузки конфигурации агента при старте jvm как с файловой системы, так и с веб сервера
* сочетание jvm агента AspectJ и привычного синтаксиса pointcut выражений упрощают изучение: существует подробная официальная документация AspectJ и публикации в интернет.
* open source/apache license, наличие исходного кода на github и сборки агента на central.maven.org
Область применения jvm агента - микросервисы и приложения для jvm(в том числе и распределенные). AspectJ Scripting позволяет собирать метрики приложения и jvm, выполнять трассировку распределенного приложения, делать дампы запросов/ответов, изменять поведение существующего приложения.
1 of 42
Downloaded 18 times
More Related Content
Аспектно-ориентированное программирование в распределенных системах для java разработчиков и QA
2. Игорь Сухоруков
Аспектно-ориентированное программирование 9.09.2015
Deutsche Bank
Аспектно-ориентированное программирование
Какие задачи решает АОП
Тестирование и модификация существующего приложения
• Доступность исходных кодов
• Перепаковка
• Модификация сторонних библиотек
• Итеративность изменений
Распределенное приложение
• Распространение изменений: classpath, конфигурация
• Оркестрация сервисов
Содержание
9/18/15 2010 DB Blue template
2
3. Игорь Сухоруков
Аспектно-ориентированное программирование 9.09.2015
Deutsche Bank
Существующие решения
• BTrace
• Byteman
• AspectJ
• Пример: JDBC
AspectJ + MVEL + Maven = AspectJ-scripting
• AspectJ
• Pointcut syntax
• Concrete Aspects
• Bytecode modification
• LTW jvm agent / compile-time weaving
• MVEL
• Maven репозитарий, зависимости
• AspectJ-scripting
Содержание
9/17/15 2010 DB Blue template
3
4. Игорь Сухоруков
Аспектно-ориентированное программирование 9.09.2015
Deutsche Bank
Примеры
● hawt.io
● метрики
● ssh server - CRaSH
● Логирование в Elasticsearch
● Hazelcast/CountDownLatch
Ограничения текущей реализации
Roadmap
• Groovy + Grape
• Модификация загрузчиков классов
• Конфигурация в maven/scm/fs/web
Заключение
Ресурсы
Q&A
Содержание
9/17/15 2010 DB Blue template
4
5. Игорь Сухоруков
Аспектно-ориентированное программирование 9.09.2015
Deutsche Bank
Аспектно-ориентированное программирование (АОП) дополняет
объектно-ориентированное программирование (ООП),
предоставляя другой способ мышления о структуре
программы. Клюевой единицей модуляризации в ООП
является класс, в то время как в АОП единицей
модуляризации является аспект. Аспекты позволяют
эффективно выполнять модуляризацию сквозной
функциональности (crosscutting), такой как управление
транзакциями, логирование, проверка прав доступа, которые
затрагивают несколько объектов и типов.
Аспектно ориентированное
программирование
9/18/15 2010 DB Blue template
5
6. Игорь Сухоруков
Аспектно-ориентированное программирование 9.09.2015
Deutsche Bank
• Аспект (англ. aspect) — модуль или класс, реализующий сквозную функциональность. Аспект
изменяет поведение остального кода, применяя совет в точках соединения,
определенных некоторым срезом.
• Совет (advice) — средство оформления кода, которое должно быть вызвано из точки
соединения. Совет может быть выполнен до, после или вместо точки соединения. Типы
совета(advice): AROUND, BEFORE, AFTER, AFTER_RETURNING, AFTER_THROWING
• Точка соединения (join point) — точка в выполняемой программе, где следует применить
совет. Многие реализации АОП позволяют использовать вызовы методов и обращения к
полям объекта в качестве точек соединения.
• Срез (pointcut) — набор точек соединения. Срез определяет, подходит ли данная точка
соединения к данному совету. Самые удобные реализации АОП используют для
определения срезов синтаксис основного языка (например, в AspectJ применяются Java-
сигнатуры) и позволяют их повторное использование с помощью переименования и
комбинирования.
• Внедрение (Introduction/inter-type declaration) — изменение структуры класса и/или изменение
иерархии наследования для добавления функциональности аспекта в инородный код.
—
Аспектно-ориентированное
программирование
9/18/15 2010 DB Blue template
6
7. Игорь Сухоруков
Аспектно-ориентированное программирование 9.09.2015
Deutsche Bank
@Transactional(readOnly = true)
public class DefaultFooService implements FooService {
public Foo getFoo(String fooName) {// do something }
// these settings have precedence for this method
@Transactional(readOnly = false, propagation =
Propagation.REQUIRES_NEW)
public void updateFoo(Foo foo) { // do something }
}
Какие задачи решает АОП
9/18/15 2010 DB Blue template
7
13. Игорь Сухоруков
Аспектно-ориентированное программирование 9.09.2015
Deutsche Bank
Byteman
-javaagent:${BYTEMAN_HOME}/lib/byteman.jar=script:appmain.btm
RULE trace main entry
CLASS AppMain
METHOD main
AT ENTRY
IF true
DO traceln("entering main")
ENDRULE
RULE trace main exit
CLASS AppMain
METHOD main
AT EXIT
IF true
DO traceln("exiting main")
ENDRULE
Существующие решения
9/18/15 2010 DB Blue template
13
14. Игорь Сухоруков
Аспектно-ориентированное программирование 9.09.2015
Deutsche Bank
AspectJ
-javaagent:pathto/aspectjweaver.jar
aop.xml
@Aspect public class ProceedAspect {
@Pointcut("call(* setAge(..)) && args(i)")
void setAge(int i) {}
@Around("setAge(i)")
public Object twiceAsOld(ProceedingJoinPoint thisJoinPoint, int i) {
return thisJoinPoint.proceed(new Object[]{i*2}); //using Java 5
autoboxing
}
}
Существующие решения
9/18/15 2010 DB Blue template
14
15. Игорь Сухоруков
Аспектно-ориентированное программирование 9.09.2015
Deutsche Bank
Пример: JDBC
@Around(“execution(* oracle.net.ns.NetInputStream.read*(..)) “)
public Object emulateDbTimeout(ProceedingJoinPoint joinPoint){
...
Thread.sleep( jdbcTimeout + SAFE_PERCENT*jdbcTimeout );
…
}
@Around(“execution(* oracle.jdbc.driver.OracleStatement.cancel*(..)) “)
{
…
cancelled.set(true);
...
}
Существующие решения
9/18/15 2010 DB Blue template
15
16. Игорь Сухоруков
Аспектно-ориентированное программирование 9.09.2015
Deutsche Bank
AspectJ: Pointcut syntax
https://eclipse.org/aspectj/doc/released/progguide/semantics-pointcuts.html
execution(* org.sonar.server.app.WebServer.start(..))
call(* org.sonar.server.app.WebServer.start(..))
initialization(ConstructorPattern) execution(* *.new(..))
staticinitialization(ConstructorPattern)
get(FieldPattern)
set(FieldPattern)
—
AspectJ + MVEL + Maven = AspectJ-scripting
9/17/15 2010 DB Blue template
16
17. Игорь Сухоруков
Аспектно-ориентированное программирование 9.09.2015
Deutsche Bank
AspectJ: Concrete Aspects
package mypack;
@Aspect public abstract class AbstractAspect {
// abstract pointcut: no expression is defined
@Pointcut abstract void scope();
@Before("scope() && execution(* *..doSome(..))")
public void before(JoinPoint jp) {
....
}
}
<aspectj>
<aspects>
<concrete-aspect name="mypack.__My__AbstractAspect"
extends="mypack.AbstractAspect">
<pointcut name="scope" expression="within(yourpackage..*)"/>
</concrete-aspect>
<aspects>
</aspectj>
AspectJ + MVEL + Maven = AspectJ-scripting
9/18/15 2010 DB Blue template
17
18. Игорь Сухоруков
Аспектно-ориентированное программирование 9.09.2015
Deutsche Bank
AspectJ: Bytecode modification
AspectJ: LTW jvm agent / compile-time weaving
—
AspectJ + MVEL + Maven = AspectJ-scripting
9/17/15 2010 DB Blue template
18
19. Игорь Сухоруков
Аспектно-ориентированное программирование 9.09.2015
Deutsche Bank
MVEL
import java.io.File;
import org.apache.commons.io.FileUtils;
import com.google.gson.GsonBuilder;
import com.thoughtworks.xstream.Xstream;
res = joinPoint.proceed();
gson = new GsonBuilder().setPrettyPrinting().create();
FileUtils.writeStringToFile(new File("report.json"), gson.toJson(res));
xstream = new XStream(); xstream.alias("issue",
org.apache.maven.plugin.issues.Issue);
FileUtils.writeStringToFile(new File("report.xml"), xstream.toXML(res));
res;
—
AspectJ + MVEL + Maven = AspectJ-scripting
9/17/15 2010 DB Blue template
19
21. Игорь Сухоруков
Аспектно-ориентированное программирование 9.09.2015
Deutsche Bank
AspectJ-scripting
-javaagent:aspectj-scripting-1.0-agent.jar
-Dorg.aspectj.weaver.loadtime.configuration=config:file:database_console.xml
AspectJ + MVEL + Maven = AspectJ-scripting
9/18/15 2010 DB Blue template
21
24. Игорь Сухоруков
Аспектно-ориентированное программирование 9.09.2015
Deutsche Bank
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration>
<aspects>
<name>com.github.aspectjscripting.DumpMetrics</name>
<type>AFTER</type>
<pointcut>execution(public static void
com.github.aspectjscripting.Example.main(..))</pointcut>
<artifacts>
<artifact>com.github.igor-suhorukov:jvm-metrics:1.1</artifact>
<classRefs>
<variable>JmxCollect</variable><className>org.github.suhorukov.JmxCollect</classNa
me>
</classRefs>
<classRefs>
<variable>SigarCollect</variable><className>org.github.suhorukov.SigarCollect</class
Name>
</classRefs>
<classRefs>
<variable>PerformanceCounters</variable><className>org.github.suhorukov.Performan
ceCounters</className>
</classRefs>
</artifacts>
Примеры: метрики
9/17/15 2010 DB Blue template
24
25. Игорь Сухоруков
Аспектно-ориентированное программирование 9.09.2015
Deutsche Bank
<process>
<expression>
jmxCollect = new JmxCollect();
System.out.println(jmxCollect.getJsonJmxInfo("java.lang:type=Memory", new
java.util.Date()));
System.out.println(new SigarCollect().getJsonFullInfo());
performanceCounters = new PerformanceCounters();
System.out.println(performanceCounters.getJsonBaseInfo("sun.*"));
</expression>
</process>
</aspects>
</configuration>
Примеры: метрики
9/17/15 2010 DB Blue template
25