Javascript

Kong API Gateway (2) Plugins

Submitted by Lizhe on Thu, 11/22/2018 - 11:56

本章主要讨论plugin, 我将参考官方例子

Kong 自带的插件一般分为以下几类:

身份校验, 安全性控制, 流量控制, 格式转换, 监控和日志 https://getkong.org/plugins/

[root@localhost ~]# curl -X POST http://localhost:8001/apis/users/plugins -d "name=key-auth"

{"created_at":1542865365000,"config":{"key_in_body":false,"run_on_preflight":true,"anonymous":"","hide_credentials":false,"key_names":["apikey"]},"id":"54df9560-66a1-494e-86d2-3aeed7f08d1c","name":"key-auth","api_id":"5fe148b3-acfa-46c3-b127-08207420f2f5","enabled":true}

Node js 安装

Submitted by Lizhe on Wed, 11/21/2018 - 10:58

 

sudo yum -y install gcc gcc-c++ kernel-devel

sudo yum -y install gcc automake autoconf libtool make

sudo tar -xf node-v10.14.1.tar.gz 

cd node-v10.14.1

sudo ./configure

sudo make

sudo make install

 

Nodejs Express API Gateway (1)

Submitted by Lizhe on Tue, 11/20/2018 - 14:45

之前一直是用kong的, 不过最近发现了express也可以做Gateway, 参考了一下开源实现

https://www.express-gateway.io

首先是安装

$ sudo npm install -g express-gateway

然后通过下面的引导命令可以初始化一个项目

$ eg gateway create

创建结束以后你会得到一个像下面的内容

20181120024510

默认get start 项目里会带一个路由, 通过 localhost:8080/ip 指向到 https://httpbin.org/ip

node express 多线程(2)

Submitted by Lizhe on Mon, 11/19/2018 - 16:38

上一个例子中并没有使用express, 下面这个例子里将演示如何在express环境中使用cluster多线程

express使用bin文件夹下的www脚本启动http server, 所以直接修改这个脚本就可以使用cluster

app/bin/www 将此脚本的内容修改为

#!/usr/bin/env node

 

var app = require("../app");

var debug = require("debug")("app:server");

var http = require("http");

 

var cluster = require("cluster");

var numCPUs = require("os").cpus().length;

 

if (cluster.isMaster) {

node express 多线程(1)

Submitted by Lizhe on Mon, 11/19/2018 - 16:15

我们知道标准的Javascript是单线程的, 无法真正的使用多核cpu, 过去的做法是在不同的端口上启动多个相同或者不同的服务

例如如果一个服务要运行在多个核心上, 就必需使用脚本启动在多个端口上, 然后用负载均衡服务器对请求进行分发, 实现起来较为复杂

使用cluster集群api可以让单个程序充分利用多核cpu, 下面来看看步骤

首先需要安装下面两个模块

npm install --save cluster
npm install --save os

然后是实现代码

var cluster = require("cluster");

var http = require("http");

var numCPUs = require("os").cpus().length;

if (cluster.isMaster) {

  // Fork workers.

express-session

Submitted by Lizhe on Mon, 11/19/2018 - 10:57

使用express-session需要安装

npm install express-session --save

然后你可以选择在app.js中加入引用

var session = require("express-session");

接着就可以使用app.use初始化这个session对象了,初始化之后直接使用req.session就可以引用它

req.session.username = "Lizhe";

res.render("index", { title: "Express " + req.session.username });

然后这里有一个坑... 本文主要记录这个坑

var app = express();

app.use(

  session({

    secret: "secret", // 对session id 相关的cookie 进行签名

React Hooks Sample

Submitted by Lizhe on Mon, 11/12/2018 - 15:51

需要注意的是, hooks这种新玩意只能用在无状态的函数组件中

还有就是如果你使用create-react-app创建应用, 那么你需要手动修改package.json中的react和react-dom版本号, 因为目前hooks还在阿尔法版本中[🐶]

import React, { Component } from "react";

import "./App.css";

import Counter from "./Counter";

class App extends Component {

  render() {

    return (

      <div className="App">

        <Counter />

      </div>

    );

  }

TypeScript 动态加载模块

Submitted by Lizhe on Thu, 11/08/2018 - 15:42

核心方法是下面这个文件

这里要重点解释几个点

1. 方法 asyncComponent 的参数是一个名为 getComponent 的方法, 参数名是getComponent, 参数的类型是一个方法, 用  () => Promise<any> 表示

这个方法的返回值是一个Promise对象, 这个Promise可以包含任意 <any> 类型的对象

2. 这个方法的返回值是 AsyncComponent 类, 它是React.Component的子类

3. AsyncComponent 加载完成之后会在componentDidMount 中调用 (await getComponent()).default;

   getComponent() 也就是传入的参数方法, 根据参数的定义, 它一定会返回一个包含任意对象的Promise对象, 然后调用这个对象的default属性

4. render方法负责渲染这个await getComponent() 返回的Component对象