Spring boot 2.0 消息总线(Spring Cloud Bus) 高可用分布式配置中心 实例
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring boot 2.0 消息总线(Spring Cloud Bus) 高可用分布式配置中心 实例相关的知识,希望对你有一定的参考价值。
参考技术A 配置中心的客户端要使用bootstrap.ymlbootstrap.yml优先于 application.yml 加载 即 bootstrap.yml加载完后才加载 application.yml
在需要更新的配置类上加@RefreshScope注解,@RefreshScope必须加,否则客户端会收到服务端的更新消息,但是更新不了,因为不知道更新哪里的。
18082: 是统一配置中心的端口
/auth-server/dev 对应远程配置文件的auth-server-dev.yml
/name-profiles.yml
/label/name-profiles.yml
name : 文件名,一般以服务名来命名
profiles : 一般作为环境标识
lable : 分支(branch),指定访问某分支下的配置文件
业务微服端的测试接口: http://127.0.0.1:18088/test
修改配置文件并提交到git上
我们发现再不重启服务的情况下就能获取到修改的属性值
只要开启 Spring Cloud Bus 后,不管是对 config-server 还是 config-client 执行/actuator/bus-refresh都是可以更新配置的,
如果有多个客户端,多个客户端都会接收到刷新配置的消息,并刷新配置。
某些场景下(例如灰度发布),我们可能只想刷新部分微服务的配置,此时可通过/actuator/bus-refresh/destination端点的 destination 参数来定位要刷新的应用程序。例如:/actuator/bus-refresh/customers:8000,这样消息总线上的微服务实例就会根据 destination 参数的值来判断是否需要要刷新。其中,customers:8000指的是各个微服务的 ApplicationContext ID。destination 参数也可以用来定位特定的微服务。例如:/actuator/bus-refresh/customers:**,这样就可以触发 customers 微服务所有实例的配置刷新。
远程配置文件修改后,不需要手动调用 http://localhost:18088/actuator/bus-refresh 即可刷新配置
选择Just the push event.,因为我们只需要push的时候进行回调,然后添加即可
每当我们更新远程配置文件后,push到git后,就会触发Payload URL(配置的是访问刷新配置的地址)
(转)Spring Boot
(二期)4、springboot的综合讲解
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions><!-- Exclude the Tomcat dependency -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency><!-- Use Jetty instead -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
@SpringBootApplication
public class SpringBootDeepinApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDeepinApplication.class, args);
}
}
SpringApplication application = new SpringApplication(SpringBootDeepinApplication.class);
#加载Spring.favorites中ApplicationContextInitializer的配置类
this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
#加载Spring.favorites中ApplicationListener的配置类
this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
#配置加载器,包括注解配置或xml配置
BeanDefinitionLoader
框架实现
Spring Framework
Spring Boot
Spring Cloud
1、基于注解驱动实现,可参考@EnableWebMvc注解
第一步
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({SayHelloWorldConfiguration.class})
public @interface EnableSayHelloWorld {
}
第二步
//@Configuration
public class SayHelloWorldConfiguration {
@Bean
SayHelloWorld sayHelloWorld() {
System.out.println("here to loading bean sayhelloworld!");
return new SayHelloWorld();
}
}
//需要初始化的bean
public class SayHelloWorld {
public String say() {
return "hello world";
}
}
第三步
@EnableSayHelloWorld
@SpringBootApplication
public class SpringBootDeepinApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDeepinApplication.class, args);
}
}
2、基于接口驱动实现,参考@EnableCaching注解
第一步、
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({HelloWorldImportSeletor.class})
public @interface EnableSeletorHelloWorld {
String model() default "first";
}
第二步、
public class HelloWorldImportSeletor implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
//获取注解上的属性的值
Map<String, Object> annotationAttributes = annotationMetadata.getAnnotationAttributes(EnableSeletorHelloWorld.class.getName());
String model = (String) annotationAttributes.get("model");
System.out.println(model);
//可以返回多个加载的配置或bean
return new String[]{SayHelloWorldConfiguration.class.getName()};
}
}
1、注解方式
2、编程方式
第一步
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Conditional({OnSystemPropertyCondition.class})
public @interface ConditionalOnSystemProperty {
String value();
}
public class OnSystemPropertyCondition implements Condition {
/**
* 判断是否满足条件
* @param conditionContext
* @param annotatedTypeMetadata 注解的元信息
* @return
*/
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
Map<String, Object> attrs = annotatedTypeMetadata.getAnnotationAttributes(ConditionalOnSystemProperty.class.getName());
String system = String.valueOf(attrs.get("value"));
String currentOs = System.getProperty("os.name");
return currentOs.endsWith(system);
}
}
@ConditionalOnSystemProperty(value = "linux")
Java SPI是什么?
Java SPI的约定
SpringBoot中的SPI机制
理念
装配
步骤
加载类SpringFactoriesLoader说明:
配置文件META-INF/spring.factories说明:
@Configuration
@ConditionalOnWebApplication(
type = Type.SERVLET
)
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
@AutoConfigureOrder(-2147483638)
@AutoConfigureAfter({DispatcherServletAutoConfiguration.class, ValidationAutoConfiguration.class})
public class WebMvcAutoConfiguration {
...
}
第一步
@Configuration
@ConditionalOnSystemProperty(value = "Windows 10")
@EnableSeletorHelloWorld
public class SayHelloWorldAutoConfiguration {
@Bean
SayHelloWorld autoSayHelloWorld() {
System.out.println("here to !!auto!! loading bean autoSayHelloWorld!");
return new SayHelloWorld();
}
}
第二步
# Auto Configure 自动装配自定义的配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
com.other.configuration.SayHelloWorldAutoConfiguration
以上是关于Spring boot 2.0 消息总线(Spring Cloud Bus) 高可用分布式配置中心 实例的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 揭秘与实战 服务器篇 - 其他内嵌服务器 发表于 2017-01-03 | Spring框架 | Spri