Jump to Navigation

Network

网络,互联网

自建ngrok服务

自建ngrok服务

源代码

ngrok1.7及以下版本有源代码

ngrok2+版本没有源代码,但有bin版本。不知道是否有什么黑科技呢。

本文以有源代码的ngrok-1.7为例,说明自建ngrok服务的过程。

生成ngrok使用的自签加密证书

ngrokd客户端与ngrok客户端tunnel全程使用tls加密传输,所以要在编译前生成加密证书。

简单的生成脚本,

go实现gRPC的服务端的PHP扩展

go实现gRPC的服务端的PHP扩展

一种支持PHP语言编写gRPC服务端的方案

在有这个方案的想法时,并不确定技术上是否可行,只是觉得可行性程度挺高。

为了确认这可行性,先行做了些测试,所以先把技术点的可行性放在了文章的开头部分。

方案的设计将在总结可行性的基础上做详细说明,从本文的第二部分开始。

可行性验证

需要验证的主要有,

  • 从PHP调用go函数
  • 从go调用PHP函数
  • 把go代码编译为库
  • 把go库链接进PHP扩展
PHP调用go函数

上篇已经验证并实现。

用go实现PHP扩展

上篇已经验证并实现。

go调用PHP函数

如果需要go调用PHP函数,其实先要确定的是用C能够调用PHP函数。

好在我们有zend_API.h中的两个函数:

  • call_user_function
  • call_user_function_ex

而且比较成熟,不再多说明了。

一种PHP实现grpc协议调用grpc服务的方案

一种PHP实现grpc协议调用grpc服务的方案

原由

在前面的文章中,曾经提到grpc对PHP语言的支持情况。

主要是因为php-grpc的支持实现不完善,有明显的bug,支持落后于其他主要的开发语言。

从这个方向上考虑,如果要解决的话,需要完善php-grpc扩展,修复bug等,工作量可能比较大。

这段时间考虑到了一种临时替代方案,以解决在PHP中实现grpc协议调用服务的需求。

把使用go语言实现的客户端转换为PHP能调用的动态库

grpc对go语言的支持还是非常完善的,如果能够利用go的实现来支持PHP就好了。

刚开始只是考虑了一下,经过一些查找测试,发现这种方式真的是可行的,实际上已经有人实践过了。

最主要的是,这种方式还是go官方提供的,非常支持的方式,因为go语言有志于替代使用C/C++这类语言开发动态共享链接库。

这个实现方案的机制描述如下,

protoc-gen-go代码生成器的扩展

protoc-gen-go代码生成器的扩展

protobuf中的protoc命令简介

protobuf提供了描述格式标准,以及对应的格式解析工具及代码生成工具protoc。

由于protobuf支持众多不同编程语言,protoc被设计为插件式的程序,能够调用不同的插件,为.proto文件生成不同语言的执行框架代码。

go语言的protobuf实现

项目地址:https://github.com/golang/protobuf

目录结构:

gRPC服务注册的建议

gRPC服务注册的建议

注册信息服务器

使用分布式配置服务etcd,解决配置信息的分布式存储与一致性保证。

服务的端口

建议尽量使用动态的服务端口,节省服务端口的配置的工作。

比如,给一个端口的范围,[5000,6000],服务启动时选择一个可用的端口并监听服务。

由于服务端口总是需要注册到etcd的,所以,手工指定配置的端口和动态选择的端口没有区别。

当然,初期可以不用实现的这么复杂,建议在程序中指定某个固定的服务端口。

心跳方式注册

为了能够保证etcd中存储的API信息的有效性,建议实现心跳机制定时刷新API的注册信息。

根据看到的一些说明,建议心跳时间在,10-30秒,初步使用20秒的心跳值。

并且,在心跳时刷新时,尽量能够根据实际服务运行状态。对于服务不响应的情况,也就不需要注册。

注册到etcd的API信息

存储在etcd中的key信息:

建议格式: /dorpc/service_name/version/

