郭联钰1

<div class="post">
<h1 class="postTitle">

<a id="cb_post_title_url" class="postTitle2" href="https://www.cnblogs.com/guolianyu/p/9614050.html">实战中的asp.net core结合Consul集群&Docker实现服务治理</a>

        </h1>
        <div class="clear"></div>
        <div class="postBody">

<div id="cnblogs_post_body" class="blogpost-body ">
<h1><span style="color: #3194d0;">0、目录</span></h1>



<p> </p>
<p>整体架构目录:<a id="cb_post_title_url" class="postTitle2" href="https://www.cnblogs.com/guolianyu/p/9473676.html" target="_blank">ASP.NET Core分布式项目实战-目录</a></p>
<h1><span style="color: #3194d0;">一、前言</span></h1>


<p> </p>
<p>在写这篇文章之前,我看了很多关于consul的服务治理,但发现基本上都是直接在powershell或者以命令工具的方式在服务器上面直接输入consul agent .... 来搭建启动consul集群,一旦把命令工具关掉,则consul无法再后台启动,尤其是在linux系统中。</p>
<p>如果在window系统中,采用bat文件到时可以做成开机自启,或者在linux中把命令做成一个service 服务文件来启动就可以实现后台运行。</p>
<p><strong><span style="color: #3194d0;">因此为了社区能更好的发展技术,且能把consul应用在生产环境中,我认真回顾了在公司项目中的应用,特此把我开发及总结的分享给大家,此篇文章采用docker引擎,并且只涉及到consul集群部署以及结合asp.net core微服务注册。</span></strong></p>
<p>当然如果内容有涉及安全隐患的,大家可以积极留言,共同进步。</p>
<p> 注:以下所涉及到部署过程全部经过楼主我反复的验证,总结得来。大家在应用的过程中如果出现问题,可以留言咨询。</p>
<h1><span style="color: #3194d0;">二、部署consul集群</span></h1>


<p> </p>
<h3>1、介绍一下Consul</h3>
<p><strong>consul 关键特性</strong>
  服务发现:支持服务发现。你可以通过 DNS 或 HTTP 的方式获取服务信息。
  健康检查:支持健康检查。可以提供与给定服务相关联的任何数量的健康检查(如 web 状态码或 cpu 使用率)。
  K/V 存储:键/值对存储。你可用通过 consul 存储如动态配置之类的相关信息。
  多数据中心:支持多数据中心,开箱即用。
  WEB UI:支持 WEB UI。点点点,你就能够了解你的服务现在的运行情况,一目了然,对开发运维是非常友好的。</p>
<p> </p>
<p><strong>说明:</strong></p>
<p>在Consul方案中,<span style="color: #3194d0;"><strong>每个提供服务的节点上都要部署和运行Consul的Client Agent</strong></span>,所有运行Consul Agent节点的集合构成Consul Cluster。
<span style="color: #3194d0;"><strong>Consul Agent有两种运行模式:Server和Client。</strong></span>这里的Server和Client只是Consul集群层面的区分,与搭建在Cluster之上的应用服务无关。以Server模式运行的Consul Agent节点用于维护Consul集群的状态,官方建议每个Consul Cluster至少有3个或以上的运行在Server Mode的Agent,Client节点不限。</p>
<p>Consul支持多数据中心,每个数据中心的Consul Cluster都会在运行于Server模式下的Agent节点中选出一个Leader节点,这个选举过程通过Consul实现的raft协议保证,多个 Server节点上的Consul数据信息是强一致的。处于Client Mode的Consul Agent节点比较简单,无状态,仅仅负责将请求转发给Server Agent节点。</p>
<p> </p>
<p><strong>Consul与其他工具的比较</strong></p>
<p><img src="https://images2018.cnblogs.com/blog/651008/201809/651008-20180909161037795-46243583.png" alt="" width="676" height="504"></p>
<p> </p>
<p><strong>consul的端口解释</strong></p>
<p><strong><img src="https://images2018.cnblogs.com/blog/651008/201809/651008-20180909161116556-1861655489.png" alt="" width="641" height="327"></strong></p>
<p>好了,该介绍的已经介绍了,接下来就是正式部署吧</p>
<p> </p>
<h3>2、Docker上运行Consul</h3>
<h4>第一步:安全配置,适用授权和数据加密传输(生产环境是必须的)</h4>
<p>为了consul的安全,需要进行gossip加密以及RPC加密结合TLS。
<span style="color: #3194d0;"><strong>Gossip加密:</strong></span>主要用于节点间的接收发送集群信息安全。
<span style="color: #3194d0;"><strong>RPC加密:</strong></span>主要用于Agent之间调用RPC授权的安全性。</p>
<p> </p>
<p><strong>此处大家可以参考官网或者一下资料:</strong></p>
<p>https://www.jianshu.com/p/3d074ed76a68
https://www.consul.io/docs/agent/encryption.html</p>
<p> </p>
<h4>第二步:consul集群部署</h4>
<p>准备服务器(可以采用虚拟机部署)</p>
<table style="height: 224px; width: 612px;" border="0">
<tbody>
<tr>
<td> </td>
<td>名称</td>
<td>IP</td>

