开源项目
2 6
gitee

最伟大的架构=1%的想法+99%的代码。Talk is cheap,show me the code。

2023开源项目

chatgpt-java(+前端项目)

OpenAI ChatGPT 的逆向工程SDK。可扩展用于聊天机器人等。demo展示http://hoppinzq.com/chat/index.html

20 305 128
打开开源地址

这是1月份到2月份的产物。很荣幸,如果你在几个月前在gitee上搜索chatGPT,那么第一个就是这个项目。这是我今年的第二个项目,是今年第一个开源的项目。
其实聊天机器人这个功能很久之前就做了一个,也集成在微信(对话开放平台——好菜一只猫)里,当时直接调的开源的api,纯属娱乐,简直是人工智障,也没有什么技术含量。
chatGPT是22年末的产物,当时只能翻墙访问,且没有公开API,我只能通过国外服务器代理并且伪造请求来调用chatGPT的聊天接口。这就是这个项目的核心原理,直到现在,除了登录接口,其他伪造的请求还是可用的。
chatGPT最火是从3月份开始,当时openAI公开了他们的接口,你只需会模拟Http请求就能调用他们,当然需要在国外搭建代理服务。 后面国内“自研”套壳chatGPT应用如雨后春笋诞生,我的这个项目狠狠地火了一把,以至于那段时间微信都被加爆了。 没办法,我在4月中旬做了一个后台代理服务和一个聊天demo页面 点我跳转 来介绍如何使用SSE技术实现及时响应的对话,如何使用上下文,如何设置系统提示词,embedding优化,图片生成模型,代码生成模型,Key池,使用数据集训练。
后面直到6月份,程序还能平稳运行,我就编写了 月度总结 ,统计了4月底到5月底的所有数据。 当时我签发了2.8w个永久性token(因为http是无状态的,需要使用这个token维护与用户连接,用户无需在我的统一权限平台注册登录),预计大约2w个用户,要是每个人给我50块钱, 那我就是百万富翁。互联网真的是普通人实现财富自由最近的一条路,每一个热点都将颠覆整个行业。我身边卖号的人都赚得盆满钵满。我就靠着网站上挂着的打赏, 维持服务器和apikey的购买费用,也算小小地赚了一笔。
由于后台代理服务跟我的网关模块强绑定,导致很多小伙伴不会部署,这是我的问题,就先让他们部署前端。 后面我就剥离出来,这时候很多小伙伴就可以部署了。能看出他们真的很开心,我也很享受这个过程。
后面经历各种封号,导致了我的网站也要跟着瘫痪,现在对话我目前是不维护了,只能说是可用。 因为现在数据库数据量有千万级,即使加了索引,各种慢SQL监控把我搞烦了。目前只维护embedding接口,用以实现推荐系统。 SSE核心代码: 展开代码

https-api

2022年末签发了我的SSL证书,我可以用https和搭建CDN啦。由于之前用的都是http协议,所以很多接口都是基于http的,然后我现在有CDN,就把所有静态资源包括前端页面都放在了CDN里, 所以这之后的项目全部都是前后端分离的。CDN带来的页面响应速度和静态资源加载速度的提升是很明显的,之前我的博客页面是前后端不分离的,静态资源都是Jetty和Tomcat加载的,首页进去得加载5s左右。 上CDN后,除第一次加载慢,后面是秒开。
言归正传,由于前端是https下的,自然之前的http接口就不能用了。就做了这个代理转发服务,用来使用https代理之前的http接口,这就是这个项目的初衷。
由于我之前做了一个短视频网站,用来分享我自己的录屏高光操作,现在我想把它做成前后端分离的,我就把视频的代码迁到了这个服务下。后面突然想做一个直播的功能,就把代码都写在这里了,也集成了OBS,原理你可以在 我的视频网站 找到。
后面我用这个项目申请了一个软著,也没开源,没开源的原因是这个本来就不是直播项目,是做https代理http的。视频项目在gitee上有,只不过直播管理功能做到这里面了!
全文检索(视频搜素)代码: 展开代码

短视频网站

hoppinzq-gateway网关

