分类归档

Docker教程

FWQ
Docker教程
Goroutine Channel Select 的用法和理解
Goroutine的使用 Goroutine 奉行通过通信来共享内存,而不是共享内存来通信。使用goroutine很简单,只需要用到一个关键字go,我们用一段代码来示例一下如何使用go关键字   package main import (     "fmt" ) func main() {     go Goroutine() } func Goroutine() {     fmt.Println("Goroutine") } 没有输出?执行了上面的代码后,你会发现,什么都没有输出,那么是什么问题呢? 因为我们当前的程序,只是一个单线程的程序,main函数只要执行完毕后,就不会再管其他线程在做什么事情了,程序自动退出。 然后我们想到了一个办法,加一个sleep函数,让main函数等待Goroutine函数执行完毕后再退出。 更改后的代码如下:…
2024-11-18 阅读全文 →
FWQ
Docker教程
如何优雅地关闭Go channel
几天前,我写了一篇文章来说明golang中channel的使用规范。在reddit和HN,那篇文章收到了很多赞同,但是我也收到了下面几个关于Go channel设计和规范的批评: 在不能更改channel状态的情况下,没有简单普遍的方式来检查channel是否已经关闭了 关闭已经关闭的channel会导致panic,所以在closer(关闭者)不知道channel是否已经关闭的情况下去关闭channel是很危险的 发送值到已经关闭的channel会导致panic,所以如果sender(发送者)在不知道channel是否已经关闭的情况下去向channel发送值是很危险的   那些批评看起来都很有道理(实际上并没有)。是的,没有一个内置函数可以检查一个channel是否已经关闭。如果你能确定不会向channel发送任何值,那么也确实需要一个简单的方法来检查channel是否已经关闭: package main import "fmt" type T int func IsClosed(ch <-chan T) bool {     select {     case <-ch:         return…
2024-11-18 阅读全文 →
FWQ
Docker教程
Go中net包中的方法
本文章是学习Go中net包的一篇笔记,记录 net 包的一些方法的使用。  1、func SplitHostPort(hostport string) (host, port string, err error) 函数将格式为”host:port”、”[host]:port”或”[ipv6-host%zone]:port”的网络地址分割为host或ipv6-host%zone和port两个部分。   2、func JoinHostPort(host, port string) string 函数将host和port合并为一个网络地址。一般格式为”host:port”;如果host含有冒号或百分号,格式为”[host]:port”。  3、type HardwareAddr []byte HardwareAddr类型代表一个硬件地址(MAC地址) 3.1、func ParseMAC(s string) (hw HardwareAddr,…
2024-11-17 阅读全文 →
FWQ
Docker教程
Go中的net/url包学习笔记
GO中的net/url包,实现对URL的处理。 1、对URL进行编码和解码 func QueryEscape(s string) string QueryEscape函数对s进行转码使之可以安全的用在URL查询里。 func QueryUnescape(s string) (string, error) QueryUnescape函数用于将QueryEscape转码的字符串还原。它会把%AB改为字节0xAB,将’+’改为’ ‘。如果有某个%后面未跟两个十六进制数字,本函数会返回错误。   2、对Path(路径)进行编码和解码 func PathEscape(s string) string func PathUnescape(s string) (string, error) tips 01 :…
2024-11-17 阅读全文 →
FWQ
Docker教程
微信小程序的app.json配置
app.json文件用来对微信小程序进行全局配置,决定页面文件的路径、窗口表现、设置网络超时时间、设置多 tab 等。下面对app.json文件进行逐个分析: Tips : 该文件时一个json文件,故不支持注释   以下是一个包含了所有配置选项的 app.json: {   "pages": [     "pages/index/index",     "pages/logs/index"   ],   "window": {     "navigationBarTitleText": "Demo"   },  …
2024-11-17 阅读全文 →
FWQ
Docker教程
理解OAuth 2.0
OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为RFC 6749。 一、应用场景 为了理解OAuth的适用场合,让我举一个假设的例子。 有一个”云冲印”的网站,可以将用户储存在Google的照片,冲印出来。用户为了使用该服务,必须让”云冲印”读取自己储存在Google上的照片。   问题是只有得到用户的授权,Google才会同意”云冲印”读取这些照片。那么,”云冲印”怎样获得用户的授权呢? 传统方法是,用户将自己的Google用户名和密码,告诉”云冲印”,后者就可以读取用户的照片了。这样的做法有以下几个严重的缺点。 “云冲印”为了后续的服务,会保存用户的密码,这样很不安全。 Google不得不部署密码登录,而我们知道,单纯的密码登录并不安全。 “云冲印”拥有了获取用户储存在Google所有资料的权力,用户没法限制”云冲印”获得授权的范围和有效期。 用户只有修改密码,才能收回赋予”云冲印”的权力。但是这样做,会使得其他所有获得用户授权的第三方应用程序全部失效。 只要有一个第三方应用程序被破解,就会导致用户密码泄漏,以及所有被密码保护的数据泄漏。 OAuth就是为了解决上面这些问题而诞生的。 二、名词定义 在详细讲解OAuth 2.0之前,需要了解几个专用名词。它们对读懂后面的讲解,尤其是几张图,至关重要。 Third-party application:第三方应用程序,本文中又称”客户端”(client),即上一节例子中的”云冲印”。 HTTP service:HTTP服务提供商,本文中简称”服务提供商”,即上一节例子中的Google。 Resource Owner:资源所有者,本文中又称”用户”(user)。 User Agent:用户代理,本文中就是指浏览器。 Authorization…
2024-11-17 阅读全文 →
FWQ
Docker教程
Redis中的Lua脚本
使用Lua脚本的好处: 减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延 原子操作。redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。因此在编写脚本的过程中无需担心会出现竞态条件,无需使用事务。 复用。客户端发送的脚步会永久存在redis中,这样,其他客户端可以复用这一脚本而不需要使用代码完成相同的逻辑。 调用Lua脚本的语法:   $ redis-cli --eval path/to/redis.lua KEYS[1] KEYS[2] , ARGV[1] ARGV[2] ... –eval,告诉redis-cli读取并运行后面的lua脚本 path/to/redis.lua,是lua脚本的位置 KEYS[1] KEYS[2],是要操作的键,可以指定多个,在lua脚本中通过KEYS[1], KEYS[2]获取 ARGV[1] ARGV[2],参数,在lua脚本中通过ARGV[1], ARGV[2]获取。 Tips 01:KEYS和ARGV中间的 ‘,’ 两边的空格,不能省略。…
2024-11-17 阅读全文 →
FWQ
Docker教程
BeansTalkd的使用与安装
一、Beanstalkd的特点 Beanstalkd 是一个轻量级、高性能的消息队列中间件,它最大特点是将自己定位为基于管道  (tube) 和任务 (job) 的工作队列 (work-queue)。 Beanstalkd 支持任务(job)优先级 (priority), 延时 (delay), 超时重发 (time-to-run) 和预留 (buried), 能够很好的支持分布式的后台任务和定时任务处理。 Beanstalkd的内部实现采用 libevent, 服务器-客户端之间用类似 memcached 的轻量级通讯协议,具有有很高的性能。 尽管是内存队列, beanstalkd 提供了 binlog 机制,…
2024-11-17 阅读全文 →
FWQ
Docker教程
BeansTalkd的命令
一、BeanstalkD协议 Beanstalk协议使用ASCII编码,运行在TCP协议之上。客户端负责主动建立连接,发送命令和数据,等待响应以及关闭连接。对于每个连接,服务端以接收请求的顺序串行地处理命令,并按相同的顺序发送响应。协议中所有的数字都是十进制并且非负的(除非有明确说明)。 协议中的名字都是ASCII字符串。名字可以包含字母(A-Z和a-z)、 数字(0-9)、连字符(”-“)、 加(”+”)、 斜线(”/”)、 分号(”;”)、 点(”.”)、 美元符号(”$”)、下划线(”_”)和括号(“(”和”)”),但是不能以连字符开头。名字以空格或换行结束。每个名字至少要有一个字符的长度。   协议中包含两类数据:文本行和非结构化的块数据。文本行用来传输客户端的命令和服务端的响应。块数据用来传输job体和统计信息。每个job体是一个不透明的字节序列。服务端从不检查或修改job体,直接按其原有的格式返回。job体的解释是有客户端来进行的。 当不再需要使用服务端时,客户端可以选择发送 ”quit” 命令或直接关闭TCP连接。然而,beanstalkd可以很好处理和维护大量打开的连接,所以,客户端应该尽可能包括连接的打开和重用。这同样也可以省去建立TCP连接的开销。 如果客户端违背了协议(比如发送错误格式的请求或者不存在的命令)或者服务端出错,服务端将返回下面信息的一种 OUT_OF_MEMORY:表示服务端不能为job分配足够的内存。客户 端应该稍后重试。 INTERNAL_ERROR:表示服务端的bug。这种情况不应该发生。如果 发生了,可以报给http://groups.google.com/group/beanstalk-talk。 BAD_FORMAT:表示客户端发送了一个错误格式的命令行。可能呢 导致这种错误发生的情况有:行没有以\r\n结尾、在需要整数的地方出现了非数字字符、参数的数目错误、或者其他格式的命令行错误。 UNKNOWN_COMMAND:表示客户端发送了一个服务端不认识的 命令。  这些错误响应不会在本文以下各节的命令列出,但都隐含在所有命令的说明里。客户端在发送命令之后都要准备好接收错误响应。  最后,如果服务端发生了严重的错误不能继续服务,服务端将会主动关闭连接。  二、Producer命令 2.1 put…
2024-11-17 阅读全文 →
FWQ
Docker教程
openResty学习中的知识点(一)
1、变量申明后,默认的值是nil;将 nil 赋给变量后,相当于删除变量。注意nil 和 ngx.null的区别。 2、在 lua中只有 false和 nil 值为 false ,其他值都为 true ,包括0,””等 3、lua中的数字(一切数字)都是 number类型。 4、table 的下标从 1 开始。 5、逻辑运算法 and 、or 、not的用法。   6 、字符串的连接可使用string.format ,或者…
2024-11-17 阅读全文 →