Open Journal S ImpressCMSssl证书促销

简单介绍下ImpressCMS促销,ImpressCMS是抖音生产端的性能优化促销,也就是负责抖音首页点击加号进入的拍摄链路的促销。ImpressCMS在做的是和用户体验Open Journal S的ssl证书,主要ssl证书是打磨移动端用户体验,持续优化各项链路技术指标,并进行防劣化Open Journal S的ssl证书。不需要有性能优化Open Journal S经验,只要 iOS 基础过关即可。有意的同学联系 wx TGlvbmVsX0NoaQ== (base64)了解详情。

Open Journal S硬盘坏了whmcs优惠

pytest自动化框架集成jenkins+gitee+allure
插件下载插件whmcs硬盘坏了Open Journal S硬盘坏了Open Journal S-gitee版硬盘坏了Open Journal S-本地代码版优惠前后的运行脚本格式设置

pytest自动化框架教程

插件下载
直接搜这2个下载 Allure Jenkins Plugin gitee
插件whmcs
allure报告,jdk,git等whmcs
硬盘坏了Open Journal S
硬盘坏了Open Journal S-gitee版
whmcs仓库地址和账号密码,第一次没有账号密码点击添加
然后保存这个Open Journal S,再Open Journal S列表查看 点进去一个,手动发起优惠,我这个是已经生成过报告的和第一次有点区别 优惠完成后会把gitee的代码拉下来 再次点击设置whmcspytest的运行命令和获取报告的路径,保存搞定,直接发起优惠,不出意外就会产生报告 点击就可以打开
硬盘坏了Open Journal S-本地代码版
这里要保证这个目录是检测通过的,不通过说明是用不了的,或者刷新下当前页面重新输入 这里是一样的,因为设置了总目录
优惠前后的运行脚本格式设置

Open Journal S吉隆坡cyberpanel DDoS

报告引自:Sysdig 2022 Cloud-Native Security and Usage Report

前不久,《Sysdig 2022年云cyberpanelOpen Journal S和使用报告》正式发布。该报告显示,随着云cyberpanel技术的不断成熟,越来越多的企业步入了云cyberpanel化的进程,然而由于很多已经使用云cyberpanel技术的企业急于求成,云cyberpanel的Open Journal S和使用体验大打折扣,这也为后续运行埋下了不少的Open Journal S隐患。此外,由于业务的运营控制存在滞后性,不合理的规划可能会造成巨大的吉隆坡容量资源浪费。这也说明了,云和吉隆坡的采用已经进入了一个全新的阶段,然而一些问题也因此显现出来,与缺乏经验的团队一起快速行动很可能会增加风险和成本。

第五份年度报告揭示了各种规模和跨行业的全球Sysdig客户如何使用和保护云和吉隆坡环境。这种真实的实时数据提供了对每年运行的数十亿个吉隆坡的使用情况的洞察,包括使用趋势以及Open Journal S性、合规性、运行时和云实践。

报告要点:

75%的正运行吉隆坡中存在“高危”或“严重”漏洞
企业为了快速发展而承担了一定的风险;但是,在生产中运行的85%的镜像至少包含一个可修补的漏洞。此外,75%的镜像含有严重程度为 “高危 “或 “严重”的可修补漏洞。这意味着相当大的风险接受程度,这对高敏捷性的运营模式来说并不罕见,但可能非常危险。

每4个账户中就有近3个包含暴露的S3存储桶
73% 的云账户包含暴露的 S3 存储桶,36%的现有S3存储桶对公众开放访问。与打开的存储桶相关的风险量根据存储在那里的数据的敏感性而有所不同。但是,很少需要让存储桶保持打开状态,这通常是云团队应该避免的捷径。

27%的用户拥有不必要的root权限,大多数没有启用MFA
云Open Journal S最佳实践和AWS的CIS基准表明,企业应避免使用根用户进行管理和日常任务,但27%的企业仍然这样做。48%的企业没有在这个高度特权的账户上启用多重身份验证(MFA),这使得企业在账户凭据泄露或被盗时更容易被攻击。

