【微服務】SpringBoot + Docker 實現微服務容器多節點負載均衡詳解

目錄

一、前言

二、前置準備

2.1 基本環境

2.2 準備一個springboot工程

2.2.1 準備幾個測試接口

2.3?準備Dockerfile文件

2.4 打包上傳到服務器

三、制作微服務鏡像與運行服務鏡像

3.1?拷貝Dockerfile文件到服務器

3.2 制作服務鏡像

3.3 啟動鏡像服務

3.4 訪問一下服務接口

四、配置負載均衡

4.1 源碼包方式安裝nginx

4.1.1 下載nginx安裝包

4.1.2 解壓安裝包

4.1.3 進入解壓后的安裝包目錄

4.1.4 編譯安裝

4.1.5 啟動nginx

4.1.6?檢查nginx服務是否啟動成功

4.1.7?訪問nginx主頁

4.1.8 nginx其他命令補充

4.2?啟動另外兩個微服務容器

4.3 配置負載均衡

4.3.1 配置nginx負載均衡

4.3.2?負載均衡效果驗證

4.4?固定微服務容器IP的方式配置負載均衡

4.4.1?創建一個docker網絡

4.4.2?使用指定IP的方式啟動三個微服務容器

4.4.3 測試訪問服務接口

4.4.4 配置nginx負載均衡

4.5 使用Docker Compose配置負載均衡

4.5.1 創建docker網絡

4.5.2 創建nginx.conf配置文件

4.5.3 創建docker-compose文件

4.5.4 啟動容器

五、寫在文末


一、前言

基于容器化部署微服務的實施方案目前在很多團隊中實踐應用,得益于docker 領域解決方案的完善,生態和組件的豐富,以及k8s的盛行,于是微服務接入docker進行部署也成為一種比較主流的方式,不過一旦項目上線,高可用問題在任何一個系統中都是需要亟待解決的,使用docker部署springboot也不例外,在不引入k8s的情況下,如何低成本的快速實現docker微服務多節點擴容呢,本篇將詳細介紹一下。

二、前置準備

在正式開始操作之前,你需要提前做下面幾項準備,以確保后面的部署、實施和相關的操作能夠順利完成。

2.1 基本環境

  • 云服務器或虛擬機,最低,2C4G;
  • 服務器安裝了Docker環境,以及Docker Compose環境;
  • 本地JDK(JDK17),Maven,Idea等;

2.2 準備一個springboot工程

如下在本地創建一個springboot工程

2.2.1 準備幾個測試接口

