0%

原力计划-从零实现最简 http 服务器

周末了,你带你的破电脑回到家并不能给你带来任何实质性作用,朋友们兜里掏出一大把钱吃喝玩乐,你默默的在家里摆弄你的破烂 java,spring 全家桶,srpingcloud 看了多少遍算法。亲戚朋友吃饭问你收获了什么,你说我装了个虚拟机,把各个工具都玩了一遍,亲戚们懵逼了,你还在心里默默嘲笑他们,笑他们不懂你的自动注入,不懂你的 10 层代理、不懂你的流量混淆,也笑他们连个复杂点的密码都记不住。你父母的同事都在说自己的子女一年的收获,儿子买了个房,女儿买了个车,姑娘升职加薪了,你的父母默默无言,说我的儿子搞了个破电脑,开起来嗡嗡响、家里电表走得越来越快了。

我就是那个段子里的大冤种,正文开始前自我调侃一下。

随着工作的年限的增长,越来越难写一些基础代码,总感觉自己的底子打的比较差,工作中写不了硬核代码,那我就用业余时间完成吧!我也知道网上代码一大堆,及时自己实现了也不见得有什么收获,就当学习,磨一磨生锈的刀。

若干年前在一个 java 项目中看到用纯 java 手撕前端代码,当时觉的好神奇,也大概只有功力深厚,大牛才能写出这样的代码,我等菜鸡只能写写 CURD,也许是那个时候埋下的种子吧,tomcat 没有精力写,但写一个简单的 http 服务器,让自己的网站跑在这个服务器上,想想也是美滋滋,什么 tomcat,什么 nginx,自己的服务器自己来写。

HTTP 服务器目标:让自己的网站跑在拥有自主知识产权的静态服务器上。

开始前要搞懂 http 协议。

HTTP 协议

HTTP 协议使用客户端-服务器模型,其中客户端发送一个 HTTP 请求到服务器,服务器则返回一个 HTTP 响应。HTTP 请求由请求方法(GET、POST、PUT、DELETE 等)和请求头(包含请求信息的元数据)组成,而 HTTP 响应由状态码(描述服务器对请求的响应)、响应头和响应正文(包含实际数据)组成。

以下是一个使用 HTTP 协议进行请求和响应的简单 demo:

  1. 客户端向服务器发送 GET 请求:

    1
    2
    3
    4
    GET /hello.txt HTTP/1.1
    Host: example.com
    User-Agent: Mozilla/5.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  2. 服务器向客户端发送响应:

    1
    2
    3
    4
    5
    HTTP/1.1 200 OK
    Content-Type: text/plain
    Content-Length: 12

    Hello World!

在这个例子中,服务器返回一个 HTTP/1.1 200 OK 响应码,表示请求成功。响应头中包含了一些附加的信息,例如返回的数据类型和数据长度。响应正文中包含了实际的数据,即 Hello World!。

阅读全文 »

写文章确实不如发朋友圈便捷,发朋友圈不需要想文章标题,但写文章需要一个标题,还需要一个主题。我也不知道我能分享什么,暂且写一写最近一些对互联网的困惑吧。

冲浪

记得在初中时,我们经常会接触一个词:冲浪。这个说法起源于 20 世纪 80 年代晚期和 90 年代初期,当时互联网还比较新颖,人们在上网时需要通过调制解调器连接到电话线,网页的加载速度也比较缓慢,因此上网浏览网页的过程就像是在波浪中冲浪一样,需要花费一定的时间和耐心。

此外,冲浪这个词本身也具有一定的流行和时尚感,适合用于描述这种新颖、刺激的行为,因此在那个年代成为了一个比较流行的说法。随着互联网技术的不断发展和进步,上网的方式也发生了很大的改变,人们逐渐使用更快速、更方便的方式进行上网,因此“冲浪”这个词汇在日常生活中的使用逐渐减少。

那个时候对于信息的获取是如饥似渴,总是在互联网上获取很多新的信息,源源不断,就像打开新世界的窗口,很像现在在抖音里看到的各种段子,但那个时候我们上网真的是抱着学习的态度,记得有一款浏览器就叫世界之窗

阅读全文 »

2022 年终总结

2022 年终总结来的比预想要晚一些,一日不书百事荒芜,虽然年前已经做好大纲和年终工作总结,但还是没有下定决心再写一篇,惰性的习惯。

趁今天在音乐中,打点鸡血,音乐果然给人力量,节选一些工作与生活的回顾,作为逝去一年的终结篇章。

Img

阅读全文 »

杜架的技术月刊,主要关注计算机领域,记录本月看到的有价值的信息,主要包含:碎片化思考,阅读笔记分享,开源项目(软件)介绍。内容主题可能有极大的个人喜好偏向,努力做个输出的人,爱我所爱,想我所想,写我所写。

Img

西安.雪

思考