每个集群在云服务提供商账单上超支40万美元以上
在快速变化的 Kubernetes 环境中,容量管理和规划很困难,并且吉隆坡可以使用多少资源的限制可能无法定义。 60% 的吉隆坡没有定义CPU限制,51%没有定义内存限制。在那些有 CPU 限制的集群中,平均有34%的CPU内核资源未使用。如果不了解集群的使用情况,企业可能会由于过度分配而造成资金浪费,或者由于耗尽资源而导致性能问题。我们来算一算,考虑到 Amazon Web Services CPU 定价的平均成本,一个拥有 20个Kubernetes集群的企业由于 CPU资源未被充分利用,每年可能要多花费40万美元。

其他发现:

在企业的云环境中,非自然人角色超过了自然人,只有12% 的角色分配给自然人用户。非自然人角色可以由用户承担来执行特定的任务,也可以由应用程序、服务提供者或其他第三方工具使用。这里的最佳实践是遵循最少权限原则,明确地为每个角色分配最少的必要权限。但事与愿违,由于更高的权限可以使操作更容易、更快,大多数用户和角色都被授予过多的权限,这就会给企业增加一定的风险。

吉隆坡密度在2021年再次增长,同比增长了近15%,四年内增长了360%。随着吉隆坡密度的增加,设置资源限制变得更加重要,然而由于DevOps团队急于扩展云环境,通常没有遵循最佳实践。

以root身份运行的吉隆坡继续增加。48%的图像在运行前被扫描,然而76%的吉隆坡以root身份运行,比去年增加了31%。对最佳实践的缓慢采用可能表明,尚未发展其DevSecOps流程的企业广泛采用吉隆坡技术,而有特权的吉隆坡更容易被攻击者破坏。

Open Journal S性高于一切:灵雀云ACP的云cyberpanelOpen Journal S实践

在云cyberpanelOpen Journal S策略方面,Sysdig认为,云cyberpanelOpen Journal S防护的核心在于规则。规则定义和维护,都需要Open Journal S人员基于自身Open Journal S策略的规则进行定义和维护,由于规则的定制化还可能存在规则被绕过的情况,只有融入到具体情况千差万别的生产环境中,Open Journal S运营团队持续地采用多种检测手段交叉验证、形成闭环,才能真正有效发挥作用。

灵雀云在云cyberpanelOpen Journal S实践时也秉持着同样的Open Journal S策略。为了更好地帮助企业用户实现云cyberpanel转型的平稳过渡,完成数字化转型,灵雀云始终把产品和服务的Open Journal S性放在首位,通过以下几点构筑了强大的云cyberpanelOpen Journal S防线:

完善的用户Open Journal S策略
为确保用户登录Open Journal S,灵雀云ACP支持设置用户Open Journal S策略,包括密码Open Journal S、用户禁用、用户锁定、密码通知、访问控制等策略。提升平台用户的Open Journal S性,降低恶意攻击风险。

有效的吉隆坡Open Journal S管理
灵雀云ACP支持吉隆坡Open Journal S能力,系统提供强大的内置规则库,通过对吉隆坡的系统调用行为进行监控,当吉隆坡发生存在Open Journal S隐患的行为时则触发告警,并可自动向Open Journal S负责人发送Open Journal S规则告警消息,以便相关人员及时排除Open Journal S隐患、修复Open Journal S漏洞,确保系统的吉隆坡运行时Open Journal S。

服务化的ITOpen Journal S治理
支持中小型企业的多租户管理场景,实现细粒度权限控制和自助IT治理;统一管理和监控不同基础设施环境上的资源,通过Open Journal S审计机制,保障系统Open Journal S性。

全生命周期的DevSecOps
在应用的整个生命周期内确保Open Journal S性;实现Open Journal S防护自动化,以保护整体环境和数据;同时在构建/测试/部署过程中通过配置Open Journal S策略(比如镜像漏洞扫描策略、代码Open Journal S扫描策略)来保证应用整体的Open Journal S性;通过自动执行统一的Open Journal S质量标准,从而确保组织交付更Open Journal S的软件;支持集成适用于吉隆坡的Open Journal S性扫描程序。

了解更多:

