本指南将向您展示如何快速搭建一个生产级的反向代理,无论是否使用 HTTPS。

前提条件:

  • 基本的终端/命令行操作技能

  • caddy
     命令已在您的系统路径(PATH)中

  • 一个正在运行的后端服务,用于代理

本教程假设您有一个后端 HTTP 服务运行在 127.0.0.1:9000
。以下命令适用于 Linux 系统,但相同的原则也适用于其他操作系统。

您可以不使用配置文件来运行一个简单的反向代理,也可以使用配置文件以获得更多的灵活性和控制能力。

阅读全文 »

本指南将向您展示如何快速搭建一个生产就绪的静态文件服务器。

先决条件:

  • 基本的终端/命令行技能

  • caddy
     已添加到您的 PATH 中

  • 包含您网站的文件夹

有两种简单的方法可以快速启动文件服务器。

命令行

阅读全文 »

欢迎来到 Caddy!本教程将探索使用 Caddy 的基础知识,并帮助你从宏观上熟悉它。

目标:

  • 🔲 运行守护进程

  • 🔲 尝试 API

  • 🔲 给 Caddy 提供配置

  • 🔲 测试配置

  • 🔲 创建 Caddyfile

  • 🔲 使用配置适配器

  • 🔲 从初始配置开始

  • 🔲 比较 JSON 和 Caddyfile

  • 🔲 比较 API 和配置文件

  • 🔲 在后台运行

  • 🔲 零停机时间配置重载

前提条件:

  • 基本的终端/命令行技能

  • 基本的文本编辑器技能

  • caddy
     和 curl
     在你的 PATH 中

阅读全文 »

以往在网站部署时第一时间想到的就是用nginx,不过总觉得nginx配置繁琐不太方便,之前在学云原生课的时候了解到现在有一款用go写的反向代理软件caddy可以替代nginx,现在就想了解学习一下怎么使用。

Caddy 是一个功能强大且可扩展的平台,用于托管您的网站、服务和应用程序,它使用 Go 语言编写。如果您是 Caddy 的新手,那么您搭建 Web 服务的方式即将改变。

介绍

大多数人将 Caddy 用作 Web 服务器或代理,但其核心是,Caddy 是一个“服务器的服务器”。凭借所需的模块,它可以承担任何长期运行进程的角色!

Caddy 的配置既动态又可通过其 API 导出。尽管不需要配置文件,但您仍然可以使用它们;大多数人配置 Caddy 的首选方式是使用 Caddyfile。配置文档的格式可以通过配置适配器呈现多种形式,但 Caddy 的原生配置语言是 JSON。

阅读全文 »

安装

本页面介绍了在您的系统上安装 Caddy 的各种方法。

官方支持的安装方法:

  • 静态二进制文件

  • Debian、Ubuntu、Raspbian 软件包

  • Fedora、RedHat、CentOS 软件包

  • Arch Linux、Manjaro、Parabola 软件包

  • Docker 镜像

社区维护的安装方法:

阅读全文 »

入门指南

以下内容假设您已经安装了 Faiss。我们提供了 C++ 和 Python 的代码示例。您可以直接复制粘贴这些代码,或者从 Faiss 发行版的 tutorial/
 子目录中运行它们。

获取数据

Faiss 处理固定维度 (d) 的向量集合,通常维度在几十到几百之间。这些集合可以存储在矩阵中。我们假设采用行主序存储,即第 (i) 个向量的第 (j) 个分量存储在矩阵的第 (i) 行、第 (j) 列。Faiss 只使用 32 位浮点矩阵。

我们需要两个矩阵:

阅读全文 »

Faiss

Faiss 是一个用于高效相似性搜索和密集向量聚类的库。它包含的算法可以在任意大小的向量集合中进行搜索,甚至包括那些可能无法完全放入 RAM 的数据集。此外,它还提供了用于评估和参数调整的支持代码。Faiss 是用 C++ 编写的,并且为 Python(2 和 3 版本)提供了完整的包装器。其中一些最有用的算法还实现了 GPU 加速。Faiss 主要由 Meta AI Research 开发,并得到了外部贡献者的帮助。

什么是相似性搜索?

给定一组维度为 (d) 的向量 ({x_1, \dots, x_n}),Faiss 会在 RAM 中构建一个数据结构。在构建完该结构后,当给定一个新的维度为 (d) 的向量 (x) 时,它会高效地执行以下操作:

阅读全文 »

UUID(Universically Unique Identifier)是一个128位的标识符,通常表示为32个十六进制字符,由连字符分隔为五段,格式为 8-4-4-4-12
(例如:123e4567-e89b-12d3-a456-426614174000
)。其各段的含义取决于 版本
 和 变体
,但通用结构如下:

UUID 通用结构

xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  |    |   |    |    |        |  |    |   |    |    |        └─ 节点/随机数据(12字符)  |    |   |    |    └─ 变体标识(4字符)  |    |   |    └─ 时间戳高位/哈希数据(4字符)  |    |   └─ 版本标识(4字符)  |    └─ 时间戳中段(4字符)  └─ 时间戳低位(8字符)

关键段详解

1. 时间戳(版本1/2)

阅读全文 »

UUID(Universally Unique Identifier),通用唯一识别码,是一种由数字和字母组成的128位标识符,通常表示为32个十六进制数字,中间用连字符分隔成5段,形式为8-4-4-4-12,例如:550e8400-e29b-41d4-a716-446655440000。每段的含义如下:

  • 第1段(8位)

  • 含义
    时间戳的一部分,它表示UUID生成的大致时间信息。更具体地说,是从1582年10月15日00:00:00 UTC到UUID生成时刻所经过的时间的低32位。

  • 作用
    在一定程度上反映了UUID生成的先后顺序,对于需要按照时间顺序处理或排序UUID的场景有一定的参考意义。

  • 第2段(4位)

  • 含义
    时间戳的一部分,是从1582年10月15日00:00:00 UTC到UUID生成时刻所经过时间的高16位中的一部分,用于进一步细化时间信息。

  • 作用
    与第1段的时间戳信息结合,能更精确地表示UUID的生成时间,有助于在分布式系统中区分在相近时间生成的UUID。

  • 第3段(4位)

  • 含义
    版本号。目前UUID有5个版本,不同版本的UUID生成方式和特点有所不同。该段数字用于标识UUID的版本号,例如,值为4表示是基于随机数生成的UUID版本4。

  • 作用
    可以让系统或应用程序根据不同的版本来确定如何解析和使用UUID,也有助于在不同的系统或应用之间进行兼容性处理。

  • 第4段(4位)

  • 含义
    变体(Variant)。用于标识UUID的变体,主要是为了兼容不同的UUID生成规范和实现。目前常见的变体有两种,一种是遵循RFC 4122规范的变体,另一种是用于Microsoft的GUID(Globally Unique Identifier,与UUID类似)的变体。

  • 作用
    帮助系统或应用程序确定UUID的兼容性和处理方式,确保在不同的环境中能够正确地解析和使用UUID。

  • 第5段(12位)

  • 含义
    通常是基于随机数或特定的命名空间和名称生成的唯一标识符的剩余部分,它提供了UUID的主要唯一性来源。

  • 作用
    保证了UUID在全球范围内的唯一性,即使在同一时间生成多个UUID,也能通过这部分内容确保它们的唯一性。

江达小记

带尖牙的Go配置!

许多Go项目都使用Viper构建,包括:

  • Hugo

  • EMC RexRay

  • Imgur的Incus

  • Nanobox
    /
    Nanopack

  • Docker Notary

  • BloomApi

  • doctl

  • Clairctl

  • Mercure

  • Meshery

  • Bearer

  • Coder

  • Vitess

安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
go get github.com/spf13/viper
```

**注意**
:Viper使用
Go模块
来管理依赖项。
## 什么是Viper?

Viper是Go应用程序(包括
12要素应用程序
)的完整配置解决方案。它旨在在应用程序中工作,可以处理所有类型的配置需求和格式。它支持:
- 设置默认值

- 从JSON、TOML、YAML、HCL、envfile和Java属性配置文件读取

- 实时监视和重新读取配置文件(可选)

- 从环境变量读取

- 从远程配置系统(etcd或Consul)读取并监视更改

- 从命令行标志读取

- 从缓冲区读取

- 设置显式值

Viper可以被视为满足应用程序所有配置需求的注册表。
## 为什么选择Viper?

在构建现代应用程序时,您不想担心配置文件格式;您只想专注于构建出色的软件。Viper可以帮助您做到这一点。

Viper为您做以下事情:
1. 查找、加载和解组JSON、TOML、YAML、HCL、INI、envfile或Java属性格式的配置文件。

1. 提供一种为不同配置选项设置默认值的机制。

1. 提供一种为通过命令行标志指定的选项设置覆盖值的机制。

1. 提供别名系统,以便在不破坏现有代码的情况下轻松重命名参数。

1. 轻松区分用户提供的命令行或配置文件与默认值相同的情况。

Viper使用以下优先级顺序:
- 对Set
的显式调用

- 标志

- 环境变量

- 配置

- 键/值存储

- 默认值

**重要**
:Viper配置键不区分大小写。目前正在讨论是否使其可选。
## 向Viper中放入值
### 设置默认值

一个好的配置系统会支持默认值。键不需要默认值,但在键未通过配置文件、环境变量、远程配置或标志设置的情况下很有用。

示例:
阅读全文 »
0%