Esse método é adequado apenas para projetos menores, como apenas um ou dois servidores, e o arquivo de configuração pode ser modificado diretamente. Por exemplo, o Spring MVC é implantado na forma de pacotes de guerra, e os arquivos de configuração nos recursos podem ser modificados diretamente. Se for um projeto de inicialização do Spring e você deseja usar esse método, você precisa consultar um arquivo editável externo, como um diretório fixo, porque a maioria da inicialização da mola é implantada em pacotes JAR e os arquivos de configuração que você inseriu no pacote não pode ser modificado diretamente. Se for um projeto relativamente grande, é melhor usar um centro de configuração, como Apollo, cônsul, etc. da CTRIP, etc.
Maneira original
O método original refere -se a reembalar e liberar o servidor sempre que você deseja modificar a configuração.
Suponha que usemos o Spring MVC para desenvolver e, após a conclusão do desenvolvimento, formaremos um pacote de guerra e o implantaremos no Tomcat. Se modificarmos um endereço de interface SMS no momento.
Precisamos fazer o seguinte:
1. Abra o arquivo de configuração e modifique as informações de configuração;
2. Compilar e pacote;
3. Pare de Tomcat e exclua o antigo diretório do projeto;
4. Coloque o novo pacote de guerra em WebApps e inicie o Tomcat.
Obviamente, você pode encontrar diretamente o arquivo de configuração deste projeto no Tomcat e modificá -lo, mas também precisa reiniciar o TomCat.
Se você apenas fizer desenvolvimento ou teste, é certamente aceitável ser um pouco de perda de tempo. Então, eu não quero perder tempo ou reiniciar o tomcat, existe alguma maneira? Esta é a virada deste artigo a ser introduzida.
Método WatchService
O Java fornece uma interface de serviço de relógios, que usa o próprio monitor de arquivos do sistema operacional para monitorar diretórios e arquivos. Quando o objeto monitorado mudar, haverá notificações de sinal, para que as alterações possam ser descobertas com eficiência.
O princípio geral deste método é: primeiro, novo monitor (serviço de relógios) de acordo com o sistema operacional, depois selecione o diretório ou arquivo onde o arquivo de configuração a ser monitorado e, em seguida, assine os eventos a serem monitorados, como criar, excluir, editar e finalmente registrar o monitor com o local monitorado. Depois que o evento correspondente ao evento inscrito é acionado, a lógica correspondente é executada.
Vamos começar com o código. Isso está em um projeto MVC da primavera e o diretório de recursos é monitorado.
@RepositoryPublic Class ConfigWatcher {private Static Final Logger Logger = LoggerFactory.getLogger (configwatcher.class); Serviço de relógio estático privado Service de relógios; @PostConstruct public void init () {logger.info ("Iniciar o monitor de arquivo de configuração"); tente {watchService = filesystems.getDefault (). newwatchservice (); Url url = configwatcher.class.getResource ("/"); Caminho do caminho = paths.get (url.touri ()); path.register (WatchService, StandardWatchEventkinds.entry_modify, StandardWatchEventkinds.entry_create); } catch (Exceção E1) {e1.printStackTrace (); } / *** Inicie o thread de monitoramento* / Thread WatchThread = new Thread (new WatchThread ()); watchThread.setDaemon (true); watchThread.start (); / ** Registre -se para fechar o gancho*/ Thread Hook = new Thread (new Runnable () {@Override public void run () {try {watchService.close ();} catch (ioexception e) {e.printStacktrace ();}}}); RUNTime.GetRuntime (). AddShutdownHook (gancho); } public class WatchThread implementa Runnable {@Override public void run () {while (true) {tente {// Tente obter as alterações no pool de monitoramento, se não, aguarde o relógio WatchKey = WatchService.take (); para (WatchEvent <?> Evento: watchKey.pollevents ()) {string editfilename = event.Context (). ToString (); Logger.info (editfilename); /*** Recarregar a configuração*/} watchKey.reset (); // Para concluir o monitoramento, você precisa redefinir o monitor uma vez} Catch (Exceção e) {e.printStackTrace (); }}}}}O código é muito simples e você pode entendê -lo rapidamente. Quando o projeto iniciar, use o FileSystems.getDefault (). NewWatchService () para criar um serviço de relógios, que é baseado no sistema operacional. Em seguida, obtenha o URL do diretório de recursos e pegue o caminho e chame o método do registro do objeto Path, registre o monitor e assine para editar e criar eventos. Os eventos são definidos na classe StandardWatchEventKinds, e existem quatro tipos:
1. StandardWatchEventKinds#Overflow
2. StandardWatchEventKinds#Entry_Create
3. StandardWatchEventKinds#Entry_Delete
4. StandardWatchEventKinds#Entry_modify
Em seguida, um thread de relógio é iniciado separadamente para lidar com a lógica de alteração, e o método Take () é chamado em um pouco de loop infinito até que ocorra uma alteração. Depois que o arquivo de configuração monitoramos as alterações, nossa lógica é chamada para recarregar a configuração. Além disso, após cada alteração, o método WatchKey.Reset () deve ser chamado para redefinir o monitor.
Por fim, você precisa registrar um gancho e pode desligar o monitor quando a JVM estiver fechada.
Com esse método, quando temos algumas alterações de configuração, podemos ir diretamente ao TomCat para modificar o arquivo de configuração e isso pode entrar em vigor sem reiniciar.
Este artigo apresenta principalmente esse método, que também é mencionado acima. Este método é adequado apenas para projetos muito simples. Para projetos em larga escala, é necessário um método mais avançado.
Como configurar o centro
Quando a complexidade do projeto se torna maior, as mudanças de configuração entram em vigor em tempo real, liberação em escala de cinza, dividida em ambientes, configurações de gerenciamento de cluster e mecanismos completos de permissões e auditoria podem se tornar problemas a serem considerados no projeto. No momento, confiar apenas nos arquivos de configuração parecerá incompetente.
Atualmente, os centros de configuração mais usados incluem etcd, zookeeper, desconf, apollo, etc. DiscoNF e Apollo estão prontos para uso, com funções completas e uma interface do suporte. E etcd e zookeeper exigem algum desenvolvimento personalizado.
Os alunos podem escolher de acordo com suas necessidades, e o conteúdo mais detalhado pode ser pesquisado e praticado por eles mesmos.