<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>service | 伪架构师</title>
    <link>/tags/service/</link>
      <atom:link href="/tags/service/index.xml" rel="self" type="application/rss+xml" />
    <description>service</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Wed, 25 May 2016 07:27:37 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>service</title>
      <link>/tags/service/</link>
    </image>
    
    <item>
      <title>Kubernetes 服务定义示例</title>
      <link>/post/kubernetes-service-sample/</link>
      <pubDate>Wed, 25 May 2016 07:27:37 +0800</pubDate>
      <guid>/post/kubernetes-service-sample/</guid>
      <description>&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;---
kind: List
apiVersion: v1
items:
- kind: ReplicationController
  apiVersion: v1
  metadata:
    name: rc-nginx-meta
    labels:
      name: rc-nginx
  spec:
    replicas: 1
    # 必须跟 template 里面的 labels 匹配
    selector:
      name: pod-nginx
    template:
      metadata:
        labels:
          name: pod-nginx
      spec:
        containers:
        - name: nginx-docker-images
          image: nginx:1.10
          # 开放端口数组
          ports:
          - containerPort: 80
            protocol: TCP
          # 环境变量数组
          env:
          - name: NGINX_PORT
            value: &amp;quot;888&amp;quot;
          # 加载卷数组，容器内不存在的路径会被新建
          volumeMounts:
            - mountPath: /test-pd
              name: test-volume
        volumes:
          - name: test-volume
            # 这里用主机路径类型的卷
            hostPath:
              path: /tmp
- kind: Service
  apiVersion: v1
  metadata:
    name: svc-nginx-meta
    labels:
      name: svc-nginx
  spec:
    type: NodePort
    ports:
    - protocol: TCP
      # 集群内端口
      port: 80
      # 容器端口，对应上面的 containerPort
      targetPort: 80
      # 在所有 Node 上都开放此端口
      nodePort: 32000
    selector:
      # 匹配 Pod 的标签
      name: pod-nginx
&lt;/code&gt;&lt;/pre&gt;
</description>
    </item>
    
    <item>
      <title>Drupal Services模块入门教程</title>
      <link>/post/drupal-service-basic/</link>
      <pubDate>Wed, 05 Aug 2015 10:32:19 +0800</pubDate>
      <guid>/post/drupal-service-basic/</guid>
      <description>

&lt;p&gt;Services模块为Drupal站点提供了实现Web服务的能力。&lt;/p&gt;

&lt;p&gt;Services很流行，可以同REST, XMLRPC, JSON以及SOAP协同工作。&lt;/p&gt;

&lt;p&gt;然而，在上星期的一次培训中，当被问到Services的问题时，我意识到，问题产生的原因在于——这个模块几乎没有清晰的可用的文档。&lt;/p&gt;

&lt;p&gt;所以我决定写一篇Services模块的入门教程。&lt;/p&gt;

&lt;p&gt;下面就是利用Services为Drupal站点建立REST API的五个步骤：&lt;/p&gt;

&lt;h2 id=&#34;1-安装&#34;&gt;1. 安装&lt;/h2&gt;

&lt;p&gt;基础的REST API需要三个模块的支持：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://www.drupal.org/project/libraries&#34; target=&#34;_blank&#34;&gt;Libraries&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://www.drupal.org/project/services&#34; target=&#34;_blank&#34;&gt;Services&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://www.drupal.org/project/services_views&#34; target=&#34;_blank&#34;&gt;Services Views&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果你要为API添加认证支持，那么还需要添加一个模块，例如&lt;a href=&#34;https://www.drupal.org/project/oauth&#34; target=&#34;_blank&#34;&gt;OAuth&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;你可能需要做一件无聊的事情：测试这几个模块的不同版本。我在Drupal.org上找到&lt;a href=&#34;https://www.drupal.org/node/1871498&#34; target=&#34;_blank&#34;&gt;一篇文章&lt;/a&gt;，其中提到需要用部分旧版本的模块，来避免一些bug。&lt;/p&gt;

&lt;p&gt;当你启用这些模块后，需要选择服务器的类型。除了REST和XMLRPC之外的其他服务模块例如&lt;a href=&#34;https://www.drupal.org/project/soap_server&#34; target=&#34;_blank&#34;&gt;SOAP&lt;/a&gt;，需要在Drupal.org上获得。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;/sites/default/files/get_image/62e366bb15d77e7f2607df91caa5bb79.png&#34; alt=&#34;Servers&#34; /&gt;&lt;/p&gt;

&lt;h2 id=&#34;2-创建server&#34;&gt;2. 创建Server&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;进入 &lt;code&gt;Structure &amp;gt; Services&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;点击 Add&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;输入机读名称。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;选择服务器&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;输入服务端点路径(Path to endpoint)，这一路径会变成这个Server的URL的一部分。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;保存&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&#34;/sites/default/files/get_image/62ba5eea4dc8d668c8ec08124ee4553d.png&#34; alt=&#34;Server Set-up&#34; /&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;点击 &lt;code&gt;Edit Resources&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;这里可以编辑Server的各种配置项目&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&#34;/sites/default/files/get_image/dd5dbae61731c948b1ce53cc38fe80dc.png&#34; alt=&#34;Edit Resource&#34; /&gt;&lt;/p&gt;

