Java微服务轻松部署服务器

news2025/1/9 23:38:14

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

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

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

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

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

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

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

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

java-jar -Dserver.port=8080 jar包名称

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

# 使用一个基础镜像
FROM openjdk:8-jdk-alpine
# 将jar1.jar复制到镜像中的工作目录
COPY jar1.jar /jar/jar1.jar
# 设置工作目录
WORKDIR /jar
# 暴露端口
EXPOSE 18080
# 设置时区
ENV TZ=Asia/Shanghai
# 运行jar文件
CMD ["java", "-jar", "jar1.jar"]

之后返回/dabaomao目录,执行命令

docker build jar1 -t jar1:v1

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

docker run -d -p --name myjar 8080:18080 jar1:v1

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

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

3.使用docker-compose,同时启动
# docker-compose.yml 文件

version: '3'  # 指定 Docker Compose 的版本

# 定义 MySQL 服务
services:
  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文件,还有就是depends_on:这个只能决定服务启动顺序,不能保证一个服务启动完再启动下一个服务
4.包含nginx流量网关也可以使用docker部署,可以实现多个端口负载均衡,nginx内部一般用于启动前端代码进行访问
docker run --name nginx -it -d -p 80:80 nginx:latest /bin/bash

进入目录conf/nginx.conf,打开这个文件,找到这里

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,并是轮训的方式

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

Upstream jar{
#负载均衡
    server 192.168.30.137:18080 weight=10
    server 192.168.30.137:18081 weight=5
#根据概率权重为2:1
}

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

# 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或者博客了解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1520377.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系统重构后,对项目定制开发的兼容性问题

公司自实施产品线战略以来,基本推翻了全部旧有业务模块。后续以标准产品二次开发的模式进行项目开发。但在涉及到一些旧有系统二期、三期升级改造过程中。不可避免的需要解决旧有系统的客户定制化开发兼容性问题。也就是旧有系统定制开发的模块不能丢弃。重新开发从…

C++Qt学习——QPushButton、QRadioButton(单选按钮)、QCheckBox(复选按钮)

目录 1、QPushButton 1.1、创建一个新的项目,转到UI界面拖一个Push Button 1.2、Push Button的常用信号主要有四个,分别为 clicked(), pressed(), released(), toggled() 1.2.1、按住Push Button右键转到槽,选择信号函数 1.2.2、在Widget…

国创证券|资源再生概念持续活跃,超越科技两连板,大地海洋等走高

资源再生概念15日盘中再度走强,截至发稿,超越科技涨停斩获两连板,深水海纳涨超14%,大地海洋涨超12%,华新环保涨近9%,天奇股份、格林美、怡球资源等涨超5%。 消息面上,3月13日,国务院…

解决jsp request.getParameter乱码问题(兼容Tomcat 6~8三个版本)

JSP页面写法&#xff1a; <% page contentType"text/html; charsetutf-8" language"java" %> <% page import"java.io.*" %> <%! int getServerVersion(HttpServletRequest request) {ServletContext application request.getS…

前端组件化:构建高效应用的艺术

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

LeetCode每日一题——两数之和

两数之和OJ链接&#xff1a;1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 思路&#xff1a; 在读懂题目后很多人觉得这种题目很简单&#xff0c;但是不管怎么写&#xff0c;在VS等其他编译器上能跑成功&#xff0c;但是在LeetCode上就是没办法通过。…

Learn OpenGL 08 颜色+基础光照+材质+光照贴图

我们在现实生活中看到某一物体的颜色并不是这个物体真正拥有的颜色&#xff0c;而是它所反射的(Reflected)颜色。物体的颜色为物体从一个光源反射各个颜色分量的大小。 创建光照场景 首先需要创建一个光源&#xff0c;因为我们以及有一个立方体数据&#xff0c;我们只需要进行…

【论文阅读笔记】Attention Is All You Need

1.论文介绍 Attention Is All You Need 2017年 NIPS transformer 开山之作 回顾一下经典&#xff0c;学不明白了 Paper Code 2. 摘要 显性序列转导模型基于包括编码器和解码器的复杂递归或卷积神经网络。性能最好的模型还通过注意力机制连接编码器和解码器。我们提出了一个新…

