Làm cách nào để chạy một jar thực thi khởi động mùa xuân trong môi trường Sản xuất?


105

Phương pháp triển khai ưa thích của Spring boot là thông qua tệp jar thực thi có chứa tomcat bên trong.

Nó được bắt đầu với một đơn giản java -jar myapp.jar.

Bây giờ, tôi muốn triển khai jar đó cho máy chủ linux của mình trên EC2, tôi có thiếu thứ gì đó không hay tôi thực sự cần tạo tập lệnh init để khởi động ứng dụng dưới dạng daemon đúng cách?

Nếu tôi chỉ đơn giản gọi java -jarlà ứng dụng chết khi tôi đăng xuất.

Tôi có thể khởi động nó trong màn hình hoặc nohup nhưng điều đó không được thanh lịch lắm và việc khởi động lại trong máy chủ của tôi sẽ buộc tôi phải đăng nhập và bắt đầu quá trình theo cách thủ công.

Vì vậy, có cái gì đó đã cho nhiệm vụ trong khởi động mùa xuân?


1
nohup / màn hình (phương pháp bẩn), init / systemd / mới nổi (phương pháp thích hợp)

@RC Yep, điều mà tôi biết, như tôi đã đề cập, / sbin / init với một tập lệnh tùy chỉnh trong /etc/init.d, sẽ thực hiện công việc, nhưng có thực sự là ý tưởng rằng mọi người nên xây dựng tập lệnh của riêng mình để quản lý daemon (bắt đầu, dừng, khởi động lại, trạng thái)? Cảm thấy như thiếu một cái gì đó trên giải pháp đó.
Cleber Goncalves

Tôi cảm thấy rằng có điều gì đó bị thiếu trong Spring-boot (đó là một dự án thực sự "mới" btw) chỉ cần liên hệ với nhóm phụ trách và đưa ra một đề xuất phát triển.

Chà, nếu bạn tạo một kho lưu trữ chiến tranh, bạn có thể sử dụng phiên bản phân phối của mình trên Tomcat, phiên bản này sẽ có sẵn một tập lệnh init để sử dụng. Mặt khác, nếu bạn sử dụng phương pháp jar thực thi, bạn phải nghĩ ra tập lệnh init tùy chỉnh của riêng mình. Không chắc liệu điều đó có nằm trong phạm vi khởi động hay không, nhưng rõ ràng là nó bị thiếu, điều này hơi kỳ lạ, do đó tôi hỏi trong trường hợp tôi bỏ qua thứ gì đó. Sẽ ping họ.
Cleber Goncalves

Câu trả lời:


96

Xin lưu ý rằng kể từ Spring Boot 1.3.0.M1, bạn có thể tạo các lọ thực thi đầy đủ bằng cách sử dụng Maven và Gradle.

Đối với Maven, chỉ cần đưa những điều sau vào pom.xml:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <executable>true</executable>
    </configuration>
</plugin>

Đối với Gradle, hãy thêm đoạn mã sau vào build.gradle:

springBoot {
    executable = true
}

Bình thực thi đầy đủ có chứa một tập lệnh bổ sung ở phía trước tệp, cho phép bạn chỉ cần liên kết biểu tượng jar Boot Spring của mình với init.dhoặc sử dụng một systemdtập lệnh.

init.d thí dụ:

$ln -s /var/yourapp/yourapp.jar /etc/init.d/yourapp

Điều này cho phép bạn bắt đầu, dừng và khởi động lại ứng dụng của mình như:

$/etc/init.d/yourapp start|stop|restart

Hoặc sử dụng một systemdtập lệnh:

[Unit]
Description=yourapp
After=syslog.target

[Service]
ExecStart=/var/yourapp/yourapp.jar
User=yourapp
WorkingDirectory=/var/yourapp
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

Thông tin thêm tại các liên kết sau:


4
Bạn cũng có thể cần phải làm $ chmod +x /etc/init.d/yourappđể có thể bắt đầu / dừng / khởi động lại
Rohith Nandakumar

Bạn luôn phải cấp quyền cho người dùng dịch vụ của mình để đọc và thực thi tệp jar. Bạn cũng phải định cấu hình Java mặc định cho máy chủ và các biến môi trường Java để mọi thứ hoạt động.
micaro

Điều này không hoạt động! Tôi đã thử và gặp lỗi sau: Không khởi động được MyApp.service: Không tìm thấy đơn vị MyApp.service
Martijn Hiemstra

9

Cho đến nay, cách dễ nhất và đáng tin cậy nhất để chạy các ứng dụng Spring Boot trong sản xuất là với Docker. Sử dụng Docker Compose, Docker Swarm hoặc Kubernetes nếu bạn cần sử dụng nhiều dịch vụ được kết nối.

Đây là một đơn giản Dockerfiletừ hướng dẫn Spring Boot Docker chính thức để giúp bạn bắt đầu:

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD YOUR-APP-NAME.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

Đây là dòng lệnh mẫu để chạy vùng chứa dưới dạng daemon:

docker run \
  -d --restart=always \
  -e "SPRING_PROFILES_ACTIVE=prod" \
  -p 8080:8080 \
  prefix/imagename

3

