SpringBoot进阶之服务部署
SpringBoot进阶之服务部署前言
大家好,一直以来我都本着用最通俗的话理解核心的知识点, 我认为所有的难点都离不开 「基础知识」 的铺垫。目前正在出一个SpringBoot 长期系列教程,从入门到进阶, 篇幅会较多~ 适合人群学完Java基础 想通过Java快速构建web应用程序 想学习或了解SpringBoot SpringBoot进阶学习
「大佬可以绕过 ~」 背景
如果你是一路看过来的,很高兴你能够耐心看完。之前带大家学了 Springboot 基础部分,对基本的使用有了初步的认识, 接下来的几期内容将会带大家进阶使用,会先讲解基础中间件 的使用和一些场景的应用,或许这些技术你听说过,没看过也没关系,我会带大家一步一步的入门,耐心看完你一定会有收获 ~ 情景回顾
前几期呢,带大家学习了 SpringBoot 的进阶教程。当我们的代码写好了,需要发布到服务器上给用户访问,这期将带大家快速的部署我们的Java 应用服务, 同样的,我们集成到Springboot 中。 分环境打包
发布之前,最重要的事情是需要我们去打包我们的程序,这样服务器才能够运行它。打包之前呢,教大家先把本地的环境区分好,先修改 pom.xml , 在build 下加入如下配置 dev true dev prod prod
刷新一下,我们会发现右侧 Maven 展开后多了一个配置文件 ,展开后它是一个单选,这就是我们的环境配置文件,选哪个代表打的包是哪个环境下的。
还需要做一件事情就是和我们的 SpringBoot 配置进行关联: spring: profiles: active: @profile.active@
@profile.active@ 这个值就是动态去获取的,它可以是通过我们刚刚配置的配置文件 里的值,还有就是可以通过命令行 参数去获取, 下面我们只需要分开建立配置文件即可, 命名方式 application-${profile}.yml , 这样一来,我们application.yml 中的配置可以拆到外边了,只需要保留公共部分, 一般情况下我们做配置区分实际上大部分都是对数据源,服务端端口,请求前缀等 做区分,数据源比如mysql,redis 等等 application.yml spring: profiles: active: @profile.active@ mybatis: mapper-locations: - classpath:mapper/*.xml configuration: cache-enabled: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl application-dev.yml server: port: 8878 # 设置应用端口,默认是8080 tomcat: max-threads: 800 uri-encoding: UTF-8 servlet: context-path: /dev-api spring: application: name: app-shiro datasource: url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true username: root password: xxxx redis: host: localhost # Redis服务器地址 database: 1 # Redis数据库索引(默认为0) port: 6379 # Redis服务器连接端口 password: # Redis服务器连接密码(默认为空) application-prod.yml server: port: 8888 # 设置应用端口,默认是8080 tomcat: max-threads: 800 uri-encoding: UTF-8 servlet: context-path: / spring: application: name: app-shiro datasource: url: jdbc:mysql://xxx.xxx.xxx.xxx:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true username: xxx password: xxxxxxx redis: host: xxxxx # Redis服务器地址 database: x # Redis数据库索引(默认为0) port: 6379 # Redis服务器连接端口 password: xxxx # Redis服务器连接密码(默认为空) 编译Jar包
我们部署方式以 Jar 包为主,下面我们就去编译它,借助idea 工具我们很方便的就可以打包了,点击右侧Maven , 然后点击生命周期 , 我们先双击clean ,然后双击install ,这样就可以了,控制台会有打包信息,出现SUCCESS 代表成功了,那么编译后的产物在哪呢, 在对应模块下的target 文件夹下, 它有一个.jar 后缀的文件,那个就是我们的jar 包了 服务部署
下面,就教大家如何部署到服务器上,首先服务器需要安装 nginx 用于代理我们的java 服务, 因为我们不会像在本地一样通过端口访问的,都是要通过域名 去访问所以推荐大家使用nginx , 其次还需要安装java8 , 下面直接给大家贴命令,我们默认服务器系统是CentOs 7 # 安装nginx yum install nginx # 设置开启启动 systemctl enable nginx systemctl start nginx # 安装java yum install java
安装好了之后,我们先配置 nginx , 修改/etc/nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; charset utf-8; location /prod-api/ { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 这就是我们要代理的服务端口 也就是sprinboot的启动端口 proxy_pass http://localhost:8888/; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
这里根据自身来,如果有 域名 可以把 localhost 改成域名, 没有也可以改成公网的ip做测试,如果是域名需要到具体的域名服务商解析到服务器的公网ip,也就是A 记录 发布jar包
下面需要把我们本地编译好的 jar包 部署到我们的服务器上,我们可以通过ftp工具去上传到服务器,哪个目录可以自己定,我这里上传到/home/java/ 下, 工具推荐filezila ,windows用户可以使用xftp ,这个也不错(只有window版本),因为我是mac,所以我使用的是filezila
然后我们链接它就完事了,好了之后我们到对应目录,把本地的 jar 包直接拖进去就完事~ 运行SpringBoot服务
我们的包已经发上来了,下边我们就一起动手运行它,这里给大家准备好了一个简要的 start.sh # 这个意思后台运行 并把日志输出到知道文件 nohup java -jar app.jar >> app.log 2>&1 &
实际上我们运行jar包通过 java -jar xxxx.jar ,但是没法后台运行,也就是说关闭远程链接后,就自动挂掉了
这里要说的是,我们执行需要到 jar 包同级目录中,好,我们把这个start.sh 文件也发到home/java/ ,下面我们通过shell 工具远程链接我们的服务器,windows用户可以使用Xshell
链接好后,执行一下命令: # 赋予可执行权限 chmod 777 start.sh # 执行脚本 ./start.sh
大家可以自己访问,测试一下,哦,修改完 nginx 配置一定记得热重启一下, 不然配置不生效哦!~ nginx -s reload 结束语
以上只针对测试环境,其实现在的环境部署都比较成熟了,一般小项目你可以这么玩,但是大项目就不行了,因为我们的进程没法自主恢复,就是说意外的挂了,他不能自愈,我们可以借助守护进程工具,比如 supervisor 这样的,这里就不给大家演示了。现在的部署都是逐渐向容器化靠拢了,后边会教大家高级的,比如docker 的部署方式,教大家如何打镜像和部署,等到讲```docker``的时候会教大家~ 下期预告
到此为止,我们的 SpringBoot 进阶系列教程就结束了,下周我们正式开启SpringCloud微服务之旅 ,如果对SpringBoot 还不够熟悉的,请看完之前的教程哦,不然学习很费劲,因为我们的微服务 都是以SpringBoot 为基础搭建的,我们学习只是学习它的各大组件还有如何灵活的运用到场景中。没有微服务基础也没关系,我会带着大家一步一步入门,从理论到实战,尽可能的讲全。关注我,不迷路,下期见~ 更文时间工作日(周一 周五) 周末不更 节假日不定时更 也欢迎投稿 往期内容我的博客(阅读体验较佳) Springboot入门 Springboot基础(一) Springboot基础(二) Springboot基础(三) Springboot基础(四) Springboot基础(五) SpringBoot进阶之缓存中间件Redis SpringBoot进阶之MyBatis分页插件 SpringBoot进阶之跨域问题处理(CORS) SpringBoot进阶之日志集成 SpringBoot进阶之请求拦截 SpringBoot进阶之事务管理及并发问题 SpringBoot进阶之整合Shiro鉴权框架(一) SpringBoot进阶之整合Shiro鉴权框架(二) SpringBoot进阶之整合Shiro鉴权框架(三) SpringBoot进阶之整合Shiro鉴权框架(四) SpringBoot进阶之整合Shiro鉴权框架(五) SpringBoot进阶之整合Shiro鉴权框架(六) 项目源码(源码已更新 欢迎star )springboot-all 地址 : https://github.com/qiuChengleiy/springboot-all.git