你发誓你在22年见过我的网关,但是现在它更强大了。你在访问我的chatgpt年度总结的时候看到一份报告,内容是关于请求数、请求地域、响应状态码等的统计,让你来设计这个需求, 你会怎么实现呢?答案就是通过网关,那么经过一年的迭代,23年的hoppinzq-gateway网关已经可以完美融合nginx了。这不是骇人听闻,因为nginx本身支持用Java进行拓展, 我将在之后写一篇博客来介绍这项功能。
不知道你们是如何部署nginx的呢?作为程序员,我不建议你去安装(或用docker安装)现成的nginx软件,我建议你通过编译源代码的方式去部署。 因为这样我们就可以修改源代码啦,这很酷,但你通常不会有这样的需求。
话又说回来了,hoppinzq-gateway网关是如何完成上面工作的?实际上我说一个简单的案例你就知道了:如何统计请求的IP地址?这个问题的答案很简单,但做起来不容易。 以前的做法是:nginx获取请求头的IP设置到自定义请求头(如:x-nginx-ip),然后网关先去判断请求头有无携带x-nginx-ip,有的话就保存起来,无的话就直接获取 请求头的IP,然后就可以再次透传这个IP到各个业务模块去了。
现在的做法就很简单了,我可以直接在nginx层面上写一个拦截器,在nginx配置让其生效。我直接在拦截器就能拿到请求头里的IP,然后写到日志里就行了。下课! 这个做法就很简单,nginx提供了拓展它的Java类库nginx-clojure,然后实现NginxJavaRingHandler接口重写方法即可。
值得注意的是,这样做有点危险,因为nginx是所有请求的入口(包括静态资源),在这个层面记录日志可能会有性能上的影响。
最后,因为有CDN层,所以在nginx统计的数据就不可靠了,但是思想最重要,思想。
下面简单重写nginx的用户认证过程,了解一下? 展开代码

Java服务管理系统

从我的剑来框架那个开源项目复制进来的,想独立作为一个开源项目,在线访问https://hoppinzq.com/manager/index.html

3 13 18
打开开源地址

