【问题标题】:How to migrate spring boot admin server and client into one spring boot application如何将 Spring Boot 管理服务器和客户端迁移到一个 Spring Boot 应用程序中
【发布时间】:2021-03-20 12:35:11
【问题描述】:

我正在使用 spring boot admin 来监控我的 springboot 应用程序,它非常好。但是我需要先启动 Spring Boot 管理服务器,然后启动包含 Spring Boot 客户端的应用程序。

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

我已经检查了这个帖子:How to run spring boot admin client and server in same application,但它不包含任何细节,我无法用可能的解决方案来实施。

PS:我知道我可以打包spring boot admin server,然后写start.sh,先启动server再启动我的应用,但这不是一个很好的解决方案。

有人可以帮忙吗?

SpringBoot 版本:2.3.4.RELEASE Spring Boot Admin 版本:2.3.0

【问题讨论】:

    标签: java spring-boot spring-boot-admin


    【解决方案1】:

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

    但是让我们试一试...

    参考: 概念证明GitHub

    这种方法的问题:

    • 在启动时启动 2 个服务器:client 端口 8080 和 admin-server 端口 8081
    • 客户端和服务器应该有单独的配置

    让我们从配置开始

    我们可以使用profile 分隔多个配置,这样我们就可以利用Profile Specific Files

    application-client.properties

    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
    

    使用正确的配置文件启动服务器和客户端。

    DemoApplication

    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!";
        }
    
    }
    

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


    如果您有两个单独的应用程序,那么在您的client 中,您可以通过一个进程启动admin-server

    @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();
        }
    }
    

    【讨论】:

    • 改进的答案:使用配置文件来分隔配置
    【解决方案2】:

    探索 spring 多模块功能以解决您的用例。

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

    【讨论】:

      【解决方案3】:

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

      您可以使用 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
      

      depends_on 将确保您的 spring-boot-client 在 spring-boot-admin 健康后启动

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-21
        • 1970-01-01
        • 1970-01-01
        • 2019-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-07
        相关资源
        最近更新 更多