雪蝠 發表於 2018-6-17 00:33:00

基于docker 如何部署surging分布式微服务引擎

<h1 align="left"><strong>1</strong><strong>、前言</strong></h1>
<p align="left"><span style="font-size: 18px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 转眼间surging 开源已经有1年了,经过1年的打磨,surging已从最初在window 部署的分布式微服务框架,到现在的可以在docker部署利用rancher 进行服务编排的分布式微服务引擎,再把业务进行剥离, 通过配置路径就能驱动加载业务模块,这样的细粒度设计,能更加灵活从业务中针对于对象加以细分,能更加灵活的拆分聚合服务。而这篇文章我们来谈谈基于docker 如何部署</span></p>
<p align="left"><span style="font-size: 18px">surging源码下载</span></p>
<h1><span style="font-family: &quot;Microsoft YaHei&quot;">2、概述</span></h1>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">容器,就是用来存放镜像的器皿,而镜像是构建成的一个轻量的、独立的、可执行的包,包括了执行它所需要的所有东西:代码、运行环境、系统工具、系统库、设置。</span></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">程序被构建成镜像放到容器中,那么它所依赖的下层环境就不再重要了。它可以在任何地方运行,甚至在混合云环境下也可以。所以为何容器能流行起来,<span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">而容器技术兴起让Docke也渐渐的映入大家的眼帘,</span></span></p>
<p>&nbsp;</p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px"><img src="https://images2018.cnblogs.com/blog/192878/201806/192878-20180616221703997-1903475797.png"></span></p>
<p>&nbsp;</p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">那么Docker又是什么呢?</span></p>
<ul>
<li>
<p style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">Docker是基于Go语言开发并开源的容器引擎</p>
</li>
<li>
<p style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">Docker将应用软件运行时所需的一切都打包成互相隔离的容器</p>
</li>
<li>
<p style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">Docker可以自动执行并配置开发/线上环境,快速构建,测试和运行复杂的多容器应用程序</p>
</li>
<li>
<p style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">对拥有数千个节点或容器的应用程序,Docker也能快速的扩展和调配</p>
</li>
<li>
<p style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">可以运行在主流的Linux系统,Mac以及Windows上,并且保证无论软件在哪里部署,都能正常运行并得到相同的结果</p>
</li>
</ul>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">相关概念介绍</span></p>
<ul>
<li>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">Image镜像和Container容器:你可以把两者理解为类和实例对象,或者是ISO系统镜像和虚拟机的关系。不同的Image所包含的软件或者环境是不同的,但是你可以使用Dockerfile(docker特有语法规则所创建的文件)进行管理。而Container则是以Image作为模板,可以独立运行的微型系统,一个Image可以创建出来多个Container容器的实例</span></p>
</li>
<li>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">Registry:Docker Hub镜像仓库,为每个人提供庞大的镜像资源进行拉取和使用</span></p>
</li>
<li>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">Dockerfile:是一个将镜像命令组合在一起的文件,用于Image的自动构建</span></p>
</li>
</ul>
<h1 align="left">&nbsp;3、环境搭建</h1>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">系统环境</span></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">宿主机:Windows 10 专业版</span></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">Linux服务器: CentOS 3.10 <br></span></p>
<h2><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">1.安装Docker</span></h2>
<p>&nbsp;</p>
<p><span style="font-size: 18px">Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。</span></p>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">通过 uname<strong> -r </strong>命令查看你当前的内核版本</span></p>
<p>&nbsp;</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;"># uname -r 3.10.0-862.E17.X86_64
</pre>
</div>
<p>&nbsp;</p>
<p><span style="font-size: 18px">&nbsp;# yum install docker-engine 安装docker包</span></p>
<p><span style="font-size: 18px">&nbsp;安装成功后,使用docker version命令查看是否安装成功,安装成功后------如下图</span></p>
<p><span style="font-size: 18px"><img src="https://images2018.cnblogs.com/blog/192878/201806/192878-20180616225320639-1502799568.png"></span></p>
<p>&nbsp;</p>
<p><span style="font-size: 18px; font-family: Microsoft YaHei">&nbsp;启动 Docker</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">systemctlstartdocker
</pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 18px"><code>&nbsp;<code>查看docker信息,如下图</code></code></span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">systemctlstatusdocker
</pre>
</div>
<p>&nbsp;</p>
<p><span style="font-size: 18px"><span class="hljs-comment"><img src="https://images2018.cnblogs.com/blog/192878/201806/192878-20180616230039445-2132284412.png"></span></span></p>
<p>&nbsp;</p>
<p><span style="font-size: 18px">测试运行 hello-world</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">#docker run hello-world
</pre>
</div>
<h2>&nbsp;<span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">2.安装rancher</span></h2>
<p><span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">下载镜像</span></p>
<p>&nbsp;</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">docker pull rancher/server
</pre>
</div>
<p><span style="font-size: 18px; font-family: Microsoft YaHei"><code>启动</code><code class=" hljs axapta">rancher</code></span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">docker run -d --restart=always -p 8080:8080 rancher/server
</pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 18px">&nbsp;安装成功后,通过http://ip:8080访问,如下图所示</span></p>
<p><img src="https://images2018.cnblogs.com/blog/192878/201806/192878-20180616231447458-1773965245.png"></p>
<h2>&nbsp;<span style="font-family: &quot;Microsoft YaHei&quot;; font-size: 18px">3.安装rabbitmq</span></h2>
<p><code class=" hljs axapta"><span style="font-family: Microsoft YaHei; font-size: 18px">&nbsp;下载镜像</span><span class="hljs-number"><span class="hljs-number"><span class="hljs-keyword"><br></span></span></span></code></p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">#docker pull rabbitmq:management
</pre>
</div>
<p><span style="font-size: 18px; font-family: Microsoft YaHei"><code>启动</code><code class=" hljs axapta">rabbitmq</code></span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">#docker run -d --name rabbitmq --publish 5672:5672 --publish 4369:4369 --publish 25672:25672 --publish 15671:15671 --publish 15672:15672 \rabbitmq:management
</pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 18px">&nbsp;安装成功后,通过http://ip:15672访问,如下图所示</span></p>
<p><span class="hljs-number"><span class="hljs-number"><span class="hljs-keyword"><img src="https://images2018.cnblogs.com/blog/192878/201806/192878-20180616232551581-2127222802.png"></span></span></span><code class="hljs sql has-numbering"></code></p>
<h2><span style="font-family: Microsoft YaHei; font-size: 18px"><code>4.安装Consul</code></span></h2>
<p><span style="font-family: Microsoft YaHei; font-size: 18px">下载镜像</span></p>
<p>&nbsp;</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">#docker pull docker.io/consul:latest
</pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;创建 Consul 配置</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">#vim /opt/platform/consul/server.json
</pre>
</div>
<p>&nbsp;</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">{
    "datacenter": "quark-consul",
    "data_dir": "/consul/data",
    "server": true,
    "ui": true,
    "bind_addr": "192.168.249.162",
    "client_addr": "192.168.249.162",
    "bootstrap_expect": 1,
    "retry_interval": "10s",
    "rejoin_after_leave": false,
    "skip_leave_on_interrupt": true
