Tools-Inno-Setup
window系统免费安装软件制作系统,用于打包封装nginx、emqx、mysql、redis、springboot等合成一个windows的exe安装包。
安装脚本
1 | [Setup] |
参考:
window系统免费安装软件制作系统,用于打包封装nginx、emqx、mysql、redis、springboot等合成一个windows的exe安装包。
1 | [Setup] |
参考:
go入门
创建一个项目目录和两个文件,结构如下
1 | go-hello |
文件内容分别如下
hello.go
文件内容:
1 | package main |
Dockerfile
文件内容:
1 | FROM golang:1.21.3-alpine AS builder |
在项目跟目录(go-hello
),执行docker build -t hello:latest .
进行镜像打包
运行镜像docker run -p 8080:8080 hello:latest
然后访问http://127.0.0.1:8080/
go build -o hello ./hello.go
生成hello
可执行文件./hello
,然后访问http://127.0.0.1:8080/在项目跟目录执行go mod init go-hello
,会生成一个go.mod
和go.sum
的文件,文件内容如下:
go.mod
1 | module qiniu_go |
go.sum
1 | github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= |
在项目跟目录执行go mod tidy
,删除错误或者不使用的modules
main.go
,dockerfile根据hello的例子进行修改即可
1 | package main |
时间同步的两种方式chrony vs ntp
ntp:传统的时间同步配置,既可以当服务端,也可以当客户端
chrony:新式时间配置,采用微调修改同步时间
1 | #查看时间 |
修改时间过后,时间过一段时间又不对了
分析,怀疑是chronyc慢慢修正成了错误时间
解决过程:
通过把chronyc停用,换成ntpd进行同步时间,过了一天,时间还是改变了(RTC+8),发现ntpd服务在3点的时候停止了
添加时间ntpd服务是否运行的检测的脚本check_ntp.sh
1 | #!/bin/bash |
添加时间是否同步time_sync_status.sh
1 | #!/bin/bash |
整合服务检测,与时间同步
1 | #!/bin/bash |
创建一个定时任务crontab -e
1 | */1 * * * * /root/sync_time.sh |
后面观察日志tail -f /var/log/sync_time.log
即可,执行more /var/log/sync_time.log | grep " is not " -A 28 -B 10
进行查看什么时候通不过时间
参考:
1 | #添加用户 |
常见问题:
1 | Jan 08 14:24:26 ubuntu sshd[2677787]: Accepted password for bikesfe from 172.16.30.210 port 52532 ssh2 |
1 | <dependency> |
在Firebase控制台,点击项目设置->服务账号->Firebase Admin SDK->选择java->生成新的私钥
等待下载成功,复制下载成功的文件到项目里面
创建FireBaseConfig.java
,添加初始化代码
1 | import com.google.auth.oauth2.GoogleCredentials; |
创建工具类FireBaseUtils
1 | import com.google.firebase.messaging.*; |
测试发送消息
1 | @GetMapping("/send") |
在firebase控制台创建项目
在产品类别->吸引->
Messaging界面,点击添加应用
在项目设置->常规->您的应用
查看应用接入配置
web版本(未成功,应该是没有token的原因)
1 | import { initializeApp } from "firebase/app"; |
Android
可以使用 android studio再带的firebase进行集成,点击tools->firebase
后续跟着提示操作即可。
下面介绍手动版本:
1 | //在项目(project)build.gradle添加com.google.gms.google-services依赖 |
添加获取token的方法,服务端发送消息的时候需要该token,一般在设备登录的时候把token发给服务端
1 | FirebaseMessaging.getInstance().getToken() |
添加接受消息的代码
1 | import android.util.Log; |
制作首个宣传活动(或者新建宣传活动)
腾讯IM vs 环信IM
文档对比,腾讯IM容易理解,环信IM文档复杂
数据流入流出逻辑
1 | 客户端->IM服务端:创建用户获取userid |
登录腾讯云控制台
在即时通信IM创建新应用(已有忽略)
查看SDKAppID和密钥
在IM腾讯云控制台创建用户(或者通过客户端创建)
在服务端计算UserSig(建议,不在服务端生成,容易泄露SDKAppID和密钥)
添加依赖(不想添加依赖,可以直接复制里面的两个文件到自己的项目)
1 | <dependency> |
引用工具类,生成userSig
1 | public static void main(String[] args) { |
编写客户端聊天代码,这里体验web版(快速入门(Web & H5 Vue2/Vue3))
填入返回的userSig
1 | // 客户端生成userSig |
emqx/emqx:5.3.1
1883
、emqx管理界面端口18083
/opt/emqx/data
和/opt/emqx/log
<IP>:18083
,默认用户名admin,密码public登录emqx管理界面
点击Rules->Create
在SQL Editor
输入
1 | SELECT |
在左侧点击Actions->Add Action
在Action选择Republish
(转发消息),输入topic的名字,例如exxk/status/client
,其他默认即可,Payload
设置为空,空代表消息原封不动转发。
最后在代码里面订阅exxk/status/client
即可,代码如下
1 | log.info("message {}", message); |
设备断电离线会有2分钟左右的延迟
问题:配置挂载目录后,启动提示该日志Failed to read: "data/loaded_modules", error: enoent
,无法访问管理界面,客户端正常连接。
解决:更换版本5.3.1
解决。
*QoS*
QoS(Quality of Service)指消息传输的服务质量。分别可在消息发送端和消息消费端设置。
QoS包括以下级别:
*cleanSession*
QoS和cleanSession搭配使用时需注意以下几点:
消费端QoS和cleanSession的不同组合产生的结果如QoS和cleanSession的组合关系所示。
QoS级别 | cleanSession=true | cleanSession=false |
---|---|---|
QoS0 | 无离线消息,在线消息只尝试推一次。 | 无离线消息,在线消息只尝试推一次。 |
QoS1 | 无离线消息,在线消息保证可达。 | 有离线消息,所有消息保证可达。 |
QoS2 | 无离线消息,在线消息保证可达且只接收一次。 | 暂不支持。 |
添加依赖
1 | <dependency> |
添加mq配置
1 | @Configuration |
对应的配置文件
1 | mqtt: |
注入配置
1 | @Configuration |
发送消息
1 | @MessagingGateway(defaultRequestChannel ="mqttOutputChannel") |
点击左侧系统设置菜单下的 API 密钥,可以来到 API 密钥页面。如果需要 API 密钥来创建一些脚本调用 HTTP API,可以在此页面进行创建获取操作。点击页面右上角创建按钮打开创建 API 密钥弹框,填写 API 密钥相关数据,如果到期时间未填写 API 密钥将永不过期,点击确定提交数据,提交成功后页面上将提供此次创建的 API 密钥的 API Key 和 Secret Key,其中 Secret Key 后续将不再显示,用户需立即将 API Key 和 Secret Key 保存至安全的地方;保存数据完毕可点击关闭按钮关闭弹框。
在 API 密钥页面上,您可以按照以下步骤生成用于访问 HTTP API 的 API 密钥和 Secret key。
单击页面右上角的**+ 创建**按钮,弹出创建 API 密钥的对话框。
在创建 API 密钥对话框上,配置 API 密钥的详细信息。
如果到期时间文本框留空,API 密钥将永不过期。
单击确认按钮,API 密钥和密钥将被创建并显示在创建成功对话框中。
代码示例:
1 | import cn.com.iexxk.config.MqttConfigProperties; |
随着K8S的火爆,K8S渐渐抛弃了docker容器,采用了Containerd容器,这就导致安装K8S的话一般就没有docker命令了,以及在流水线编译镜像时,也依赖宿主机的docker环境,因此才研究了下除了使用docker环境编译镜像,还能使用其他那几种方式编译镜像。
未实践 使用 DaemonSet 在每个 containerd 节点上部署 Docker
改方式使用的是docker pull docker
镜像的方式,常用使用方式如下
1 | #需要挂载宿主机的docker,其实共用了宿主机环境不安全 |
属于工具软件,主要安装在Linux, macOS, and Windows环境,安装命令brew install buildkit
,如果在编译的容器(例如gitlab runner的容器、jenkins的容器)里面安装,应该也可以有很好的适应性,但是还未实验。
1 | #使用debug镜像,因为可以进入sh命令行,原镜像是gcr.io替换为gcr.lank8s.cn,因为gcr.io访问不了 |
在pom.xml文件添加jib插件,然后使用mvn package -f pom.xml
进行打包,就会自动上传到harbor仓库了
1 | <build> |
因为harbor仓库不是https,因此执行mvn命令时,还需加上jvm参数-DsendCredentialsOverHttp=true
,linux可以通过mvn -DsendCredentialsOverHttp=true package
进行打包。
出现如下错误
{"errors":[{"code":"PRECONDITION","message":"Failed to process request due to 'xxx-business:latest' configured as immutable."}]}
分析:因为harbor设置了immutable
,在harbor上面删除带immutable
的tag就会提示the tag latest configured as immutable, cannot be deleted
该错误。
解决:在harbor管理界面,点击项目->Policy->TAG IMMUTABILITY->Immutability rules
,然后删除相关规则
参考:镜像构建
创建harbor仓库
本地编译web项目
添加Dockerfile
到项目根目录
1 | FROM nginx:alpine |
添加nginx的配置文件default.conf
到项目根目录
1 | # 后端接口代理地址,部署在一个命名空间,通过service模式访问,在这里配置了就可以不用配置外网访问的ip |
编译镜像,在项目根目录执行docker build --no-cache=true --build-arg JAR_FILE='*' -f Dockerfile -t harbor.iexxk.dev/base/test_web:latest .
推送镜像,在项目根目录执行docker push harbor.iexxk.dev/base/test_web:lates
在kuboard上面创建deployment部署。
配置ingress,配置一个自定义域名映射到前端80的服务上。
到此就配置结束了,通过自定义域名即可访问前端,后端通过自定义域名加/api
就可以通过前端部署时用的nginx进行转发。
疑问:在我的印象你前端需要指定后端接口地址,但是不知前端做了什么操作,没有指定,部署上直接访问的接口就是域名加api的模式访问。