摘要:使用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/index3次,可以看到如下结果

第一次

第二次

第三次

可以看到nginx使用默认的轮询策略进行服务分发,访问3次,依次访问了代理的3个服务

小结

我们使用docker部署springboot项目,之后使用nginx对3个docker容器进行代理,最后在浏览器访问查看nginx是否对springboot项目进行均衡负载

参考

nginx官方文档

docker官方文档

《springboot实战-汪云飞》

使用Nginx实现Tomcat集群负载均衡

使用nginx对spring boot项目进行代理的更多相关文章

  1. Docker数据持久化及实战(Nginx+Spring Boot项目+MySQL)

    Docker数据持久化: Volume: (1)创建mysql数据库的container docker run -d --name mysql01 -e MYSQL_ROOT_PASSWORD= my ...

  2. liunx从0开始部署vue+spring boot项目(包含:安装jdk、mysql、nginx)

    单纯记录,若有不合理不规范的地方请忽略. 0.配置JDK 0.下载liunx的jdk解压到/usr/local目录下. tar -xzvf jdk-8u291-linux-x64.tar.gz -C ...

  3. 在Linux上从零开始部署前后端分离的Vue+Spring boot项目

    最近做了一个前后端分离的商城项目来熟悉开发的整个流程,最后希望能有个正式的部署流程,于是试着把项目放在云服务器上,做了一下发现遇到了不少问题,借此记录一下整个部署的过程. 使用的技术栈如标题所说大体上 ...

  4. Spring Boot 项目转容器化 K8S 部署实用经验分享

    转载自:https://cloud.tencent.com/developer/article/1477003 我们知道 Kubernetes 是 Google 开源的容器集群管理系统,它构建在目前流 ...

  5. 后端开发实践——Spring Boot项目模板

    在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为"第0个迭代"要做的事情.但是,当项目运行了一段时间之后再来反 ...

  6. Spring boot入门(一):快速搭建Spring boot项目

    (一)Spring boot介绍 本部分摘自:https://www.zhihu.com/question/64671972/answer/223383505 Spring Boot是由Pivotal ...

  7. spring boot项目中处理Schedule定时任务

    项目中,因为使用了第三方支付(支付宝和微信支付),支付完毕后,第三方支付平台一般会采用异步回调通知的方式,通知商户支付结果,然后商户根据通知内容,变更商户项目支付订单的状态.一般来说,为了防止商户项目 ...

  8. Docker Gitlab CI 部署 Spring Boot 项目

    目前在学习这一块的内容,但是可能每个人环境都不同,导致找不到一篇博客能够完全操作下来没有错误的,所以自己也写一下,记录一下整个搭建的过程. Docker 的安装这里就不赘述了,基本上几行命令都可以了, ...

  9. [转帖]spring boot项目集成jacoco

    小试牛刀:spring boot项目集成jacoco 2019-03-28 20:14:36 zyq23333 阅读数 509   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议, ...

随机推荐

  1. SharePoint 2013 - Designer Workflow

    另一篇文章 SharePoint Designer - Workflow 1. 可以定义每个Stage的名称,并将Stage名称显示在工作流状态字段,相比于SP2010时仅有的in progress ...

  2. Android SharedPreferences存储数据

    SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的就是一个key-value(键值对)SharedPreferences常用来 ...

  3. Qt删除文件夹

    写的软件需要进行文件夹的复制,开始不怎么懂就找了个拷贝文件夹的代码测试了一下,运行程序选择了源目录和目标目录相同进行拷贝,结果悲剧了.因为是递归拷贝,导致文件夹被嵌套N层,软件死机,强制结束后,产生的 ...

  4. 自整定模糊PID算法的理论

    模糊控制系统的构成与与常规的反馈控制系统的主要区别在于控制器主要是由模糊化,模糊推理机和精确化三个功能模块和知识库(包括数据库和规则库)构成的.具体实现过程如下所示: (1)预处理: 输入数据往往是通 ...

  5. zookeeper的JavaAPI

    org.apache.zookeeper.Zookeeper Zookeeper 是在 Java 中客户端主类,负责建立与 zookeeper 集群的会话,并提供方法进行操作. org.apache. ...

  6. (五)TortoiseSVN 客户端-----安装

    svn客户端类型 svn客户端需要通过网络访问svn服务端提交文件.查询文件等,可通过以下客户端类型访问svn服务端: 使用Subversion提供的客户端命令,使用方式:在命令行下输入命令操作. 使 ...

  7. 再学UML-Bug管理系统UML2.0建模实例(二)

    2.3 BMS顺序图(需求模型)       在UML中,我们将顺序图分为两类,一类用于描述系统需求,构造系统的需求模型(分析模型):另一类用于指导设计与实现,构造系统的实现模型(设计模型).     ...

  8. jdk是什么?jdk1.8安装配置方法

    jdk是什么呢?jdk的是java development kit的缩写,意思是java程序开发的工具包.也可以说jdk是java的sdk. 目前的JDK大致分三个大版本:Java SE:Java P ...

  9. c++中的const用法(很详细)——转

    http://www.cnblogs.com/ymy124/archive/2012/04/16/2451433.html const给人的第一印象就是定义常量. (1)const用于定义常量. 例如 ...

  10. NO.011-2018.02.16《三五七言 / 秋风词》唐代:李白

    三五七言 / 秋风词_古诗文网 三五七言 / 秋风词 唐代:李白 秋风清,秋月明,秋风凌清,秋月明朗. 落叶聚还散,寒鸦栖复惊.风中的落叶时聚时散,寒鸦本已栖息,又被明月惊起.落叶聚还(huán)散: ...