Contour & Envoy 指标

Contour & Envoy 指标

本文档内容与Contour与 Envoy 的metrics相关, 据Contour与envoy的官网内容并参考源码、第三方blog等汇总而成. 因为 Contour 指标较少, 所以在文中全部列出,且个人主观的将其暂分为:必须与可选的; 在envoy中 metrics被称为stats 通过管理接口向公众暴露,因其指标过多,所以按官方建议只选取Cluster与HCM相关指标,并只抽取个人认为比较重要且现阶段需要的指标列出,如需要相看详情,请点击相应链接.

Contour 指标

Required Name Type Description  
YES contour_build_info Gauge branch, revision, version  
NO contour_cachehandler_onupdate_duration_seconds Summary Histogram for the runtime of xDS cache regeneration.  
YES contour_dagrebuild_timestamp Gauge Timestamp of the last DAG rebuild.  
NO contour_dagrebuild_total Counter Total number of times DAG has been rebuilt since startup  
YES contour_eventhandler_operation_total Counter Total number of Kubernetes object changes Contour has received by operation and object kind.  
YES contour_httpproxy Gauge Total number of HTTPProxies that exist regardless of status.  
NO contour_httpproxy_invalid Gauge Total number of invalid HTTPProxies.  
NO contour_httpproxy_orphaned Gauge Total number of orphaned HTTPProxies which have no root delegating to them.  
YES contour_httpproxy_root Gauge Total number of root HTTPProxies. Note there will only be a single
       
YES contour_httpproxy_valid Gauge Total number of valid HTTPProxies.  

Envoy 指标

Cluster

General

Name Type Description
cluster_added/modified/removed/updated Counter Total clusters added / modified / removed / updated
active_clusters Gauge Number of currently active (warmed) clusters
upstream_cx_total Counter Total connections
upstream_cx_active Gauge Total active connections
upstream_cx_connect_fail Counter Total connection failures
upstream_cx_connect_timeout Counter Total connection connect timeouts
upstream_cx_connect_ms Histogram Connection establishment milliseconds
upstream_cx_rx_bytes_total Counter Total received connection bytes
upstream_cx_tx_bytes_total Counter Total sent connection bytes
upstream_rq_total Counter Total requests
upstream_rq_active Gauge Total active requests
upstream_rq_timeout Counter Total requests that timed out waiting for a response
upstream_rq_retry Counter Total request retries
upstream_rq_retry_success Counter Total request retry successes

Request Response Size statistics

Name Type Description
upstream_rq_headers_size Histogram Request headers size in bytes per upstream
upstream_rq_body_size Histogram Request body size in bytes per upstream
upstream_rs_headers_size Histogram Response headers size in bytes per upstream
upstream_rs_body_size Histogram Response body size in bytes per upstream

HCM

General

Name Type Description
downstream_cx_total Counter Total connections
downstream_cx_active Gauge Total active connections
downstream_cx_rx_bytes_total Counter Total bytes received
downstream_cx_tx_bytes_total Counter Total bytes sent
downstream_rq_total Counter Total requests
downstream_rq_active Gauge Total active requests
downstream_rq_1/2/3/4/5xx Counter Total 1/2/3/4/5xx responses
downstream_rq_completed Counter Total requests that resulted in a response (e.g. does not include aborted requests)
downstream_rq_time Histogram Total time for request and response (milliseconds)

Per user agent statistics

Name Type Description
downstream_cx_total Counter Total connections
downstream_rq_total Counter Total requests

HTTP per listener statistics¶

Name Type Description
downstream_rq_completed Counter Total responses
downstream_rq_1/2/3/4/5xx Counter Total 1/2/3/4/5xx responses

Tracing statistics

Name Type Description
random_sampling Counter Total number of traceable decisions by random sampling
service_forced Counter Total number of traceable decisions by server runtime flag tracing.global_enabled
client_enabled Counter Total number of traceable decisions by request header x-envoy-force-trace
not_traceable Counter Total number of non-traceable decisions by request id
health_check Counter Total number of non-traceable decisions by health check

参考


关于监控指标的问题答疑:

  • 实时 启动之后一直有的
  • 时间范围的数据
  • 数据统计维度
    • contour httpproxy count
    • envoy request count
    • httpproxy -> route -> request info summary
  • 现阶段暂时未接入 prom,需要考虑如何处理,接入后会联动到 grafana,这部分跟 insight 怎么处理
  • 告警怎么做?拿到了数据指标之后怎么处理

image-20221120000945266


2022-07-22 Contour

jq 命令行 Json 处理神器

一个灵活的轻量级命令行 JSON 处理器

说明

