使用nginx对spring boot项目进行代理
摘要:使用nginx对spring boot项目进行反向代理,并且使用轮询均衡负载策略
均衡负载与集群
集群和均衡都涉及到多个机器提供的服务的问题
不同点是,集群是互相通信、协同的的多个服务,服务之前能够状态共享。而均衡负载一般说的是,服务之间相互独立,不知道彼此。因此,使用均衡负载最好是提供的无状态的服务,如果服务有状态,那么就需要一个统一管理状态的服务单独部署
搭建过程
相关工具
- 使用spring boot快速搭建一个web项目
- virtual box作为虚拟机,并安装docker
- 独立安装nginx,对docker容器进行反向代理
spring boot项目
只需要添加spring-boot-starter-web
依赖即可,并且添加如下代码
package com.luzj.mychdocker10;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author luzj
* @description:
* @date 2018/7/27
*/
@RestController
public class IndexController {
@RequestMapping("/index")
public String index(){
return "hello docker 1";
}
@RequestMapping("/tips")
public String tips(){
return "是莉娜呀!!!";
}
}
然后将项目打包,之后修改上面index()
的代码,使返回不同的字符串,这样便于观察nginx是否将请求分发到每一个服务上面去
服务2代码
@RequestMapping("/index")
public String index(){
return "hello docker 2";
}
服务3代码
@RequestMapping("/index")
public String index(){
return "hello docker 3";
}
分别将3个服务打成jar
,待之后部署到docker上,分别是mychdocker10-0.0.1-SNAPSHOT.jar
,mychdocker10-0.0.2-SNAPSHOT.jar
,mychdocker10-0.0.3-SNAPSHOT.jar
docker+nginx部署项目
docker和nginx全部部署在virtual box上。其中docker部署用来部署前面的jar
包,而nginx单独部署,对三个docker容器代理。
之所以nginx单独部署,是因为单独拉取的nginx镜像无法使用vim编写配置文件。
使用docker部署jar包
# 在 /home/<username>/目录下新建 dockerdir目录
mkdir -p /home/<username>/dockerdir
# 将jar包拷入dockerdir中
# 编写Dockerfile
vim Dockerfile
# Dockerfile内容
FROM java:8
add mychdocker10-0.0.3-SNAPSHOT.jar app.jar
expose 8080
entrypoint ["java","-jar","/app.jar"]
# 编译docker镜像,balancejar 为镜像名称, . 表示当前目录
docker build -t balancejar .
# 运行容器,8081:8080表示将docker内部8080端口映射到宿主机的8081端口,docker的宿主机就是virtual box,之后还需要对virtual box再进行一次映射,映射到本机
docker run -d -p 8081:8080 --name balanceContainer balancejar
另外两个jar的的部署方式和上面的一样,分别映射到8082和8083端口
docker镜像列表:
docker容器列表:
virtual box端口映射
我们的docker是安装在virtual box上面的,如果想让本机可以访问,还需要将虚拟机的端口映射到宿主机的端口
选择[控制]->[设置]->[网络]->[端口转发]
,即可见端口映射配置面板,如下图
查看docker部署结果
可以看到直接在本机上可以访问了
配置nginx
nginx打开配置文件
vim /usr/local/nginx/conf/nginx.conf
添加如下配置信息到http模块里面
# 配置代理server组,标识为Tomcat
upstream tomcat {
server 127.0.0.1:8081 weight=10;
server 127.0.0.1:8082 weight=10;
server 127.0.0.1:8083 weight=10;
}
server {
listen 80; # 默认监听端口80
server_name cc520.me;# 对外服务名
# ...其他配置信息
# 配置代理路径
location /docker{
proxy_pass http://tomcat/;
}
# 对“/”路径转发 /docker
location = / {
return 302 /docker;
}
# ...其他配置信息
}
映射nginx监听端口
将virtual box 80端口映射到本机
访问nginx进行验证
依次访问http://cc520.me/docker/index
3次,可以看到如下结果
第一次
第二次
第三次
可以看到nginx使用默认的轮询策略进行服务分发,访问3次,依次访问了代理的3个服务
小结
我们使用docker部署springboot项目,之后使用nginx对3个docker容器进行代理,最后在浏览器访问查看nginx是否对springboot项目进行均衡负载
参考
使用nginx对spring boot项目进行代理的更多相关文章
- Docker数据持久化及实战(Nginx+Spring Boot项目+MySQL)
Docker数据持久化: Volume: (1)创建mysql数据库的container docker run -d --name mysql01 -e MYSQL_ROOT_PASSWORD= my ...
- liunx从0开始部署vue+spring boot项目(包含:安装jdk、mysql、nginx)
单纯记录,若有不合理不规范的地方请忽略. 0.配置JDK 0.下载liunx的jdk解压到/usr/local目录下. tar -xzvf jdk-8u291-linux-x64.tar.gz -C ...
- 在Linux上从零开始部署前后端分离的Vue+Spring boot项目
最近做了一个前后端分离的商城项目来熟悉开发的整个流程,最后希望能有个正式的部署流程,于是试着把项目放在云服务器上,做了一下发现遇到了不少问题,借此记录一下整个部署的过程. 使用的技术栈如标题所说大体上 ...
- Spring Boot 项目转容器化 K8S 部署实用经验分享
转载自:https://cloud.tencent.com/developer/article/1477003 我们知道 Kubernetes 是 Google 开源的容器集群管理系统,它构建在目前流 ...
- 后端开发实践——Spring Boot项目模板
在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为"第0个迭代"要做的事情.但是,当项目运行了一段时间之后再来反 ...
- Spring boot入门(一):快速搭建Spring boot项目
(一)Spring boot介绍 本部分摘自:https://www.zhihu.com/question/64671972/answer/223383505 Spring Boot是由Pivotal ...
- spring boot项目中处理Schedule定时任务
项目中,因为使用了第三方支付(支付宝和微信支付),支付完毕后,第三方支付平台一般会采用异步回调通知的方式,通知商户支付结果,然后商户根据通知内容,变更商户项目支付订单的状态.一般来说,为了防止商户项目 ...
- Docker Gitlab CI 部署 Spring Boot 项目
目前在学习这一块的内容,但是可能每个人环境都不同,导致找不到一篇博客能够完全操作下来没有错误的,所以自己也写一下,记录一下整个搭建的过程. Docker 的安装这里就不赘述了,基本上几行命令都可以了, ...
- [转帖]spring boot项目集成jacoco
小试牛刀:spring boot项目集成jacoco 2019-03-28 20:14:36 zyq23333 阅读数 509 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议, ...
随机推荐
- [JAVA小项目]GUI界面的局域网聊天室
思路: 1.服务端: 1.1 创建ServerSocket 监听本地端口 1.2 循环接收多个客户端的连接,并且把多个客户端连接的每个管道都为其创建线程. 服务端类的成员:链表--每个成员都是线程类- ...
- Eclipse Common API
Platform runtime Defines the extension point and plug-in model. It dynamically discovers plug-ins an ...
- android 5.0 下载编译
CM的CM-12.0版本(对应Android5.0.2): $ repo init -u https://github.com/CyanogenMod/android.git -b cm-12.0 注 ...
- python 函数,内置函数
1.函数 1.1 定义函数 ·函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 (). ·任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数. ·函数的第一行语句可以选择性 ...
- attention机制的实现
本文转自,http://www.jeyzhang.com/understand-attention-in-rnn.html,感谢分享! LSTM 中实现attention:https://distil ...
- struts-config.xml 中 action 与 forward 的重要属性
1.forward 的 redirect 可以为true.false(默认).yes.no true和yes一样,false和no一样: redirect="false",容器内跳 ...
- 通过vue-cli3构建一个SSR应用程序
1.前沿 1.1.什么是SSR SSR(服务端渲染)顾名思义就是将页面在服务端渲染完成后在客户端直接展示. 1.2.客户端渲染与服务端渲染的区别 传统的SPA模式 即客户端渲染的模式 Vue.js构建 ...
- Ext,合计保留两位小数
1. features: [{ ftype: 'summary', dock: 'bottom' }], 2. summaryType: function(records){ return '合计'; ...
- 【洛谷2290】[HNOI2004] 树的计数(Python+利用prufer序列结论求解)
点此看题面 大致题意: 给定每个点的度数,让你求有多少种符合条件的无根树. \(prufer\)序列 这显然是一道利用\(prufer\)序列求解的裸题. 考虑到由\(prufer\)序列得到的结论: ...
- cross entropy与logistic regression
维基上corss entropy的一部分 知乎上也有一个类似问题:https://www.zhihu.com/question/36307214 cross entropy有二分类和多分类的形式,分别 ...