这是一个没有readme的项目,如你所见,我现在有很多后台服务,每次部署服务都很费事,这导致了我产生一个独特的能力:我都可以闭着眼部署它们了(笑。
这个项目是3月份完成的,我经过chatGPT的指导,完成了这个牛逼的项目,我先说说它能干啥:首先管理Linux的文件系统,刷新CDN缓存,可以用来部署jar包, 实时打印日志和堆栈信息。一键开启或者停用服务,一键配置jmx监控或者远程调试,一键gc。还有类似宝塔的功能,可以一键开启nginx,redis等服务,而无需进入Linux终端。
牛逼,这是怎么实现的?chatGPT说:jsch。它提供了Java操作ssh的全部api,你只需对Linux指令有足够的了解,就能实现上面的功能。
然而不幸的是,虽然这个项目的功能很强大,但是部署上去我就很少使用了。在线访问: 点我跳转
部署Jar包核心代码: 展开代码

hoppin推荐系统

这是5月份的产物,我是聪明逼。感谢openAI提供的embedding接口。
说实话我说原理你们可能也不太懂, 看我这个博客 ,反正就是牛逼,这套系统除了没有相关度排序外,基本可以完美而准确的按照预期推荐。你们可以看看我的视频网站和博客网站, 有人可能看到视频网站的推荐内容了,有人感觉推荐的很慢。这是我的错,因为推荐过程实际上是向量之间的余弦相似度计算,属于CPU密集型任务。 而视频网站推荐接口运行在单核的服务器上,理论上只能跑一个线程,我还傻傻地用线程池一顿优化,我是傻逼。
视频推荐相关代码(省略了若干方法): 展开代码

(开发中)springhoppinzq

基于SpringBoot的微服务框架,你永远见不到这么牛逼的项目,它应该被用金框裱起来。
首先,这是对标的SpringCloud的微服务框架,拥有自己的框架、协议和中间件。这很牛逼,但是它的诞生是一个偶然。 这个框架的起源是21年7月份的一个报错而产生的,这个报错就是EOFException,即End Of File Exception。 这个报错非常的有趣,也是非常罕见的,程序在读取输入流的时候,由于结束标记位的混乱(如:在流里插入一个null或-1), 导致程序读取到结束标记位的时候,不确定是否真的到达了输入流的末尾。这个时候,程序一旦读到结束标记位的字符,就会抛出这个异常。
我不确定你是否对它感兴趣,反正通过这个报错,我了解了序列化和反序列化,进而了解了RPC原理,进而编写了第一个垃圾的框架——剑来RPC框架。
看,从0到1就这么突破了,后面一发而不可收,陆陆续续完成了自己的网关中间件,统一权限认证平台,爬虫框架,以及第一个使用剑来框架编写的博客系统。
目前框架能按照预期工作,拓展接口非常之多。您目前访问我的所有网站,其后台全部都是基于剑来框架和网关搭建而成。
这套框架已有的功能,大家可以打开文档查看,目前有:注册中心,负载均衡,断路器,网关等中间件。
远程服务调用核心代码: 展开代码

打开使用文档(旧)

(集成在springhoppinzq的)http声明式调用

你是如何模拟http请求的呢?是用现成的库如httpClient?还是用原生的网络传输?先不说我的答案, 首先现有的库httpClient、okhttp3等都很强大,封装的也很全面。我的chatGPT代理服务就是基于okhttp3的。URL对象是偏底层的东西,是Web开发中最主流的资源定位方式。
我们通常在后台调用其他http接口,往往都是通过写一个工具类,来对httpClient或者URL对象进行封装。这没问题,往往我们都是把请求的url写死在 一个字符串,然后调用工具类来模拟调用并处理响应。每一个url都要写一个调用的方法,因为不同的url要求调用的细节是不一样的,有的要求post请求,有的要求添加某些请求头。。。
那么,能不能将不同的调用细节统一抽象出来做一个配置呢?答案是可以的,你如果用过Feign,就知道Feign就是一种声明式的调用,这很优雅,且拓展性非常高,你可以先看看springhoppinzq的下面的代码:

    
public interface ExampleApi {
    @HttpHeaders({
        @HttpHeader(key = "x-zhang0",value = "qi0"),
        @HttpHeader(key = "x-zhang1",value = "qi1"),
        @HttpHeader(key = "x-zhang2",value = "qi2")
    })
    @HttpHeader(key = "x-zhang",value = "getToken")
    @HttpApi(url = "http://127.0.0.1:8801/service/hoppinzq?method=getGatewayMapping¶ms={}")
    @ResponseBody
    String getData();

    @ZQGatewayMethod("getGatewayMapping")
    @HttpApi(url = "http://127.0.0.1:8801/service/hoppinzq")
    String getData1(@ZQGatewayParam String param);

    @HttpHeader(key = "x-encode",value = "true")
    @HttpApi(url = "http://127.0.0.1:8801/service/hoppinzq?method=${param1}¶ms=${param2}&token=${param3}")
    String getData2(String param1,String param2,String param3,@HttpHeader(key = "token") String header);

    @UsingRequest
    @HttpApi(url = "http://127.0.0.1:8801/service/hoppinzq?method=id",method="post")
    String getId(@RequestBody String params);
}
    
我们不会在这里探讨任何细节和工作原理,因为时间是宝贵的,字数是有限的。它被集成在springhoppinzq,并为zq网关开发了特定的注解,已适配它独特的请求体。 你看源代码的时候可能会有很多困惑,感兴趣可以微信:HOPPIN_HAZZ

(开发中)hoppinAI

这是一个令人振奋的项目,每个人都可以有的小ai。hoppin出品,必属精品。目前已经完全地迈出了第一步——切分词服务的实现和数据结构的设计。 我很乐意分享我的想法和其中的工作原理,但你有没有一双乐意倾听的耳朵呢?
啊哈哈哈没有掉一根头发。
切词核心算法: 展开代码


或许你应该从组装一棵字典树开始?
组装字典树部分核心代码: 展开代码

看不懂?别着急,因为这算是断章取义,我并不指望你能看懂。 毕竟这并不是一个分享代码的好地方,这只是用来告诉我:我做了,而且我是一个行动派。

gitee指数,今年不统计,因为chatgpt那个项目太火了,数据波动太大。
游戏

应用了高清渲染管线HDRP的demo,效果拔群!

这是一个伟大的飞跃,因为这个画质已经可以够看了。 这是一个箱庭式地图,将是我们魂游的开始。 展开代码