一个简单的代理程序开发过程(1)。
1. 简介
你们中的许多人都读过埃里克·史蒂文·雷蒙德(Eric Steven Raymond)的文章(大教堂和集市)。
本文介绍了传统的开发团队开发方法和基于互联网的去中心化开发方法(Linux开发方法,GNU软件)。
)。开发方法
),并基于开发自己的程序之一的示例简单的网站程序,描述了The Bazaar开发方法的几个重要原则。
然而,中国很多程序员在工作时仍然采用传统的开发方法,很难有机会在工作中体验到这一原则。所以这个
反例给了你另一个体验这个原则的过程。
这个反例主要使用一些编程技术,比如套接字编程、信号、进程,还有一些Unix套接字编程
高级主题。当然,这些都不是主要的,重要的是体验集市的发展方法。
2. 本代理程序开发背景
当我工作时,我处于一个相对封闭的网络环境中。我的机器在局域网 (LAN) 中,连接到外部互联网
以代理的形式,有几个Unix服务器作为代理服务器,运行Squid作为HTTP的代理,Socks作为Socks 5。
代理。应该说这样的待遇还不错,:-),浏览网站,鱿鱼就够了;要运行ICQ,OICQ等程序,请使用
袜子也足够了。但是,我遇到了一个更麻烦的问题,在这样的在线环境中,我无法使用Outlook和其他工具进行支付
非来自公司邮件服务器的电子邮件(例如@linuxaid.com.cn、@163.net、@sina.com.cn 等);也没有办法使用它诸如
Gravity之类的工具在USENET上进行了讨论。当然,有一个权衡,我可以使用一些在Linux下支持Socks的电子邮件。
客户端软件和新闻组阅读软件。但是,当我必须支付电子邮件费用时,这肯定会造成一些麻烦(我实际上确实这样做了)
或者在阅读新闻组时,我必须重新启动计算机以切换到 Linux 操作系统,当我必须工作时,我必须
重新启动机器并切换到Windows(不得不说,Linux作为办公桌面仍然不如Windows,尽管这是
这句话肯定会涉及很多Linux粉丝:-))。作为一名程序员,我无法忍受这些麻烦。我必须找到解决此问题的方法
问题。经过考虑,我得出了一个好意见。
这突出了集市的原则一:
软件的每一项出色工作都始于挠开发人员的个人痒处。
每个软件开发都带有开发人员自己的品牌。
3. 初始设计
我需要的是一个也可以完成“二传手”工作的程序。他本人可以连接到外部目标服务器和我的机器。
我的机器向他发送请求,他接受请求,完整复制请求并将其发送到外部目标服务器;外部目标服务器
回答请求时,我把答案发给他,他接受了,原封不动地复制出来,送到我的机器上。这样,我的机器
事实上,他被视为目标服务器(因为它是按原样复制的,所以请求和答案没有改变)。他是外部目标
服务器的客户端(由于它是完整的副本,因此请求和应答未被更改)。我称这些代理程序为“二传手”。
示意图如下:|--------------| |-----------------| |
--------------------|| |------------------>| |
---------------->| |
|
我的机器 | |代理服务 | |目标服务器 ||
||--------------| |-----------------| |
--------------------|
4. 重用示例
集市原则二:
优秀的程序员知道该写什么。伟大的人知道重写(和重用)什么。
优秀的程序员知道该写什么。伟大的程序员知道哪些是重绘和重用的。
基于这个原理,我其实不会从头开始编写这个程序(实际上这个程序是一个非常小的程序,没有必要这样做)。不过,为了给
大家,也为了给自己一个集市化开发方法的体验,我还是做了,我先写下了一个
简单的程序---附在本文末尾----然后我想起找出是否有类似的程序:-),结果证明是很多时间)。我
搜索了互联网并花了大约半个小时(大约与我编写第一个简单程序的时间相同:-)并找到了这个程序。
程序如下:
------------------------------------------------------------------------------------------------
/****
程序: 代理
模块:代理
摘要:为隔离网络上的主机提供代理 TCP 服务。
程序员:卡尔·哈里斯(ceharris@vt.edu)
日期: 22 Feb 94
描述:
此代码实现了一个守护进程,该进程侦听 tcp 连接
指定端口号上的端口号。建立连接后,
子项被分叉以处理新客户端。然后孩子建立——
将 TCP 连接连接到隔离主机上的端口。孩子
然后陷入一个循环,在该循环中,它将数据写入隔离主机
对于客户,反之亦然。一旦孩子被分叉,
父级恢复侦听其他连接。
独立主机的名称和要用作代理的端口,
以及服务器侦听的端口号被指定为
命令行参数。**
**
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define TCP_PROTO “TCP”
int proxy_port; /* 端口,用于侦听 */ 上的代理连接
struct sockaddr_in hostaddr; /* host addr 组装自 gethostbyname() */
extern int errno; /* 由 libc.a 定义 */
extern char *sys_errlist[]; /* 由 libc.a 定义 */
void parse_args (int argc, char **argv);
void daemonize (int servfd);
void do_proxy (int usersockfd);
无效reap_status(无效);
无效错误(字符 *消息);
/****
功能:主
描述:主级别驱动程序。在对进程进行守护进程后,套接字
打开以侦听代理端口上的连接,
接受连接并生成子项以进行处理
每个新连接。
参数:
argc,argv 你知道那些是什么。
返回值:无。
呼叫:parse_args、do_proxy。
全局:读取proxy_port。**
**
主要(ARGC,Argv)
国际 ARGC;
字符 **argv;
国际克利伦;
int childpid;
int sockfd, newsockfd;
struct sockaddr_in servaddr, cliaddr;
parse_args(argc,argv);
/* 准备一个地址结构来侦听连接 */
bzero((char *) &servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = proxy_port;
/* 得到一个插座... */if ((
sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0) {
fputs(“未能创建服务器套接字
“,斯特德);
退出(1);
/* ...并将我们的地址和端口绑定到它 */
if (bind(sockfd简单的网站程序,(struct sockaddr_in *) &servaddr,sizeof(servaddr)) < 0) {
fputs(“失败将服务器套接字绑定到指定端口
“,斯特德);
退出(1);
/* 准备接受,最多 5 个等待连接的客户端 */
听(袜子,5);
/* 把自己变成一个守护进程 */
Daemonize(sockfd);
/* 陷入一个循环以接受新连接并生成子项 */
而 (1) {
/* 接受下一个连接 */
clilen = sizeof(cliaddr);
newsockfd = accept(sockfd, (struct sockaddr_in *) &cliaddr, &clilen);
if (newsockfd < 0 && errno == EINTR)
继续; /* 信号可能会中断我们的 accept() 调用 */
否则如果 (newsockfd < 0)
/* 有些不对劲 -- k
从手动到
手工,从重复到创新,技术变革的过程伴随着开发者工具产品的开发。
阿里巴巴将开业
其通过开源、云实现或工具等在各种业务场景中的技术背景,本文将选择一些阿里巴巴开发者工具,希望能帮助开发者提高开发效率,编写更多高尚的代码。
因为开发者涉及很多技术领域,笔者只从我熟悉的领域前端开发者的角度来盘点一下可能使用的工具。每个工具都根据以下几点进行描述:
1. 工具名称及介绍 2、使用场景 3、使用教程 4、获取方法
一、Java在线诊断工具Arthas。
阿里巴巴于2018年9月开源了一款Java在线诊断工具。
工具的使用方案:
1. 这个类是从哪个 jar 包加载的?为什么会报告各种与类相关的异常?
2. 为什么我更改的代码没有执行?难道我没有承诺?分支出错了?
3. 如果遇到问题,无法在线调试,只能通过添加日志重新发布吗?
4.在线遇到的用户的数据处理存在问题,但也无法在线调试,并且很难离线复制!
5. 是否有全局视角来查看系统的运行状况?
6. 监控JVM实时运行状态的方法有哪些?
Arthas支持JDK6+,Linux/Mac/Windows,采用命令行交互模式,并提供丰富的Tab手动补全功能,进一步方便问题定位和诊断。教程:
基本教程:
高级教程:
如何获得它:(免费)开源地址:
二、IDE插件CloudToolkit
CloudToolkit 是一个 IDE 插件,可帮助开发人员更高效地开发、测试、诊断和部署应用程序。通过 CloudToolkit,开发人员可以轻松地一键将本地应用程序部署到任何机器(本地或云)上,一键提供 IntelliJIDEA 版本、Eclipse 版本、PyCharm 版本和 Maven 版本,以及外部 Arthas 诊断、终端命令和 SQL 的高效执行等。
工具的使用方案:
1. 每次代码更改后,您是否要进行重复包装?
2. 经常在 Maven、Git 和其他操作脚本和工具之间切换?
3. 使用 SCP 工具上传?使用 XShell 或 SecureCRT 登录服务器?是否替换部署包?重新启动?
4. 将文件上传到服务器的指定目录,并经常在各种FTP和SCP工具之间切换?
教程:
智能JIDEA版:
日食版本:
PyCharm 版:
Maven版本:
如何获得:(免费)工具地址:
混沌之刃,混沌实验注入工具
ChaosBlade是一款沌沌工程工具程序员 常用网站,遵循混沌工程的实验原理,提供丰富的故障场景实现,帮助分布式系统提高容错率和可恢复性,可实现底层故障注入,提供延迟、异常、返回特定值、修改参数值、重复调用、try-catch块异常等异常场景。
工具的使用方案:
1. 微服务的容错能力不好判断吗?
2. 容器编排配置是否合理且难以验证?
3. 有没有办法开始测试 PaaS 层的健壮性?
教程:
新中学指南
如何获得它:(免费)开源地址:
新中学指南
四、Java代码协议扫描插件
该插件用于检查 Java 代码中的不规则并提供提示。该协议插件是用 Kotlin 语言开发的。
教程:
IDEA 插件使用文档:
插件使用文档
Eclipse 插件使用文档:
插件使用文档
如何获得它:(免费)开源地址:
5. 应用实时监控工具 ARMS
ARMS 是一款 APM 类型的监控工具,提供后端监控、应用监控和自定义监控三种监控选项,可以快速建立实时应用性能和业务监控能力。
工具的使用方案:
1.晚上10点收到37份举报,但你没有办法开始?
2. 当我们发现问题时,客户/企业已经发起了投诉?
3、每月花几十万买服务器,却无法保证用户体验?
教程:
后端监控访问:
应用程序监控访问:
自定义监控:
如何获得:(收费)工具地址:
Docsite,一个静态的开源网站建设工具
Docsite是集官网、文档、博客和社区于一体的静态开源站点解决方案,具有简单易用的特点,支持反应和静态渲染、PC联通、中英文国际化、SEO、降价文档、全局站点搜索、网站风格定制、页面定制等功能。
教程:
如何获得:(免费)项目地址:
Freeline,Android平台上的二级编译方案
Freeline可以在几秒钟内快速编译并将代码更改部署到设备上,充分利用缓存文件,有效减少日常开发中大量重新编译和安装的时间。使用Freeline的最快方法是直接安装Android Studio插件。
教程:
如何获得:(免费)项目地址:
8. 性能测试工具 PTSPTS
可以模拟大量用户访问服务的场景,可以随时启动任务,消除建设和维护成本,并支持将JMeter脚本转换为PTS压力测试,以及原生JMeter引擎进行压力测试。
教程:
如何获得:(收费)工具地址:
9. 云效果开发者工具 KT
KT 可以简化 Kubernetes 下联合调试测试的复杂性,提升基于 Kubernetes 的开发效率。
教程:
如何获得:(免费)工具地址:
10. 架构可视化工具AHAS
AHAS为K8s等容器环境提供架构可视化,并具有故障注入高可用能力评估、一键式流控降级等功能,可以快速、经济地提升应用可用性。
工具的使用方案:
1. 在面向服务的转型过程中,是否要准确理解资源实例的组成和交互,实现架构的可视化?
2. 想介绍真实的故障场景和练习模型吗?
3. 获得流量控制和降级功能的门槛低?
教程:
如何获得:(免费)工具地址:
数据处理工具 易超
易超
是一个解析Java和生成Excel的框架,它将poi的解析重绘到Excel的07版本,原来3M Excel用POIsax需要大约1亿的视频内存,EasyExcel可以增加到KB级别,而且无论多大的excel都不会出现视频内存溢出。版本 03 依赖于 POI 的萨克斯模式。下层封装用于模型转换,使用户更容易、更方便。
教程:
如何获得它:(开源)。
HandyJSON,一个iOS工具
HandyJSON 是 Swift 语言的 JSON 序列化/反序列化库。
与其他流行的 SwiftJSON 库相比,HandyJSON 的特点是支持纯 Swift 类和简单易用。反序列化(将 JSON 转换为模型)时,它不需要模型从 NSObject 继承(因为它不基于 KVC),也不需要为模型定义映射函数。只要定义 Model 类并声明它遵循 HandyJSON 协定,HandyJSON 就可以使用每个属性的属性名称自行解析 JSON 字符串中的值。
教程:
如何获得它:(开源)。
EDASServerless,云资源和应用程序部署工具
EDASServerless是一个基于Kubernetes的无服务器平台,用于应用程序和微服务。用户可以通过镜像、WAR 包、JAR 包快速创建原生支持 Kubernetes 的容器应用,无需管理和维护集群和服务器,同时支持 SpringCloud 和 Dubbo 等主流微服务框架。
教程:
如何获得:(在封闭测试期间免费)。
14. 数据库加入池德鲁伊
Druid 是 Java 语言中的数据库连接池,它还提供强大的监视和扩展功能。**教程:**%E5%B8%B8%E8%A7%81%E9%
97%AE%E9%A2%98
如何获得它:(开源)。
Java工具集Dragonwell阿里巴巴
龙威是阿里巴巴内部OpenJDK定制版AJDK的开源版本,结合业务场景针对在线电商、金融、货运进行了优化程序员 常用网站,运行在阿里巴巴数据中心的超大型10万+服务器上。AlibabaDragonwell与JavaSE标准兼容,目前仅支持Linux/x86_64平台。**教程:**%E9%
98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4Dragonwell8%E7%94%A8%E6%88%
B7%E6%8C%87%E5%8D%97
如何获得它:(开源)。
最近面试BAT,整理一份面试资料《Java面试BATJ通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 Java 领取,更多内容陆续奉上。
如果文章有帮助,请阅读它,转发它。
感谢您的支持哟(*^__^*)。