日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

重新认识Docker Compose之Sidecar模式

發(fā)布時(shí)間:2023/12/4 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 重新认识Docker Compose之Sidecar模式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

什么是Docker Compose

在微服務(wù)盛行的今天,我們通常是這么定義Compose的:對(duì)容器的統(tǒng)一啟動(dòng)和關(guān)閉的編排工具。

但是我以前還是有個(gè)疑惑,誰(shuí)會(huì)用Compose在一臺(tái)服務(wù)器上部署多個(gè)服務(wù)呢?干脆直接用單體服務(wù)就行了!直到我遇到了以下的一個(gè)需求,讓我明白了在一臺(tái)服務(wù)器上不得不用多個(gè)服務(wù)的時(shí)候,Compose可以通過(guò)sidecar的模式,讓服務(wù)很簡(jiǎn)單的通過(guò)127.0.0.1調(diào)用另一個(gè)服務(wù)

需求遇到不合適的語(yǔ)言

一個(gè)用golang開(kāi)發(fā)的某個(gè)項(xiàng)目,希望根據(jù)學(xué)生信息打印學(xué)籍,學(xué)籍表其中一部分如下

?go中并不是沒(méi)有操作word的庫(kù),但是操作這樣一個(gè)復(fù)雜的word,并且填好信息還是有很大難度。所以我們想到了一個(gè)實(shí)現(xiàn)方案。

實(shí)現(xiàn)方案

1.通過(guò)excel定義一個(gè)一樣的模板

2.golang往excel的指定cell里填值,這樣相對(duì)往word里填值就簡(jiǎn)單很多,其中一部分代碼

xlsx.SetCellValue("Sheet1", "C3", student.Major.Name) xlsx.SetCellValue("Sheet1", "F3", student.ClassInfo.Name) xlsx.SetCellValue("Sheet1", "J3", student.SchoolSystem)xlsx.SetCellValue("Sheet1", "B4", student.Name) xlsx.SetCellValue("Sheet1", "D4", student.BeforName) xlsx.SetCellValue("Sheet1", "F4", student.Gender) xlsx.SetCellValue("Sheet1", "H4", student.Nation)xlsx.SetCellValue("Sheet1", "B5", student.IdCardNo) xlsx.SetCellValue("Sheet1", "F5", student.HomePlace)xlsx.SetCellValue("Sheet1", "B6", student.Birthday.Format("20060102")) xlsx.SetCellValue("Sheet1", "D6", student.EntranceTime.Format("20060102")) xlsx.SetCellValue("Sheet1", "F6", student.JoinTeamTime)xlsx.SetCellValue("Sheet1", "B7", student.FamilyAddress) xlsx.SetCellValue("Sheet1", "F7", student.HealthStatus)

3.最關(guān)鍵的一步,把excel轉(zhuǎn)成pdf返給前端,供其展示或者打印

我在github了沒(méi)找到golang把excel轉(zhuǎn)成pdf的庫(kù)(有推薦可以留言),于是想到了.net里的FreeSpire.Xls庫(kù)可以很方便實(shí)現(xiàn)excel轉(zhuǎn)pdf的功能,所以需要有個(gè).net api把go生產(chǎn)并填好的excel轉(zhuǎn)成pdf,于是我新建了一個(gè).net webapi,項(xiàng)目名定義成pdfprocessor,其中定一個(gè)Controller

[Route("[controller]")] public class PDFController : ControllerBase {private readonly ILogger<PDFController> _logger;public PDFController(ILogger<PDFController> logger){_logger = logger;}[HttpPost]public async Task<IActionResult> HttpPostAsync(){try{Stream stream = Request.Body;byte[] buffer = new byte[Request.ContentLength.Value];stream.Position = 0L;stream.ReadAsync(buffer, 0, buffer.Length);Workbook wb = new Workbook();wb.LoadFromStream(stream);Worksheet ws = wb.Worksheets[0];var streamReturn = new MemoryStream();ws.SaveToPdfStream(streamReturn);return File(streamReturn, "application/octet-stream");}catch (Exception ex){_logger.LogError("", ex);return BadRequest(ex.Message);}} }

4.部署go項(xiàng)目與.net項(xiàng)目,使go語(yǔ)言調(diào)用.net api實(shí)現(xiàn)excel轉(zhuǎn)化pdf

因?yàn)檫@是一個(gè)很小的單體項(xiàng)目,那么如何使這個(gè)部署與調(diào)用相對(duì)簡(jiǎn)單就是我需要考慮的問(wèn)題了,這時(shí)候我想到了Docker Compose。

我可以通過(guò)docker-compose同時(shí)啟動(dòng)go api和.net api,最重要的還是可以讓go與.net項(xiàng)目使用同一個(gè)network的方式,使go api通過(guò)127.0.0.1:port來(lái)調(diào)用.net api,拓?fù)淙缦?/p>

?5.go api通過(guò)127.0.0.1調(diào)用 .net api,這樣.net api就成了go api的一個(gè)sidecar,為其服務(wù)

response, err := http.Post("http://127.0.0.1:6081/PDF", "multipart/form-data;boundary="+multipart.NewWriter(bytes.NewBufferString("")).Boundary(), bytes.NewReader(byteA)) if err != nil {c.Bad(err.Error())return } defer response.Body.Close() if response.StatusCode != 200 {data, _ := ioutil.ReadAll(response.Body)c.Bad(string(data))return }pdfFilePth := fmt.Sprintf("./templates/tmp/%s.pdf", uuid.New()) f, err := os.Create(pdfFilePth) if err != nil {c.Bad(err.Error())return } io.Copy(f, response.Body) c.Ctx.Output.Download(pdfFilePth, "data.xlsx")

6.docker-compose部署

編寫(xiě)go api的dockerfile

FROM library/golangWORKDIR /app RUN go env -w GO111MODULE=on RUN go env -w GOPROXY=https://goproxy.cn,direct ADD api/ /app RUN cd /app RUN go mod tidy RUN go build main.go ENTRYPOINT ["/app/main"] EXPOSE 6080

編寫(xiě).net的dockerfile

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base RUN apt-get update RUN apt-get install -y --no-install-recommends libgdiplus libc6-dev RUN apt-get install -y fontconfig xfonts-utils COPY /pdfprocessor/fonts/ /usr/share/fonts/ RUN mkfontscale RUN mkfontdir RUN fc-cache -fvWORKDIR /app EXPOSE 6081FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src COPY ["pdfprocessor/pdfprocessor.csproj", "pdfprocessor/"] RUN dotnet restore "pdfprocessor/pdfprocessor.csproj" COPY . . WORKDIR "/src/pdfprocessor" RUN dotnet build "pdfprocessor.csproj" -c Release -o /app/buildFROM build AS publish RUN dotnet publish "pdfprocessor.csproj" -c Release -o /app/publishFROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "pdfprocessor.dll"]

編寫(xiě)docker-compose.yaml,讓goapi與.net api使用同一個(gè)network

version: '3.4'services:pdfprocessor:image: pdfprocessorbuild:context: .dockerfile: pdfprocessor/Dockerfiledepends_on:- eduadminnetwork_mode: "service:eduadmin"eduadmin:image: eduadminbuild:context: .dockerfile: api/Dockerfileports:- "6080:6080"- "6088:6088"

7.通過(guò)docker-compose up -d啟動(dòng)服務(wù),查看pdf展示效果

最后想說(shuō)docker-compose真香!

關(guān)注我獲取技術(shù)分享

總結(jié)

以上是生活随笔為你收集整理的重新认识Docker Compose之Sidecar模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。