根据本人实际项目需要(spring cloud项目)很多组一起开发,本项目两套环境,由于种种原因没有办法做到数据库动态切换,需要人工收到手动切换,如果一个服务一个服务启启动太来浪费时间。
数据连接信息统一配置到spring cloud config配置中心,有配置中心管理。
开发了一个简单的一键启动功能,写一个公共的包,具体如下:
pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
具体实现代码:
@Endpoint(id = "reboot") @Component @ConfigurationProperties(prefix ="spring") public class ApplicationContextUtil implements ApplicationContextAware { @Autowired private ApplicationArguments applicationArguments; private static ConfigurableApplicationContext context; private static Class str; public static Class getStr() { return str; } public static void setStr(Class str) { ApplicationContextUtil.str = str; } @ReadOperation public String restart(@Selector String name) { if(!name.equals("tjkab") || str == null){ return "重启失败"; } Thread restartThread = new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1000); context.close(); context = SpringApplication.run(str,applicationArguments.getSourceArgs()); } catch (InterruptedException ignored) { return; } } }); restartThread.setDaemon(false); restartThread.start(); return "重启成功"; } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { if (applicationContext instanceof ConfigurableApplicationContext) { this.context = (ConfigurableApplicationContext) applicationContext; } } }
说明:@Endpoint配置一个端点
需要通过http重启服务的项目,都引入这个包,在启动类中将启动类传入这个包中
这样就是配置好了,接下来就是通过监控端点进行启动
红色部分就是http访问地址,http://ip:port/actuator/reboot/{name} 访问你自己的地址,就可以看到服务正在重新启动。
附加:
如果你有多个服务可以写一个功能,从注册中心获取到所有势力的IP地址,一起访问,如果配置重启服务这个包,就重启。如果没有配置就访问失败。
@RestController public class RebootController { RestTemplate restTemplate = new RestTemplate(); @Autowired private DiscoveryClient discoveryClient; @GetMapping("/reboot/service") public Map<String,String> rebootService(){ List<String> list = this.findServiceUrl(); Map<String,String> map = new HashMap<>(); for(String str : list){ String result = ""; try{ result = restTemplate.getForObject(str,String.class); map.put(str,result); }catch (Exception e){ //e.printStackTrace(); map.put(str,e.getMessage()); } } return map; } public List findServiceUrl() { List<String> msl = new ArrayList<String>(); List<String> services = discoveryClient.getServices(); for (String service : services) { List<ServiceInstance> sis = discoveryClient.getInstances(service); for(ServiceInstance serviceInstance : sis){ msl.add(serviceInstance.getUri()+"/actuator/reboot/tjkab"); } } return msl; } }