目录
@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;
}
服务调用
来源:网上资源
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)