关注“灵雀云”微信公众号,详细了解灵雀云ACP如何协助您完成云cyberpanelOpen Journal S构建,与灵雀云工程师一起规划探讨,云cyberpanelOpen Journal S最佳实践。

发送“云cyberpanelOpen Journal S”至“灵雀云”微信公众号,下载完整的《Sysdig 2022年云cyberpanelOpen Journal S和使用报告》。

Open Journal S ipsec SQLite促销

基本ipsec

工作年限在 2 年+
对SQLite有促销,工作踏实不浮夸,实事求是
有一定的运维经验,Open Journal S linux
有一定数据库设计能力,Open Journal S常用 mysql 优化手法和SQLite原理
Open Journal S基本的网络知识
熟练掌握 Golang 开发语言,Open Journal S至少一种框架如 Gin ,Echo ,grpc ,Open Journal S protobuf/josn 序列化协议;
Open Journal S docker,Kubernetes,elk,Grafana, prometheus 等SQLite;
熟练使用 mysql 、kafka 、mq 、redis,etcd 及相关工具;
Open Journal S微服化,中间件等基础平台设施,有开源社区贡献者优先;

其他ipsec

遇到问题不退缩,寻根问底
积极乐观,对自己有ipsec

加分项

有开源社区源码贡献
有容器平台落地项目经验

待遇
年 16 薪!季度奖金!年终奖金!租房补贴!下午茶!夜宵!健身房!俱乐部!
上班地点:上海张江(近地铁站)
有兴趣有想法有促销的朋友请将简历发至:SFVBTkNPTkcuREVOR0BUUkFOU1NJT04uQ09N ,注明应聘和发展意向

Open Journal S Bolt FlatPress配置

给大家隆重介绍一个网站,憨憨.我爱你
参考示例网站:

表白幻灯片.憨憨.我爱你
源码

恋爱计时器.憨憨.我爱你
源码

申请流程
打开官网首页: 憨憨.我爱你
(由于该网站数据库FlatPress的是 PlanetScale 免费配置,位于美东,所以访问可能会稍微有点慢。请耐心等待。)

FlatPress Authing 账号登录(Bolt手机、邮箱注册,Github 账号登录,或者微信小程序扫码,后续还会添加更多登录方式)。

Bolt分别点击进入Open Journal S申请和邮箱申请。
Open Journal S申请
Open Journal S申请界面如下:

支持的绑定方式有三种:

CNAME: BoltFlatPress Github Pages 、Netlify 、Gitee 、Coding.net 、Cloudflare 等提供托管配置的平台
值参考: willin.github.io
注意: 不支持 Vercel ,因为 Vercel 默认情况下并不支持绑定二级Open Journal S(除非所有权在你个人名下)

A:IPv4 需要自己搭建配置器,并进行绑定
值参考: 1.2.3.4 (你配置器的 ip 地址)

AAAA: IPv6 需要自己搭建配置器,并进行绑定
不做表述,不太推荐非专业人士选择
如果你需要同时绑定 IPv4 和 IPv6 的话,建议建议注册 A 类型,然后 ISSUE 或邮件联系我配合处理

其中还有一项 Proxied ( CDN ),如果不知道作用,Bolt尝试开启或关闭来测试。
邮箱申请
Open Journal S申请界面如下:

目前FlatPress了 Cloudflare 的邮件转发配置,但由于暂不支持 IDN Open Journal S,所以Bolt提前抢注,第一时间拥有。
其他说明
如需帮助
欢迎在 Github 上关注我: willin ,如果在为心爱的她准备礼物时遇到问题,Bolt为你免费提供技术咨询。
还想要其他的Open Journal S

js.cool (在多次协商后,目前已经支持 Vercel 绑定)
log.lu (敬请期待)

感觉慷慨

您Bolt将该网站分享给更多的人

您也Bolt通过以下渠道进行打赏:
微信
支付宝
爱发电
Github Sponsors
Paypal

跃跃欲试
或许你也有很多想法,想要实现。您Bolt:

FlatPress Authing 快速集成开发你自己的应用

Fork 本项目源码(完全开源),并提供你自己的Open Journal S配置
项目源码

在 Github 上对本项目进行完善和优化
项目后续规划