大数据未来发展的趋势在哪里?

在腾讯全球数字生态大会上,腾讯云对这个赛道发展趋势的判断:云原生,数据治理,数智融合,隐私计算。结合自己在公司所接触的情况,我个人比较看重:云原生,数据治理,数智融合 。
云原生
我们公司的技术栈早在 2016 年基本已经全部容器化,redis, mysql,elasticsearch ,kafka 等基础设施早已容易化,但 hadoop 体系却没有容器化,总体感觉大数据体系在云原生化进展特别缓慢,但云原生化带来的收益是很大的,各种云厂商的弹性 MapReduce 也早已在提供服务。
云计算领域非常著名的计算存储分离的架构也慢慢在深入到一些基础设施,该架构也是 kafka 未来最大目标之一。Pulsar 从设计之初就将它列为设计目标之一。
大数据技术本身对硬件资源消耗的要求,对软件运维的要求等各方面,都表明,只有拥抱云原生,大数据才能够避免高门槛,难度大等一系列问题,真正成为所有客户的选择
数据治理
对于这方面,我没有经验,只是在我们内部面临了各种数据层面的问题,数据不可知,数据不可控,数据不可取,数据不可连等等问题,在这个领域也有很多数仓,数据湖(Delta Lake、Iceberg 和 Hudi),元数据管理等产品。
往往企业向数据化转型的途中,使用数据的同时会涉及到很多痛点,这些痛点可能来源于业务、技术、运维、产品等不同的和数据相关的成员

Img

数智融合
自从深度学习技术发展起来以后,人工智能达到了一个新高度。深度学习离不开大量的计算来产生复杂的模型,同样也离不开大量的数据输入进行训练。可以说人工智能的最新进展,就是算力巨大进步和大数据技术的发展相结合的产物。
这种人工智能和大数据结合产生的智能决策的潜力是巨大的,互联网巨头们比如谷歌,脸书,亚马逊,已经通过这一技术的突破赚得盆满钵满。
最近在做公司的个性化推荐,确实学习到了很多新的思路和方法,深度学习的做法和统计学的做法区别很大,存在一定的不可解释性,这方面值得期待。

阅读全文 »

杜架的技术月刊,主要关注计算机领域,记录本月看到的有价值的信息,主要包含:碎片化思考,阅读笔记分享,开源项目(软件)介绍。内容主题可能有极大的个人喜好偏向,努力做个输出的人,爱我所爱,想我所想,写我所写。

Img

思考

have-do-be vs. be-do-have

两种不同的思维方式,这里用减肥来解释。
第一种思维方式是
1.我想要减肥(do)
2.因为我想要有美好的身材(have)
3.最终我想成为一个健康自信有魅力的人(be)
总结:先做事,做完事之后就会有什么,最终会成为什么
第二种思维方式
1.我要成为一个自信有魅力的人(be)
2.这样一种人会做一些什么事呢(do)
3.做了这些事之后,我会拥有什么呢(have)
总结:先有目标,根据目标倒推出当前要做的事情,做完这些事情之后达成目标就会水到渠成(以终为始)

快速学习

做技术久了,有一个感觉,想要避免 35 岁危机,拥有自己职场的核心竞争力,快速学习绝对是一个秘密武器,但人的能力和精力一定是有限的,如何做到呢?
自己简单梳理一下:

  • 保持长期阅读和学习的状态,一切快速学习都是建立在之前的常年累月投资的基础上
  • 带着问题去学习,事半功倍
  • 做好判断(标准),识别关键(核心)问题,例如:面对一个全新业务场景,如何能够识别 20%的关键业务路径,关键业务痛点

何为知识?

为什么有的时候,会感觉鸡同鸭讲,排除对方理解能力问题,信息差等原因,更大的原因是你讲的思维和听的人的思维不同。

记笔记,写博客算在积累知识吗?在 5 年前我会认为是,但最近越发觉得还不够。再多的信息也不等于知识,
经由我们自己的思维转换并以自己的理解方式吸收的才是自己的知识,
然后再将知识应用结合到日常工作中的才算是个人的能力。

知识是需要整理的,我认为它应该是结构化的。世面上的知识库,书籍,就是个很明显的例子。

适当的对自己的笔记和博客进行整理,我觉得不失为一个好的办法,温故知新,条理化。

Img

阅读全文 »

最近看了一本书,很多地方引起自己的共鸣,还有一些自己觉得值得记录的地方,此篇文章摘自自己的读书笔记,希望给大家带来一些帮助和思考。

命名

约定

Img

方法小写开头,驼峰命名;常量大写,以下划线分隔,TOTAL_COUNT;枚举类以 Enum 结尾;抽象类名以 Abstract 开头;异常类以 Exception 结尾;测试类以 Test 结尾;包名小写。

阅读全文 »

Spring必知必会的技术

参数配置

