当前位置: 首页 > 知识库问答 >
问题:

如何将SpringBoot管理服务器和客户端迁移到一个SpringBoot应用程序中

缪嘉志
2023-03-14

我使用SpringBootAdmin来监视我的springboot应用程序,它非常好。但我需要先启动SpringBoot管理服务器,然后启动包含SpringBoot客户端的应用程序。

有没有办法将Spring Boot服务器包含到我的Spring Boot应用程序中,使它们看起来像一个应用程序,这样我就可以启动我的应用程序,然后服务器启动,客户端注册到服务器。最终目的是我的应用程序在端口8080上运行,而spring boot admin在端口8081上运行。

我已经检查了这个线程:如何在同一个应用程序中运行SpringBootAdmin客户端和服务器,但它不包含任何细节,我无法用可能的解决方案实现。

PS:我知道我可以打包spring boot管理服务器,然后编写开始代码。先启动服务器,然后启动我的应用程序,但这不是一个很好的解决方案。

有人能帮忙吗?

SpringBoot版本:2.3.4。发布Spring启动管理版本:2.3.0

共有3个答案

拓拔曦
2023-03-14

从技术上讲,这应该可以将两者集成到一个应用程序中,但恐怕您很快就会遇到问题。

但是让我们试试看。。。

参考:概念证明GitHub

这种方法的问题:

  • 启动时启动2台服务器:端口8080上的客户端,端口8081上的管理服务器

我们可以使用配置文件来分离多个配置文件,以便利用特定于配置文件的文件

应用程序客户端。性质

server.address=localhost
spring.boot.admin.client.url = http://localhost:8081/
management.endpoints.web.exposure.include = *
management.endpoint.health.show-details= always

spring.application.name=client-app
spring.boot.admin.client.instance.name=client-app

application-admin.properties

server.address=localhost
server.port=8081

人口应用

public class DemoApplication {

    public static void main(String[] args) throws Exception {
        SpringApplication admin = new SpringApplication(DemoAdminServer.class);
        admin.setAdditionalProfiles("admin");
        admin.run(args);

        SpringApplication client = new SpringApplication(DemoClient.class);
        client.setAdditionalProfiles("client");
        client.run(args);
    }
}

@EnableAdminServer
@Configuration
@EnableAutoConfiguration
@Profile("admin")
class DemoAdminServer {

}

@SpringBootApplication
@RestController
@Profile("client")
class DemoClient {

    @GetMapping
    public String hello(){
        return "Hello world!";
    }

}

启动应用程序,我们应该很好。。。

  • 客户端
  • 管理服务器

如果您有两个独立的应用程序,那么在客户端中,您可以通过一个进程启动管理服务器

@SpringBootApplication
public class ClientApplication {

    public static void main(String[] args) throws Exception{
        startAdminServer();
        SpringApplication.run(DemoApplication.class, args);
    }

    static void startAdminServer() throws Exception {
        new ProcessBuilder()
                .redirectErrorStream(true)
                .command("cmd.exe",
                         "/c",
                         "java -jar path_to_your_admin_server.jar")
                .start();
    }
}

松景铄
2023-03-14

一个更简单的解决方案是让应用程序在容器中运行,最好将它们隔离,而不是将它们变成一个整体。

您可以使用docker构建应用程序(https://spring.io/guides/gs/spring-boot-docker/)

基本上,每个应用程序都有一个docker文件,如下所示:

FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

并使用docker compose启动它们

version: '3.7'
services:
  spring-boot-admin:
    image: spring-boot-admin-image
    container_name: spring-boot-admin
    ports:
      - 8081:8081
    healthcheck:
      test: "curl --fail --silent localhost:8081/actuator/health | grep UP || exit 1"
      interval: 20s
      timeout: 5s
      retries: 5
      start_period: 40s

  spring-boot-client:
    image: spring-boot-client-image
    container_name: spring-boot-client
    ports:
      - 8080:8080
    depends_on:
      - spring-boot-admin

Dependes_on将确保您的spring boot客户端在spring boot admin运行正常后启动

西门飞星
2023-03-14

探索spring多模块特性以解决您的用例。

将Spring Boot服务器作为父项目,并将所有Spring Boot客户端项目添加为单个模块。所有这些单独的模块都只是一个Spring Boot应用程序。您可以在任何不同的端口上打包和部署这些单独的模块。

 类似资料:
  • 我正在使用spring boot 2.5.1和Java 11。 我试图在同一个应用程序中创建SpringBoot管理服务器和客户端,但是当我启动它时,控制台中出现以下错误。 裁判:https://github.com/codecentric/spring-boot-admin 错误 未能将应用程序注册为Spring-boot-admin([http://localhost:8085/instanc

  • 我正在探索将java web应用程序移动到Azure应用程序服务的可能性。应用程序on prem在启动时读取属性文件。 是否有可能将属性文件传递或放置到应用服务?如果没有,建议将此类遗留应用程序移动到Azure应用服务?

  • 我想同步2个集合。如果服务器端有什么变化,连接的客户端就会更新。我有一个非常基本的问题。我现在需要复制我的java项目,并在一个项目中编程服务器,在另一个项目中编程客户端吗?但这听起来像是相当多不必要的工作。我不能在一个项目中实现这一切,然后在一个主项目中启动服务器和客户端吗?我需要线程吗?我有点纠结于最好的方法是什么。提前谢谢。

  • 我想把我的项目换成基于spring的产品。 我的第一步是将我的java web应用程序从一个生成的WAR文件转换成一个独立的可执行jar,它由Spring引导驱动。 让我们从GITHUB获取一个开源Web应用示例。vaadinspringweb应用程序 网络。xml文件可以在这里找到。 根上下文文件可以在这里找到。 我希望有一些指导我执行转换。 我还提交了Spring启动项目中的一个问题。

  • 我已经尝试了这篇简单的教程https://spring.io/guides/gs/consource-web-service/,它起作用了。 然后尝试连接到另一个SOAP服务,使用一个附加的和扩展的客户端类。似乎这两个客户机类都使用了相同的-class,这使得我首先添加的一个失败(未知的jaxb-context等)。如何确保客户端类使用正确的-class?

  • 本文向大家介绍Rust 一个简单的TCP客户端和服务器应用程序:echo,包括了Rust 一个简单的TCP客户端和服务器应用程序:echo的使用技巧和注意事项,需要的朋友参考一下 示例 以下代码基于std :: net :: TcpListener上的文档提供的示例。该服务器应用程序将侦听传入的请求并发送回所有传入的数据,从而充当“回显”服务器。客户端应用程序将发送一条小消息,并期望包含相同内容的