重新认识Docker Compose之Sidecar模式

什么是Docker Compose

在微服务盛行的今天,我们通常是这么定义Compose的:对容器的统一启动和关闭的编排工具。

但是我以前还是有个疑惑,谁会用Compose在一台服务器上部署多个服务呢?干脆直接用单体服务就行了!直到我遇到了以下的一个需求,让我明白了在一台服务器上不得不用多个服务的时候,Compose可以通过sidecar的模式,让服务很简单的通过127.0.0.1调用另一个服务

需求遇到不合适的语言

一个用golang开发的某个项目,希望根据学生信息打印学籍,学籍表其中一部分如下

8cb4dd2237153fb33233ef6f9fc4bf06.png

 go中并不是没有操作word的库,但是操作这样一个复杂的word,并且填好信息还是有很大难度。所以我们想到了一个实现方案。

实现方案

1.通过excel定义一个一样的模板

aceb22ad899f6f626566fbda57ae3212.png

2.golang往excel的指定cell里填值,这样相对往word里填值就简单很多,其中一部分代码

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.最关键的一步,把excel转成pdf返给前端,供其展示或者打印

我在github了没找到golang把excel转成pdf的库(有推荐可以留言),于是想到了.net里的FreeSpire.Xls库可以很方便实现excel转pdf的功能,所以需要有个.net api把go生产并填好的excel转成pdf,于是我新建了一个.net webapi,项目名定义成pdfprocessor,其中定一个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项目与.net项目,使go语言调用.net api实现excel转化pdf

因为这是一个很小的单体项目,那么如何使这个部署与调用相对简单就是我需要考虑的问题了,这时候我想到了Docker Compose。

我可以通过docker-compose同时启动go api和.net api,最重要的还是可以让go与.net项目使用同一个network的方式,使go api通过127.0.0.1:port来调用.net api,拓扑如下

ac0e07bca6f806a9a539e565336b990a.png

 5.go api通过127.0.0.1调用 .net api,这样.net api就成了go api的一个sidecar,为其服务

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部署

编写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

编写.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"]

编写docker-compose.yaml,让goapi与.net api使用同一个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.通过docker-compose up -d启动服务,查看pdf展示效果

41948e075b907e74b9fa4a44e6c31469.png

67c408f27c4f335783207eb4f0901497.png

最后想说docker-compose真香!

关注我获取技术分享

a48590785acab256f221ae2ec4176a27.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294488.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android面试题总结加强再加强版(四)

http://blog.csdn.net/superjunjin/article/details/7862182 1&#xff0c;双缓冲技术原理以及优缺点&#xff1a; 创建一幅后台图像&#xff0c;将每一帧画入图像&#xff0c;然后调用drawImage()方法将整个后台图像一次画到屏幕上去。 优点&#xff1a;双缓冲技术的优点在于大…

数学家看到就把持不住,高斯被它迷得神魂颠倒,2600年的数学史里的一个奇迹……...

全世界只有3.14 % 的人关注了爆炸吧知识数学的美两个字就能说清数学女神很可能是个洁癖她的苛刻就体现在公式里那每一个符号每一个数字都不允许有哪怕一点杂质如此才是她最认可的孩子因为知道了勾股定理古人们才创造了辉煌因为有了经典力学公式人类才能探索星辰大海因为掌握了质…

JSFL:导入Png图片导出swf

现在项目需要用到某种格式的swf&#xff0c;既这个swf里的舞台上原点有两个MovieClip&#xff0c;分别命名为mc1&#xff0c;mc2. mc1和mc2都是从外部导入的同一个png图片转为mc而来的。然后导出为这个png同名的swf文件&#xff0c;和png同目录。 代码如下&#xff1a; //功能&…

SQLSERVER中的自旋锁

SQLSERVER中的自旋锁 在SQLSERVER中的锁有很多&#xff0c;例如什么意向共享锁&#xff0c;排他锁&#xff0c;行&#xff0c;页锁 这些都属于LOCK 而latch比lock更轻量级&#xff0c;只在内存中存在&#xff0c;一般用来锁住数据页面&#xff0c;防止多人同时修改内存中的一个…

java语言程序设计第六章答案_Java语言程序设计(邵丽萍编著)第六章.doc

Java语言程序设计(邵丽萍编著)第六章第6章(一)判断题(1)抽象类不能实例化。 ( )(2)一个类中&#xff0c;只能拥有一个构造方法。 ( )(3)内部类都是非静态的。 ( )(4)接口中的所有方法都没有被实现。 ( )(5)实现一个接口&#xff0c;则在类中一定要实现接口中的所有方法。 ( )(6…

[改善Java代码]性能考虑,数组是首选

建议60:性能考虑,数组是首选 一、分析 数组在实际的系统开发中使用的越来越少&#xff0c;我们通常只有在阅读一些开源项目时才会看到它们的身影&#xff0c;在Java中它确实没有List、Set、Map这些集合使用起来方便&#xff0c;但是在基本类型处理方面&#xff0c;数组还是占优…

编程语言也环保?C语言领跑,Python、Perl垫底