常用的有两种方式:@Value和@ConfigurationProperties

Feature @ConfigurationProperties @Value
Relaxed binding Yes Limited (see note below)
Meta-data support Yes No
SpEL evaluation No Yes

@Value

首先需要在配置类上增加@Configuration

带默认值的

1
2
@Value("${kafka.producer.retry:1}")
private int retry;

使用Spring Expression Language (SpEL)

1
2
@Value("#{'${actuator.send.business.type:eims,item}'.split(',')}")
List<String> specifyType;

@ConfigurationProperties

该方式可以将相应的配置封装在具体类内,对代码组织和封装友好,推进使用这种方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@ConfigurationProperties(prefix = "my.server")
public class MyServerProperties {
private String name="test";
@NotNull
private String bootstrapServers;
private Host host;
// getters/setters ...
// 嵌入式结构
public static class Host {
private String ip;
private int port;
// getters/setters ...
}
}
1
2
3
4
5
6
my.server:
name: test
bootstrap_servers: xxxxx:9092
host:
ip: xxx
port: 8081
阅读全文 »

Native Image

借助于GraalVM和springboot 3 ,我们可以将java应用编译成native image,脱离jre单独运行。

环境搭建

需要安装GraalVM和C++编译环境

安装GraalVM

下载GraalVM,然后解压到相应目录,配置环境变量:

JAVA_HOME

1
D:\app\java\graalvm-ce-java17-22.3.0

Path

1
%JAVA_HOME%\bin

接着验证一下

1
2
3
4
> java -version
openjdk version "17.0.5" 2022-10-18
OpenJDK Runtime Environment GraalVM CE 22.3.0 (build 17.0.5+8-jvmci-22.3-b08)
OpenJDK 64-Bit Server VM GraalVM CE 22.3.0 (build 17.0.5+8-jvmci-22.3-b08, mixed mode, sharing)

最后安装native-image,由于功能网络环境限制,先下载,然后使用离线安装:

1
gu install -L native-image-installable-svm-java17-windows-amd64-22.3.0.jar
阅读全文 »

Docker镜像最佳实践

5条最佳建议

1.仅安装产线需要依赖与软件

镜像尽可能最小原则

  • 仅复制jar/war
  • 使用自定义JRE(Java Runtime Environment)

2.使用多阶段构建

1
2
3
4
5
6
7
8
9
10
11
12
FROM maven:3.6.3-jdk-11-slim AS build
RUN mkdir /project
COPY . /project
WORKDIR /project
RUN mvn clean package -DskipTests


FROM adoptopenjdk/openjdk11:jre-11.0.9.1_1-alpine
RUN mkdir /app
COPY --from=build /project/target/java-application.jar /app/java-application.jar
WORKDIR /app
CMD "java" "-jar" "java-application.jar"
阅读全文 »

杜架的技术月刊,主要关注计算机领域,记录本月看到的有价值的信息,主要包含:碎片化思考,阅读笔记分享,开源项目(软件)介绍。内容主题可能有极大的个人喜好偏向,努力做个输出的人,爱我所爱,想我所想,写我所写。

austin-schmid-qXkfoiTV6nY-unsplash (1).jpg
岁月无痕,流光难驻。用笔印证心灵的虹影,用心感悟时代的呼声,让过往的岁月留存,让看过的世界被更多的人知晓,爱我所爱,想我所想,写我所写,这便是创刊的情和志。

思考

做事

学习任何事务首先要学会基本的规则,然后才能知道什么时候去打破规则。这个原则放在很多地方都能适用
例如:如何成为一个厉害的程序员,刚入行,大佬会告诉你先按这样写,而这样就是规则,新人最容易创新,但也最容易出错,往往忽略规则,忽略约定成俗,你的视野决定了你看问题的高度,当你掌握基本规则,那么我相信你的很多新奇的想法就可以实现了。为什么大佬告诉你程序员要懂设计原则设计模式,我想这个应该算是程序员世界的规则吧。

世界的本质是数学

人类孜孜不倦的探索着世界的本质,或者说一个物体的本质,原子核,质子,电子,夸克,这些都可以用数学公式来解释,人的认知能力是有限的,想象力也只局限于三维世界,这些都可以用数学来描述,数学可以让我们看的更远,看到一些我们无法想象的事。三个苹果+两个苹果等于五个苹果,三个桃+两个桃等于五个桃子,抛开外在干扰,3+2=5,这个是本质。外在因素再变化,这个数学本质没有变化,所以我想说未来对世界的探索可能还会有新的发展,新的变化,但数学一定是永恒的。

团队工程经验

一份团队工程经验(新人指导)可以极大的提升团队协作能力,代码质量,生产效率等等方面,而不是手把手教每一个新人。这个其实是做事的第一个阶段,经验文档化,方案演进化。整理了一个思维图:
image.png

阅读全文 »