HttpPostman自动路由组件
github地址:https://github.com/shang7053/HttpPostman
码云地址:
说明
自动路由组件,根据访问域名自动路由到真实服务上,无需事先配置,启动即可发现服务。当某一真实路径不可用时,自动移除不可用。支持轮询,直到请求成功或者全部不成功(比较耗时)。支持配置超时时间。
主要特性如下:
- 路由模块使用node.js,基于事件驱动,最大支持每秒24000次请求,相比tomcat、nginx拥有更高的性能
- 使用zookeeper作为服务注册中心,启动将注册信息加载到内存,并通过watcher机制进行同步,最大化减少路由模块响应耗时
- 支持权重策略,解决硬件差异下公平路由
- 支持GET、POST、PUT、DELETE
- 支持表单提交和rest
- 支持返回json、xml
架构图
流程图
网络结构图示例
模块
主要分两个部分,路由模块和sdk模块。
路由模块负责处理转发所有请求。
sdk负责注册服务信息。
中间依赖redis做注册中心。
声明:
- sdk目前仅支持java,其他语言请自行拓展
- 现已测试各类接口程序,但未测试返回页面的门户、管理系统等(不建议此类场景使用)
最佳实践
- 适合http接口类应用
- 适合k8s或任何自动伸缩导致接口应用IP经常变化的环境下使用
- 目标不是替代任何软件,而是支持动态链接到可用的接口程序
路由模块安装
推荐使用pm2运行,推荐按CPU核数集群运行,不推荐单机单节点运行
1、下载源码
git clone https://github.com/shang7053/autorouter.git
2、执行启动命令
sh bin/start.sh
配置
进入conf文件夹,编辑arconf.json
{
"port":3000,
"polling":true,
"redisDeployType":"cluster",
"zkAddress":"172.16.40.4:2181,172.16.40.5:2181",
"zkBasePath":"/ar/domains",
"httpTomeOut": 2000,
"log4js": {
"appenders": {
"console": {
"type": "console"
},
"log_date":{
"type": "dateFile",
"filename": "logs/system.log",
"alwaysIncludePattern": true,
"pattern": "-yyyy-MM-dd-hh",
"encoding": "utf-8"
}
},
"categories": {
"default": {
"appenders":["console","log_date"],
"level": "debug"
}
}
}
}
sdk使用说明
进入到sdks->java->ar_client,执行
mvn clean install
然后在项目添加到pom.xml
<dependency>
<groupId>com.scc</groupId>
<artifactId>ar_client</artifactId>
<version>0.0.1</version>
</dependency>
配置支持三种方式,properties、spring bean、api
arconf.properties
zk.address=172.16.40.4:2181,172.16.40.5:2181
#zk.basePath=/ar/domains
service.domain=datasyc.voole.com
#service.ip=10.5.5.1
service.port=8080
service.weight=1
service.register.interval=10
spring bean
<bean class="com.scc.ar.client.core.AutoRegistService" init-method="init" destroy-method="close">
<property name="zkAddress" value="172.16.40.4:2181,172.16.40.5:2181" />
<property name="serviceDomain" value="localhost" />
<property name="serviceRegisterInterval" value="10" />
<!-- 默认自动获取本机IP <property name="serviceIp" value="127.0.0.1" /> -->
<property name="servicePort" value="8080" />
<property name="serviceWeight" value="1" />
</bean>
api
AutoRegistService service = new AutoRegistService();
service.setZkAddress("172.16.40.4:2181");
service.setServiceDomain("www.baidu.net");
service.setServicePort("80");
service.setServiceWeight("2");
service.setServiceRegisterInterval("100");
service.init();