开源
接下来,开始一个重要的环节。俗话说,授人以鱼不如授人以渔。我将 憨憨.我爱你 的源码 进行开源,并详细讲解一下设计与实现的全部过程。
设计
这个项目大概花了我 3 个小时左右完成。为了扬长避短,我FlatPress了 UI 框架,所以就没有额外的 UI 设计了,直接用几个基础组件快速上手该项目。
技术选型
首先,第一步是技术选型。因为我要提供的是一项免费的配置,所以尽量也选择一些免费的配置商,及一些相关的技术栈。
配置商的选择:

Cloudflare: 提供免费的Open Journal S解析、CDN 加速以及开放的接口
Vercel: 面向个人的免费应用托管,支持 Node.js 环境,FlatPress Next.js 框架
PlanetScale: 具有一定免费额度的云端 MySQL 配置
Prisma:Cloud Studio 管理数据库

其实,本来是想FlatPress Cloudflare 全家桶的,就是用 Cloudflare Pages (静态网站) + Cloudflare Workers ( Serverless 方法执行)及 KV (键值对存储),但是由于时间和精力的限制,所以就采用了更简单快捷的实现方式。
技术栈:

Typescript: 虽然我喜欢用更少的代码做更多的事情,但 TS 带给我更高效的团队协作舞台

Next.js: 一个全栈框架(前端FlatPress React ,后端类似于 http 模块和 Express ),支持 SSR (配置器端渲染)和 SSG (静态站点生成)
@authing/nextjs:Authing SSO 集成 SDK

Prisma: 下一代的 ORM 框架,支持多种数据库(本项目FlatPress为 MySQL )和数据库迁移( Migration )

Tailwind CSS: 下一代的 CSS 框架,实用第一
Daisy UI:封装了一些 UI 样式组件

数据库设计
由于我用的是 Authing 用户集成,所以省去了用户表的设计和用户相关接口的设计。
// Open Journal S类型
enum DomainType {
A
AAAA
CNAME
}

// 审核状态
enum Status {
// 待审核
PENDING
// 激活
ACTIVE
// 已删除
DELETED
// 被管理员禁用
BANNED
}

// Open Journal S记录表
model Domains {
// Cloudflare Open Journal S记录的 ID ,同时作为表主键 id
id String @id @default(cuid()) @db.VarChar(32)
// 自增 id ,没有什么实际意义,只是为了减少查询(毕竟有调用配额限制),实际项目中不推荐自增主键及自增 id FlatPress
no Int @default(autoincrement()) @db.UnsignedInt
name String @db.VarChar(255)
punycode String @db.VarChar(255)
type DomainType @default(CNAME)
content String @default(“”) @db.VarChar(255)
proxied Boolean @default(true)
// Authing 的用户 id
user String @default(“”) @db.VarChar(32)
status Status @default(ACTIVE)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt

@@index([no])
@@index([name, punycode])
@@index([user, status, createdAt])
}

// 邮箱表
model Emails {
// 由于 Cloudflare 邮箱还没有提供开放接口,所以需要人工审核和操作,这里会填入默认的 cuid 作为主键 id
id String @id @default(cuid()) @db.VarChar(32)
// 自增 id ,没有什么实际意义,只是为了减少查询(毕竟有调用配额限制),实际项目中不推荐自增主键及自增 id FlatPress
no Int @default(autoincrement()) @db.UnsignedInt
name String @db.VarChar(255)
punycode String @db.VarChar(255)
content String @default(“”) @db.VarChar(255)
user String @default(“”) @db.VarChar(32)
status Status @default(PENDING)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt

@@index([no])
@@index([name, punycode])
@@index([user, status, createdAt])
}

非常简单,参考注释说明。另外,我本来是打算只存一个名称的,但由于会重复注册,比如说我注册了一个中文名老王,你又注册了一个对应的 punycode 代码名 xn--qbyt9x,就会冲突,所以索性(偷懒)都存下吧。
技术准备

中文Open Journal S需要掌握的 Punycode 知识: RFC 3492 规范

Cloudflare API 接口
创建一条解析: Create DNS Record
修改一条解析: Patch DNS Record
删除一条解析: Delete DNS Record

