<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>服务注册 on Yeqown</title>
    <link>https://www.yeqown.xyz/tags/%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C/</link>
    <description>Recent content in 服务注册 on Yeqown</description>
    <generator>Hugo</generator>
    <language>en-US</language>
    <lastBuildDate>Tue, 23 Oct 2018 17:20:48 +0000</lastBuildDate>
    <atom:link href="https://www.yeqown.xyz/tags/%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>etcd与service-registration-discovery</title>
      <link>https://www.yeqown.xyz/2018/10/23/etcd-service-registration-discovery/</link>
      <pubDate>Tue, 23 Oct 2018 17:20:48 +0000</pubDate>
      <guid>https://www.yeqown.xyz/2018/10/23/etcd-service-registration-discovery/</guid>
      <description>&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;声明：本文对etcd的原理，实现细节，性能等均不考虑，仅将etcd作为一个分布式的K-V存储组件。本文提价代码均在： &lt;a href=&#34;https://github.com/yeqown/server-common/tree/master/framework/etcd&#34;&gt;github.com/yeqown/server-common/tree/master/framework/etcd&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;h3 id=&#34;一个核心&#34;&gt;一个核心&lt;a class=&#34;anchor&#34; href=&#34;#%e4%b8%80%e4%b8%aa%e6%a0%b8%e5%bf%83&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;etcd, 分布式Key-Value存储工具。详细资料&lt;a href=&#34;https://github.com/etcd-io/etcd/blob/master/Documentation/docs.md&#34;&gt;由此去&lt;/a&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/etcd-io/etcd/releases&#34;&gt;etcd下载安装&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;两个对象&#34;&gt;两个对象&lt;a class=&#34;anchor&#34; href=&#34;#%e4%b8%a4%e4%b8%aa%e5%af%b9%e8%b1%a1&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;服务提供者（在测试环境中，我定义为单独的服务实例），也就是服务的提供者，需要向其他服务暴露自己的ip和端口，方便调用。&lt;/li&gt;&#xA;&lt;li&gt;服务调用者（同样地，在测试环境中我定义为反向代理网关程序），也就是服务的调用者，需要获取到 &lt;em&gt;&lt;strong&gt;可使用&lt;/strong&gt;&lt;/em&gt; 地服务地址并调用。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h3 id=&#34;关于服务注册与发现&#34;&gt;关于服务注册与发现&lt;a class=&#34;anchor&#34; href=&#34;#%e5%85%b3%e4%ba%8e%e6%9c%8d%e5%8a%a1%e6%b3%a8%e5%86%8c%e4%b8%8e%e5%8f%91%e7%8e%b0&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;就具体场景而言：我们的生产环境中使用了一个代理网关服务器，用于转发移动端和PC端的API请求，并完成其他功能。所有的服务实例配置都是硬编码在网关程序中，顶多就是抽离出来成了一个配置文件。这样做的缺点很明显：“非动态”。也就意味着，一旦有服务Down掉，那么用户访问则可能异常，甚至导致整个服务的崩溃；其次，需要对服务进行扩容的情况下，则需要先进行服务部署再更新网关程序，步骤繁琐且容易出错。&lt;/p&gt;&#xA;&lt;p&gt;那么如果我们设计成为如下图的样子：&#xA;&lt;img src=&#34;https://www.yeqown.xyz/images/etcd-service-regisration-discovery.png&#34; alt=&#34;etcd-service-regisration-discovery&#34; /&gt;&#xA;对于新添加的服务实例，只需要启动新的服务，并注册到etcd相应的路径下就行了。&lt;/p&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;注册：对于同一组服务，配置一个统一的前缀（如图上的&amp;quot;/specServer&amp;quot;），不同实例使用ID加以区分。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;h3 id=&#34;将现行服务改造成为上述模式需要解决的问题&#34;&gt;将现行服务改造成为上述模式需要解决的问题：&lt;a class=&#34;anchor&#34; href=&#34;#%e5%b0%86%e7%8e%b0%e8%a1%8c%e6%9c%8d%e5%8a%a1%e6%94%b9%e9%80%a0%e6%88%90%e4%b8%ba%e4%b8%8a%e8%bf%b0%e6%a8%a1%e5%bc%8f%e9%9c%80%e8%a6%81%e8%a7%a3%e5%86%b3%e7%9a%84%e9%97%ae%e9%a2%98&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;etcd 配置安装&lt;/li&gt;&#xA;&lt;li&gt;网关程序改造（监听etcd的节点夹子/prefix;适配动态的服务实例调用）&lt;/li&gt;&#xA;&lt;li&gt;服务实例改造（注册服务实例到etcd;心跳更新;其他配套设施，异常退出删除注册信息）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;etcd安装配置在github.com已经非常详细了。在这里贴一下我在本地测试时候启动的脚本（这部分是从etcd-demo获取到的，做了针对端口的改动）：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/bash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# For each machine&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TOKEN&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;token-01&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CLUSTER_STATE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;new&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NAME_1&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;machine1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NAME_2&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;machine2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NAME_3&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;machine3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HOST_1&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;127.0.0.1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HOST_2&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;127.0.0.1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HOST_3&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;127.0.0.1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CLUSTER&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;NAME_1&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;http://&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;HOST_1&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;:2380,&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;NAME_2&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;http://&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;HOST_2&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;:2381,&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;NAME_3&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;http://&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;HOST_3&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;:2382&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# For machine 1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;THIS_NAME&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;NAME_1&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;THIS_IP&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;HOST_1&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;etcd --data-dir&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;machine1.etcd --name &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;THIS_NAME&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;--initial-advertise-peer-urls http://&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;THIS_IP&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;:2380 --listen-peer-urls http://&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;THIS_IP&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;:2380 &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;--advertise-client-urls http://&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;THIS_IP&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;:2377 --listen-client-urls http://&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;THIS_IP&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;:2377 &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;--initial-cluster &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;CLUSTER&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;--initial-cluster-state &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;CLUSTER_STATE&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt; --initial-cluster-token &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;TOKEN&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt; &amp;amp;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# For machine 2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;THIS_NAME&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;NAME_2&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;THIS_IP&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;HOST_2&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;etcd --data-dir&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;machine2.etcd --name &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;THIS_NAME&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;--initial-advertise-peer-urls http://&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;THIS_IP&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;:2381 --listen-peer-urls http://&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;THIS_IP&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;:2381 &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;--advertise-client-urls http://&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;THIS_IP&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;:2378 --listen-client-urls http://&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;THIS_IP&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;:2378 &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;--initial-cluster &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;CLUSTER&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;--initial-cluster-state &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;CLUSTER_STATE&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt; --initial-cluster-token &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;TOKEN&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt; &amp;amp; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# For machine 3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;THIS_NAME&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;NAME_3&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;THIS_IP&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;HOST_3&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;etcd --data-dir&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;machine3.etcd --name &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;THIS_NAME&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;--initial-advertise-peer-urls http://&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;THIS_IP&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;:2382 --listen-peer-urls http://&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;THIS_IP&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;:2382 &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;--advertise-client-urls http://&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;THIS_IP&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;:2379 --listen-client-urls http://&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;THIS_IP&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;:2379 &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;--initial-cluster &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;CLUSTER&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;--initial-cluster-state &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;CLUSTER_STATE&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt; --initial-cluster-token &lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;TOKEN&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt; &amp;amp;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;对于程序的改造，鉴于服务较多且etcd操作流程大体一致，便简单包装了一下，项目地址见文首位置。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
