Go语言之一:工作区和GOPATH 作者: lovingyu_er 时间: 2020-01-29 21:11:00 分类: 编程语言,Golang 评论 在命令行的模式下,执行:```go env``` 会得到如下的结果: ```bash darrykingerdeMacBook-Pro:time_geekbang_lib darry$ go env GO111MODULE="" GOARCH="amd64" GOBIN="" GOCACHE="/Users/darry/Library/Caches/go-build" GOENV="/Users/darry/Library/Application Support/go/env" GOEXE="" GOFLAGS="" GOHOSTARCH="amd64" GOHOSTOS="darwin" GONOPROXY="" GONOSUMDB="" GOOS="darwin" GOPATH="/Users/darry/go" GOPRIVATE="" GOPROXY="https://proxy.golang.org,direct" GOROOT="/usr/local/go" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64" GCCGO="gccgo" AR="ar" CC="clang" CXX="clang++" CGO_ENABLED="1" GOMOD="" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/j_/cw210fh54cd01vfqckw_wk140000gn/T/go-build743480192=/tmp/go-build -gno-record-gcc-switches -fno-common" ``` 重点的几个参数: ```GOROOT```: go语言的安装路径 ```GOPATH```: 若干工作区目录的路径,go语言的自定义工作空间,也就是GO语言的工作路径,它的值是一个目录的路径,也可以是多个目录的路径,每个目录都代表go语言的一个工作区,这些工作区中放置了一些源码文件(source file),以及一些install后的归档文件(archive file,是以.a结尾的文件),以及一些可执行文件(executed file ) ```bash ls -al /Users/darry/go drwxr-xr-x 5 darry staff 160 1 19 00:41 pkg drwxr-xr-x 3 darry staff 96 1 18 21:48 src ``` go语言的项目周期内的所有操作,编码,依赖管理,构建,测试,安装等,都基本上都是围绕```GOPATH```和和工作区进行的。 ```GOBIN```: GO 语言生成可执行文件的路径 根据```GOPATH```我们需要关注重点三个问题: 1. Go 语言源码的组织方式是怎样的; 2. 你是否了解源码安装后的结果(只有在安装后,Go 语言源码才能被我们或其他代码使用); 3. 你是否理解构建和安装 Go 程序的过程(这在开发程序以及查找程序问题的时候都很有用,否则你很可能会走弯路)。 ###1.GO语言源码的组织方式: GO语言的源码是以代码包为基本组织单位的。在文件系统中,这种代码包是和文件目录是一一对应的,目录有子目录,代码包也可以有子代码包 一个代码包中可以包含很多个.go文件,并且这些文件都需要声明是属于同一个代码包 代码包的名称一般会与源码文件所在的目录同名。如果不同名,那么在构建、安装的过程中会以代码包名称为准。 每一个代码包都有一个导入路径,代码包的导入路径是其他代码在使用该包中的程序实体时,需要引入的路径。 例如,导入一个包:```bash import "github.com/labstack/echo" ``` 在导入代码包的时候,其实就是从 src 子目录,到该包的实际存储位置的相对路径。 所以说,```Go 语言源码的组织方式就是以环境变量 GOPATH、工作区、src 目录和代码包为主线的。```一般情况下,Go 语言的源码文件都需要被存放在环境变量 GOPATH 包含的某个工作区(目录)中的 src 目录下的某个代码包(目录)中。 ###2.你是否了解源码安装后的结果 源码文件位置是在某个工作区的src目录下,如果安装出现了归档文件(.a结尾的,安装某个代码包产生的归档文件是和这个代码包同名的),就会被放到```pkg```的目录下;如果产生了可执行文件,就会放到```bin```目录下。 ###3.构建和安装GO程序 构建使用命令go build,安装使用命令go install。构建和安装代码包的时候都会执行编译、打包等操作,并且,这些操作生成的任何文件都会先被保存到某个临时的目录中。 ItemGo buildgo install 库源码文件临时目录中它所在工作区pkg目录的子目录下 命令源码文件源码文件所在的目录它所在工作区bin的目录下或者GOBIN指向的目录 顺序--Build->链接操作->结果文件->指定的目录
17.消息队列:秒杀时如何处理每秒上万次的下单请求?学习笔记 作者: lovingyu_er 时间: 2020-01-21 21:07:00 分类: 架构学习笔记, 技术品鉴 评论 ####高并发设计的三个目标 性能,可用性和高扩展性 高并发的一般都是查询,读多写少。 消息队列在秒杀场景下的作用: ###1.削去秒杀场景下的峰值写流量 四个字概括就是:削峰填谷 也就是说它可以削平短暂的流量高峰,虽说堆积会造成请求被短暂延迟处理,但是只要我们时刻监控消息队列中的堆积长度,在堆积量超过一定量时,增加队列处理机数量来提升消息的处理能力就好了,而且秒杀的用户对于短暂延迟知晓秒杀的结果也是有一定容忍度的。 ###2.通过异步处理简化秒杀请求中的业务流程 你想,在秒杀场景下,我们整个购买请求处理完成需要 500ms。这时你分析了一下整个的购买流程,发现这里面会有主要的业务逻辑,也会有次要的业务逻辑, 我们分析到的主要的流程是生成订单、扣减库存; 次要的流程可能是我们在下单购买成功之后会给用户发放优惠券,会增加用户的积分。 也就是将次要的流程从整个业务逻辑中分离出来,不和主要业务逻辑同步,这样就又减少了整个业务流程的处理时长。 如果发放优惠券需要耗时50ms,增加用户积分也是50ms,那么将缩短整个流程的100ms的时长,那么整个购买请求处理完成需要的时间降低到400ms,大大的优化了系统的性能。 ###3.解耦实现秒杀系统模块之间松耦合 功用:解耦合 新需求: 比如数据团队对你说,在秒杀活动之后想要统计活动的数据,借此来分析活动商品的受欢迎程度、购买者人群的特点以及用户对于秒杀互动的满意程度等等指标。而我们需要将大量的数据发送给数据团队,那么要怎么做呢? 一般的思路,使用http或者rpc的方式来同步的调用,也就是直接给数据团队一个接口,同步将数据放松给数据团队。 那么这种思路在高并发的秒杀系统中存在的问题: - 耦合性比较强,如果数据团队接口出现异常,影响秒杀的进行 - 数据系统变更数据字段的时候,接口也要变更字段,秒杀系统要跟着更改。 使用消息队列后的解决思路如下:秒杀系统产生一条购买数据后,我们可以先把全部数据发送给消息队列,然后数据团队再订阅这个消息队列的话题,这样它们就可以接收到数据,然后再做过滤和处理了。 本小结,主要是讲了在秒杀系统场景下,消息队列的作用,整理起来就是:削峰填谷,异步处理,解耦合。 在公司项目设计中,由于业务监听部分,需要检测返回的数据是否正常,发送邮件的功能,就用到消息队列。包括一些search功能,采集用户的搜索记录等等。
2020年 作者: lovingyu_er 时间: 2020-01-19 16:23:00 分类: 每日发呆,生活小文艺 评论 2020年,我想无敌的活下去! 算了,还是少喝酒了!:dizzy_face: 人情冷暖,皆自知 ```2020年02月04号```===:joy: :joy: :joy:===```感觉好烦呀。。。```
php 中一些魔术方法的简单介绍 作者: lovingyu_er 时间: 2020-01-17 14:50:00 分类: 编程语言,PHP 评论 php的魔术方法 ```php php的魔术方法 1.__get,__set 访问或者设置一个对象不存在的属性会触发这两个函数 2.__call,__callStatic:前者访问一个对象实例不存在的函数触发改函数;后者是访问类不存在的方法的时候会触发改函数的执行 3.__toString():假如我们直接echo $object 这个对象,也就是直接认为这个$object是一个字符串的时候,这种对类型判断出问题的时候,会触发这个函数 4.__invoke(): 如果我们直接$object("test3333333333333333"),也就是直接把对象实例当成一个函数的时候,会触发这个函数的执行 ``` 案例如下: ```php php/PSR_0/Common/Objects.php array[$key]=$value; } function __get($key){ var_dump(__FUNCTION__); return $this->array[$key]; } function __call($func,$param){ var_dump($func,$param); var_dump(__FUNCTION__); } static function __callStatic($name, $arguments) { // TODO: Implement __callStatic() method. var_dump($name); var_dump($arguments); } function __toString() { // TODO: Implement __toString() method. var_dump(__METHOD__); return __CLASS__.PHP_EOL; } //将一个对象作为一个函数去访问 function __invoke($params) { // TODO: Implement __invoke() method. var_dump(__METHOD__); var_dump($params); } } //不能有echo之类的代码 ``` 让一个对象可以以数组的方式访问,可以参考php的接口```ArrayAccess``` 接口,继承实现就可以了
nignx实现负载均衡的几种方式 作者: lovingyu_er 时间: 2020-01-15 23:57:56 分类: 编程语言,Ubuntu 评论 ####1.轮询 这是一般的more策略,这种一般都是无状态的,将请求按照顺序分配到不同的server上 ####2.最少的连接: 将请求分配到连接数最少的server上 ####3.权重 使用 weight 来指定 server 访问比率,weight 默认是 1。weight越大,权重越高,分摊的任务也越多 ####4. ip hash 每个请求会按照访问 ip 的 hash 值分配,这样同一客户端连续的 Web 请求都会被分发到同一 server 进行处理,可以解决 session 的问题。如果 server 挂掉,能自动剔除(心跳检查)