边锋的一次面试经历

前几天,去边锋网络上海分公司去面试,去了以后,说 PHP 负责人请假了,一个 Golang 后端面的,聊了2个非语言层面的问题,这里梳理总一下。

Q1:编写 API 接口,如果保证幂等性?

所谓幂等性设计,就是说,一次和多次请求某一个资源应该具有同样的副作用。用数学的语言来 表达就是:f(x) = f(f(x))。

举几个例子:

  • 订单创建接口,第一次调用超时了,然后调用方重试了一次。是否会多创建一笔订单?

因为系统超时,而调用户方重试一下,会给我们的系统带来不一致的副作用。

为什么会产生这样的问题,就是在我们把系统解耦隔离后,服务间的调用可能会有三个状态,一个是成功(Success),一个是失败(Failed),还有一个是超时(Timeout)。前两者都是明确的状态,而超时则是完全不知道是什么状态。

这种情况下,一般有两种处理方式:

  • 一种是下游服务提供查询接口,上游再请求超时后查询一下,如果查询到则表示成功,如果查询不到则表示失败。
  • 另一种是做接口幂等设计,也就是将查询动作放在下游服务,上游只管做重试,请求一次和请求多次结果是一样的。

对于第一种方式,需要对方提供一个查询接口来做配合。而第二种方式则需要下游的系统提供支持幂等性的交易接口。

初识 Go 语言

Go 语言主要特性

  • 自动垃圾回收
  • 更丰富的内置类型
  • 函数多返回值
  • 错误处理
  • 匿名函数和闭包
  • 类型和接口
  • 并发编程
  • 反射
  • 语言交互性

Composer 中国镜像

Composer 中国镜像,没有梯子的同学这个必备,之前一直用pkg.phpcomposer.com提供的,但是某些时候很不友好(半天没有反应),于是乎我发现了这个

原文地址:https://learnku.com/laravel/t/4484/composer-mirror-use-help

选项一、全局配置(推荐)

1
composer config -g repo.packagist composer https://packagist.laravel-china.org

选项二、单独使用

如果仅限当前工程使用镜像,去掉 -g 即可,如下:

1
composer config repo.packagist composer https://packagist.laravel-china.org

取消镜像

1
composer config -g --unset repos.packagist

Linux PATH 环境变量配置

以添加go为例,修改PATH的几种方法

准备

1
2
3
4
5
cd ~
pwd
/home/bing
wget https://dl.google.com/go/go1.12.5.linux-amd64.tar.gz
tar -xzvf go1.12.5.linux-amd64.tar.gz

查看 PATH

1
echo $PATH

:符号分割,每一段都是一个环境变量

修改 PATH

酷代码-第一篇

分享一下,工作中遇见值得分享的Code,这些代码往往比较有趣、有意义、或者少见(有意义),在此我统称为:酷代码。

IP 白名单检测

场景描述:我司的一个子项目,用来处理全部的支付业务,为了安全,所有的内部请求必须经过 IP 检测(这只是其中一环),分享一下基于我老大(涛哥)思想,利用位运算完成,IP白名单检测方法,以下是核心代码

定义检测函数checkRemoteAddr()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* 验证 IP 白名单
* @param $ip string 待验证IP地址
* @param $AllowRemoteIps array 允许的IP白名单
* @return bool
*/
function checkRemoteAddr($ip,$AllowRemoteIps)
{
$ipNum = ip2long($ip);
foreach ($AllowRemoteIps as $mask)
{
@list($maskIp, $maskStep) = explode("/", $mask);
$maskIpNum = ip2long($maskIp);
$maskStep = !isset($maskStep) ? 0 : 32 - intval($maskStep);
if( ($ipNum >> $maskStep) === ($maskIpNum >> $maskStep) ) return true;
}
return false;
}

Window10 子系统极速搭建LNMP开发环境

开启子系统

window10 开启子系统方法:

参考地址:https://jingyan.baidu.com/article/546ae185de58961149f28cac.html

快速安装 LNMP 环境

Linux 下 CentOS 可以通过yum,Ubuntu 可以通过 apt-get,可以通过这种方式安装LNMP所需要每一个软件,也可以使用LNMP集成包的方法,既然是快速搭建开发环境,这里推荐使用BT

安装手册:http://www.bt.cn/btcode.html#install

安装扩展

方法一:

通过BT管理面板,进行安装。

方法二:

切换PHP可执行目录,cd /www/server/php/71/bin/

1
sudo pecl install mongodb
1
2
3
4
Build process completed successfully
Installing '/www/server/php/71/lib/php/extensions/no-debug-non-zts-20160303/mongodb.so'
install ok: channel://pecl.php.net/mongodb-1.5.3
Extension mongodb enabled in php.ini

常见问题

Q:Ubuntu apt-get源为国内镜像源的方法
A:见以下操作步骤:

  1. sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
  2. sudo vim /etc/apt/sources.list
  3. 清空原来的列表(命令行模式下,按ggdG),添加以下内容(中科大镜像源)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    deb http://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
    deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
    deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
    deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
    deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
    deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
    deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
    deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
    deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
    deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse

4.保存后,运行 sudo apt-get update

补:Vim 清空文件内容方法
方法一:命令行模式下,按键盘ggdG
方法二:先在命令模式下输入 G 再输入:1,.d


Q:访问PHP项目,特别慢或者(Time out)超时。
A:在 Ubuntu WSL的Nginx配置 fastcgi_buffering off; # This must be here for WSL as of 11/28/2018

具体配置参考如下:

1
2
3
4
5
6
7
8
9
10
11
location ~ \.php$ {
proxy_set_header X-Forwarded-Proto $scheme;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_buffering off; # This must be here for WSL as of 11/28/2018
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PHP_VALUE "upload_max_filesize = 20M \n post_max_size=21M";
include /etc/nginx/fastcgi.conf;
}

此问题 Issues:https://github.com/Microsoft/WSL/issues/393#issuecomment-442498519


Git 实用指南

Git 安装

Git 官网地址:https://git-scm.com/book/zh/v2

最简配置

config 的三个作用域

1
2
3
git config --local
git config --global
git config --system

配置 user.nameuser.email

1
2
git config --global user.name 'your name'
git config --global user.email 'your_email@domain.com'

显示config配置

1
git config --list --local

图形界面

Git 基础命令

1
2
git -u
git mv test demo

Git log

1
2
3
4
5
6
git log
git log --onelie
git log -n4
git log --all --graph
git log --all --oneline --graph -n4
git log help --web log