Ứng dụng khởi động Spring của tôi có hai bộ khởi động. Một để phát triển và một để sản xuất. Để phát triển, tôi sử dụng phương pháp chính như sau:

@SpringBootApplication
public class MyAppInitializer {

    public static void main(String[] args) {
        SpringApplication.run(MyAppInitializer .class, args);
    }

}

Bộ khởi tạo của tôi cho môi trường sản xuất mở rộng SpringBootServletInitializer và trông giống như sau:

@SpringBootApplication
public class MyAppInitializerServlet extends SpringBootServletInitializer{
    private static final Logger log = Logger
            .getLogger(SpringBootServletInitializer.class);
    @Override
    protected SpringApplicationBuilder configure(
            SpringApplicationBuilder builder) {
        log.trace("Initializing the application");
        return builder.sources(MyAppInitializerServlet .class);
    }

}

Tôi sử dụng gradle và tệp build.gradle của tôi áp dụng plugin ' WAR '. Khi tôi chạy nó trong môi trường phát triển, tôi sử dụng tác vụ bootrun . Khi tôi muốn triển khai nó vào sản xuất, tôi sử dụng nhiệm vụ lắp ráp để tạo ra WAR và triển khai.

Tôi có thể chạy như một ứng dụng mùa xuân bình thường trong quá trình sản xuất mà không làm giảm những lợi thế được cung cấp bởi tomcat sẵn có trong khi phát triển. Hi vọng điêu nay co ich.


2

Trong môi trường sản xuất, bạn muốn ứng dụng của mình được khởi động lại khi khởi động lại máy, v.v., tạo tập lệnh /etc/init.d/ và liên kết với runlevel thích hợp để bắt đầu và dừng nó là cách tiếp cận chính xác. Spring Boot sẽ không bao gồm điều này vì nó là một thiết lập dành riêng cho hệ điều hành và có rất nhiều tùy chọn khác, bạn có muốn nó chạy trong một nhà tù chroot không, nó có cần phải dừng / khởi động trước một số phần mềm khác không, v.v.


2

Bạn có thể sử dụng ứng dụng có tên Supervisor . Trong cấu hình trình giám sát, bạn có thể xác định nhiều dịch vụ và cách thực thi giống nhau.

Đối với các ứng dụng khởi động Java và Spring, lệnh sẽ là java -jar springbootapp.jar.

Các tùy chọn có thể được cung cấp để giữ cho ứng dụng luôn chạy. Vì vậy, nếu EC2 khởi động lại thì Người giám sát sẽ khởi động lại ứng dụng của bạn

Tôi thấy Supervisor dễ sử dụng so với việc đặt các tập lệnh khởi động vào /etc/init.d/. Các tập lệnh khởi động sẽ bị treo hoặc chuyển sang trạng thái chờ trong trường hợp có lỗi.


2

Nếu bạn đang sử dụng gradle, bạn chỉ cần thêm nó vào build.gradle

springBoot {
    executable = true
}

Sau đó, bạn có thể chạy ứng dụng của mình bằng cách nhập ./your-app.jar

Ngoài ra, bạn có thể tìm thấy hướng dẫn đầy đủ tại đây để thiết lập ứng dụng của mình như một dịch vụ

56.1.1 Cài đặt dưới dạng dịch vụ init.d (Hệ thống V)

http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html

hoan hô


Trên thực tế, hóa ra nó phải là bootRepackage { executable = true }Xem docs.spring.io/spring-boot/docs/current/reference/html/…
Philippe

2

Trên hệ điều hành Windows không có dịch vụ.

start.bat

@ECHO OFF
call run.bat start

stop.bat:

@ECHO OFF
call run.bat stop

run.bat

@ECHO OFF
IF "%1"=="start" (
    ECHO start myapp
    start "myapp" java -jar -Dspring.profiles.active=staging myapp.jar
) ELSE IF "%1"=="stop" (
    ECHO stop myapp
    TASKKILL /FI "WINDOWTITLE eq myapp"
) ELSE (
    ECHO please, use "run.bat start" or "run.bat stop"
)
pause

1

Tôi khởi động các ứng dụng mà tôi muốn chạy liên tục hoặc ít nhất là bán vĩnh viễn qua màn hình -dmS TÊN / path / to / script. Theo như tôi được thông báo đây là giải pháp thanh lịch nhất.


0

Đây là một cách đơn giản, bạn có thể sử dụng plugin Spring boot maven để hoàn tất việc triển khai mã của mình.

cấu hình plugin như:

<plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <jvmArguments>-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=${debug.port}
                    </jvmArguments>
                    <profiles>
                        <profile>test</profile>
                    </profiles>
                    <executable>true</executable>
                </configuration>
            </plugin>

Và, jvmArtumentslà thêm cho bạn jvm. profilessẽ chọn một hồ sơ để bắt đầu ứng dụng của bạn. executablecó thể làm cho ứng dụng của bạn chạy nhanh.

và nếu bạn thêm mvnwvào dự án của mình, hoặc bạn có một enveriment maven. Bạn chỉ có thể gọi ./mvnw spring-boot:runcho mvnw hoặc mvn spring-boot:runcho maven.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.