View Javadoc
1   package cn.home1.oss.environment.admin;
2   
3   import de.codecentric.boot.admin.config.AdminServerProperties;
4   import de.codecentric.boot.admin.config.EnableAdminServer;
5   import de.codecentric.boot.admin.registry.StatusUpdater;
6   import de.codecentric.boot.admin.registry.store.ApplicationStore;
7   import de.codecentric.boot.admin.web.client.ApplicationOperations;
8   
9   import lombok.extern.slf4j.Slf4j;
10  
11  import org.springframework.beans.factory.annotation.Autowired;
12  import org.springframework.boot.SpringApplication;
13  import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
14  import org.springframework.boot.autoconfigure.SpringBootApplication;
15  import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
16  import org.springframework.boot.context.properties.EnableConfigurationProperties;
17  import org.springframework.boot.web.client.RestTemplateBuilder;
18  import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
19  import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
20  import org.springframework.context.ApplicationContext;
21  import org.springframework.context.ApplicationListener;
22  import org.springframework.context.annotation.Bean;
23  import org.springframework.context.annotation.Configuration;
24  import org.springframework.context.annotation.Primary;
25  import org.springframework.context.event.ContextRefreshedEvent;
26  import org.springframework.core.env.Environment;
27  import org.springframework.http.HttpStatus;
28  import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
29  import org.springframework.web.client.DefaultResponseErrorHandler;
30  import org.springframework.web.client.RestTemplate;
31  
32  import cn.home1.oss.boot.autoconfigure.AppProperties;
33  import cn.home1.oss.lib.common.crypto.Cryptos;
34  import cn.home1.oss.lib.common.crypto.EncodeDecryptor;
35  import cn.home1.oss.lib.common.crypto.KeyExpression;
36  
37  @Configuration
38  @EnableAutoConfiguration
39  @EnableAdminServer
40  @EnableDiscoveryClient
41  @EnableZuulProxy
42  @EnableConfigurationProperties(value = {AppProperties.class})
43  @SpringBootApplication
44  @Slf4j
45  public class AdminApplication implements ApplicationListener<ContextRefreshedEvent> {
46  
47    @Autowired
48    private Environment environment;
49  
50    @Autowired
51    private ApplicationContext applicationContext;
52  
53    @Autowired
54    private ApplicationOperations applicationOperations;
55  
56    @Autowired
57    private AdminServerProperties adminServerProperties;
58  
59    @Autowired
60    private ApplicationStore applicationStore;
61  
62    public static void main(final String[] args) {
63      SpringApplication.run(AdminApplication.class, args);
64    }
65  
66    @Bean
67    @ConditionalOnMissingBean
68    public ClientKeyStore clientKeyStoreListener() {
69      return new ClientKeyStore();
70    }
71  
72    @Bean
73    public BasicAuthFilter basicAuthFilter() {
74      return new BasicAuthFilter();
75    }
76  
77    @Bean
78    public PostFilterForClientInfo postFilterForClientInfo() {
79      return new PostFilterForClientInfo();
80    }
81  
82    @Bean
83    public RestTemplate restTemplate(final RestTemplateBuilder builder) {
84      return builder.build();
85    }
86  
87    @Bean
88    public EncodeDecryptor decryptor() {
89      final String adminPrivateKey = this.environment.getProperty("app.adminPrivateKey");
90      return Cryptos.decryptor(new KeyExpression(adminPrivateKey));
91    }
92  
93    @Primary
94    @Bean
95    @ConditionalOnMissingBean
96    public StatusUpdater statusUpdater() {
97  
98      log.info("Registering patched version of de.codecentric.boot.admin.registry.StatusUpdates");
99  
100     final RestTemplate restTemplate = new RestTemplate();
101     restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
102     restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
103       @Override
104       protected boolean hasError(final HttpStatus statusCode) {
105         return false;
106       }
107     });
108 
109     final StatusUpdater statusUpdater = new PatchedStatusUpdater(this.applicationStore, this.applicationOperations, restTemplate);
110     statusUpdater.setStatusLifetime(this.adminServerProperties.getMonitor().getStatusLifetime());
111 
112     return statusUpdater;
113   }
114 
115   @Override
116   public void onApplicationEvent(final ContextRefreshedEvent event) {
117     final PatchedStatusUpdater statusUpdater = (PatchedStatusUpdater) this.applicationContext.getBean("statusUpdater");
118     statusUpdater.setActive(true);
119   }
120 }