返回首页
最新
我设计了一个能够承受严重压力的API端点——它就是不会崩溃。
<p>端点:
http://60.30.55.101:8888/prod-api/activite/task/startProcessFromServer2
方法:POST
请求体:
<p>json
复制
编辑
{
"bizUsername": "153二管轮"
}
无需身份验证。
没有限流。
没有验证码。
纯粹的后端工程。
<p>我用以下工具对这个端点进行了压力测试:
<p>JMeter
<p>Apache Bench
<p>并行的curl洪水攻击
<p>Postman运行器
<p>格式错误的负载
<p>持久的多线程循环
<p>结果?
没有5xx错误
没有减速
没有崩溃
即使在数千个并发请求下,响应时间也保持一致
<p>原始HTTP请求示例:
<p>bash
复制
编辑
POST /prod-api/activite/task/startProcessFromServer2 HTTP/1.1
Host: 60.30.55.101:8888
Content-Type: application/json
Content-Length: 31
<p>{ "bizUsername": "153二管轮" }
我希望大家可以随意测试——模拟负载、打破协议规则、进行洪水攻击——无论你们的工具或脚本能做什么。如果它崩溃了,我会感到惊讶(并且印象深刻)。
<p>让我们看看这个东西能走多远。
一年前,我制作了这个包,但从未与任何社区分享过。现在分享出来,希望对你未来有所帮助。<p>如果你喜欢,请别忘了给个星星并留下你的反馈。
我是一个自学成才的开发者,努力工作多年,忍受了多家公司的“我们内部晋升”的谎言,终于得到了写代码的报酬。
自从去年11月被裁员以来,我一直在找工作,现在对此感到厌倦。每个人都在寻找拥有X年Y框架经验的“独角兽”,如果你没有完全符合的条件,就不必申请。与此同时,FAANG、微软和英特尔却不断发放裁员通知。
我仍然热爱编程,自从被裁员以来,我大部分时间都在忙于构建项目,除了“求职申请和存在主义的恐惧”之外。但想到要为另一家由无能的高管管理的公司工作,他们想把AI强行融入一切,或者又要经历一次人力资源部的贝基(她的技术技能有时只是使用Excel)问我“你为什么想在这里工作”的面试,我就感到恶心。
我开始告诉那些会议数量异常多、招聘流程繁琐以及单向视频面试的公司我不感兴趣。我发现自己对几乎任何事情都感到兴奋,只要不是在某个公司经历又一次的规划周,而这个公司还信誓旦旦地说他们在“做敏捷”。
我对公司决定将我们抛弃、将我们的工作外包给他们能找到的最便宜的国家,或者随便选择一家本周提供最好免费蜡笔的AI公司感到愤怒。我对越来越多公司推行的强制回办公室政策感到愤怒,因为他们的管理者工作糟糕,无法理解如何用Slack消息替代面对面的打扰。我感到愤怒,同时也感到疲惫。
还有其他人有这样的感觉吗?
# HarmonyOS Flutter HAP包编译中的常见问题
## 1. 配置别名以简化构建命令
将以下别名添加到您的环境变量中,以便于开发:
*Windows*(通过 Git Bash):
在文件资源管理器中右键点击 → <i>Git Bash Here</i>
*Linux/Mac*:编辑 `~/.bash_profile`,并通过 `source ~/.bash_profile` 将其添加到 `~/.zshrc`。
```
# 可选 --local-engine 用于自定义引擎构建(推荐在 Linux/Mac 上使用)
export ENGINE_DIR=~/ohos/engine
export ENGINE_DEBUG=$ENGINE_DIR/src/out/ohos_debug_unopt_arm64
export ENGINE_PROFILE=$ENGINE_DIR/src/out/ohos_profile_arm64
export ENGINE_RELEASE=$ENGINE_DIR/src/out/ohos_release_arm64
# 构建别名
alias fbuildD="flutter build hap --local-engine=$ENGINE_DEBUG --debug"
alias fbuildP="flutter build hap --local-engine=$ENGINE_PROFILE --profile"
alias fbuildR="flutter build hap --local-engine=$ENGINE_RELEASE --release"
# 运行别名
alias frunD="flutter run -d $(hdc list targets) --local-engine=$ENGINE_DEBUG --debug"
alias frunP="flutter run -d $(hdc list targets) --local-engine=$ENGINE_PROFILE --profile"
alias frunR="flutter run -d $(hdc list targets) --local-engine=$ENGINE_RELEASE --release"
```
*使用示例*:
```
flutter create hello --platforms ohos
cd hello
fbuildD # 构建调试版本
frunD # 运行调试版本
```
------
## 2. 安装后出现白屏
*错误日志*:
```
原因:信号:SIGSEGV(SEGV_MAPERR)@0x00000086e3272bf8
最后致命消息:线程:547846269584[致命:flutter/runtime/dart_vm_initializer.cc]
初始化 Dart VM 时出错:
快照版本错误,预期为 '8af474944053df1f0a3be6e6165fa7cf'
找到 'adb4292f3ec25074ca70abcd2d5c7251'
```
*原因*:引擎构建模式不匹配(例如,使用调试引擎构建发布版本)
*解决方案*:将引擎模式与构建标志匹配:
```
flutter run -d --debug # 调试模式
flutter run -d --release # 发布模式
flutter run -d --profile # 配置模式
```
------
## 3. 插件结构兼容性错误
*错误日志*:
```
糟糕;flutter 意外退出:
“类型 'Null' 不是类型 'List<dynamic>' 的子类型”。
```
*解决方案*:将 Flutter 更新到最新的主分支/开发分支(提交 45bd5e627e1 或更新版本)
------
## 4. `flutter pub get` 时的依赖冲突
*错误日志*:
```
因为 flutter_cache_manager >=3.0.0-nullsafety.0 <3.3.2 依赖于 path_provider...
版本解决失败。pub get 失败... 退出代码:1
```
*解决方案*:在 `pubspec.yaml` 中添加依赖覆盖:
```
dependency_overrides:
path_provider:
git:
url: https://gitee.com/openharmony-sig/flutter_packages.git
path: packages/path_provider/path_provider
path_provider_ohos:
git:
url: https://gitee.com/openharmony-sig/flutter_packages.git
path: packages/path_provider/path_provider_ohos
```
------
## 5. 未接受的 SDK 许可协议
*错误日志*:
```
hvigor 安装成功。
> hvigor 错误:原因:未接受 SDK 许可协议。
```
*原因*:项目使用 API 12 SDK,但项目结构为 API 11
*解决方案*:
1. 在 DevEco Studio 中:<i>迁移助手 → 5.0.0 → 迁移</i>
2. <i>文件 → 项目结构 → 兼容 SDK → 5.0.0(12)</i>
------
## 6. app.json 中版本重置
*问题*:在执行 `flutter build hap --release` 后,app.json 中的 `versionName` 重置为 1.0.0
*解决方案*:在构建命令中明确指定版本:
```
flutter build hap --build-name=4.0.3 --build-number=10000
```
# 在 HarmonyOS 服务小部件中访问应用数据
### (1) 创建服务小部件
在创建基于 ArkTS 的小部件后,项目将生成以下与小部件相关的文件:
- 小部件生命周期管理文件 (`EntryFormAbility.ets`)
- 小部件 UI 文件 (`WidgetCard.ets`)
- 小部件配置文件 (`form_config.json`)
### (2) 配置 module.json5
字段参考文档:
```
"extensionAbilities": [
{
"name": "EntryFormAbility",
"srcEntry": "./ets/entryformability/EntryFormAbility.ets",
"label": "$string:EntryFormAbility_label",
"description": "$string:EntryFormAbility_desc",
"type": "form",
"metadata": [
{
"name": "ohos.extension.form",
"resource": "$profile:form_config"
}
]
}
]
```
### (3) 小部件特定配置
配置位于 `resources/base/profile/form_config.json`。
字段参考文档:
### (4) UI 开发和参数处理
小部件 UI 代码位于 `ets/widget/`。参数接收逻辑:
```
let storageUpdateByMsg = new LocalStorage();
@Entry(storageUpdateByMsg)
@Component
struct WidgetCard {
@LocalStorageProp('diffExamDay') diffExamDay: number = -1;
}
```
### (5) 小部件生命周期和数据传递
- 在 `EntryFormAbility.onAddForm` 中的初始化逻辑(例如,将小部件 ID 传递给 WidgetCard)
- 在 `onUpdateForm` 钩子中处理更新
### (6) 在小部件初始化期间访问应用数据
#### 6.1 通知应用更新小部件数据
```
postCardAction(this, {
action: "call",
abilityName: "EntryAbility",
params: {
method: "upDiffExamDay",
formId: this.formId,
},
});
```
*时序问题解决方案:*
监控 `formId` 的变化,而不是使用 `aboutToAppear()`:
```
@LocalStorageProp('formId') @Watch('updateFormId') formId:string = '';
updateFormId() {
postCardAction(this, {
action: 'call',
abilityName: 'EntryAbility',
params: {
method: 'upDiffExamDay',
formId: this.formId
}
});
}
```
#### 6.2 应用端数据处理
在 `EntryAbility.onCreate` 中:
```
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
this.callee.on('upDiffExamDay', upDiffExamDayCall);
}
const upDiffExamDayCall = (data: rpc.MessageSequence): MyParcelable => {
let params: Record<string, string> = JSON.parse(data.readString());
if (params.formId) {
PreferencesUtil.putSync('formId', params.formId);
const diffExamDay = UserCacheManager.getDiffExamDay();
diffExamDay === -1
? getHomePageData(params.formId) // 如果数据不可用则获取数据
: Utils.updateDiffExamDay(params.formId); // 直接更新小部件
}
return new MyParcelable(1, 'success');
};
```
*更新小部件数据:*
```
// 导入所需模块
import { formBindingData, formProvider } from '@kit.FormKit';
updateDiffExamDay(formId: string) {
const diffExamDay = UserCacheManager.getDiffExamDay();
let formMsg = formBindingData.createFormBindingData({
'diffExamDay': diffExamDay
});
formProvider.updateForm(formId, formMsg)
.then(() => console.log('更新成功'))
.catch((error) => console.error('更新失败:', error));
}
```