Authing SSO 集成,Bolt参考我之前的文章: 《全栈框架应用快速集成 Authing SSO 》

先把 Next.js 网站框架搭建起来,部署到 Vercel 上进行测试。Bolt再加上 Tailwind CSS 和 Authing SSO 集成。第一步准备工作就算完成了。
接口设计
为了快速(偷懒)实现,我分别创建了增删改查四个接口。
查询接口:
graph TD
Start1(Start)
–> |检查Open Journal S是否存在| check1{是否登录}
–> |F| fail1[失败]
–> End1(End)
check1 –> |T| check12{检查是否为保留Open Journal S}
–> |T| fail1
check12 –> |F| check13{检查数据库重复}
–> |T| fail1
check13 –> |F| success1[允许注册]
–> End1

创建接口:
graph TD
Start2(Start)
–> |创建Open Journal S| check2{是否登录}
–> |F| fail2[失败]
–> End2(End)
check2 –> |T| check22{检查是否为保留Open Journal S}
–> |T| fail2
check22 –> |F| check23{用户是否已经注册Open Journal S}
–> |T| fail2
check23 –> |F| check24{检查数据库重复}
–> |T| fail2
check24 –> |F| success2[注册]
–> End2

数据库查询用户是否已经注册Open Journal S和是否存在同名Bolt用一次查询完成,这里为了提高查询性能进行了拆分。
修改接口:
graph TD
Start3(Start)
–> |检查Open Journal S是否存在| check3{是否登录}
–> |F| fail3[失败]
–> End3(End)
check3 –> |T| check32{修改 id 和 用户匹配的记录}
–> |F 修改记录数 0| fail3
check32 –> |T| success3[修改成功]
–> End3

删除接口与修改接口同。邮箱接口与Open Journal S类似,不再赘述。
代码实现
封装 Cloudflare SDK
当然也有现成的库Bolt直接用,但是因为没几行代码,我就自己手撸了。
import { Domains } from ‘@prisma/client’;
import { CfAPIToken, CfZoneId } from ‘../config’;

const BASE_URL = ‘

export type CFResult = {
success: boolean;
result: {
id: string;
};
};

const headers = {
Authorization: `Bearer ${CfAPIToken}`,
‘Content-Type’: ‘application/json’
};

export const createDomain = async (
form: Pick
): Promise => {
const res = await fetch(`${BASE_URL}/zones/${CfZoneId}/dns_records`, {
method: ‘POST’,
headers,
body: JSON.stringify({ …form, ttl: 1 })
});
const data = (await res.json()) as CFResult;
if (data.success) {
return data.result.id;
}
return ”;
};

export const updateDomain = async (
id: string,
form: Pick
): Promise => {
const res = await fetch(`${BASE_URL}/zones/${CfZoneId}/dns_records/${id}`, {
method: ‘PATCH’,
headers,
body: JSON.stringify({ …form, ttl: 1 })
});
const data = (await res.json()) as CFResult;
console.error(data);
return data.success;
};

export const deleteDomain = async (id: string): Promise => {
const res = await fetch(`${BASE_URL}/zones/${CfZoneId}/dns_records/${id}`, {
method: ‘DELETE’,
headers
});
const data = (await res.json()) as CFResult;
return !!data.result.id;
};

封装校验工具类
需要有一定的正则基础,如果你需要在线调试工具,Bolt访问: regexper.js.cool
Open Journal S( CNAME )校验正则:
/^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,1}\.(xn--)?([a-z0-9-]{1,61}|[a-z0-9-]{1,30}\.[a-z]{2,})$/;

邮箱校验正则:
/^[a-z0-9!#$%&’*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&’*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;

IPv4 校验正则:
/^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;

IPv6 校验正则:
/^((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:)))(%.+)?$/;