&lt;h2 id=&#34;3-服务器配置&#34;&gt;3. 服务器配置&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Server Tab页面让你可以为Server选择(响应)格式以及(请求的)解析器类型。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&#34;/sites/default/files/get_image/7cee34feb5fac96973f710a66012815e.png&#34; alt=&#34;settings&#34; /&gt;&lt;/p&gt;

&lt;p&gt;认证(Authentication) Tab让你可以对Server进行访问控制，下面以OAuth举例说明：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;安装&lt;a href=&#34;https://www.drupal.org/project/oauth&#34; target=&#34;_blank&#34;&gt;OAuth&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;导航至 &lt;code&gt;Configuration &amp;gt; OAuth &amp;gt; Add Context&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;设置OAuth连接的详细信息&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;进入&lt;code&gt;Structure &amp;gt; Services &amp;gt; Edit Resources&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;检查OAuth的认证框：&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&#34;/sites/default/files/get_image/b8e80b19bcf0c6ad4b9973908bfc7b6b.png&#34; alt=&#34;auth box&#34; /&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;点击认证Tab（Authentication）&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;选择OAuth上下文(Context)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&#34;/sites/default/files/get_image/8776f9042df170ef84fe02362c1b116f.png&#34; alt=&#34;OAuth Context&#34; /&gt;&lt;/p&gt;

&lt;p&gt;最后，资源Tab允许你控制服务器的功能范围。本例中，我们要确定按下图进行选择。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;/sites/default/files/get_image/14672d2c7bddd96a2c7c11178dc5b028.png&#34; alt=&#34;selection&#34; /&gt;&lt;/p&gt;

&lt;h2 id=&#34;4-创建视图&#34;&gt;4. 创建视图&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;进入 &lt;code&gt;Structure &amp;gt; Views &amp;gt; Add New View&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;创建一个视图，只使用Block模式：&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&#34;/sites/default/files/get_image/e1ca820ec17ee639bf11e0777c837e7b.png&#34; alt=&#34;new view &#34; /&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;点击继续，编辑&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;在views顶部点击Add，添加Servies。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&#34;/sites/default/files/get_image/d5d1b67d033c78120ef0e793236a6911.png&#34; alt=&#34;add services&#34; /&gt;&lt;/p&gt;

&lt;p&gt;你会看到一条消息：&lt;code&gt;Display &amp;quot;Services&amp;quot; uses a path but the path is undefined.&lt;/code&gt;(显示Services需要使用的路径未经定义)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;点击Path右边的斜线进行编辑，来解决这一问题&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&#34;/sites/default/files/get_image/b320b93c8bb83c5453e562facb07d80f.png&#34; alt=&#34;path1&#34; /&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;输入路径，例如&amp;rdquo;myrestapi&amp;rdquo;：&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&#34;/sites/default/files/get_image/04226bda3aae9984ffb39625d9797d8f.png&#34; alt=&#34;path2&#34; /&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;查看预览。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;保存View。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&#34;/sites/default/files/get_image/ae53cc690f7f302ac155ee65c25948c7.png&#34; alt=&#34;review&#34; /&gt;&lt;/p&gt;

&lt;p&gt;然后你就可以利用Views的功能对其进行定制了。&lt;/p&gt;

&lt;h2 id=&#34;5-查看server&#34;&gt;5. 查看Server&lt;/h2&gt;

&lt;p&gt;最后一步就是查看Server的输出。没有自动提供的连接，只能通过下面的网址来查看：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    /path-to-endpoint/views/view-machine-name/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;在我的例子中是这样定义的：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;path-to-endpoint：我在第二部分中设置为“myrestapi”.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;view-machine-name：我给这个view命名为&amp;rdquo;myrestapi&amp;rdquo;，可以通过编辑view并查看URL来确定网址的唯一性。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;所以，访问我的Server的URL： &lt;code&gt;/myrestapi/views/myrestapi/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;下面是返回内容：&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;/sites/default/files/get_image/824063bc4d1a32a68f277db67b9b0bcc.png&#34; alt=&#34;xml&#34; /&gt;&lt;/p&gt;

&lt;p&gt;##更多内容&lt;/p&gt;

&lt;p&gt;Drupal.org上&lt;a href=&#34;https://www.drupal.org/node/1871498&#34; target=&#34;_blank&#34;&gt;最好的文档&lt;/a&gt;，相较本文来说，提供了更多细节，这篇文章也是&lt;a href=&#34;https://www.drupal.org/node/113697&#34; target=&#34;_blank&#34;&gt;Services文档&lt;/a&gt;的一部分.&lt;/p&gt;

&lt;p&gt;如果你希望使用REST API导入数据，我找到的&lt;a href=&#34;https://www.drupal.org/node/113697&#34; target=&#34;_blank&#34;&gt;最好教程&lt;/a&gt;拱你参考。&lt;/p&gt;

&lt;p&gt;Youtube上还提供了一个很好的视频：&lt;/p&gt;

&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=xxWWq4wwqp4&#34; target=&#34;_blank&#34;&gt;https://www.youtube.com/watch?v=xxWWq4wwqp4&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