文 | Travis出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013&#xff09;毋庸置疑&#xff0c;Python 是世界上最流行的编程语言之一&#xff0c;其被广泛运用于人工智能、数据分析、网络爬虫和 Web 开发等领域。在上个月的 TIOBE 榜单中&#xff0c;Python 一举超过…

Android最全面试题71道题 详解

http://blog.csdn.net/superjunjin/article/details/7772030 Android面试题 1. 下列哪些语句关于内存回收的说明是正确的? (b ) A、 程序员必须创建一个线程来释放内存 B、 内存回收程序负责释放无用内存 C、 内存回收程序允许程序员直接释放内存 D、 内存回收程序可以在指定…

我靠“读书笔记”闷声赚3万:那些你看不上的行业,往往最赚钱

全世界只有3.14 % 的人关注了爆炸吧知识你有没有计算过&#xff1a;你的时间&#xff0c;值多少钱&#xff1f;如果你月薪5000&#xff0c;一个月工作20天&#xff0c;每天8小时&#xff0c;那么你1小时的价值就是32元。然而&#xff0c;现在请一个打扫卫生的钟点工&#xff0c…

12月16日课程安排

12/16: 6-8PM 新主楼 D218 讲座 1) 微软亚洲研究院的研究员 分享研究经验 (韩石 研究员) 2) 互联网创新公司的研发介绍 (王京: 应用汇首席工程师, 北航 6 系校友) 微软亚洲研究院的研究员建议大家先读一下这些文章: ICSE’12 paper on StackMine – Performance D…

C#元组类型System.ValueTuple

元组功能在 C# 7.0 及更高版本中可用&#xff0c;它提供了简洁的语法&#xff0c;用于将多个数据元素分组成一个轻型数据结构。元组功能需要 System.ValueTuple 类型和相关的泛型类型&#xff08;例如 System.ValueTuple<T1,T2>&#xff09;&#xff0c;这些类型在 .NET …

Cocoapods的安装和使用

一、Cocoapods的安装 第一步&#xff1a;打开终端 第二步&#xff1a;修改ruby镜像引用 gem source --remove https://rubygems.org/ gem sources -a http://ruby.taobao.org/ 完成后用命令行查看ruby镜像是否是taobao,用命令行&#xff1a; gem sources -l 返回信息为&#xf…

JAVA软件图片浏览下载_java模拟浏览器下载图片

/** * 抓取网上的图片 * param imgSrc * param filePath */ public static void downloadImgByNet(String imgSrc,String filePath,String fileName){ try{ URL url new URL(imgSrc); URLConnection conn url.openConnection(); //设置超时间为3秒 conn.setConnectTimeout(3*…

微信企业号开发之如何建立连接

http://www.07net01.com/2014/09/167991.html 连接将使你的企业号更具价值&#xff0c;你可以使用以下三种方式&#xff0c;连接你的企业号及企业应用&#xff1a; 1、企业应用调用企业号提供的接口&#xff0c;管理或查询企业号后台所管理的资源、或给成员发送消息等&#xff…

完全颠覆你世界观的10个科学实验!从此脑洞大开

全世界只有3.14 % 的人关注了爆炸吧知识这两天超模君逛知乎时&#xff0c;发现有人提问&#xff1a;“如何让孩子学会主动”&#xff1f;孩子学会主动是很重要的&#xff0c;特别是在学习方面&#xff0c;懂得主动学习无论是在小时候还是未来都很有优势。可能很多家长都有类似的…

js模版引擎handlebars.js实用教程——with-终极this应用

返回目录 1 <!DOCTYPE html>2 <html>3 <head>4 <META http-equivContent-Type content"text/html; charsetutf-8">5 <title>with-终极this应用 - by 杨元</title>6 </head>7 <body>8 <h1>w…

大学

(一才女博客看来的&#xff0c;不错&#xff0c;意境很浓)大一&#xff0c;年少春衫薄。骑马倚斜桥&#xff0c;满楼红袖招。一朝看尽长安花。大二&#xff0c;春日游&#xff0c;杏花插满头。谁家年少足风流&#xff0c;妾身欲语还休。大三&#xff0c;男儿立志出乡关&#xf…

c# 弹性和瞬态故障处理库Polly

关于pollypolly文档中对自己介绍的原文是:Polly is a .NET resilience and transient-fault-handling library that allows developers to express policies such as Retry,Circuit Breaker, Timeout, Bulkhead Isolation, and Fallback in a fluent and thread-safe manner.从…

MySQL账户安全设置

一般来说&#xff0c;安装完MySQL后&#xff0c;默认的用户是root,密码123456&#xff0c;外网不能访问。 有时候也希望在外网访问&#xff0c;则可以添加一个账户。建议不要用root。 如下表&#xff0c;存在安全问题&#xff1a; mysql> select host,user,password from us…

Android之Android Studio--Gradle多渠道打包

于国内Android市场众多渠道,为了统计每个渠道的下载及其它数据统计,就需要我们针对每个渠道单独打包,如果让你打几十个市场的包岂不烦死了,不过有了Gradle,这再也不是事了。 友盟多渠道打包 废话不多说,以友盟统计为例,在AndroidManifest.xml里面会有这么一段: <…