其中,dorpc为固定标识,该key下是一些gRPC服务API信息。

gRPC对PHP的支持情况说明

gRPC对PHP的支持情况说明

gRPC设计能够支持大多数常用编程语言,PHP也不例外。

不过由于gRPC对不同语言的支持力度不一样,有些语言支持的非常完善,

而有些语言支持的不够完善,甚至达不到能够使用程度。

很不幸的是PHP语言正是支持力度非常靠后的一种语言。

gRPC包括客户端部分和服务端部分,对不同的语言也同时分为这两个部分。

以前从这两个部分说明gRPC的 PHP支持情况,软件包使用的是各包最新的有版本号的beta状态的包。

(也许还可以完全部使用仓库的HEAD版本进行测试,结果也许有所不同,后续有测试之后补上。)

基础依赖包

  • gRPC C实现包和运行库
  • protobuf实现包和运行库
  • PHP-5.5+

对PHP客户端的支持

客户端的支持,需要几个模块的配合使用,

Go调用gRPC服务两例

Go调用gRPC服务两例

先上两段Go语言客户端调用gRPC服务的示例代码:

Linux 微信(weixin)代理项目(wxagent)介绍

微信登陆代理:wxagent

微信桌面版做的很弱,并且没有Linux版。

虽然在Linux上可以使用微信web版,有时很难在一堆浏览器标签中找到。

像这样的应用,应该有属于自己的程序窗口与桌面空间。

微信登陆代理实现目标

提供后台服务,管理微信登陆会话,负责与服务器通信。

以后台服务的方式运行,占用资源少,并且能够长时间运行,避免了需要经常手机扫描登陆的麻烦。

不过,由于这个代理提供的消息服务不再有认证等安全功能,登陆代理最好安装在安全的机器上,像本机上,或者是内网的私有服务器上。

微信登陆代理原理

提到实现,不免要涉及到微信通信协议,好在已经有人对微信web版协议做了分析,虽然还有不完善的地方,基本上可以实现简单登陆与消息收发功能了。

微信登陆代理根据现有资料,使用PyQt5实现了微信web版协议,通过测试,把相关API更新到了最新的微信的wx2版本。

并且把二维码以dbus服务方式提供出来,这样该服务就不需要有UI的支持了,这也是与现有几个Linux版微信不同的地方。

除了以DBus方式提供API,还可以使用socket方式,可以更灵活了。

docker应用小记

docker应用小记

这两天搞了点docker相关的东西,涉及到了docker两个相关的点,
都是关于网络方面的。

一个是docker使用的子网的配置。
一个是 docker pull/push使用的代理方式配置。

###
在centos7上,docker使用了这些配置文件:
/etc/sysconfig/docker
/etc/sysconfig/docker-network
/etc/sysconfig/docker-storage
/etc/sysconfig/docker-storage-setup

这几个文件内容比较简单,每个文件一行,而且默认是空参数。
这些文件叫做EnvironmentFile,用来设置docker的固定配置参数。

对本文开头提到的两个问题,修改这些文件即可实现。
比如这里只修改了/etc/sysconfig/docker-network文件,因为这两个配置都是关于网络方面的。

对实现了RUDP的enet库定制化改造

对实现了RUDP的enet库定制化改造

### enet库介绍
enet是使用C语言实现的、简洁的、基于UDP的网络开发库。
最重要的特性是实现了UDP包的可选的可靠性、有序性。

除些以外,还实现了透明压缩功能,降低传输网络负载等。

但为了保持库本身的简单、可移植、方便嵌入特性,忽略掉了认证,服务发现,加密等功能。

enet库文档:http://enet.bespin.org/index.html

### 我的定制需求
我需要使用其reliable部分代码,即接收包要按照发送包的顺序,并且不能有丢包。
但是我的包并非来自UDP socket,所有无法直接使用现有的原装代码。

页面

订阅 RSS - Network


Main menu 2

by Dr. Radut