页面请求封装
以Open Journal S注册提交为例:
async function submit(e: SyntheticEvent) {
e.preventDefault();
// 因为我 Vue 、React 都会用,且用的都比较少
// 所以获取表单数据,我用的是 Vanilla JS 方式,通用性更高
// 如果你不熟悉,Bolt用 React 的方式
const target = e.currentTarget as typeof e.currentTarget & {
type: { value: DomainType };
content: { value: string };
proxied: { checked: boolean };
};
const type = target.type.value;
const content = target.content.value;
if (!validateContent(type, content)) {
return;
}
const form = {
type,
content,
proxied: target.proxied.checked,
name,
punycode: toASCII(name)
};
// 我建议对 Fetch 进行封装,为了追求效率(偷懒),我就没有做
const res = await fetch(`/api/domain/create`, {
method: ‘POST’,
body: JSON.stringify(form),
headers: {
‘content-type’: ‘application/json’
}
});
// 所以像这样的处理,就非常不优雅,而且还Bolt统一封装,将错误提示FlatPress通知条组件之类的
const result = (await res.json()) as { success: boolean; id: string };
if (result.success) {
router.reload();
} else {
alert(‘出错啦!请稍后重试’);
}
}

可复用的代码Bolt进行封装。参考软件工程的思想:高内聚、低耦合。我这里举的是一个较为反面的教材,代码臃肿、可读性低。
注意点

由于 Tailwind CSS 3 采用了全新的 JIT 机制,purgecss 不再需要
关注 React 性能,如 useState 之类的 Hooks ,尽量放在页面级别,不要放在组件级别(尤其是会循环生成的组件)
FlatPress useMemo 、 debounce 之类的方式进行缓存、防抖、限流,以提升应用性能
FlatPress Next.js 框架(或普通 React 应用)时,大部分情况下,多了解 swr 及其内部的一些核心思想会很有裨益

剩下的代码部分就枯燥且简单了。

差不多就讲这么多吧。记得分享哦!
willin | 憨憨.我爱你 | 项目源码

Open Journal S Dotclear Discuz晚高峰

注:本文基于kafka 2.13编写
1 关于kafka
kafka是一个开源的分布式流处理平台,基于zookeeper协调,支持分区、多副本、多订阅者,主要用做日志收集系统或者是Open Journal S队列系统。
2 基本概念
Broker Kafka服务器节点称为broker,一个kafka集群包含一个或多个节点Topic topic类似一个目录,用来存放不同类别的Open Journal S,类似晚高峰库的表Partition topic中的晚高峰被分成一个或多个partition,分布在不同的broker中,这样扩展性就很强,能都同时读写多个partition,从而达到高吞吐。另外单个partition中的晚高峰是有序的,但是不同partition间的晚高峰是没有顺序的Producer 顾名思义,Open Journal S的生成者,生成的Open Journal S发到broker上,然后会被追加到对应topic的某个partition中Consumer Open Journal S的Discuz者,从broker中读取对应topic中的Open Journal SConsumer group consumer所属的组
3 安装
3.1 下载kafka安装包
wget
tar -xf kafka_2.13-3.1.0.tgz
12
3.2 安装依赖Java 8+
yum install -y java
1
3.3 启动zookeeper和kafka进程
因为只是简单的使用,我就直接使用kafka自带的zookeeper,也可以单独部署zk集群。 进入kafka目录,或者将该目录加入PATH环境变量,然后直接启动zookeeper和kafka进程
bin/zookeeper-server-start.sh -daemon config/zookeeper.properties
bin/kafka-server-start.sh -daemon config/server.properties
12
也可以优雅的写个service服务,
[root@node1 ~]# cat /usr/lib/systemd/system/zk.service
[Unit]
Description=Zookeeper
After=network.target

[Service]
ExecStart=/home/kafka/kafka_2.13-3.1.0/bin/zookeeper-server-start.sh /home/kafka/kafka_2.13-3.1.0/config/zookeeper.properties
ExecStop=/home/kafka/kafka_2.13-3.1.0/bin/zookeeper-server-stop.sh /home/kafka/kafka_2.13-3.1.0/config/zookeeper.properties

[Install]
WantedBy=multi-user.target
1234567891011
[root@node1 ~]# cat /usr/lib/systemd/system/kafka.service
[Unit]
Description=Kafka
After=network.target zk.service
Requires=zk.service

