@RefreshScope和@FeignClient

@RefreshScope和@FeignClient,第1张

目录

@RefreshScope

@FeignClient


@RefreshScope

第一步使用@RefreshScope第一步从maven仓库引入jar包


    org.springframework.cloud
    spring-cloud-starter-config



    org.springframework.boot
    spring-cloud-starter-actuator

也可以直接在Bean的配置中心(也就是@Configuration注解的类)写注解

@RefreshScope
@Bean
public DistributeIdCofig distributeIdCofig(){
    return new DistributeIdCofig();
}

第二步配置文件 

distributed-id是自定义需要动态部署的配置文件。

distributed-id:
    datacenter: 1
    mechineId: 5


#management:是暴露refresh接口,不加此条配置将无法启用动态加载配置文件的功能

management:
    endpoints:
        web:
          exposure:
            include: "*"


第三步:

编写自定义配置文件的Java对象,一定要加上 @RefreshScope注解

@Data
@RefreshScope
@ConfigurationProperties(prefix="distribute-id")
@Component
public class A{
    private long A;
    private long B;
}

编写controller时,也一定要加@RefreshScope注解,不加无法运行 

原因:@RefreshScope not working - Spring Boot - Stack Overflow(栈溢出)

 用途

在使用动态配置刷新的我们要配置一个@RefreshScope 在类上才可以实现对象属性的的动态更新

实现@RefreshScope 动态刷新的就需要以下几个:

  • @ Scope   
  • @RefreshScope
  • RefreshScope       
  • GenericScope   
  • Scope
  • ContextRefreshe

@Scope

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package org.springframework.context.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Scope {
    @AliasFor("scopeName")
    String value() default "";

    @AliasFor("value")
    String scopeName() default "";

    ScopedProxyMode proxyMode() default ScopedProxyMode.DEFAULT;
}

 @RefreshScope实现原理:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Scope("refresh")
@Documented
public @interface RefreshScope {
    ScopedProxyMode proxyMode() default ScopedProxyMode.TARGET_CLASS;
}

作用:

需要动态刷新的类标注@RefreshScope 注解

@RefreshScope 注解标注了@Scope 注解,并默认了ScopedProxyMode.TARGET_CLASS; 属性,此属性的功能就是在创建一个代理,在每次调用的时候都用它来调用GenericScope get 方法来获取对象

如属性发生变更会调用 ContextRefresher refresh() -》RefreshScope refreshAll() 进行缓存清理方法调用,并发送刷新事件通知 -》 GenericScope 真正的 清理方法destroy() 实现清理缓存

在下一次使用对象的时候,会调用GenericScope get(String name, ObjectFactory objectFactory) 方法创建一个新的对象,并存入缓存中,此时新对象因为Spring 的装配机制就是新的属性了。

@FeignClient
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package org.springframework.cloud.netflix.feign;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FeignClient {
    @AliasFor("name")
    String value() default "";

    /** @deprecated */
    @Deprecated
    String serviceId() default "";

    //name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现
    @AliasFor("value")
    String name() default "";  

    //
    String qualifier() default "";

    // url: url一般用于调试,可以手动指定@FeignClient调用的地址
    String url() default "";

    //decode404:当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException
    boolean decode404() default false;

    //configuration: Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract
    Class[] configuration() default {};

    //fallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口
    Class fallback() default void.class;

    //fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码
    Class fallbackFactory() default void.class;

    //path: 定义当前FeignClient的统一前缀
    String path() default "";

    //是否将伪代理标记为主Bean,默认为true
    boolean primary() default true;
}

 服务调用

来源:网上资源

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/723923.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存