<span style="font-size: 18px">}
</span></pre>
</div>
<p><span style="font-size: 18px">&nbsp;配置说明</span></p>
<p><span style="font-size: 16px">官方在启动容器的时候是将一部分配置作为 <code>docker run</code> 的参数,而我是把参数写到了配置文件里。</span></p>
<ul>
<li><span style="font-size: 16px">datacenter:数据中心名称(库名)</span></li>
<li><span style="font-size: 16px">data_dir:数据存储目录</span></li>
<li><span style="font-size: 16px">server:运行在server模式</span></li>
<li><span style="font-size: 16px">ui:使用UI界面</span></li>
<li><span style="font-size: 16px">bind_addr:内部集群通信绑定的地址。默认是<code>0.0.0.0</code>,如果有多块网卡,需要指定,否则启动报错</span></li>
<li><span style="font-size: 16px">client_addr:客户端接口绑定的地址,默认是<code>127.0.0.1</code>;</span></li>
<li><span style="font-size: 16px">retry_join:重新加入集群</span></li>
<li><span style="font-size: 16px">retry_interval:重试时间</span></li>
<li><span style="font-size: 16px">rejoin_after_leave:在离开集群之后才重试加入</span></li>
<li><span style="font-size: 16px">skip_leave_on_interrupt:在启动后,是否 Ctrl+C 优雅退出,我们是容器模式,所以不用管,直接 true 就好了。</span></li>
</ul>
<p><span style="font-family: Microsoft YaHei; font-size: 18px">启动 consul-server</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">docker run -d --net=host --name consul -v /opt/platform/consul/config:/consul/config -v /opt/platform/consul/data:/consul/data consul agent
</pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 18px">&nbsp;安装成功后,通过http://ip:8500访问,如下图所示</span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 18px"><span class="hljs-number"><span class="hljs-number"><span class="hljs-keyword"><img src="https://images2018.cnblogs.com/blog/192878/201806/192878-20180616234435437-1852660540.png"></span></span></span></span></p>
<p>&nbsp;</p>
<h2><span style="font-size: 18px; font-family: Microsoft YaHei">5. 安装dotnetcore 2.1 runtime</span></h2>
<p><span style="font-size: 18px; font-family: Microsoft YaHei">下载镜像</span></p>
<div class="cnblogs_code">
<pre>#sudo docker pull microsoft/dotnet:<span style="color: rgba(128, 0, 128, 1)">2.1</span>-runtime</pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 18px">启动</span><span style="font-size: 18px; font-family: Microsoft YaHei">&nbsp;</span></p>
<p>&nbsp;</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">#sudo docker run -it microsoft/dotnet:2.1-runtime
</pre>
</div>
<h1>四、部署程序</h1>
<h2><span style="font-family: Microsoft YaHei; font-size: 18px">1. 部署surging引擎,无需引用任何业务模块,新建Dockerfile文件</span></h2>
<div class="cnblogs_code">
<pre>FROM microsoft/dotnet:<span style="color: rgba(128, 0, 128, 1)">2.1</span>-<span style="color: rgba(0, 0, 0, 1)">runtime
WORKDIR </span>/<span style="color: rgba(0, 0, 0, 1)">app
COPY . .
ENTRYPOINT [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">dotnet</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Surging.Services.Server.dll</span><span style="color: rgba(128, 0, 0, 1)">"</span>]</pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 18px">发布程序</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">dotnet publish -r centos.7-x64 -c release
</pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 18px">&nbsp;使用Dockerfile创建镜像</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">#docker build -t surgingserver .
</pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 18px">&nbsp;启动</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">#docker run --name surgingserver --env Mapping_ip=192.168.249.162 --env Mapping_Port=198 --env RootPath=/home/fanly --env
Register_Conn=192.168.249.162:8500 --env EventBusConnection=172.17.0.4 --env Surging_Server_IP=0.0.0.0 -v /home/fanly:/home/fanly -it -p 198:198 surgingserver
</pre>
</div>
<p>&nbsp;</p>
<p><span style="font-size: 18px; font-family: Microsoft YaHei">&nbsp;配置说明</span></p>
<ul>
<li><span style="font-size: 16px; font-family: Microsoft YaHei">Mapping_ip:映射的外部IP(环境变量)</span></li>
<li><span style="font-size: 16px; font-family: Microsoft YaHei"><span style="font-size: 16px">Mapping_port</span>:映射的外部端口<span style="font-size: 16px">(环境变量)</span></span></li>
<li><span style="font-size: 16px; font-family: Microsoft YaHei">RootPath:业务模块存储的根路径<span style="font-size: 16px">(环境变量)</span></span></li>
<li><span style="font-size: 16px; font-family: Microsoft YaHei">Register_Conn:注册中心地址<span style="font-size: 16px">(环境变量)</span></span></li>
<li><span style="font-size: 16px; font-family: Microsoft YaHei">EventBusConnection:eventbus 地址<span style="font-size: 16px">(环境变量)</span><br></span></li>
<li><span style="font-size: 16px; font-family: Microsoft YaHei">Surging_Server_IP:容器内部IP<span style="font-size: 16px"><span style="font-size: 16px">(环境变量)</span></span></span></li>














