spring aop 与 aspectj

aspectj 是什么?

官网如此描述:

  • 对Java编程语言中的AOP进行无缝扩展(这点很重要)
  • 适用Java平台
  • 易学易用

aspectj如何使用

aspectj 有三种使用方式:

  1. 编译时织入,利用ajc编译器直接将切面织入到源代码中并编译为class
  2. 编译后织入,利用ajc编译器向编译后的class或jar织入切面代码
  3. 运行时织入,不使用ajc编译器,而是利用java agent的能力,在类加载时将切面织入目标代码。

下面我们就看看这三种方式具体如何使用:

spring中AOP实现分析-第一篇

前言

这是一篇关于Spring AOP的总结分析文章,帮助自己记忆。

AOP配置

下面的例子是通过注解驱动的AOP例子:

启用Spring AOP:

1
<aop:aspectj-autoproxy proxy-target-class="true" expose-proxy="true"/>

或者通过下面的注解方式启用Spring AOP

1
2
3
4
5
6
7
8
/**
* @author jiexiu
*/
@EnableAspectJAutoProxy(exposeProxy = true, proxyTargetClass = true)
@Configuration
public class Config {

}

nacos学习笔记

nacos是什么?

Nacos 是 Dynamic Naming and Configuration Service 的缩写。

总结来说:nacos一个专门为微服务架构设计提供了诸如:服务注册,服务发现,服务元数据管理,服务动态配置管理,流量管理等功能的中间件。通过使用nacos你可以快速搭建微服务架构,并可以和业界优秀的开源项目,像k8s,Dubbo,Spring Cloud进行整合 或 和公司内部的中间件进行整合。

nacos 一致性模型

说到底,nacos是一个分布式存储系统。既然是存储系统,那么它的一致性模型必然是人们首要关注的问题。
根据官网文档介绍可知。Nacos选择了AP下的最终一致性模型。

异步调用转为同步

背景

在日常的开发工作中,我们经常会有一些任务需要异步执行。那么如何获取异步任务的结果呢?常见的解决方案有两种:1,任务异步执行,调用方同步获取结果(本篇文章需要讨论的);2,通过Callback 或 Listener进行处理。

针对需要同步获取异步计算结果的需求,下面分场景进行讨论并给出解决方案和原理分析。

Future + 线程池

这个是最常见模式:

1
2
3
4
5
6
7
8
9
ExecutorService executorService = Executors.newFixedThreadPool(1);
Future<String> result = executorService.submit(new Callable<String>() {
@Override
public String call() throws Exception {
Thread.sleep(1000);
return "Hello";
}
});
System.out.println(result.get());

架构模式

本文翻译自Software Architecture Patterns

Layered Architecture

分层架构是最通用和使用频率最高的架构模式,通常也称之为N-层架构。这种模式也是大多数Java EE应用程序的事实上的架构标准,因此,它被大多数架构师,设计人员和开发人员所广泛了解。 分层架构模式能与传统的IT通信和大多数公司中的组织结构紧密匹配,这使其成为大多数业务应用程序开发工作的自然选择。

Pattern Description

分层架构模式中的组件被组织为水平分隔的层,每一层在应用程序中扮演特定的角色(例如,表示层或业务逻辑层)。 尽管分层体系架构模式没有指定模式中必须存在的层的数量和类型,但是大多数分层架构都由四个标准层组成:表示层业务层持久性数据库层,如图(图1-1)所示。在某些情况下,尤其是在将持久性逻辑(例如SQL或HSQL)嵌入业务层组件中时,业务层和持久性层会组合为一个业务层。 因此,较小的应用程序可能仅具有三层,而较大且更复杂的业务应用程序可能包含五层或更多层。

数据是如何到达目标主机的

背景

最近重新翻看了图解TCP/IP,有必要将一些知识点记下来,方便以后自己和其他人理解记忆。本文主要总结一个数据是如何发送到目标主机的。

假设模型

模型中假设主机1(IP地址为:192.168.1.3) 要给主机2(IP地址为:192.168.2.3)发送数据。

logback最佳实践

背景

在最近的一次项目性能优化过程中,通过火焰图工具发现logback占用CPU很多,因此有了这篇总结文章。

logback 同步 vs 异步

同步写日志一般配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
 <appender name="ORDER_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/data/logs/AAA/order.log</file>
<encoder>
<pattern>[%-5p] [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%X{tracing_id}] [%C{1}:%M:%L] %m%n</pattern>
<immediateFlush>false</immediateFlush>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/data/logs/AAA/order.log.%d{yyyy-MM-dd_HH}</fileNamePattern>
</rollingPolicy>
</appender>

Java 对象内存布局

前言

所有试验代码都是在Mac os JDK8 64位JVM上测试(默认开启了指针压缩)。

背景

一道面试题。 问题是:A和B两个类,A类中有一个private的字段age,B类继承自A类。创建一个B类的对象b,对象b的内存中是否包含父类A中的字段age的内存空间。

类似代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* @author jiexiu
* created 2019/12/14 - 09:26
*/
public class Animal {

private int age;

public int getAge() {
return age;
}
}
/**
* @author jiexiu
* created 2019/12/14 - 09:26
*/
public class Dog extends Animal {

private double weight;

}

MySQL中join操作总结

前言

在数据库中Join操作被称为连接。目的是从多个表中获取数据作为结果集返回给客户端。join 操作分为如下几种:

外连接:left joinright join
内连接:inner join
全连接:full join
笛卡尔积: cross join

准备工作

新建2个表t1, t2,结构相同。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE TABLE `t1` (
`id` int(11) NOT NULL,
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `a` (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `t2` (
`id` int(11) NOT NULL,
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `a` (`a`)
) ENGINE=InnoDB;

INSERT INTO t1 VALUES (1,1,1), (2,2,2), (3, 3, 3);
INSERT INTO t2 VALUES (1,1,1), (2,2,2), (4, 4, 4);

关于timeout你必须了解

前言

有经验的开发同学都知道访问依赖的服务服务时需要设置超时时间。这些外部服务可能是一个http接口,RPC接口,获取分布式锁等等。没有合理的超时时间设置,你的系统可能出现雪崩。但是在工作中发现大部分同学,包括我自己在内对如何合理的设置timeout没有形成一个完整的知识链条,这就会导致你可能设置了timeout,但系统并不会像你想象中的正常工作。

下面以一个简单的访问数据库的HTTP请求来串起整个理论。可能理解或实践有误,还请发现的同学留言斧正。

注意:所有代码例子都是在Linux 3.10.0 测试上通过,使用Java语言编写的。

|