方便后面的測試效果

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class DockerController {//localhost:8081/test@GetMapping("/test")public String test(){return "docker test";}}

本地啟動之后,確保接口能夠正常調用

2.3?準備Dockerfile文件

在resources目錄下添加一個Dockerfile文件,內容如下:

FROM  openjdk:17-jdk-alpine
ADD ./boot-docker.jar /app/boot-docker.jar
ENTRYPOINT ["java", "-jar", "/app/boot-docker.jar"]

2.4 打包上傳到服務器

使用maven命令對上面的工程打包,將jar包上傳到服務器目錄

為了確保可用,使用java -jar命令啟動一下

三、制作微服務鏡像與運行服務鏡像

使用docker的方式運行微服務,首先需要基于Dockerfile文件將原始的服務jar包制作成鏡像,參考下面的操作過程

3.1?拷貝Dockerfile文件到服務器

在服務器目錄與jar包同目錄下,創建一個Dockerfile文件,將上述Dockerfile的內容拷貝進去

3.2 制作服務鏡像

使用下面的命令,將本次的微服務jar包制作成docker鏡像

  • 這里有個前提,需要服務器提前安裝好docker compose組件,否則無法使用這個命令;

docker build -t boot-docker:1.0 .

執行成功后,通過docker imags命令檢查微服務鏡像是否生成

3.3 啟動鏡像服務

使用下面的命令啟動第一個鏡像服務

docker run -d -it -p 8081:8081 --name=boot-docker-1 boot-docker:1.0

3.4 訪問一下服務接口

訪問工程中預留的接口,看到如下效果,說明服務正常啟動可用了

四、配置負載均衡

目前在項目中使用nginx作為路由轉發,負載均衡的配置非常普遍,下面就以nginx為例進行說明。

4.1 源碼包方式安裝nginx

4.1.1 下載nginx安裝包

使用下面的命令下載

wget http://nginx.org/download/nginx-1.20.2.tar.gz

4.1.2 解壓安裝包

執行下面的命令

tar -zxvf nginx-1.20.2.tar.gz -C /usr/local/src/

4.1.3 進入解壓后的安裝包目錄

cd /usr/local/src/nginx-1.20.2

4.1.4 編譯安裝

依次執行下面的命令

./configuremakemake install

執行過程

4.1.5 啟動nginx

切換到nginx的安裝目錄

cd /usr/local/nginx

執行下面的命令,啟動nginx服務

./sbin/nginx

4.1.6?檢查nginx服務是否啟動成功

ps -ef | grep nginx

4.1.7?訪問nginx主頁

如果能夠正常啟動,訪問下80端口,看到下面的效果說明nginx服務啟動成功

4.1.8 nginx其他命令補充

這里補充一下其他的幾個nginx常用命令

nginx -s reload            # 重新載入配置文件
nginx -s reopen            # 重啟 Nginx
nginx -s stop              # 停止 Nginx

4.2?啟動另外兩個微服務容器

參照2.3 的方式,再啟動另外兩個服務鏡像,使用不同的端口進行區分

docker run -d -it -p 8082:8081 --name=boot-docker-2 boot-docker:1.0
docker run -d -it -p 8083:8081 --name=boot-docker-3 boot-docker:1.0

通過docker ps命令,可以看到三個鏡像服務都正常啟動了

依次訪問一下各自的服務接口,確保可以正常使用

第一個服務

第二個服務

第三個服務

4.3 配置負載均衡

上面的服務環境和nginx服務啟動之后,接下來就可以配置負載均衡了

4.3.1 配置nginx負載均衡

將下面的配置信息拷貝到nginx.conf文件中

upstream backend {server 101.221.34.177:8081;server 101.221.34.177:8082;server 101.221.34.177:8083;}server {listen 80;location / {proxy_pass http://backend;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}

配置完成之后,注意重啟nginx

4.3.2?負載均衡效果驗證

在上面的配置中,配置監聽80端口,然后直接被路由到各個服務模塊,各個服務模塊直接訪問自身的默認的那個接口,我們可以通過查看日志觀察效果,上述負載均衡的配置中,沒有指定具體的方式,默認采用輪詢的策略

第一次訪問:

第二次訪問:

第三次訪問:

4.4?固定微服務容器IP的方式配置負載均衡

在上述的操作中,采用的方式是基于同一個原始鏡像,啟動多個容器的方式,最后配置負載均衡的效果,在目前金倉的部署方式中,各個微服務容器采用的是固定IP的形式啟動的,下面再補充一下這種方式的配置過程。

4.4.1?創建一個docker網絡

使用下面的命令自定義一個docker網絡

  • 指定的IP段根據服務器自身的情況設置

docker network create --subnet=192.168.100.0/24 my_custom_network

4.4.2?使用指定IP的方式啟動三個微服務容器

依次執行下面的命令

docker run -d -it -p 8085:8081 --name boot-docker-5 --network my_custom_network --ip 192.168.100.10 boot-docker:1.0
docker run -d -it -p 8086:8081 --name boot-docker-6 --network my_custom_network --ip 192.168.100.11 boot-docker:1.0
docker run -d -it -p 8087:8081 --name boot-docker-7 --network my_custom_network --ip 192.168.100.12 boot-docker:1.0

4.4.3 測試訪問服務接口

訪問工程中預留的接口,看到如下效果,說明服務正常啟動可用了

4.4.4 配置nginx負載均衡

只需要修改一下upstream中的信息即可

 upstream backend {server 192.168.100.10:8085;server 192.168.100.11:8086;server 192.168.100.12:8087;}server {listen 80;location / {proxy_pass http://backend;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}

4.5 使用Docker Compose配置負載均衡

4.5.1 創建docker網絡

使用自定義的網絡,可以確保微服務和nginx的容器在同一個網絡域

docker network create --driver bridge --subnet=172.19.0.0/24 network1

4.5.2 創建nginx.conf配置文件

自定義一個nginx.conf配置文件,用于在啟動nginx容器的時候作映射,可以直接拷貝上面的做簡單的修改使用,關鍵是負載均衡那里的配置

upstream backend {server 172.19.0.5:8085;server 172.19.0.6:8086;}server {listen 80;location / {proxy_pass http://backend;#proxy_pass http://192.168.100.10:8085;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}

4.5.3 創建docker-compose文件

在nginx.conf相同的目錄下創建一個docker-compose文件

參考下面的配置信息,將其拷貝到docker-compose.yml文件中

version: '3'
services:app1:image: boot-docker:1.0container_name: boot-docker-5networks:network1:ipv4_address: 172.19.0.5ports:- "8085:8081"app2:image: boot-docker:1.0container_name: boot-docker-6networks:network1:ipv4_address: 172.19.0.6ports:- "8086:8081"nginx:image: nginx:alpinevolumes:- ./nginx.conf:/etc/nginx/nginx.confports:- "80:80"depends_on:- app1- app2networks:network1:ipv4_address: 172.19.0.7networks:network1:external: true

4.5.4 啟動容器

執行下面的命令啟動微服務容器,和nginx

docker-compose up -d

驗證下是否啟動成功

五、寫在文末

本文通過實際操作詳細演示了如何基于springboot制作微服務鏡像,以及開啟多個微服務容器配置nginx負載均衡的過程,希望對看到的同學有用哦,本篇到此結束,感謝觀看。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/80920.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80920.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/80920.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

1.2.2.1.4 數據安全發展技術發展歷程:高級公鑰加密方案——同態加密

引言 在密碼學領域,有一種技術被圖靈獎得主、著名密碼學家Oded Goldreich譽為"密碼學圣杯",那就是全同態加密(Fully Homomorphic Encryption)。今天我們就來聊聊這個神秘而強大的加密方案是如何從1978年的概念提出&…

vllm量化03—INT4 W4A16

本系列基于Qwen2.5-7B,學習如何使用vllm量化,并使用benchmark_serving.py、lm_eval 測試模型性能和評估模型準確度。 測試環境為: OS: centos 7 GPU: nvidia l40 driver: 550.54.15 CUDA: 12.3本文是該系列第3篇——INT4 W4A16 一、量化 f…

第二十五天打卡

常見報錯類型 try-except-else-finally 語句 首先執行try語句,若正確直接執行else語句 若try語句發生錯誤,則判斷錯誤類型,執行錯誤類型對應的except語句,不執行else語句 finally語句無條件執行,多用于資源保存&…

城市掃街人文街頭紀實膠片電影感Lr調色預設,DNG/手機適配濾鏡!

調色詳情 城市掃街人文街頭紀實膠片電影感 Lr 調色是通過 Lightroom(Lr)軟件,對城市街頭抓拍的人文紀實照片進行后期調色處理。旨在賦予照片如同膠片拍攝的質感以及電影般濃厚的敘事氛圍,不放過每一個日常又珍貴的瞬間&#xff0c…

【hadoop】Kafka 安裝部署

一、Kafka安裝與配置 步驟: 1、使用XFTP將Kafka安裝包kafka_2.12-2.8.1.tgz發送到master機器的主目錄。 2、解壓安裝包: tar -zxvf ~/kafka_2.12-2.8.1.tgz 3、修改文件夾的名字,將其改為kafka,或者創建軟連接也可&#xff1…

UDP 多點通信

一、setsockopt/getsockopt 函數詳解 1. 函數原型 c #include <sys/socket.h> int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);…

說一說Node.js高性能開發中的I/O操作

眾所周知&#xff0c;在軟件開發的領域中&#xff0c;輸入輸出&#xff08;I/O&#xff09;操作是程序與外部世界交互的重要環節&#xff0c;比如從文件讀取數據、向網絡發送請求等。這段時間&#xff0c;也指導項目中一些項目的開發工作&#xff0c;發現在Node.js運用中&#…

Charles抓包并破解ProtoBuf請求

安裝Charles并抓包 如果是外網的需要root安裝一系列證書等&#xff0c;詳細見參考文章&#xff1a; 在雷電模擬器安卓7.0上使用Charles抓包詳細教程 遇到如下問題&#xff1a; 1.粘貼到目錄/system/etc/security/cacerts內&#xff0c;粘貼不了。需要打開這個 2.模擬器wifi打…

Odoo 18 安全組與訪問權限管理指南

Odoo 18 安全組與訪問權限管理指南 一、準備工作&#xff1a;在自定義模塊中創建安全配置文件 創建 security 文件夾 在自定義模塊內創建名為 security 的文件夾&#xff0c;用于存放安全組和訪問權限的定義文件。 二、定義模型訪問權限&#xff1a;ir.model.access.csv 文…

使用lldb查看Rust不同類型的結構

目錄 前言 正文 標量類型 復合類型——元組 復合類型——數組 函數 &str struct 可變數組vec Iter String Box Rc Arc RefCell Mutex RwLock Channel 總結 前言 筆者發現這個lldb挺好玩的&#xff0c;可以查看不同類型的結構&#xff0c;雖然這好像是C的東…

uniapp使用ui.request 請求流式輸出

正文&#xff1a; 在現代Web開發中&#xff0c;實時數據流和長時間運行的請求變得越來越常見&#xff0c;尤其是在處理大量數據或進行實時通信時。在這種情況下&#xff0c;uniapp 提供的 ui.request 請求方法可以幫助我們輕松實現流式輸出請求。本文將介紹如何使用 uni.reques…

如何恢復被勒索軟件加密的服務器文件(解密與備份策略)

針對勒索軟件加密文件的恢復和解密策略&#xff0c;結合當前數據安全最佳實踐&#xff0c;整理應對指南如下&#xff1a; 一、文件解密與修復方法 立即隔離設備? 斷開網絡連接并禁用共享功能&#xff0c;防止病毒橫向傳播 通過文件后綴異常&#xff08;如.locked、.wxx&…

JS,ES,TS三者什么區別

Java Script(JS)、ECMAScript(ES)、TypeScript(TS) 的核心區別與關聯的詳細解析,結合技術背景、設計目標及應用場景展開說明: 一、核心定義與關系 JavaScript(JS) 定義:一種動態類型、基于原型的腳本語言,由 Netscape 公司于 1995 年首次開發,用于網頁交互功能。角…

【MapReduce入門】深度解析MapReduce:定義、核心特點、優缺點及適用場景

目錄 1 什么是MapReduce&#xff1f; 2 MapReduce的核心特點 2.1 分布式處理 2.2 容錯機制 3 MapReduce的完整工作流程 4 MapReduce的優缺點分析 4.1 優勢 4.2 局限性 5 MapReduce典型應用場景 5.1 適用場景 5.2 不適用場景 6 MapReduce與其他技術的對比 7 總結 1…

【Redis】分布式鎖的實現

目錄 一、本地鎖存在的問題 二、redis實現分布式鎖原理 三、使用示例 四、鎖誤刪問題 解決思路 獲取鎖和釋放鎖代碼優化 五、鎖釋放的原子性問題 解決思路&#xff08;Lua腳本&#xff09; 使用流程 總結 大家好&#xff0c;我是千語。上期給大家講了使用悲觀鎖來解決…

Unity3D對象池設計與實現詳解

前言 在Unity3D中&#xff0c;對象池&#xff08;Object Pooling&#xff09;是一種優化技術&#xff0c;用于減少頻繁實例化和銷毀對象帶來的性能開銷。以下是對象池的詳細設計和實現步驟&#xff1a; 對惹&#xff0c;這里有一個游戲開發交流小組&#xff0c;希望大家可以點…

[Spring]-組件的生命周期

組件生命周期 認識組件的聲明周期 實驗1 通過Bean指定組件的生命周期 package com.guigu.spring.ioc.bean;Data public class User {private String username;private String password;private Car car;Autowiredpublic void setCar(Car car) {System.out.println("自動…

【golang】網絡數據包捕獲庫 gopacket

詳解 github.com/google/gopacket/pcap 包 github.com/google/gopacket/pcap 是 Go 語言中一個強大的網絡數據包捕獲庫&#xff0c;它是 gopacket 項目的一部分&#xff0c;提供了對 libpcap&#xff08;Linux/Unix&#xff09;和 WinPcap&#xff08;Windows&#xff09;的 G…

RBTree的模擬實現

1&#xff1a;紅黑樹的概念 紅?樹是?棵?叉搜索樹&#xff0c;他的每個結點增加?個存儲位來表?結點的顏?&#xff0c;可以是紅?或者??。通過對任何?條從根到葉?的路徑上各個結點的顏?進?約束&#xff0c;紅?樹確保沒有?條路徑會?其他路徑?出2倍&#xff0c;因…

React 第三十九節 React Router 中的 unstable_usePrompt Hook的詳細用法及案例

React Router 中的 unstable_usePrompt 是一個用于在用戶嘗試離開當前頁面時觸發確認提示的自定義鉤子&#xff0c;常用于防止用戶誤操作導致數據丟失&#xff08;例如未保存的表單&#xff09;。 一、unstable_usePrompt用途 防止意外離開頁面&#xff1a;當用戶在當前頁面有…