</tr>
<tr>
<td>CentOS7-1</td>
<td>server1</td>
<td>192.168.216.160</td>

</tr>
<tr>
<td>CentOS7-2</td>
<td>server2</td>
<td>192.168.216.161</td>

</tr>
<tr>
<td>CentOS7-3</td>
<td>server3</td>
<td>192.168.216.162</td>

</tr>
<tr>
<td>CentOS7-4</td>
<td>client1</td>
<td>192.168.216.163</td>

</tr>
<tr>
<td>vs 2017</td>
<td>project部署在docker上</td>
<td>192.168.216.163</td>

</tr>

</tbody>

</table>
<p><strong>部署server1</strong></p>
<p><span style="color: #3194d0;">docker run -d --net=host -v PWD/data:/consul/data -vPWD/config:/consul/config --restart always --name consulServer1 consul agent -server -bind=192.168.216.160 -node=server1 -bootstrap-expect 3 -data-dir=/consul/data -config-file=/consul/config -client 0.0.0.0 -ui</span></p>
<p><span style="color: #3194d0;"> </span></p>
<p><strong>部署server2</strong>
<span style="color: #3194d0;">docker run -d --net=host -v PWD/data:/consul/data -vPWD/config:/consul/config --restart always --name cs2 consul agent -server -bind=192.168.216.161 -node=server2 -bootstrap-expect 3 -data-dir=/consul/data -config-file=/consul/config -client 0.0.0.0 -ui -retry-join=192.168.216.160</span></p>
<p><span style="color: #3194d0;"> </span></p>
<p><strong>部署server3</strong>
<span style="color: #3194d0;">docker run -d --net=host -v PWD/data:/consul/data -vPWD/config:/consul/config --restart always --name cs3 consul agent -server -bind=192.168.216.162 -node=server3 -bootstrap-expect 3 -data-dir=/consul/data -config-file=/consul/config -client 0.0.0.0 -ui -retry-join=192.168.216.160</span></p>
<p>
<strong>部署client-连接server</strong>
<span style="color: #3194d0;">docker run -d --net=host -v PWD/data:/consul/data -vPWD/config:/consul/config --restart always --name cc1 consul agent -bind=192.168.216.163 -node=client1 -data-dir=/consul/data -config-file=/consul/config -client 0.0.0.0 -retry-join=192.168.216.160</span></p>
<p><span style="color: #3194d0;"> </span></p>
<p><span style="color: #ff0000;"><strong>注:(针对以上的参数以及配置解释)</strong></span>
1、此处的数据挂载就是把容器内的data以及配置挂载到外部地址,<strong><span style="color: #3194d0;">PWD代表当前目录即你运行docker命令时的目录,当然PWD可以替换为具体的路径</span></strong>。
2、-data-dir=/consul/consul -config-file=/consul/config :这两个地方代表在consul启动后会把数据以及配置文件放到指定的目录下,这个对于在服务器模式下运行的代理尤其重要,因为它们必须能够保持群集状态。
3、总结,以上两点结合就是说明 consul产生的数据然后挂载在外部地址进行持久化存储。
4、server端 的-client 参数可以不用,官方推荐是 服务注册到client端,由client端再把数据统一提交到server端。</p>
<p> </p>
<p>参数说明</p>
<p>-client : 0.0.0.0 代表绑定到所有接口的选项,如果没有此选项,则asp.net core无法进行服务注册使用</p>
<p>-bind :该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的</p>
<p>--net=host 使得docker容器越过了net namespace的隔离,免去手动指定端口映射的步骤</p>
<p>-retry-join 允许你在第一次失败后进行尝试,加入一个已经启动的agent的ip地址</p>
<p>-bootstrap-expect 提供的server节点数目</p>
<p>-ui 启动自有主机的界面</p>
<p>-data-dir :提供一个目录用来存放agent的状态,所有的agent允许都需要该目录,该目录必须是稳定的,系统重启后都继续存在</p>
<p>CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}:在0.7版本之后默认是true,因此不是必须的。</p>
<p>CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}:在0.7版本之后默认是true,因此不是必须的。如果启用,当代理收到TERM信号时,它将向Leave群集的其余部分发送消息并正常离开</p>
<p> </p>
<p><strong>打开浏览器器查看 consul :</strong></p>
<p><img src="https://images2018.cnblogs.com/blog/651008/201809/651008-20180909162501482-2001493357.png" alt=""></p>
<p><span style="font-size: 15px;"><strong>看所有consul节点情况</strong></span>
docker exec -t cs1 consul members</p>
<p><img src="https://images2018.cnblogs.com/blog/651008/201809/651008-20180909162528132-215591304.png" alt=""></p>
<p> </p>
<p><span style="font-size: 15px;"><strong>查看server的状态,以及哪一个节点是leader</strong></span></p>
<p>docker exec -t cs1 consul operator raft list-peers</p>
<p><img src="https://images2018.cnblogs.com/blog/651008/201809/651008-20180909162603859-553257653.png" alt=""></p>
<h2><span style="color: #ff0000;"><strong>注:</strong></span></h2>
<p><span style="color: #ff0000;"><strong><span style="font-size: 16px;">如果其中一台或者多台server端挂掉,则Consul集群就会重新选举新的Leader,</span></strong></span>
<span style="color: #ff0000;"><strong><span style="font-size: 16px;">但是一旦挂掉阿的节点数量超过一半,则Consul集群就无法工作了。</span></strong></span></p>
<h1><span style="color: #3194d0;">三、asp.net core微服务进行服务注册</span></h1>