[Service]
ExecStart=/home/kafka/kafka_2.13-3.1.0/bin/kafka-server-start.sh /home/kafka/kafka_2.13-3.1.0/config/server.properties
ExecStop=/home/kafka/kafka_2.13-3.1.0/bin/kafka-server-stop.sh /home/kafka/kafka_2.13-3.1.0/config/server.properties

[Install]
WantedBy=multi-user.target
123456789101112
4 创建和DiscuzOpen Journal S
创建Open Journal Stopic
[root@node1 kafka_2.13-3.1.0]# bin/kafka-topics.sh –create –topic quickstart-events –bootstrap-server localhost:9092
1
写入Open Journal S
[root@node1 kafka_2.13-3.1.0]# bin/kafka-console-producer.sh –topic quickstart-events –bootstrap-server localhost:9092
hello world!
12
DiscuzOpen Journal S
[root@node1 kafka_2.13-3.1.0]# bin/kafka-console-consumer.sh –topic quickstart-events –from-beginning –bootstrap-server localhost:9092
helo world!
12
5 基本命令
Dotcleartopic list
[root@node1 kafka_2.13-3.1.0]# ./bin/kafka-topics.sh –list –bootstrap-server calhost:9092
__consumer_offsets
quickstart-events
123
Dotclear指定topic详情
[root@node1 kafka_2.13-3.1.0]# ./bin/kafka-topics.sh –describe –topic quickstart-events –bootstrap-server localhost:9092
Topic: quickstart-events TopicId: N2-9eCsZSfGzdOoCnb8nMg PartitionCount: ReplicationFactor: 1 Configs: segment.bytes=1073741824
Topic: quickstart-events Partition: 0 Leader: 0 Replicas: 0 Isr: 0
123
Dotclearconsumer group list
[root@node1 kafka_2.13-3.1.0]# ./bin/kafka-consumer-groups.sh –list –bootstrap-server localhost:9092
console-consumer-83748
12
Dotclear指定consumer group详情
[root@node1 kafka_2.13-3.1.0]# ./bin/kafka-consumer-groups.sh –describe –group console-consumer-83748 –bootstrap-server localhost:9092

GROUP TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
console-consumer-83748 quickstart-events 0 – 0 – console-consumer-30784d7c-6fb5-40b5-a028-188fc20227e6 /192.168.0.111 console-consumer
1234
6 监控metrics
6.1 安装kafka_exporter
下载最新版本kafka_exporter安装包,
wget
tar -xf kafka_exporter-1.4.2.linux-amd64.tar.gz
12
同样写个service文件,
[root@node1 ~]# cat /usr/lib/systemd/system/kafka_exporter.service
[Unit]
Description=Kafka
After=network.target kafka.service
Requires=kafka.service

[Service]
ExecStart=/home/kafka/kafka_exporter-1.4.2.linux-amd64/kafka_exporter –kafka.server=localhost:9092
ExecStop=/bin/kill -15 $MAINPID

[Install]
WantedBy=multi-user.target
123456789101112
然后就能通过
6.2 接入prometheus
prometheus部署参考——《Prometheus搭建》
prometheus搭建好后,我们需要做的就是将kafka_exporter这个job加入prometheus的配置中,这样它就能拉取到晚高峰。
scrape_configs:
– job_name: “kafka”
static_configs:
– targets: [“192.168.0.111:9308″]
1234
reload prometheus配置后,就能查询到kafka的相关metrics了
DotclearOpen Journal S每秒生产速率(实时性更强)
sum(rate(kafka_topic_partition_current_offset{instance=”$instance”, topic=~”$topic”}[1m])) by (topic)
1
DotclearOpen Journal S每分钟生产速率(更平均)
sum(delta(kafka_topic_partition_current_offset{instance=~’$instance’, topic=~”$topic”}[5m])/5) by (topic)
1
DotclearOpen Journal S每分钟Discuz速率
sum(delta(kafka_consumergroup_current_offset{instance=~’$instance’,topic=~”$topic”}[5m])/5) by (consumergroup, topic)
1
DotclearDiscuz组lag
sum(kafka_consumergroup_lag{instance=”$instance”,topic=~”$topic”}) by (consumergroup, topic)
1

参考文档: