自己建代理服务器 手机代理服务器是什么( 二 )


├── config│ ├── balancer.JSON│ ├── proxy.json│ └── Router.json├── plugins│ ├── balancer.js│ ├── default.js│ └── router.js└── proxy.js让我们开始吧:
{ "listen": 8000, "plugins": [ "plugins/router.js", "plugins/balancer.js", "plugins/default.js" ]}

  1. 重复步骤 2 和 3 , 创建另一个文件/config/router.json , 它将存储路由信息 , 配置数据如下:
{ "routes": { "/hi/*": "service-hi", "/echo": "service-echo", "/ip/*": "service-tell-ip" }}
  1. 重复步骤 2 和 3 , 创建另一个文件/config/balancer.json , 它将存储服务到目标的映射信息 , 内容如下:
{ "services": { "service-hi" : ["127.0.0.1:8080", "127.0.0.1:8082"], "service-echo" : ["127.0.0.1:8081"], "service-tell-ip" : ["127.0.0.1:8082"] }}
  1. 现在 , 我们编写第一个 Pipy 脚本 , 当我们收到一个没有配置任何目标(端点/url)的请求时 , 它将被用作默认的后备选项 。 重复上述步骤 , 创建文件/plugins/default.js 。 使用 default 作为文件名只是一个习惯做法 , 并不是 Pipy 的要求 , 你可以选择任何你喜欢的名字 。 该脚本将包含如下代码 , 返回 HTTP 状态代码 404 , 信息为 No handler found:
pipy().pipeline('request') .replaceMessage( new Message({ status: 404 }, 'No handler found') )
  1. 创建/plugins/router.js文件 , 存储路由逻辑:
(config =>pipy({ _router: new algo.URLRouter(config.routes),}).export('router', { __serviceID: '',}).pipeline('request') .handleMessageStart( msg => ( __serviceID = _router.find( msg.head.headers.host, msg.head.path, ) ) ))(JSON.decode(pipy.load('config/router.json')))
  1. 创建/plugins/balancer.js文件 , 存储了我们的负载均衡逻辑 。 顺便说明一下 , Pipy 提供了多种负载均衡算法 , 但简单起见 , 我们这里将使用 Round Robin 算法 。
(config =>pipy({ _services: ( Object.fromEntries( Object.entries(config.services).map( ([k, v]) => [ k, new algo.RoundRobinLoadBalancer(v) ] ) ) ), _balancer: null, _balancerCache: null, _target: '',}).import({ __turnDown: 'proxy', __serviceID: 'router',}).pipeline('session') .handleStreamStart( () => ( _balancerCache = new algo.Cache( // k is a balancer, v is a target (k ) => k.select(), (k,v) => k.deselect(v), ) ) ) .handleStreamEnd( () => ( _balancerCache.clear() ) ).pipeline('request') .handleMessageStart( () => ( _balancer = _services[__serviceID], _balancer && (_target = _balancerCache.get(_balancer)), _target && (__turnDown = true) ) ) .link( 'forward', () => Boolean(_target), '' ).pipeline('forward') .muxHTTP( 'connection', () => _target ).pipeline('connection') .connect( () => _target ))(JSON.decode(pipy.load('config/balancer.json')))
  1. 现在 , 我们来编写入口点或代理服务器脚本 , 它会使用上述插件 。 创建一个新的代码库(步骤 1) , 这个过程会创建一个默认的main.js文件作为入口点 。 我们可以用它作为我们的主入口点 , 或者如果你希望换个名字 , 可以随时删除main.js , 然后用你选的名字新建一个文件 。 让我们删除它并新建一个名为/proxy.js的文件 。 务必点下顶部的旗标 , 将其设置为主入口点 , 这可以确保在你点击运行按钮(右侧的箭头图标)时开始执行脚本:
(config =>pipy().export('proxy', { __turnDown: false,}).listen(config.listen) .use(config.plugins, 'session') .demuxHTTP('request').pipeline('request') .use( config.plugins, 'request', 'response', () => __turnDown ))(JSON.decode(pipy.load('config/proxy.json')))


特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。