<p> </p>
<h3>1、新建一个项目asp.net core webapi项目</h3>
<p>引入 consul ,nuget包</p>
<h3>2、在控制器中新建一个控制器Health,代表健康检查</h3>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre>[Produces(<span style="color: #800000;">"</span><span style="color: #800000;">application/json</span><span style="color: #800000;">"</span><span style="color: #000000;">)]
[Route(</span><span style="color: #800000;">"</span><span style="color: #800000;">api/Health</span><span style="color: #800000;">"</span><span style="color: #000000;">)]
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> HealthController : Controller
{
[HttpGet]
</span><span style="color: #0000ff;">public</span> IActionResult Get() => Ok(<span style="color: #800000;">"</span><span style="color: #800000;">ok</span><span style="color: #800000;">"</span><span style="color: #000000;">);
}</span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p> </p>
<h3>3、然后在appsetting.json中添加配置文件</h3>
<p>需要手动配置一下地址和端口号。</p>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #000000;">{
</span><span style="color: #800000;">"</span><span style="color: #800000;">Logging</span><span style="color: #800000;">"</span><span style="color: #000000;">: {
</span><span style="color: #800000;">"</span><span style="color: #800000;">IncludeScopes</span><span style="color: #800000;">"</span>: <span style="color: #0000ff;">false</span><span style="color: #000000;">,
</span><span style="color: #800000;">"</span><span style="color: #800000;">Debug</span><span style="color: #800000;">"</span><span style="color: #000000;">: {
</span><span style="color: #800000;">"</span><span style="color: #800000;">LogLevel</span><span style="color: #800000;">"</span><span style="color: #000000;">: {
</span><span style="color: #800000;">"</span><span style="color: #800000;">Default</span><span style="color: #800000;">"</span>: <span style="color: #800000;">"</span><span style="color: #800000;">Warning</span><span style="color: #800000;">"</span><span style="color: #000000;">
}
},
</span><span style="color: #800000;">"</span><span style="color: #800000;">Console</span><span style="color: #800000;">"</span><span style="color: #000000;">: {
</span><span style="color: #800000;">"</span><span style="color: #800000;">LogLevel</span><span style="color: #800000;">"</span><span style="color: #000000;">: {
</span><span style="color: #800000;">"</span><span style="color: #800000;">Default</span><span style="color: #800000;">"</span>: <span style="color: #800000;">"</span><span style="color: #800000;">Warning</span><span style="color: #800000;">"</span><span style="color: #000000;">
}
}
},
</span><span style="color: #800000;">"</span><span style="color: #800000;">ServiceRegister</span><span style="color: #800000;">"</span>: { <span style="color: #008000;">//</span><span style="color: #008000;">服务注册</span>
<span style="color: #800000;">"</span><span style="color: #800000;">IsActive</span><span style="color: #800000;">"</span>: <span style="color: #0000ff;">true</span><span style="color: #000000;">,
</span><span style="color: #800000;">"</span><span style="color: #800000;">ServiceName</span><span style="color: #800000;">"</span>: <span style="color: #800000;">"</span><span style="color: #800000;">testconsul6</span><span style="color: #800000;">"</span><span style="color: #000000;">,
</span><span style="color: #800000;">"</span><span style="color: #800000;">ServiceHost</span><span style="color: #800000;">"</span>: <span style="color: #800000;">"</span><span style="color: #800000;">192.168.216.163</span><span style="color: #800000;">"</span><span style="color: #000000;">,
</span><span style="color: #800000;">"</span><span style="color: #800000;">ServicePort</span><span style="color: #800000;">"</span>: <span style="color: #800080;">5006</span><span style="color: #000000;">,
</span><span style="color: #800000;">"</span><span style="color: #800000;">Register</span><span style="color: #800000;">"</span><span style="color: #000000;">: {
</span><span style="color: #800000;">"</span><span style="color: #800000;">HttpEndpoint</span><span style="color: #800000;">"</span>: <span style="color: #800000;">"</span><span style="color: #800000;">http://192.168.216.163:8500</span><span style="color: #800000;">"</span><span style="color: #000000;">
}
}
}</span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p> </p>
<h3>4、这一步是服务注册的类</h3>
<p>ServiceRegisterOptions.cs</p>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> ServiceRegisterOptions
{
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 是否启用
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">bool</span> IsActive { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 服务名称
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> ServiceName { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 服务IP或者域名
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> ServiceHost { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> 服务端口号
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> ServicePort { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
</span><span style="color: #808080;">///</span> <span style="color: #808080;"><summary></span>
<span style="color: #808080;">///</span><span style="color: #008000;"> consul注册地址
</span><span style="color: #808080;">///</span> <span style="color: #808080;"></summary></span>
<span style="color: #0000ff;">public</span> RegisterOptions Register { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
}</span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p> </p>
<p> RegisterOptions.cs</p>
<div class="cnblogs_code">
<pre><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> RegisterOptions
{
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> HttpEndpoint { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
}</span></pre>
</div>
<p> </p>
<h3> 5、在startup.cs 中的服务注册</h3>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> ConfigureServices(IServiceCollection services)
{
</span><span style="color: #0000ff;">#region</span> 服务注册基础信息配置<span style="color: #000000;">
services.Configure</span><ServiceRegisterOptions>(Configuration.GetSection(<span style="color: #800000;">"</span><span style="color: #800000;">ServiceRegister</span><span style="color: #800000;">"</span><span style="color: #000000;">));
services.AddSingleton</span><IConsulClient>(p => <span style="color: #0000ff;">new</span> ConsulClient(cfg =><span style="color: #000000;">
{
</span><span style="color: #0000ff;">var</span> serviceConfiguration = p.GetRequiredService<IOptions<ServiceRegisterOptions>><span style="color: #000000;">().Value;
</span><span style="color: #0000ff;">if</span> (!<span style="color: #0000ff;">string</span><span style="color: #000000;">.IsNullOrEmpty(serviceConfiguration.Register.HttpEndpoint))
{
cfg.Address </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Uri(serviceConfiguration.Register.HttpEndpoint);
}
}));
</span><span style="color: #0000ff;">#endregion</span><span style="color: #000000;">

        services.AddMvc();
    }</span></pre>

<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p> </p>
<p>在Configure 方法中配置代码</p>
<div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div>
<pre><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> RegisterService(IApplicationBuilder app,
IOptions</span><ServiceRegisterOptions><span style="color: #000000;"> serviceRegisterOptions,
IConsulClient consul,
IApplicationLifetime appLife)
{
</span><span style="color: #0000ff;">var</span> serviceId = $<span style="color: #800000;">"</span><span style="color: #800000;">{serviceRegisterOptions.Value.ServiceName}_{serviceRegisterOptions.Value.ServiceHost}:{serviceRegisterOptions.Value.ServicePort}</span><span style="color: #800000;">"</span><span style="color: #000000;">;

        </span><span style="color: #0000ff;">var</span> httpCheck = <span style="color: #0000ff;">new</span><span style="color: #000000;"> AgentServiceCheck()
        {
            DeregisterCriticalServiceAfter </span>= TimeSpan.FromSeconds(<span style="color: #800080;">5</span>),<span style="color: #008000;">//</span><span style="color: #008000;">服务启动多久后注册</span>
            Interval = TimeSpan.FromSeconds(<span style="color: #800080;">30</span>),<span style="color: #008000;">//</span><span style="color: #008000;">健康检查时间间隔,或者称为心跳间隔</span>
            HTTP = $<span style="color: #800000;">"</span><span style="color: #800000;">http://{serviceRegisterOptions.Value.ServiceHost}:{serviceRegisterOptions.Value.ServicePort}/api/health</span><span style="color: #800000;">"</span>,<span style="color: #008000;">//</span><span style="color: #008000;">健康检查地址</span>

<span style="color: #000000;"> };

        </span><span style="color: #0000ff;">var</span> registration = <span style="color: #0000ff;">new</span><span style="color: #000000;"> AgentServiceRegistration()
        {
            Checks </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;">[] { httpCheck },
            Address </span>=<span style="color: #000000;"> serviceRegisterOptions.Value.ServiceHost,
            ID </span>=<span style="color: #000000;"> serviceId,
            Name </span>=<span style="color: #000000;"> serviceRegisterOptions.Value.ServiceName,
            Port </span>=<span style="color: #000000;"> serviceRegisterOptions.Value.ServicePort
            </span><span style="color: #008000;">//</span><span style="color: #008000;">Tags = new[] { $"urlprefix-/{serviceRegisterOptions.Value.ServiceName}" }</span><span style="color: #008000;">//</span><span style="color: #008000;">添加 urlprefix-/servicename 格式的 tag 标签,以便 Fabio 识别</span>

<span style="color: #000000;"> };
</span><span style="color: #008000;">//</span><span style="color: #008000;">.GetAwaiter().GetResult()</span>
<span style="color: #000000;"> consul.Agent.ServiceRegister(registration).GetAwaiter().GetResult();

        appLife.ApplicationStopping.Register(() </span>=&gt;<span style="color: #000000;">
        {
            consul.Agent.ServiceDeregister(serviceId).GetAwaiter().GetResult();</span><span style="color: #008000;">//</span><span style="color: #008000;">服务停止时取消注册</span>

<span style="color: #000000;"> });
}
</span><span style="color: #0000ff;">#endregion</span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);" onclick="copyCnblogsCode(this)" title="复制代码"><img src="//common.cnblogs.com/images/copycode.gif" alt="复制代码"></a></span></div></div>
<p> </p>
<p>自此,可以把我们的项目部署到163服务器上面的docker上啦。</p>
<p>我们看一下效果,成功注册到了</p>
<p><img src="https://images2018.cnblogs.com/blog/651008/201809/651008-20180909180513074-280273671.png" alt=""></p>
<p><img src="https://images2018.cnblogs.com/blog/651008/201809/651008-20180909180543608-730458163.png" alt=""></p>
<p> </p>
<p> </p>
<h3><strong>参考资料:</strong></h3>
<p><strong>Conusl TLS配置:</strong></p>
<p> https://www.jianshu.com/p/3d074ed76a68
https://www.consul.io/docs/agent/encryption.html</p>
<p><strong>consul 参数配置: </strong></p>
<p>https://blog.csdn.net/zl1zl2zl3/article/details/79622476</p>
<p><strong>consul服务治理:</strong></p>
<p>http://michaco.net/blog/ServiceDiscoveryAndHealthChecksInAspNetCoreWithConsul
https://www.cnblogs.com/myzony/p/9168851.html
https://www.cnblogs.com/edisonchou/p/9124985.html</p>
<p> </p>



<p> </p>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容

  • 一、Consul简介 Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go...
    QIQIHAL阅读 4,910评论 0 11
  • 假设三台主机的ip分别为: 主机一:10.21.14.164 主机二:10.21.14.165 主机三:10.21...
    soane1983阅读 3,594评论 0 1
  • 使用Consul打造弹性可扩展的PaaS平台 应用背景 HiAR 是亮风台打造的新一代增强现实(AR)开发平台,提...
    喵喵唔的老巢阅读 247评论 0 1
  • 妈妈的爱是什么 我们总是觉得妈妈,父母们不理解我们 可是 你见过的,你想过的,你认为的 和你的父母是在一个程度上吗...
    chde我阅读 182评论 0 0
  • 1、加油站国庆搞活动92号汽油,每升6元。超过或等于20升,价格降到5.9元;97号汽油,每升7元。超过或等于30...
    hi__world阅读 2,239评论 0 5