描述
配置好域名转发后发现依旧无法访问,使用service caddy status
发现报错: no cipher suite supported by both client and server
解决
改成如下配置:
1 |
|
增加 tls协议配置即可
分享个人经验见解
配置好域名转发后发现依旧无法访问,使用service caddy status
发现报错: no cipher suite supported by both client and server
改成如下配置:
1 |
|
增加 tls协议配置即可
SERPAPI_API_KEY get from https://serpapi.com/
Install the following dependencies:
1 | pip install langchain |
1 | # set the api key |
Now AI can first use Google search and then answer your questions.
seata是阿里开源的分布式事务调度框架,支持TCC、AT、SAGA、XA四种模式
AT
SEATA默认是AT模式,通过@GlobalTrancation 动态代理生成全局事务ID,并通过RM来管理全局事务,如中间出错需要回滚事务时则通过数据库中的undo-log回写,undolog记录了数据提交前的状态
XA
二阶段提交,需要数据库本身支持XA协议
TCC
即 尝试(Try)-确认(Confirm)-取消(Cancel),每个事务都分成这三个阶段,在提交事务前向另一个系统发送确认消息,两边系统都确认OK了才执行提交操作,有一方出现异常则执行Cancel(补偿方法),缺点在于三个方法都需要自已手动完成
SAGA
与TCC类似,不同点在于一阶段直接提交事务,失败则执行补偿操作,无锁,因此性能相对较好,但同时由于没有事务隔离性会带来赃写
当某些简单的定时任务需要通过后台修改执行时间时,通过spring boot自带的定时任务来实现是个不错的选择。
需要实现SchedulingConfigurer
接口
1 |
|
1 |
|
由于服务器上部署了caddy torjan 作为代理服务器,想要配置域名时发现80端口已经被caddy占用,无法使用nginx,干掉80端口代理又无法使用,于是打算直接使用caddy反向代理域名。
配置caddy时走了一些弯路,按照官方文档配置怎么都访问不了,在此记录一下最终解决方案
按照官方文档我找到了caddyFile的位置:/etc/caddy/Caddyfile
接着vi 编辑,如下配置:
1 | reiner.host { |
保存后重启caddy: systemctl restart caddy.service
访问配置的域名,结果发现域名访问不进来,官方的说法是,不配置前缀只配置域名,默认转发http://reiner.host 以及 https://reiner.host 的80和443端口,理论上这么配置应该没错。
这里我的版本是caddy 2.6.x
最终我打算不再相信官方文档,手动配置每个需要转发的端口,如下:
1 | www.reiner.host:80 www.reiner.host:443 reiner.host:80 reiner.host:443 { |
其中第一段配置是将/data/pages
文件夹下所有文件作为HTTP服务器,通过访问如 reiner.host 或者 www.reiner.host 转发到 /data/pages/index.html
第二段是配置后台接口的地址,通过访问gateway.reiner.host 转发到本地的8000端口服务
tls 的作用是帮你申请ssl证书,这一点比nginx方便很多,当配置完重启后已经可以直接通过https访问了
2023-8-26 update
针对同一个域名,根据不同的路径转换到不同的服务,配置示例如下:
1 | www.reiner.host:80 www.reiner.host:443 reiner.host:80 reiner.host:443 { |
例如访问reiner.host/api/user/xxx 就会转发到服务器的8081端口
Langchain
llama_index >=0.6.5
GPT-3.5
websockets
python >=3.10
dependence
1 | pip install llama-index |
Supporting private knowledge base AI question-answering chatbot, capable of both knowledge-based Q&A and casual conversation.
more >>随着OPENAI开放API接口后,各大厂商的AI如雨后春笋般涌现,如同十年前的互联网大火,未来的风口必然是在AI上。
当然,基于自训模型/自研AI 门槛过高,不是个人或中小厂能干的,而且即使有也与OPENAI差距不小,因此一般人能卷的也只有应用层了。
基于此背景,我开始研究基于GPT的自定义数据索引问答机器人,接着我发现了llama_index和langchain这两个框架,在此记录一下它的使用方法。
langchain: GitHub - hwchase17/langchain: ⚡ Building applications with LLMs through composability ⚡
最初我尝试使用OPENAI的模型微调,我试着弄了几百KB的文本数据喂进去,然而发现当我使用微调模型对话时AI的回复总是只言片语连一句完整的句子都无法返回。
通过搜索资料后我意识到模型微调不是几百或者几兆文本数据就能达到我想要的目地的。
最终我发现llama_index + langchain可以实现想要的效果
安装python3.10以上版本
安装依赖库:
pip install llama-index
pip install openai
pip install langchain
pip install pandas
准备OPENAI的API KEY
准备好机器人要回答的资料库,可以有PDF、HTML、WORD文档、SQL、API接口甚至GITHUB、WIKI等网络资源也可以,在本章我将使用简单的TXT文本,举例大概内容如下:
塞尔达传说:王国之泪什么时候出? 《塞尔达传说:王国之泪》将于2023年5月12日发售哦,敬请期待!
more >>前面使用Jenkins+docker+shell脚本可以方便的实现单体应用部署,但如果是微服务架构,工程包较多,若是为每一个服务都建一个Jenkins job 会变得很繁琐,这个时候就需要用到docker-compose 容器编排工具,它可以只需一行命令就能帮我们完成多个服务的构建、推送、重启。
考虑到如果有多个服务需要部署到多台服务器,如果每台服务器都采用发送jar包再构建镜像的方式会产生许多重复工作,因此这种情况应该使用jenkins构建镜像->推送到私库->服务器拉取->docker-compose启动 如此流程来完成部署。
需要安装如下软件:
Jenkins (包括git/svn、publish over ssh 这个插件,jenkins安装教程很多此处不再赘述)
docker
Node JS (可选,仅部署前端vue项目时需要安装)
docker compose
准备工作指路:
jenkins: https://www.jenkins.io/download/ 直接启动war包或者使用docker安装
docker: Install Docker Desktop on Linux
Node Js:Node.js
docker compose: GitHub - docker/compose: Define and run multi-container applications with Docker
或者直接使用curl下载安装,以CentOs为例执行如下代码:
1 | 1、下载docker-compose |
为了使服务一次打包多次部署,需要安装docker私库来保存镜像
首先建好映射目录的文件夹:
1 | mkdir /data/registry |
执行docker命令启动私库镜像:
1 | docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest |
添加docker配置:
注意:如果是通过内网访问就配内网IP否则 配公网IP
vi /etc/docker/daemon.json
添加如下:
1 | "insecure-registries": ["192.168.2.200:5000"] |
如果需要设置账号密码:
1 | docker run --rm --entrypoint htpasswd httpd:2 -Bbn yourUserName yourPwd >> ./auth/htpasswd |
一般在内网环境部署私库,拉取推送也是全程内网,所以可装可不装
默认私库无法删除镜像,执行如下命令添加配置:
1 | sudo docker exec -it registry /bin/sh |
网上的资料比较杂,且少有成体系的资料,因此收集资料并按照自己的理解做了一下整合,本文为自我理解与总结,不代表标准答案。
java从编写’System.out.println(“hello world”)’ 开始,并编译运行,在这期间到底发生了什么。
一个.java文件的完整周期是 java编码成jvm可识别的.class文件, 然后大致流程是: 加载–>连接–>初始化–>使用–>卸载
1、通过全类名获取定义此类的二进制字节流(类似反射)
2、将字节流所代表的静态存储结构转换为JVM方法区的运行时数据结构
3、在内存中生成一个代表该类的 java.lang.Class 对象,作为方法区这些数据的访问入口(这样代码才能通过全类名访问到该对象)
PS:数组类型不通过类加载器创建,它由JAVA虚拟机直接创建,数组的加载可通过自定义类加载器控制加载方式
JVM中有三个类加载器,除了 BootstrapClassLoader 其他类加载器均由 Java 实现且全部继承自java.lang.ClassLoader
1、BootstrapClassLoader(启动类加载器) :最顶层的加载类,由 C++实现,负责加载 %JAVA_HOME%/lib目录下的 jar 包和类或者被 -Xbootclasspath参数指定的路径中的所有类。
2、ExtensionClassLoader(扩展类加载器) :主要负责加载 %JRE_HOME%/lib/ext 目录下的 jar 包和类,或被 java.ext.dirs 系统变量所指定的路径下的 jar 包。
3、AppClassLoader(应用程序类加载器) :面向我们用户的加载器,负责加载当前应用 classpath 下的所有 jar 包和类。
适用于单库,日志表过大的问题,如每月产生几千万条日志,还不能清理,必须存档,其它业务表反而没这么大量时,可以使用分表来解决。
可以按实际情况来决定是按年分表还是按月分表,每年产生的数据量过亿时可以按月分表。
使用spring boot 2.x + mybatis-plus + shardingjdbc5.x + druid
shardingjdbc非常坑的一个点,每个版本变一次配置,官方文档写得不清不楚,通过GITHUB找到官方示例,发现示例也很少,最后是通过网上的博文+示例+文档才搞定。
1 | <properties> |
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia-plus根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true