Spring 使用 AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry); 注册代理

本文介绍了一种基于自定义注解的限流器实现方案,详细解释了如何通过Spring AOP来完成方法级别的访问频率限制,并解决了实现过程中遇到的问题。

原先有问题的代码

自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(RateLimiterImportBeanDefinitionRegistrar.class)
public @interface EnableRateLimiter {
    /**
     * 扫描路径
     * @return
     */
    boolean proxyTargetClass() default false;
}
注册APC(AutoProxyCreate)
@Configuration
public class RateLimiterImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        Map<String, Object> annotationAttributes = importingClassMetadata.getAnnotationAttributes(EnableRateLimiter.class.getName());
        Boolean flag = (Boolean) annotationAttributes.get("proxyTargetClass");

        //依赖于Spring底层实现,通常是Spring 内部使用
        AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry);
        if (flag) {
            AopConfig
以下是对该 Nacos 中 Seata 配置可能存在问题的检查分析: ### 配置项检查 #### 1. `seata.enabled` 配置中设置 `enabled: true`,这表明启用 Seata 功能,此配置本身没有问题,前提是项目确实需要使用 Seata 进行分布式事务管理。 #### 2. `seata.application-id` `application-id: ${spring.application.name}`,使用 Spring 应用名称作为 Seata 应用编号,这是常见且合理的做法,只要 `spring.application.name` 能正确获取到应用名称即可。 #### 3. `seata.tx-service-group` `tx-service-group: ${spring.application.name}-group`,将事务组编号设置为应用名称加上 `-group` 后缀。需要确保这个事务组编号与 Seata 服务端配置中的 `service.vgroup_mapping` 对应,否则可能导致事务无法正常提交或回滚。 #### 4. `seata.config` ```yaml config: type: nacos nacos: server-addr: ${spring.cloud.nacos.server-addr} group: DEFAULT_GROUP namespace: dev username: ${spring.cloud.nacos.username} password: ${spring.cloud.nacos.password} data-id: seata-server.properties ``` - **`server-addr`**:使用 `${spring.cloud.nacos.server-addr}` 引用 Spring Cloud Nacos 的地址配置,需要保证该变量能正确解析为 Nacos 服务器地址。 - **`group`**:设置为 `DEFAULT_GROUP`,要确保在 Nacos 中 `seata-server.properties` 配置文件确实存放在该分组下。 - **`namespace`**:指定为 `dev`,需要确认 Nacos 中存在该命名空间,并且配置文件在该命名空间下。 - **`username` 和 `password`**:使用 `${spring.cloud.nacos.username}` 和 `${spring.cloud.nacos.password}` 引用 Spring Cloud Nacos 的认证信息,要保证这些变量能正确解析。 - **`data-id`**:设置为 `seata-server.properties`,需要保证在指定的命名空间和分组下存在该配置文件。 #### 5. `seata.registry` ```yaml registry: type: nacos nacos: application: qinghe-seata-server server-addr: ${spring.cloud.nacos.server-addr} group: DEFAULT_GROUP username: ${spring.cloud.nacos.username} password: ${spring.cloud.nacos.password} namespace: dev ``` - **`application`**:指定为 `qinghe-seata-server`,需要确保在 Nacos 中该应用名称对应的服务存在。 - **`server-addr`、`group`、`username`、`password`、`namespace`**:与 `seata.config` 中的配置类似,需要保证配置信息能正确连接到 Nacos 并找到对应的服务。 #### 6. `seata.enable-auto-data-source-proxy` 设置为 `false`,表示关闭自动数据源代理。如果需要 Seata 自动代理数据源来管理事务,应将其设置为 `true`。 ### 总结 主要检查点在于确保各个配置项的引用变量能正确解析,以及 Nacos 中对应的命名空间、分组、配置文件和服务存在。同时,要保证事务组编号与 Seata 服务端配置对应,数据源代理配置符合业务需求。 ### 示例代码检查 ```yaml seata: # 是否启用 enabled: true # Seata 应用编号,默认为应用名 application-id: ${spring.application.name} # Seata 事务组编号,用于 TC 集群名 tx-service-group: ${spring.application.name}-group config: type: nacos nacos: server-addr: ${spring.cloud.nacos.server-addr} group: DEFAULT_GROUP namespace: dev username: ${spring.cloud.nacos.username} password: ${spring.cloud.nacos.password} data-id: seata-server.properties registry: type: nacos nacos: application: qinghe-seata-server server-addr: ${spring.cloud.nacos.server-addr} group: DEFAULT_GROUP username: ${spring.cloud.nacos.username} password: ${spring.cloud.nacos.password} namespace: dev # 关闭自动代理 enable-auto-data-source-proxy: false ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值