Java微服务轻松部署服务器

我们在日常开发微服务之后需要再服务器上面部署,那么如何进行部署呢,先把微服务的各个服务和中间件以及对应的端口列举出来,都打包成镜像,以及前端代码部署的nginx,使用docker-compose启动,访问服务器nginx端口就部署完成了,大致如下

1.首先需要对多个服务进行打成jar包放到服务器上

微服务一般maven文件有一个父类的pom.xml,需要将pom.xml删除在子类加上,不然会找不到主类

XML 复制代码
<packaging>jar</packaging> <!--打包成jar包-->

在maven的插件中配置如下

就是repackage这个配置,父类删除都加到子类中,之后右键maven的选项

点击package进行打包,打包成功之后会显示jar包的路径,可以使用java-jar命令测试能不能跑起来,没出错就可以了

2.制作服务镜像,成功会一个tar的docke镜像包,可转移

将jar包放到linux中/dabaomao/my-images/这个目录中,测试一下java-jar能不能跑

如果需要的话可以加上8080端口访问,镜像内部为映射端口

bash 复制代码
java-jar -Dserver.port=8080 jar包名称

之后在创建一个DockerFile文件,注意没有前缀

cs 复制代码
# 使用一个基础镜像
FROM openjdk:8-jdk-alpine
# 将jar1.jar复制到镜像中的工作目录
# COPY jar1.jar /my-images/jar1.jar 我们已经移到了暂时不需要,注释掉
# 设置工作目录
WORKDIR /dabaomao/my-images
# 暴露端口
EXPOSE 18080
# 设置时区
ENV TZ=Asia/Shanghai
# 运行jar文件
CMD ["java", "-jar", "jar1.jar"]

之后返回/dabaomao目录,执行命令,创建镜像my-image

bash 复制代码
docker build -t my-image:1.0 /dabalmao/my-images/

之后会出现下载进度,成功之后就可以启动镜像容器myjar

bash 复制代码
docker build -t <镜像名称>:<标签> <Dockerfile路径>
docker run -d -p --name myjar 8080:18080 my-image:1.0

注意18080是我们程序的jar包对外的端口,也就是映射端口,是springboot的yml设置的,属于映射端口,需要输入真正端口8080访问,上面java-jar同理

之后使用docker ps查看容器是否存在即可

3.使用docker-compose,同时启动
cs 复制代码
# docker-compose.yml 文件
version: '3'  # 指定 Docker Compose 的版本
# 定义 MySQL 服务
services:
  #自己服务jar包的镜像
  myjar:
    image: my-imgae:1.0 #自定义镜像名称
    container_name: my-mysql # 指定容器的名字
    environment: #设置时区
      - TZ=Asia/Shanghai
    ports:
      - "18080:18080"
    networks: # 指定网络
      - network1 # 将服务连接到network网络上
  mysql:
    # 使用官方的 MySQL 镜像
    image: mysql:5.7
    # 设置环境变量,用于配置 MySQL
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
    container_name: my-mysql # 指定容器的名字
    # 暴露端口 3306,供外部访问
    ports:
      - "3306:3306"
    # 定义数据卷,用于持久化 MySQL 数据库文件
    volumes:
      - mysql_data:/var/lib/mysql
    restart: always # 容器退出时总是重启
    networks: # 指定网络
      - network1 # 将服务连接到network网络上
  redis:
    # 使用官方的 Redis 镜像
    image: redis:latest
    # 暴露端口 6379,供外部访问
    ports:
      - "6379:6379"
    container_name: my-redis # 指定容器的名字
    restart: always # 容器退出时总是重启
    networks: # 指定网络
      - network1 # 将服务连接到network网络上
  nacos:
    # 使用官方的 Nacos 镜像
    image: nacos/nacos-server:latest
    # 暴露端口 8848,供外部访问
    ports:
      - "8848:8848"
    container_name: my-nacos # 指定容器的名字
    restart: always # 容器退出时总是重启
    networks: # 指定网络
      - network1 # 将服务连接到network网络上

# 定义网络,所有服务都使用同一个自定义网络
networks: # 定义网络
  network1: # 定义一个名为network的网络
++注意,启动顺序要先启动依赖配置服务,在启动业务服务,建议写两个docker-compose文件先启动mysql,redis中间件的容器,再启动各个服务,还有就是depends_on:这个只能决定服务启动顺序,不能保证一个服务启动完再启动下一个服务++
4.包含nginx流量网关也可以使用docker部署,可以实现多个端口负载均衡,nginx内部一般用于启动前端代码进行访问