jq 是 stedolan 开发的一个轻量级的和灵活的命令行 JSON 处理器,源码请参考 jq 项目主页 。jq 用于处理 JSON 输入,将给定过滤器应用于其 JSON 文本输入并在标准输出上将过滤器的结果生成为 JSON;最简单的过滤器是.,它将 jq 的输入未经修改地复制到其输出中(格式设置除外);请注意,jq 当前仅支持 64 位双精度浮点数(IEEE754)。

安装

# Debian系,如 Ubuntu
sudo apt-get install jq

# RedHat系, 如 CentOS
yum install jq

# MacOS
brew install jq

语法

jq [options] <jq filter> [file...]
jq [options] --args <jq filter> [strings...]
jq [options] --jsonargs <jq filter> [JSON_TEXTS...]

选项

-c               紧凑而不是漂亮的输出;
-n               使用`null`作为单个输入值;
-e               根据输出设置退出状态代码;
-s               将所有输入读取(吸取)到数组中;应用过滤器;
-r               输出原始字符串,而不是JSON文本;
-R               读取原始字符串,而不是JSON文本;
-C               为JSON着色;
-M               单色(不要为JSON着色);
-S               在输出上排序对象的键;
--tab            使用制表符进行缩进;
--arg a v        将变量$a设置为value<v>;
--argjson a v    将变量$a设置为JSON value<v>;
--slurpfile a f  将变量$a设置为从<f>读取的JSON文本数组;
--rawfile a f    将变量$a设置为包含<f>内容的字符串;
--args           其余参数是字符串参数,而不是文件;
--jsonargs       其余的参数是JSON参数,而不是文件;
--               终止参数处理;

例子

.: 以漂亮的方式输出

$ echo '{ "foo": { "bar": { "baz": 123 } } }' | jq '.'
{
  "foo": {
    "bar": {
      "baz": 123
    }
  }
}

.foo, .foo.bar, .foo?: 获取一个键的值

$ echo '{"foo": 42, "bar": "less interesting data"}' | jq '.foo'
42

.[], .[]?, .[2], .[10:15]: 数组运算

$ echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]' | jq '.[1]'
{
  "name": "XML",
  "good": false
}

[], {}: 构造一个数组/对象

$ echo '{"user":"stedolan","titles":["JQ Primer", "More JQ"]}' | jq '{user, title: .titles[]}'
{
  "user": "stedolan",
  "title": "JQ Primer"
}
{
  "user": "stedolan",
  "title": "More JQ"
}

length: 计算一个值的长度

$ echo '[[1,2], "string", {"a":2}, null]' | jq '.[] | length'                                  
2
6
1
0

keys: 取出数组中的键

$ echo '{"abc": 1, "abcd": 2, "Foo": 3}' | jq 'keys'                                        
[
  "Foo",
  "abc",
  "abcd"
]

,: 使用多个过滤器

$ echo '{ "foo": 42, "bar": "something else", "baz": true}' | jq '.foo, .bar' 
42
"something else"

|: 通过管道将一个过滤器的输出当做下一个过滤器的输入

$ echo '[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]' | jq '.[] | .name'                                                 
"JSON"
"XML"

select(foo): 如果 foo 返回 true,则输入保持不变

$ echo '[1,5,3,0,7]' | jq 'map(select(. >= 2))'                                                    
[
  5,
  3,
  7
]

map(foo): 每个输入调用过滤器

$ echo '[1,2,3]' | jq 'map(.+1)'
[
  2,
  3,
  4
]

if-then-else-end: 条件判断

 $ echo '2' | jq 'if . == 0 then "zero" elif . == 1 then "one" else "many" end'
"many"

\(foo): 在字符串中插入值并进行运算

$ echo '42' | jq '"The input was \(.), which is one less than \(.+1)"'          
"The input was 42, which is one less than 43"

2022-07-22 unix command

微服务引擎网关能力介绍

image

产品介绍

什么是 Skoala-gateway?