Redis部署方式(三)主从模式

在前面单机版的基础上&#xff0c;41为主&#xff0c;30为从。 一、主从搭建 1、主Redis安装 41机器redis主要配置 requirepass redis#!_41 bind 0.0.0.0 port 6379 daemonize yes 2、从redis安装 30机器redis主要配置 requirepass redis#!_30 bind 0.0.0.0 port 6380 da…

Oracle 部署及基础使用

1. Oracle 简介 Oracle Database&#xff0c;又名 Oracle RDBMS&#xff0c;简称 Oracle Oracle系统&#xff0c;即是以Oracle关系数据库为数据存储和管理作为构架基础&#xff0c;构建出的数据库管理系统。是目前最流行的客户/服务器&#xff08;client/server&#xff09;或…

关于Transfomer的思考

为何诞生 在说transformer是什么&#xff0c;有什么优势之类的之前&#xff0c;先谈一谈它因何而诞生。transformer诞生最重要的原因是早先的语言模型&#xff0c;比如RNN&#xff0c;由于其本身的训练机制导致其并行度不高&#xff0c;特别是遇到一些长句子的情况下。其次&…

面试题手撕篇

参考博客 开始之前&#xff0c;理解递归 手写 浅拷贝 function shallow(target){if(target instanceof Array){return [...resObj]}else{return Object.assign({},target);} }手写深拷贝 const _sampleDeepClone target > {// 补全代码return JSON.parse(JSON.stringify…

深度学习神经网络训练环境配置以及演示

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础教程 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 目录 1 NVIDIA Dr…

Flink源码解析(1)TM启动

首先在看之前,回顾一下akka模型: Flink通讯模型—Akka与Actor模型-CSDN博客 注:ActorRef就是actor的引用,封装好了actor 下面是jm和tm在通讯上的概念图: RpcGateway 用于定义RPC协议,是客户端和服务端沟通的桥梁。服务端实现了RPC协议,即实现了接口中定义的方法,做具…

云原生(二)、Docker基础

Docker Docker 是一种开源的容器化平台&#xff0c;用于开发、部署和运行应用程序。它允许开发者将应用程序及其所有依赖项打包到一个可移植的容器中&#xff0c;这个容器可以在任何支持 Docker 的环境中运行&#xff0c;无论是开发人员的个人笔记本电脑、测试环境、生产服务器…

逆序对的数量 刷题笔记

思路 使用归并排序 在每次返回时 更新增加答案数 因为归并排序的两个特点 第一 使用双指针算法 第二 层层返回 从局部有序合并到整体有序 例如 {4 &#xff0c;1 &#xff0c;2 &#xff0c;3} 划分到底层是四个数组 {4}&#xff0c;{1}&#xff0c;{3}, {…

Java项目:54 springboot工资信息管理系统453

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本系统的使用角色可以被分为用户和管理员&#xff0c; 用户具有注册、查看信息、留言信息等功能&#xff0c; 管理员具有修改用户信息&#xff0c;发…

k8s部署hadoop

&#xff08;作者&#xff1a;陈玓玏&#xff09; 配置和模板参考helm仓库&#xff1a;https://artifacthub.io/packages/helm/apache-hadoop-helm/hadoop 先通过以下命令生成yaml文件&#xff1a; helm template hadoop pfisterer-hadoop/hadoop > hadoop.yaml用kube…

《操作系统实践-基于Linux应用与内核编程》第10章-Linux综合应用

前言: 内容参考《操作系统实践-基于Linux应用与内核编程》一书的示例代码和教材内容&#xff0c;所做的读书笔记。本文记录再这里按照书中示例做一遍代码编程实践加深对操作系统的理解。 引用: 《操作系统实践-基于Linux应用与内核编程》 作者&#xff1a;房胜、李旭健、黄…

vue3+ts动态表单渲染,antd的useForm改造

let fieldList: any getFormFields(fieldInfo.coreNavigationList[0].list[0].list,fieldInfo.positionCodeRespVO,isCanBeUpdateProcess.value,isDetail.value 1); fieldInfo数据格式&#xff1a; {"name": "默认模板","status": "ENA…