使用run直接期待nginx(不推荐)

bash 复制代码
docker run --name nginx -it -d -p 80:80 nginx:latest /bin/bash

部署前端代码,进入目录conf/nginx.conf,打开这个文件,找到这里

bash 复制代码
server {
    # 前端程序运行端口
    # 注释:前端程序运行端口
    listen       80;
    # 前端程序运行ip
    # 注释:前端程序运行ip
    server_name  localhost;
    # 前端代码,vue使用dist,需要index.html会开头
    # 注释:前端代码,vue使用dist,需要index.html会开头
    root         /usr/share/nginx/html;

    # 加载配置文件以使用默认服务器块。
    # Load configuration files for the default server block.
    # 注释:加载配置文件以使用默认服务器块。
    include /etc/nginx/default.d/*.conf;

    location / {
        proxy_pass http://jar;
        #通过代理转到jar进行负载均衡
    }

    error_page 404 /404.html;
        location = /40x.html {
        # 如果请求的错误页面是404,则返回404.html文件。
        # 如果请求的错误页面是40x.html,则不做任何处理。
        # 注释:如果请求的错误页面是404,则返回40x.html文件。
        # 如果请求的错误页面是50x.html,则不做任何处理。
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        # 如果发生5xx错误,例如500内部服务器错误,则返回50x.html文件。
        # 如果请求的错误页面是50x.html,则不做任何处理。
        # 注释:如果发生错误,例如内部服务器错误,则返回5xx.html文件。
    }
}
Upstream jar{
#负载均衡
    server 192.168.30.137:18080
    server 192.168.30.137:18081
}

这样就绑定成功了,前端端口为80,可以访问后端18080和18081的端口api,并是轮训的方式

不只是轮训,权重的话如下,修改完成后记得重启

cs 复制代码
Upstream jar{
#负载均衡
#后端服务端口
    server 192.168.30.137:18080 weight=10
    server 192.168.30.137:18081 weight=5
#根据概率权重为2:1
}

之后再docker-compose启动的时候也加上

cs 复制代码
# docker-compose.yml 文件
version: '3'  # 指定 Docker Compose 的版本

# 定义 Nginx 服务
services:
  nginx:
    # 使用官方的 Nginx 镜像
    image: nginx:latest
    # 设置容器的工作目录
    working_dir: /usr/share/nginx/html
    # 暴露端口 80,供外部访问
    container_name: nginx # 指定容器的名字
    ports:
      - "80:80"
    # 定义数据卷,用于持久化 Nginx 配置和静态文件
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro  # 宿主机上的 nginx.conf 文件
      - ./html:/usr/share/nginx/html:ro         # 宿主机上的 HTML 目录

    restart: on-failure # 容器退出时,如果是因为错误导致的,则重启容器

    restart: always # 总是在容器退出时重启容器
    
    networks: # 指定网络
      - network1 # 将服务连接到network网络上

networks: # 定义网络
  network1: # 定义了一个名为network的网络

之后nginx进行扩容gateway的地址,访问nginx的对外端口即可

大致就这些环节了,如果服务部署在多个服务器那么需要使用k8s进行集中管理,哪个环节出错可以使用gpt或者博客了解

相关推荐
狂放不羁霸19 分钟前
idea | 搭建 SpringBoot 项目之配置 Maven
spring boot·maven·intellij-idea
wowocpp19 分钟前
ubuntu 22.04 server 格式化 磁盘 为 ext4 并 自动挂载 LTS
服务器·数据库·ubuntu
九圣残炎20 分钟前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
wclass-zhengge22 分钟前
Netty篇(入门编程)
java·linux·服务器
方方怪28 分钟前
与IP网络规划相关的知识点
服务器·网络·tcp/ip
成富42 分钟前
文本转SQL(Text-to-SQL),场景介绍与 Spring AI 实现
数据库·人工智能·sql·spring·oracle
计算机学长felix1 小时前
基于SpringBoot的“校园交友网站”的设计与实现(源码+数据库+文档+PPT)
数据库·spring boot·毕业设计·交友
Re.不晚1 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
雷神乐乐1 小时前
Maven学习——创建Maven的Java和Web工程,并运行在Tomcat上
java·maven
码农派大星。1 小时前
Spring Boot 配置文件
java·spring boot·后端