V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
t298
V2EX  ›  Java

企业里的前后端是怎么部署的呢?

  •  1
     
  •   t298 · 2023-01-12 10:24:31 +08:00 · 6834 次点击
    这是一个创建于 685 天前的主题,其中的信息可能已经有所发展或是发生改变。

    各位大佬,我现在有两个前后端分离的 java 项目,如果我想模拟企业的实际部署,我是把他们各自打包扔到服务器启动后来访问,还是通过 nginx 来访问呢? A 项目是一个关于地图的项目,打包后会有大量的 js 和 geojson 文件,可能会有十几 M ,项目 B 就是普通的门户网站,两个项目访问量都不是很大,服务器是阿里云的一核 2G ,1M 带宽,从没有部署过项目,还是希望大佬们分享一下经验,感激不尽。

    40 条回复    2023-12-29 12:26:56 +08:00
    xuanbg
        1
    xuanbg  
       2023-01-12 10:26:45 +08:00
    1c2g 的服务器,我就不建议容器化部署了。
    anviod
        2
    anviod  
       2023-01-12 10:29:23 +08:00
    Java 内存大户 2G 部署两个项目勉强够用 单机写 docker-compose 编排即可
    t298
        3
    t298  
    OP
       2023-01-12 10:31:47 +08:00
    @xuanbg
    @anviod 目前只是买来练手的嘛,如果真的需要,可以加配置,需要加到什么程度呢?
    vdrapb
        4
    vdrapb  
       2023-01-12 10:45:02 +08:00
    前端打包丢到 nginx ,后端正常启动服务,2G 应该勉强够用
    wanguorui123
        5
    wanguorui123  
       2023-01-12 10:47:00 +08:00
    npm 打包到 java 到 static 目录映射出去
    RedBeanIce
        6
    RedBeanIce  
       2023-01-12 10:56:09 +08:00
    1 ,简单的,直接 jar 包部署,古老方案,但是现在依旧有很多公司是这么做的,一般情况学这个足够
    这里面有前置知识,java -jar 启动服务的 jvm 知识,npm 启动前端项目
    2 ,复杂的,将两个打包到 docker 直接访问,这里面前置知识是 docker 于 Linux ,(理论上刚入门的话用不到 docker-compose )

    对于楼主来说,我觉得方案 1 ,应该是够用的
    opengps
        7
    opengps  
       2023-01-12 10:58:24 +08:00
    首先来说,前后端必然两个域名(往往是同顶级域名的两个二级域名)
    那就必然部署位为两个 web 项目,其中前端完全是独立资源,这时候可以直接用对象存储发布,因为可以用到更高的带宽,服务器带宽低的场景,速度优化效果很明显
    dwlovelife
        8
    dwlovelife  
       2023-01-12 11:06:26 +08:00
    @opengps 补充一下楼上的,正常情况是楼上说的,但是如果有 cdn ,cdn 的静态资源也要单独部署,这时候就是三个独立资源部署了
    mmmfj
        9
    mmmfj  
       2023-01-12 11:35:13 +08:00
    云服务,docker ,k8s 那套
    duan602728596
        10
    duan602728596  
       2023-01-12 11:46:05 +08:00
    静态资源上 CDN ,部署用的 docker ,k8s 那套,前端服务用 node
    cryboy007
        11
    cryboy007  
       2023-01-12 12:02:38 +08:00
    同一时间打成 docker 镜像 k8s 容器化部署
    SACKJJKLL
        12
    SACKJJKLL  
       2023-01-12 12:33:28 +08:00
    docker
    yrzs
        13
    yrzs  
       2023-01-12 14:17:14 +08:00
    一核 2G docker 都装不上吧
    MaxFang
        14
    MaxFang  
       2023-01-12 14:34:42 +08:00   ❤️ 1
    拿门户网站来讲,nginx 先配置一个 server1 来访问前端项目,前端对于 api 的访问转发到 server2 上。
    nginx 配置 server2 来接收 api 请求,并转发到你 java 后端项目服务上。

    至于项目的具体部署,考虑到模拟企业实际部署情况,我推荐两种。
    1.都不用 docker ,直接实体机安装环境启动服务;
    2.要使用 docker 的话,标准的做法是先把项目打包到镜像里面,推送镜像,然后服务器上拉取镜像启动。
    在 2 的基础上可以考虑上 k8s ,一些构建工具等。
    kiddingU
        15
    kiddingU  
       2023-01-12 14:35:09 +08:00
    就这点资源还上 k8s ,别扯淡了,传统方式运维就行了
    ytmsdy
        16
    ytmsdy  
       2023-01-12 14:42:26 +08:00
    用 Github 上的 Action 功能,只要有代码合并到 main 分支,就自动触发 action ,然后自动部署。
    这样编译的压力都在 Github 上了
    luomao
        17
    luomao  
       2023-01-12 16:01:53 +08:00
    觉得楼上有些回答挺扯得,op 说了 1c2g ,这还能上 k8s 么。模拟企业的实际部署,首先需要确定要模拟那种企业,模拟腾讯阿里这种就别考虑了,1c2g 属实是有点逗。
    1 、仅按目前的描述来看,nginx 作为对外的入口,前端页面和后端服务都走 nginx 转发即可,nginx 在配置上 ssl 证书
    2 、稍微改造版,1M 带宽如果要跑 A 项目恐怕太难了,可以把前端扔到 OSS 上,再加点 CDN ,接口 1M 带宽服务几十并发还是可以
    licoycn
        18
    licoycn  
       2023-01-12 16:09:34 +08:00
    gitea+drone 还是可以实现自动化部署的,对于 1c2g 的环境
    vishun
        19
    vishun  
       2023-01-12 16:36:12 +08:00
    @opengps #7 并不需要两个域名,只前端一个域名就行,部署 nginx ,后端的 api 请求都通过 nginx 反向代理到后端接口上去。这是前后端分离最常用的部署方法。
    helloriver952
        20
    helloriver952  
       2023-01-12 16:43:51 +08:00
    可以试试 coding 阿里的 devops 都有免费额度流水线可以使用
    hhjswf
        21
    hhjswf  
       2023-01-12 16:46:39 +08:00 via Android
    @opengps 蛤?后端还要域名。。
    bitmin
        22
    bitmin  
       2023-01-12 16:46:46 +08:00
    打包完前端代码直接上传到云服务的对象存储,简单设置下域名静态页面等参数可以直接访问

    Java 打包 jar 包扔服务器运行,配置下 nginx 转发,服务器带宽可以设大点,设置成按量收费,流量不大更好用
    opengps
        23
    opengps  
       2023-01-12 16:49:50 +08:00
    @hhjswf #21 前端需要访问后端,后端的 webapi 也是用一个网站形式发布的
    @vishun #19 你这里的方案要求前后端同机器部署,砍掉了自身可以分开部署的优势
    huangdanyu
        24
    huangdanyu  
       2023-01-12 16:53:29 +08:00
    阿里云的云效试试 flow 流水线部署到 oss 上 后端编译发布到云主机上 后端接口配置域名 可使用云解析的 PrivateZone 实现前端调取后端服务 走内网调用 走公网的话带宽太小了
    bl
        25
    bl  
       2023-01-12 17:30:40 +08:00
    通过 nginx 访问。java 直接通过 java -jar 启动, 如果想搞复杂点,可以用 docker 。
    blankmiss
        26
    blankmiss  
       2023-01-12 19:51:56 +08:00
    @yrzs .... 这不随便装
    h0099
        27
    h0099  
       2023-01-12 20:29:24 +08:00
    @opengps nginx 当然可以设置非 localhost 的其他局域网甚至公网 ip upstream server
    http://nginx.org/en/docs/http/ngx_http_upstream_module.html
    http://nginx.org/en/docs/http/ngx_http_proxy_module.html
    因此 nginx 也可以跑在一个独立机器系统上,而前后端跟 nginx 可以有也可以没有物理上的关系(只要能通过网络访问就行)
    那些 load balancer 不就是这种模式
    biguokang
        28
    biguokang  
       2023-01-12 21:02:47 +08:00
    前端代码打包好后,丢阿里云 oos 上,然后配置一个域名就行了,用户就直接访问这个域名,还能加上 cdn ,这样前端加载速度就很快。

    后端代码就部署在云服务器就行了,也配置个域名,前端页面通过这个后端域名访问后端 api 。

    把前端代码也部署在后端不现实,你那个 1m 小水管,也就是理论速度 125kb/s 的出口速度,假设你前端页面加起来 1m 的大小,那用户访问你的页面就需要 8 秒才能加载完成,这还只是一个用户,要是两个用户同时访问那速度就更慢了。


    当年我还是新手的时候,就是前后端都部署到我的云服务器上,也是 1m 的出口带宽,然后我的前端页面大概 2m 多大小,结果我访问的时候要等个半分钟网页在加载完。

    后来把前端页面丢 oos 里了,几秒钟页面就加载好了,就是要按流量算费,也就几毛钱 1g 左右。
    GreatAuk
        29
    GreatAuk  
       2023-01-12 21:56:58 +08:00
    @biguokang 想知道 oss 部署项目有什么局限,比如说并发
    h0099
        30
    h0099  
       2023-01-12 22:08:06 +08:00
    @GreatAuk 他的意思是前后端分离做好后前端就只是一大堆静态资源 htmljscss ,所以这些静态文件随便托管在哪儿都可以只要用户能在访问域名时下载到这些文件
    那么前端静态资源的并发就是看您托管的地方的并发了,而这基本是不用担心的
    因为 oss 和 cdn 服务端所做的不过是去缓存(当然可能 cache miss )里读取一些文件响应而已,也就是 nginx 等 webserver 最擅长的事
    lm930129
        31
    lm930129  
       2023-01-12 22:30:42 +08:00
    这个在不同的公司,不同的情况下,有不同的部署方式,我这里介绍下。
    1 、如果是老的项目,可能是打出来的 war 包,用 Tomcat 来部署,然后就不用 nginx 了,直接端口映射出去。
    2 、像是前后端分离这种项目,前端有用 build 出来后,用 nginx 来对外的,不做容器。也有做成容器,容器里面集成一个 nginx 的,然后外面可能再套娃一个 nginx ;后端可能就直接 java -jar 后来启动了,当然也有打包成容器了,然后启动容器就完事了。
    3 、全部打包成 docker 镜像后,用 k8s 部署的。
    NoirStrike
        32
    NoirStrike  
       2023-01-12 23:01:28 +08:00
    @yrzs #13 小看 docker 了, 0.5g 小鸡 跑 docker 挺稳的
    biguokang
        33
    biguokang  
       2023-01-13 00:16:57 +08:00   ❤️ 1
    @GreatAuk 局限就是要花钱,而且如果有人恶意刷流量的话可能会扣光你的钱。

    至于别的东西就不用担心了,oos 其实就是相当于把你的前端网页托管给阿里云了(类似 github page ),别人加载你的网页是从阿里云加载的,在中间阿里云是怎么处理并发问题的不用你担心。

    而且你可以在设置里勾上 cdn 选项,这样全国各地访问加载你的网页速度就都会很快,如果 cdn 设置里也加了海外 cdn 的话,那国外访问你的网页也很快,就是海外 cdn 流量稍微贵点。


    其实 oss 本质上是可以看作为一个“按流量计费”的网盘,一般用来存贮些静态资源比如视频、图片啥的,然后一般作为图床使用,这样视频图片网页等静态资源都去阿里云请求,不用麻烦你自己的服务器。


    当然这个仅限于前后端分离的项目,如果你用的是 ssr (服务端渲染),那就没法这么干。
    S1ngleton
        34
    S1ngleton  
       2023-01-13 03:09:12 +08:00 via iPhone
    1. 直接物理机器部署
    2. 容器化部署,一个服务部署 n 个 pods


    对于两种部署肯定都是会写部署脚本,ci ,pipeline 自动执行。脚本里包括一些比如跑单测覆盖率,语法检测,部署在服务器上需要的命令(这里面可以包括下载 nginx )不过有些大公司自己就有大前端来做 nginx 的工作,不需要 nginx
    xiang0818
        35
    xiang0818  
       2023-01-13 09:32:54 +08:00
    @opengps 还必然,无语。用一个域名用 nginx 转发就好了。
    opengps
        36
    opengps  
       2023-01-13 09:36:56 +08:00
    @h0099 #27
    @xiang0818 #35
    知道,但这一台 nginx 不是大流量架构里的优选的方案,因为流量过于集中。能增加接入点就不会选择单点承载
    47d7tEUBp521E8fJ
        37
    47d7tEUBp521E8fJ  
       2023-01-13 18:05:46 +08:00
    装个宝塔
    dongci777
        38
    dongci777  
       335 天前
    @opengps 所以为什么要两个域名???
    opengps
        39
    opengps  
       335 天前
    @dongci777 前后端分离,意味着这就是两个独立发布的站点。
    dongci777
        40
    dongci777  
       334 天前
    为什么一定是两个独立的站点?一台服务部署前后端不行?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1769 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 16:37 · PVG 00:37 · LAX 08:37 · JFK 11:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.