• 使用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镜像列表:
    image

    docker容器列表:
    imags

    virtual box端口映射

    我们的docker是安装在virtual box上面的,如果想让本机可以访问,还需要将虚拟机的端口映射到宿主机的端口

    选择[控制]->[设置]->[网络]->[端口转发],即可见端口映射配置面板,如下图

    image

    查看docker部署结果

    image
    可以看到直接在本机上可以访问了

    配置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次,可以看到如下结果

    第一次
    image

    第二次
    image

    第三次
    image

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

    小结

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

    参考

    nginx官方文档

    docker官方文档

    《springboot实战-汪云飞》

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

  • 相关阅读:
    Socket与系统调用深度分析
    需求分析:未来的图书会是怎么样的?
    构建调试Linux内核网络代码的环境MenuOS系统
    jmeter--开始
    pytest---api
    pytest---mark
    pytest---数据处理
    pytest---fixture运行规则
    pytest---allure(mac版本)
    pytest---pytest.ini
  • 原文地址:https://www.cnblogs.com/Franken-Fran/p/nginx_balanceLoad.html
Copyright © 2020-2023  润新知