Haohao Notes

DREAM OF TECHNICAL ACHIEVEMENT

0%

Kong

Kong可以说是API的得力助手。对需要从事API管理的广大开发员来说,它是最出色的工具之一。Kong是开源工具,具有可扩展性和模块性,可以在任何一种基础设施上运行。多年来,Kong一直在支持优秀的开发项目,比如Mashape(世界上规模最大的API市场)。最棒的是,Kong得到了强大的Nginx的支持。

主要功能

  • Kong可灵活扩展:只要增添更多的服务器实例,它就能横向扩展,毫无问题,那样你可以支持更多流量,同时确保网络延迟很短。

  • Kong可在任何地方运行:它可以部署在单个或多个数据中心环境的私有云或公有云上。它还支持大多数流行的操作系统,比如Linux、Mac和Windows。Kong包括许多实用技巧,以便针对大多数现代平台完成安装和配置工作。

  • Kong具有模块性:它可以与新的插件协同运行,扩展基本功能。可将你的API与许多不同的插件整合起来,以增强安全、分析、验证、日志及/或监测机制。最好的例子之一就是Nginx Plus插件(https://getkong.org/plugins/nginx-plus-monitoring/),该插件提供了服务器实时监测机制,以获得关于负载和请求的度量指标和统计数字。

  • 开源及企业:虽然Kong是开源工具,可供每个人免费使用,但你也能获得企业版,企业版通过电子邮件、电话和聊天提供了快速支持,此外还提供初始安装、从第三方API管理工具来迁移、紧急补丁、热修复程序及更多特性。
    Kong Api管理解决方案

工作原理

Kong可与两种不同的组件协同工作:

  • Nginx:Kong使用经过修改的Nginx web服务器作为代理服务器,该服务器负责处理API请求。
  • Apache Cassandra 或者 Postgresql:这用作数据存储(Datastore)服务器,负载存储来自Kong操作的数据。

Kong安装

参考Kong CentOS Installation

从下载Kong的配置

1
yum install https://bintray.com/kong/kong-community-edition-rpm/download_file?file_path=centos/7/kong-community-edition-0.14.0.el7.noarch.rpm

阅读全文 »

最近公司业务要构建一个高性能API网关,所以就整理了市场上的一些产品。

API网关简介

API网关 顾名思义,是出现在系统边界上的一个面向API的、串行集中式的强管控服务,这里的边界是企业IT系统的边界,主要起到隔离外部访问与内部系统的作用。在微服务概念的流行之前,API网关的实体就已经诞生了,例如银行、证券等领域常见的前置机系统,它也是解决访问认证、报文转换、访问统计等问题的。移动应用、企业互联,使得后台服务支持的对象,从以前单一的Web应用,扩展到多种使用场景,且每种使用场景对后台服务的要求都不尽相同。这不仅增加了后台服务的响应量,还增加了后台服务的复杂性。随着微服务架构概念的提出,API网关成为了微服务架构的一个标配组件。

API网关网关的价值:

  • 网关层对外部和内部进行了隔离,保障了后台服务的安全性。
  • 对外访问控制由网络层面转换成了运维层面,减少变更的流程和错误成本
  • 减少客户端与服务的耦合,服务可以独立发展。通过网关层来做映射。
  • 通过网关层聚合,减少外部访问的频次,提升访问效率。
  • 节约后端服务开发成本,减少上线风险。
  • 为服务熔断,灰度发布,线上测试提供简单方案。
  • 便于扩展。

API Gateway

常用的API网关方案

业界API网关解决方案有很多,包括商业的、开源的。例如

三种常见API网关方案

阅读全文 »

centos

今天在Docker中centos7镜像使用yum提示:Loaded plugins: fastestmirror, refresh-packagekit, security Loading mirror speeds from cached hostfi
我使用ping www.huixing.org 发现网络是正常的。

遇到这种情况有两种做法:

查看网络是否畅通

ping www.huixing.org

如果显示没有连接的话,就说明没网,也就无法使用yum 命令。

网络畅通还是无法使用yum

在安装完CentOS后一般需要修改yum源,才能够在安装更新rpm包时获得比较理想的速度。国内比较快的有163源、sohu源、阿里云源,这里使用阿里云为例子。

作为运维人员任何修改文件最好都要备份

备份操作:
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

阅读全文 »

php

在开发过程中,例如要修改别人开发的代码或调试出问题的代码,需要对代码流程一步步去跟踪,找到出问题的地方进行修改。如果有一个方法可以获取到某段代码是被哪个方法调用,并能一直回溯到最开始调用的地方(包括调用的文件,行数,参数等),这样就能很方便的定位到出问题的地方。

php的debug_backtrace方法可以对代码调用进行跟踪,方便调试代码。

1
2
3
4
5
6
7
8
9
10
$traces = debug_backtrace();
//Remove other keys other than file/function/line
for($i=0; $i<count($traces); $i++) {
$all_keys = array_keys($traces[$i]);
foreach($all_keys as $key){
if($key != "file" && $key != "line" && $key != "function")
unset($traces[$i][$key]);
}
}
file_put_contents("/tmp/call_trace.log", "\n\n##################\n" . print_r($traces, true), FILE_APPEND);

代码实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php 
class SchoolController{
public function schoolSay() {
$traces = debug_backtrace();

for($i=0; $i<count($traces); $i++) {
$all_keys = array_keys($traces[$i]);
foreach($all_keys as $key){
if($key != "file" && $key != "line" && $key != "function")
unset($traces[$i][$key]);
}
}
print_r($traces);
}
}

class ClassController{
function classSay(){
$a = new SchoolController();
$a->schoolSay();
}
}

class StudentController{
public function __construct(){
$b = new ClassController();
$b->classSay();
}
}

$stu = new StudentController();

调试结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Array
(
[0] => Array
(
[file] => \u01\www\huixing.org\test.php
[line] => 20
[function] => schoolSay
)

[1] => Array
(
[file] => \u01\www\huixing.org\test.php
[line] => 27
[function] => classSay
)

[2] => Array
(
[file] => \u01\www\huixing.org\test.php
[line] => 31
[function] => __construct
)

)

Linux

Linux系统中的 find 命令在查找文件时非常有用而且方便。它可以根据不同的条件来查找文件,例如权限、拥有者、修改日期/时间、文件大小等等。在这篇文章中,我们将学习如何使用 find 命令以及它所提供的选项来查找文件。

在绝大多数Linux发行版中,你都可以直接使用 find 命令而无需进行任何安装操作。如果你想在linux系统的命令行中变得特别高效,那么 find 是你必须掌握的命令之一。

find 命令的基本语法如下:

$ find [path] [option] [expression]

基本用法

列出当前目录和子目录下的所有文件

这个命令会列出当前目录以及子目录下的所有文件。

1
2
3
4
5
6
$ find
.
./abc.txt
./subdir
./subdir/how.php
./cool.php

该命令与以下命令效果相同

1
2
$ find .
$ find . -print

查找特殊的目录或路径

阅读全文 »

RESETful API

关于「能愿动词」的使用

为了避免歧义,文档大量使用了「能愿动词」,对应的解释如下:

  • 必须 (MUST):绝对,严格遵循,请照做,无条件遵守;
  • 一定不可 (MUST NOT):禁令,严令禁止;
  • 应该 (SHOULD) :强烈建议这样做,但是不强求;
  • 不该 (SHOULD NOT):强烈不建议这样做,但是不强求;
  • 可以 (MAY)可选 (OPTIONAL) :选择性高一点,在这个文档内,此词语使用较少;

参见:RFC 2119

Protocol

客户端在通过 API 与后端服务通信的过程中,应该 使用 HTTPS 协议。

API Root URL

API 的根入口点应尽可能保持足够简单,这里有两个常见的 URL 根例子:

  • api.example.com/*
  • example.com/api/*
阅读全文 »

docker
前面几篇文章介绍了Docker如何构建一个镜像以及如何运行一个容器,其实这个是在大家有Docker基础的前提下进行的,对于没有基础的同学,本文简单介绍一下Dockerfile中各个命令的用法是怎样的。

1. FROM

格式:FROM <image>或者FROM <image>:<tag>
第一条指令必须是FROM,而且,在同一个Dockerfile中创建多个镜像的时候,可以使用多个FROM指令(每个指令一次)。

2. MAINTAINER

格式:MAINTAINER <name>
指定维护者是谁。

3. RUN

格式:RUN <command>或者RUN ["executable", "param1", "param2"]
前者将在shell终端中运行,即/bin/sh -c。后者使用exec执行。指定使用其它终端执行可以用后一种方式实现。比如RUN ["/bin/bash", "-c", "echo hello"]
每一条RUN指令执行的时候都会在当前镜像的基础上创建新的镜像,如果你的命令实在是非常长的话可以使用\来分隔。

4. CMD

支持三种格式:

  • CMD ["executable", "param1", "param2"]使用exec执行,推荐方式。
  • CMD command param1 param2/bin/sh中执行,提供给需要交互的应用。
  • CMD ["param1", "param2"]提供给ENTRYPOINT的默认参数。
阅读全文 »