Skoala-gateway 是 DCE 5.0 云原生平台上微服务引擎 Skoala 模块内的微服务网关产品,基于云原生平台之上,提供了云原生微服务的南北向流量治理的分布式网关中间件,Skoala-gateway 原生提供了 API 管理、接口限流、多种策略安全认证、黑白名单、路由转发、MockAPI 等能力,同时提供了企业级高性能和高扩展的云服务能力。 Skoala-gateway 采用了业界领先的主流微服务网关开源项目 Contour 和 Envoy 的能力,可以做到全面兼容市面上主要的原生平台,如 Kubernetes、OpenShift 等,并保持着良好的后续迭代优势。 ![image.png](../assets/qwoqr6/1656640383767-868c5dfc-73db-4cbe-8c93-5fa4aa8a2799.png

Skoala-gateway 能力介绍

image

什么是微服务网关?

微服务网关作为云原生微服务的 API 统一的外部流量入口,网关承接了所有访问微服务 API 的请求,所以肩负着保护、增强和控制对于微服务的安全访问、管理授权、访问控制和流量限制等,这样微服务就会被微服务网关保护起来,对所有的调用者透明。因此,隐藏在 Skoala-gateway 后面的业务系统就可以更加专注于业务本身。 image.png 在云原生时代,采用统一的微服务网关来完成对外的流量治理、流量分发、鉴权能力等,这样微服务本身可以关注在业务内容背身;对于网络管理和安全这些基础能力,重复在不同的微服务实现成本极高且维护不变,另外微服务内无法很好的实现流量的治理,所以将流量管理和认证管理的能力,使用独立的微服务中间件来完成,会极大提升系统的自由度和专业性。

产品优势

  • 多实例管理能力:只需简单的 2 个步骤,即可完成一个网关实例的部署,支持多实例聚合管理
  • 完美兼容开源:100% 兼容开源网关,开箱即用,用户从自建网关迁移无门槛
  • 强大的界面 UI:100% 网关功能支持 UI 操作和可视化查看,提供现今的网关结构拓扑,网关数据可视化,一目了然
  • 高性能高可靠:依托于云原生平台,支持动态部署,无缝扩缩容,轻松应对流量洪峰
  • 强大的集成能力
    • 服务发现:依托于 DCE5.0 Skoala 微服务引擎和 Kpanda 容器服务,无缝集成容器和微服务体系,同时支持支持 Nacos、Mesh、Eureka、Zookeeper、K8s 等多种服务发现方式,均可实现自动发现
    • 日志监控:依托于 DCE5.0 Insight 产品提供强大的监控预警和完善的日志追踪能力,极大提升问题排查分析效率

应用场景

微服务网关提供多网关的高效管理能力,在 Contour 的基础上增加界面操作能力,大大降低了使用门槛和维护成本,而基于 DCE5.0 产品平台,您可以无感的实现多网关实例的管理;这样可以研发团队仅需关注对应网关的业务规则和业务逻辑,而不需关注网关的实现。

需要 不同的项目组和集群需要独立的网关

Skoala-gateway 原生支持多实例部署能力,当您存在较多集群和多项目同时对微服务网关有依赖时,而不希望所有项目在一个网关造成服务瓶颈或者网关资源开销过大,建议您采用 Skoala-gateway 微服务网关,您可以非常方便在不同集群和不同项目之间进行创建独立的网关,网关实例之间互相隔离,提高网关的可用性和稳定性。

需要 针对 API 级别进行精细化认证和限流管理

Skoala-gateway 原生支持针对 API 级别的限流控制,您只需要在 SKoala-gateway 内的插件中心,为网关实例开启限流服务,便可以在不同的 API 或 API 分组中,创建对应的限流策略,并且支持不同级联层级的网关限流控制

名词说明

对 Skoala-gateway 提及的专有名词进行解释,所有文档应保持相同定义

名词 释义
DCE 5.0 由 DaoCloud 自主研发的新一代云原生服务平台,包含了 Kpanda、Insight、Ghippo、Skoala 等众多强大产品模块
目前已迭代到 第五代,下文简称“DCE5.0”  
Skoala DCE5.0 产品模块中负责 微服务引擎和流量治理、网关能力,承接全部云原生平台南北流量和东西流量的分配和治理能力,原生支持多实例网关联合管理
Skoala-gateway Skoala 产品内负责南北向流量治理的产品模块,支持跨集群服务发现和详细化路由管理等能力
Kpanda DCE5.0 产品模块中负责 容器集群的管理平台,支持接入和创建全部主流的云原生容器平台
Insight DCE5.0 产品模块中负责 监控告警和日志管理模块,承接了整个 DCE 平台所有服务模块的日志和监控诉求,为 Skoala 提供了全生命周期的日志管理能力
Ghippo DCE5.0 产品模块中负责 账号及权限、资源分配模块;创新实现 Workspace 设计;以 DCE5.0 视角,全面统一了资源划分和权限结构体系,为 Skoala 提供了完善的权限划分等能力

常见问题

功能介绍

网关多实例管理模块

Skoala-gateway 原生支持对 Kpanda 管理的多集群、多命名空间的的网关实例进行管理,您可以通过 Skoala-gateway 管理界面,仅需简单的操作,即可完成网关实例进行管理,包括创建、删除、查询、修改等操作。

每个网关支持在一个集群下对多个命名空间内的微服务网关管理的接管,您可以在配置中方便的进行调整;不过您需要注意一个命名空间同时只能被一个微服务网关管理。

API 管理模块

您可以通过 Skoala-gateway 管理界面,非常方便的对网关下的路由 API 进行管理,通过简单的界面化操作即可完成,API 的创建、编辑等能力;这是原生 Contour 不支持的功能,当然在增加 Contour 管理能力的同时,我们也会保障原生 API 的能力不受影响;但非常建议您通过界面化的方式来管理。

您可以给 API 附加丰富的策略,例如:请求重写策略、重试机制以及限流策略等,默认情况下限流能力不开启,您可以在需要时针对开启,当然这些会需要一个资源支出。

服务接入模块

Skoala-gateway 旨在让您可以方便的对 API 背后的服务进行路由管理,Skoala 支持非常丰富的服务接入能力,可以很轻易的将您的微服务接入到网关下,无论它部署在哪里,Skoala 同时支持对运行在 Kpanda 上的微服务自动进行服务发现。

域名管理模块

Skoala-gateway 原生提供了便捷的域名管理能力,支持方便的将统一的服务域名预先配置,在创建 API 时,仅做简单的选取即可;同时支持 HTTP 和 HTTPS 服务域名管理,HTTPS 支持多种证书托管模式。

插件中心模块

Skoala-gateway 同时也提供了丰富的的插件功能,支持安全、流量管控、缓存等组件,您可以根据实际的业务需求,方便您根据实际的业务需要,在网关中启用这些组件。

监控告警模块

Skoala-gateway 在部署时会自动配置监控、告警等功能;每个网关都自带了完善的资源监控和网关业务监控,同时也支持接入待 Insight(DCE5.0 重磅观测产品),您可以利用 Insight 更加丰富的观测手段,自定义完成您的业务监控。

日志查看模块

Skoala-gateway 原生接入了 DCE 5.0 强大 Insight 日志管理模块,提供了非常全面的业务日志和网关实例日志查看、链路追踪能力;支持实时更新,配合网关实例不同级别的日志提醒,您可以非常方便的完成详细日志的输出,提高业务分析和日志排查效率。

业务日志查看

在 Skoala-gateway 日志查看模块,对业务日志提供了查询优化,您可以方便通过关键字、时间、日志内容、服务名、API 名称等进行秒级查询,通知支持您切换查看不用的后端服务日志,以便于快速定位问题。

实例日志查看

Skoala-gateway 依托 Insight 提供了 微服务网关的全生命周期的日志记录能力,可以提供实时、准确的实例日志查看能力,为了网关容器和部署调试提供了详细的日志支持。

权限管理模块

Skoala-gateway 同样支持 DCE5.0 权限管理模块的能力,支持利用 Ghippo 权限管理模块,自定义权限管理策略,授权不同成员对网关的管理权限,这一切都是 DCE5.0 平台内统一的标准化能力,您可以很轻易的完成。

用户手册

SKoala-gateway 用户手册,帮助您快速了解本产品的全部功能。

快速上手

带您快速了解并可以快速上手体验使用 Skoala-gateway 微服务网关的产品能力。

操作步骤

  1. 进入微服务网关管理页面
  2. 完成创建微服务网关
    1. 输入网关名称
    2. 选择部署区域
  3. CleanShot 2022-07-27 at 01.55.03@2x.jpg
  4. 创建后等待网关初始化和启动成功,这是网关状态会展示为“运行中”
  5. 在列表中点击网关名称进入网关详情,通过右侧导航栏,找到 API 列表
  6. 点击创建 API,按步骤完成 API 创建
    1. 输入 API 名称
    2. 选择关联域名,如果找不到域名,可以根据提示去接入域名
    3. 填写 匹配规则
    4. 选择 目标服务,目标服务会根据自动发现和手工接入(需要到服务列表接入)、重定向、直接返回多种类型
  7. CleanShot 2022-07-27 at 02.08.44@2x.jpg
  8. 完成 API 创建后,即可通过请求列表,查看对应的 API 结果
  9. 通过左侧导航栏 日志查看,查看对应的请求信息
  10. 通过 监控告警,查看对应的监控信息

微服务网关功能列表

功能分类 功能项 子功能项
微服务网关多实例管理 实例列表  
  添加实例  
  移除实例  
微服务网关详情 实例概览 基本信息
    连接信息
    网关数据
    资源数据
    API 请求排行
    资源负载
  API 管理 创建 API
    编辑 API 规则
    API 上下线管理
    批量管理 API
  服务接入 手工接入服务
    自动发现服务列表
    服务接入来源管理
  域名管理 添加域名
    编辑域名信息
  监控告警 业务监控看板
    网关实例监控看板
    监控告警规则
    自定义告警通知方式
  日志查看 业务日志查看
    业务日志源数据查看
    网关实例日志查看
  插件中心 全局限流插件
    安全认证插件
微服务网关管理 网关调试模式  
  网关手工重启  

2022-07-21 Skoala

i18n 使用构建

难题和调整

  • 产品原型页面翻译,工作量双份,更新和维护困难
  • 翻译质量不好校验,文档同学参与困难
  • 操作方式比较原始

在终端完成翻译工作

  • 基础使用
    • 创建项目
    • 创建部件(与 git 集成)
  • 如何与 git 集成
    • 创建唯一身份 key
    • 使用独立分支
  • 安装 weblate 终端应用

支持的功能

通过 api 查询组件详情

https://docs.weblate.org/en/latest/api.html#get--api-components-(string-project)-(string-component)-

GET /api/components/(string:project)/(string:component)/
Returns information about translation component.

Parameters
project (string)  Project URL slug

component (string)  Component URL slug

通过 api 创建组件

https://docs.weblate.org/en/latest/api.html#post--api-projects-(string-project)-components-

POST /api/projects/hello/components/ HTTP/1.1
Host: example.com
Accept: application/json
Content-Type: application/json
Authorization: Token TOKEN
Content-Length: 20

{
    "file_format": "po",
    "filemask": "po/*.po",
    "name": "Weblate",
    "slug": "weblate",
    "repo": "weblate://weblate/hello",
    "template": "",
    "new_base": "po/hello.pot",
    "vcs": "git"
}
HTTP/1.0 200 OK
Date: Tue, 12 Apr 2016 09:32:50 GMT
Server: WSGIServer/0.1 Python/2.7.11+
Vary: Accept, Accept-Language, Cookie
X-Frame-Options: SAMEORIGIN
Content-Type: application/json
Content-Language: en
Allow: GET, POST, HEAD, OPTIONS

{
    "branch": "main",
    "file_format": "po",
    "filemask": "po/*.po",
    "git_export": "",
    "license": "",
    "license_url": "",
    "name": "Weblate",
    "slug": "weblate",
    "project": {
        "name": "Hello",
        "slug": "hello",
        "source_language": {
            "code": "en",
            "direction": "ltr",
             "population": 159034349015,
            "name": "English",
            "url": "http://example.com/api/languages/en/",
            "web_url": "http://example.com/languages/en/"
        },
        "url": "http://example.com/api/projects/hello/",
        "web": "https://weblate.org/",
        "web_url": "http://example.com/projects/hello/"
    },
    "repo": "file:///home/nijel/work/weblate-hello",
    "template": "",
    "new_base": "",
    "url": "http://example.com/api/components/hello/weblate/",
    "vcs": "git",
    "web_url": "http://example.com/projects/hello/weblate/"
}

2022-07-18 i18n , Weblate

闭关备战 11 月

目标

获得软考中级证书,完成落户条件准备。

下一次考试时间是 11 月份,

开始闭关。


2022-07-17

Mac 上安装软件的方式

写在前面的话

如果你第一次看到这个文档,那么,欢迎加入 Mac 的大家庭!

接下来我会带领你来初始化的刚到手还热乎的 Mac,如果能对你有些帮助,那最好不过了。

简析 Mac 软件与 Windows 软件的区别

首先 软件名.exe 的软件是不能在 Mac 运行的,并且 Mac 软件与 Windows 的生态环境不同,所以你在安装软件的时候,注意下载对应 Mac 版本;好在由于苹果软件生态的优势,如果你安装了 Mac 版本,软件的 UI 体验和广告体验会比 Windows 好很多。

软件付费概念

如果同我们从 Android 手机转为 iPhone 时竟然发现软件还需要花钱买一样,苹果有着优质软件生态,是无数开发者和 Apple 共同运营的结果,所以尊重知识产权,合理付费,同时也可以体验到优质的产品和服务。

但是 Apple 目前有些收费策略的确让人搞不懂,如果你可以通过能 (tao) 力 (bao) 的方式省钱,欢迎告诉我。

Mac 软件安装的三种方式

1. App Store

这是苹果的官方渠道,如同 iPhone 的 App Store,可以在这边方便下载和更新你的软件。但是由于 App Store 的软件审核和发布流程的繁琐,Mac 版相对 iPhone 版,软件少的可怜,不过一些主流应用还是都可以找到的,下面列出一些常用的软件。

2. 软件官方网站

注意,在 Mac 上目前还没成熟的第三方软件仓库管理工具,例如某安全卫士和某管家都集成 Windows 软件管理仓库。所以到你需要用到的软件官网下载是一个非常保险的方式。

Mac 版本的软件后缀名一般为.dmg 或 .pkg,注意安装过程中可能需要输入密码

3. 第三方 Mac 软件收集网站导航

不要相信一些华军软件园等,或者 CSDN 上下载,这里推荐一些专门做 Mac Apps 收集梳理的网站,注意这里会用到百度网盘或 CT 网盘,下载速度会有些慢,氪金可以解决问题。

下面分享一下 Mac 应用网站:

注意,以上网站下载软件后解压时需要输入密码,对应网站会有提示或者 Google Search

4. Github 软件收集仓库

我竟然关注了一堆非开发相关的东西,真是奇特的知识。(GayHub 还有非常丰富的东西),这里就直接把 Github 上的仓库分享出来了,喜欢的老铁请自行 Star、Watch、打赏 (刚出的功能)。

5. Homebrew & Cask

到了重点部分了,Mac 很大的一个特色是 MacOS 底层的 Unix 衍生版本,和当前主流服务器操作系统如 Redhat、Debian 等一样,有这个强大的命令行模式,所以 Mac 在拥有非常好的软件生态的同时,也支持方便使用一些命令的指令,对开发者来讲,上手是十分友好的。

5.1 安装 brew

直接将下面的命令放到终端中运行,稍等片刻即可安装完成

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安装完成后,你可以非常方便的使用brew 进行软件的安装和管理

下面是一些安装软件的演示以及一些常用指令

# 安装wget
→ brew install wget

# 查找mysql
→ brew search mysql
==> Formulae
automysqlbackup             mysql-client                mysql-connector-c++         mysql-utilities             mysql@5.7
mysql ✔                     mysql-cluster               mysql-sandbox               mysql@5.5 ✔                 mysqltuner
mysql++                     mysql-connector-c           mysql-search-replace        mysql@5.6 ✔

# 安装mysql 5.7,使用@ 来指定版本,如果无多版本直接使用软件名称即可
→ brew install mysql@5.7

# 更新一个软件
→ brew upgrade wget

5.2 安装 Cask 用于安装 Mac 图形化软件

有 Homebrew 出现之后,丰富了 Mac 进行命令行工具和服务端应用的安装,但一直缺少图形化软件这一块,所以有其他开发者开发了附件的 Brew-Cask 插件,使得 Homebrew 拥有了安装图形化的能力,而作为使用者,我们只需要运行以下命令加载对应 Caskroom 的源即可。

brew tap caskroom/cask

成功加载源之后,我们就可以方便的安装软件啦,因为 Cask 都是通过去官方的软件仓库下载和安装,所以大家在使用时大可放心,下面直接用命令展示下,经常会用到的命令。

# 安装google-chrome
→ brew cask install google-chrome   # 我们只需在安装时加上 cask就行

# 查找eclipse
→ brew search eclipse
==> Casks
eclipse-cpp                 eclipse-installer           eclipse-jee                 eclipse-platform            eclipse-scout
eclipse-dsl                 eclipse-java                eclipse-modeling            eclipse-ptp                 eclipse-testing
eclipse-ide                 eclipse-javascript          eclipse-php                 eclipse-rcp                 nodeclipse

# 查找mysql 
→ brew search mysql
==> Formulae  (CLI)
automysqlbackup             mysql-client                mysql-connector-c++         mysql-utilities             mysql@5.7
mysql ✔                     mysql-cluster               mysql-sandbox               mysql@5.5 ✔                 mysqltuner
mysql++                     mysql-connector-c           mysql-search-replace        mysql@5.6 ✔

==> Casks        (图形化)
mysql-connector-python                         mysql-utilities                                navicat-for-mysql
mysql-shell                                    mysqlworkbench                                 sqlpro-for-mysql

# 更新软件 
→ brew cask upgrade google-chrome

结束语

好了,以上简单进行了 Mac 上安装软件的几个方法介绍,希望可以帮助到大家,也是为了自己做笔记。


2022-06-29 Mac

HTTPProxy API 创建

image


2022-06-18 Contour

Hexo 增加 admonition 样式支持

背景

除了在 Hexo 维护个人博客之外,目前经常用到的 2 个文档工具:语雀和 Mkdocs 都是支持 admonition 样式,所以也在考虑如何给 Hexo 博客文章也增加这样的能力。

保证写作习惯的一致性,好在有人开发出对应的插件,感谢。

安装方式

简单通过 2 个步骤即可,

安装插件

采用 npm 安装,如下:

npm install hexo-admonition --save

样式配置

你的 hexo 可能会使用不同主题,所以需要自己增加样式,将如下样式放入 hexo 主题的自定义样式文件中(如:ext.css),并按自己喜好修改:

.admonition {
  margin: 1.5625em 0;
  padding: .6rem;
  overflow: hidden;
  font-size: .64rem;
  page-break-inside: avoid;
  border-left: .3rem solid #42b983;
  border-radius: .3rem;
  box-shadow: 0 0.1rem 0.4rem rgba(0,0,0,.05), 0 0 0.05rem rgba(0,0,0,.1);
  background-color: #fafafa;
}
p.admonition-title {
  position: relative;
  margin: -.6rem -.6rem .8em -.6rem !important;
  padding: .4rem .6rem .4rem 2.5rem;
  font-weight: 700;
  background-color:rgba(66, 185, 131, .1);
}
.admonition-title::before {
  position: absolute;
  top: .9rem;
  left: 1rem;
  width: 12px;
  height: 12px;
  background-color: #42b983;
  border-radius: 50%;
  content: ' ';
}
.info>.admonition-title, .todo>.admonition-title {
  background-color: rgba(0,184,212,.1);
}
.warning>.admonition-title, .attention>.admonition-title, .caution>.admonition-title {
  background-color: rgba(255,145,0,.1);
}
.failure>.admonition-title, .missing>.admonition-title, .fail>.admonition-title, .error>.admonition-title {
  background-color: rgba(255,82,82,.1);
}
.admonition.info, .admonition.todo {
  border-color: #00b8d4;
}
.admonition.warning, .admonition.attention, .admonition.caution {
  border-color: #ff9100;
}
.admonition.failure, .admonition.missing, .admonition.fail, .admonition.error {
  border-color: #ff5252;
}
.info>.admonition-title::before, .todo>.admonition-title::before {
  background-color: #00b8d4;
  border-radius: 50%;
}
.success>.admonition-title::before{
  background-color: #00c853;
  border-radius: 50%;
}
.warning>.admonition-title::before, .attention>.admonition-title::before, .caution>.admonition-title::before {
  background-color: #ff9100;
  border-radius: 50%;
}
.failure>.admonition-title::before,.missing>.admonition-title::before,.fail>.admonition-title::before,.error>.admonition-title::before{
  background-color: #ff5252;;
  border-radius: 50%;
}
.admonition>:last-child {
  margin-bottom: 0 !important;
}

使用说明

Hexo-admonition 遵循一种简单的语法:每个块都以 !!! 开头,然后是代表提示类型的关键字(type)及标题(title)。例如:

!!! note Hexo-admonition 插件使用示例
    这是基于 hexo-admonition 插件渲染的一条提示信息。类型为 note,并设置了自定义标题。
    提示内容开头留 4 个空格,可以有多行,最后用空行结束此标记。

在 Hexo 渲染前,将被转换成如下内容:

<div class="admonition note ">
  <p class="admonition-title">Hexo-admonition 插件使用示例
  这是基于 hexo-admonition 插件渲染的一条提示信息。类型为 note,并设置了自定义标题。
  提示内容开头留 4 个空格,可以有多行,最后用空行结束此标记。
</div>

最终呈现效果如下:

!!! note Hexo-admonition 插件使用示例 这是基于 hexo-admonition 插件渲染的一条提示信息。类型为 note,并设置了自定义标题。 提示内容开头留 4 个空格,可以有多行,最后用空行结束此标记。

支持的类型

提示类型 type 将用作 CSS 类名称,暂支持如下类型:

  • note
  • info, todo
  • warning, attention, caution
  • error, failure, missing, fail

设置/隐藏标题

标题 title 是可选的,当未设置时,将以 type 作为默认值:

!!! warning
    这是一条采用默认标题的警告信息。

效果如下:

!!! warning 这是一条采用默认标题的警告信息。

如果不想显示标题,可以将 title 设置为 ""

!!! Warning ""
    这是一条不带标题的警告信息。

效果如下:

!!! Warning “” 这是一条不带标题的警告信息。

卡片演示

主要四种类型:info, warning, error, note

```markdown !!! note Hexo-admonition 插件使用示例 这是基于 hexo-admonition 插件渲染的一条提示信息。类型为 note,并设置了自定义标题。

提示内容开头留 4 个空格,可以有多行,最后用空行结束此标记。

!!! warning Hexo-admonition 插件使用示例 这是基于 hexo-admonition 插件渲染的一条提示信息。类型为 warning,并设置了自定义标题。

提示内容开头留 4 个空格,可以有多行,最后用空行结束此标记。

!!! error Hexo-admonition 插件使用示例 这是基于 hexo-admonition 插件渲染的一条提示信息。类型为 error,并设置了自定义标题。

提示内容开头留 4 个空格,可以有多行,最后用空行结束此标记。

!!! info Hexo-admonition 插件使用示例 这是基于 hexo-admonition 插件渲染的一条提示信息。类型为 info,并设置了自定义标题。

提示内容开头留 4 个空格,可以有多行,最后用空行结束此标记。

!!! todo Hexo-admonition 插件使用示例 这是基于 hexo-admonition 插件渲染的一条提示信息。类型为 todo,并设置了自定义标题。

提示内容开头留 4 个空格,可以有多行,最后用空行结束此标记。

!!! attention Hexo-admonition 插件使用示例 这是基于 hexo-admonition 插件渲染的一条提示信息。类型为 attention,并设置了自定义标题。

提示内容开头留 4 个空格,可以有多行,最后用空行结束此标记。

2022-05-28 Hexo

Gitlab 发送企微机器人消息

image

Gitlab 配置

image.png :::info => 高级用法 开启鉴权 :::

- 在 Gitlab 配置好之后 Secret token
- 在服务端接收推送时验证

实现中转站服务

:::warning 基本需求说明:

  • 可以 接受 gitlab 的 event 推送
  • 可以 发送 消息到微信服务器
  • 稳定 :::

我采用的方式,腾讯云函数;薅羊毛的方式

import os
import json
from flask import Flask, jsonify, render_template, request, url_for, send_from_directory
from werkzeug.utils import secure_filename
import requests

IS_SERVERLESS = bool(os.environ.get('SERVERLESS'))
print(IS_SERVERLESS)

app = Flask(__name__)

# send_msg_wecom
def msg_send_wecom(md_content):
    """msg_send_wecom
    {
        "msgtype": "markdown",
        "markdown": {
            "content": "实时新增用户反馈<font color=\"warning\">132 例,请相关同事注意。\n
             >类型:<font color=\"comment\">用户反馈
             >普通用户反馈:<font color=\"comment\">117 例
             >VIP 用户反馈:<font color=\"comment\">15 例"
        }
    }
    """

    url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key="

    webhooks = ["xxxxxxxxxxxxxxxxxxxxxxxxxxx"] # 多个 webhook 需要推送时
    headers = {'Content-Type': 'application/json'}

    message = {
        "msgtype": "markdown",
        "markdown": {
            "content": md_content
            }
        }

    for webhook in webhooks:
        try:
            requests.post(url=url+webhook, headers=headers, json=message)
        except Exception as e: 
            print(e)


@app.route("/from_gitlab_webhook", methods=['POST'])
def say_hello():
    data = request.get_json()
    event_type = data['object_kind']

    resp = {
        'event': event_type,
        }

    md_content = ""

    if event_type == 'push':
        resp['commit_msg'] = data['commits'][0]['message'].replace("\n", "")
        resp['author'] = data['user_username']
        resp['project_name'] = data['project']['name']
        resp['project_url'] = data['project']['web_url']

        # fit md_content
        md_content += "## 文档站 <font color=\"info\">{} 通知:\n\n".format(resp['event'])
        md_content += "- 项目:[{}]({}) \n".format(resp['project_name'],resp['project_url'])
        md_content += "- 更新人:*{}* \n".format(resp['author'])
        md_content += "- 提交信息:{} \n".format(resp['commit_msg'])

    elif event_type == 'build':
        resp['author'] = data['user']['username']
        resp['project_name'] = data['repository']['name']
        resp['project_url'] = data['repository']['homepage']
        resp['commit_msg'] = data['commit']['message'].replace("\n", "")
        resp['build_status'] = data['build_status']
        resp['build_duration'] = int(data['build_duration']) + 1

        if resp['build_status'] == 'failed':
            md_content += "## 文档站 {} <font color=\"warning\">{} 通知:\n\n".format(resp['event'], resp['build_status'])
            md_content += "- 项目:[{}]({}) \n".format(resp['project_name'],resp['project_url'])
            md_content += "- 请 **{}** 关注最近提交的内容 \n".format(resp['author'])
            md_content += "- 提交信息:{} \n".format(resp['commit_msg'])

    msg_send_wecom(md_content)

    print("INFO: " + json.dumps(resp))
    return json.dumps(resp)

@app.route("/")
def index():
    return {"code": 200, "msg": "it's ok!"}

# 启动服务,监听 9000 端口,监听地址为 0.0.0.0
app.run(debug=IS_SERVERLESS != True, port=9000, host='0.0.0.0')

创建企微群机器人

成功创建机器人后,会获取到一个 用于推送消息的 webhook Key image.png :::info => 高级用法 针对推送来源进行 IP 限制 ::: image.png

消息呈现展示

image.png


2022-05-18 GitLab , Webhook , Bot

国内环境搭建 MacOS K8s 开发环境

Minikube

在 Mac 上搭建开发环境,这里主要使用了 Kubernetes 官方推荐的 minikube 和 docker-for-desktop 环境

minikube start --image-mirror-country cn \
    --registry-mirror=https://vbj8usl3.mirror.aliyuncs.com

2022-05-17 K8s