</ul>
<p><span style="font-size: 16px; font-family: Microsoft YaHei"><span style="font-size: 16px"><span style="font-size: 16px">启动后在rancher如下图所示</span></span></span></p>
<p><span style="font-size: 16px"><span style="font-size: 16px"><span style="font-size: 16px"><img src="https://images2018.cnblogs.com/blog/192878/201806/192878-20180617000714905-1850441079.png"></span></span></span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 18px">因为方便,把宿主机的目录进行了挂载,microsurging 为分布式微服务引擎,Modules 为业务模块目录,surgingapi为网关</span></p>
<p><img src="https://images2018.cnblogs.com/blog/192878/201806/192878-20180617001218020-321086496.png"></p>
<h2><span style="font-family: Microsoft YaHei; font-size: 18px">2. 部署surging网关,<span style="font-family: Microsoft YaHei; font-size: 18px">新建Dockerfile文件</span></span></h2>
<p>&nbsp;</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">FROM microsoft/dotnet:2.1-runtime
WORKDIR /app
COPY . .
ENTRYPOINT ["dotnet", "Surging.ApiGateway.dll"]
</pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 18px">&nbsp;</span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 18px">&nbsp;发布程序</span></p>
<p>&nbsp;</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">dotnet publish -r centos.7-x64 -c release
</pre>
</div>
<p>&nbsp;</p>
<p><span style="font-family: Microsoft YaHei; font-size: 18px">&nbsp;使用Dockerfile创建镜像</span></p>
<p>&nbsp;</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">docker build -t surgingapi .
</pre>
</div>
<p>&nbsp;</p>
<p><span style="font-family: Microsoft YaHei; font-size: 18px">&nbsp;&nbsp;启动</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">#docker run --name surgingapi -it -p 729:729 --env Register_Conn=192.168.249.162:8500 surgingapi
</pre>
</div>
<p><span style="font-family: Microsoft YaHei; font-size: 18px">&nbsp;启动后在rancher如下图所示</span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 18px"><img src="https://images2018.cnblogs.com/blog/192878/201806/192878-20180617002238129-1174095297.png"></span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 18px">可以通过http://ip:729进行访问</span></p>
<p><span style="font-family: Microsoft YaHei; font-size: 18px"><img src="https://images2018.cnblogs.com/blog/192878/201806/192878-20180617002413523-543823639.png"></span></p>
<p>&nbsp;</p>
<p>&nbsp;<img src="https://images2018.cnblogs.com/blog/192878/201806/192878-20180617002506240-79004076.png"></p>
<p><span style="font-family: Microsoft YaHei; font-size: 18px">然后可以通过postman 来测试网关,如下图</span></p>
<p><img src="https://images2018.cnblogs.com/blog/192878/201806/192878-20180617002619580-989250379.png"></p>
<h1><span style="font-family: Microsoft YaHei">五、总结</span></h1>
<p><span style="font-family: Microsoft YaHei; font-size: 18px">通过1年的开发,surging 也趋于完善,性能非常不错,平均访问在0.12ms 左右,而且6月30日会在上海微软研发中心和大家见面讲解下surging 微服务引擎,也请大家多多关注</span></p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/fanliang11/p/9191793.html
頁: [1]
查看完整版本: 基于docker 如何部署surging分布式微服务引擎