一个消息分发给多个消费者,这就叫做发布-订阅模式。 作为示例,这里构建一个日志系统,由两部分组成,一个是发送日志消息,另一个是接收和打印。 **exchange** `exchange`就是接收生产者的消息,然后推送给队列的一个东西,类似邮局。 `exchange`有几种类型,`direct`, `topic`, `headers` 和`fanout`。 不同的`exchange`类型会有不同的行为,各种类型的使用在后续文章会有介绍,这里我们先只关注最后一种。 `$channel->exchange_declare('logs', 'fanout', false, false, false);` `fanout`类型是广播消息到所有已知的队列。 创建一个名字是`logs`的`exchange`。 ```php $channel->exchange_declare('logs', 'fanout', false, false, false); $channel->basic_publish($msg, 'logs'); ``` ...
 发布日期: 2018-11-13    分类: 其他   浏览量: 3309
我这里说的日志是应用日志,比如Web api 出现的一些异常,错误信息等,收集到一起,方便查询检索。 基本架构是,应用把出现的异常错误信息发送到MQ,再存储到数据库,然后提供一个web前端可以查看和检索。 ELK的主要组件如下: - elasticsearch:存储数据的地方 - kibana:可视化数据的web前端 - logstash:数据中转的地方,可以收集数据,过滤转换之后存储起来,输入和输出都可配置,默认是elasticsearch,也可以是其他数据库。 - beats:这个是收集特定数据的一组轻量级工具,可以单独安装用来收集特定数据,比如nginx的日志,系统日志,或者是系统监控信息等,这组工具的信息可以直接写入到`elasticsearch`,也可以通过`logstash`写入。和上面三个工具集成度很高,只需要很少的配置就可以完成收集安装。 这里我只是收集应用日志,所以暂时不需要用到`beats`。 数据流向图: ![流向图](/upload/image/2018/cb0e6a6b22865cfa8524b91ca0120407....
 发布日期: 2018-11-05    分类: 数据库   浏览量: 3340
### Nginx支持的负载均衡方案: - 轮训:循环分发请求; - 最少连接:下一个请求会分发给连接数最少的服务器; - ip-hash:用基于ip的hash方法计算来决定使用哪个服务器。 ### 最简单的负载均衡配置 ```nginx http { upstream myapp1 { server srv1.example.com; server srv2.example.com; server srv3.example.com; } server { listen 80; location / { proxy_pass http://myapp1; } } } ``` 测试Nginx是1.10.3版本,系统是ubuntu17.04。 默认80端口是主机用来做负载均衡,8080 - 8082三个端口分布做三个服务主机用来测试。 在`/etc/nginx/ngin...
 发布日期: 2018-11-05    分类: 其他   浏览量: 8953
可以使用`composer init`来初始化一个测试项目,然后用`composer require php-amqplib/php-amqplib`来引入`RabbitMQ`开发包,然后就可以进行以下测试了。 下面是一个简单的生产者和消费者代码。 如果运行多个消费者,生产者的消息会通过轮训的方式平均分配给消费者。 生产者(消息发送者): **producer.php** ```php ...
 发布日期: 2018-11-04    分类: 其他   浏览量: 3534
官网下载二进制包,或者用对应系统的仓库安装就可以了。 安装好后默认服务是启动的,可以使用下列命令查看状态: `service rabbitmq-server status`或者`systemctl status rabbitmq-server`。 服务是以`rabbitmq`用户运行的。 需要打开的端口: - 4369:RabbitMQ and CLI 工具用来节点发现的。 - 5672,5671:客户端AMQP通信端口。 - 25672:节点间和CLI工具的通信端口,这个端口的是动态的,AMQP端口+20000计算而来。如果不需要外部通信,不需要公开端口。 - 35672 - 35682:用于CLI工具和节点间通信用。动态分配的,计算方法是上的端口号+10000 - 上面的端口号+10010。 - 15672:HTTP API客户端,management UI和rabbitmqadmin使用。 - 61613,61614:STOMP客户端使用。 - 1883, 8883: MQTT客户端使用。 - 15674: STOMP-over-WebSocke...
 发布日期: 2018-11-04    分类: 其他   浏览量: 3989
首先有一个完全不需要配置的现成方案,直接用`docker run`运行就可以使用了,项目地址:[https://github.com/jae-jae/docker-pan](https://github.com/jae-jae/docker-pan)。 这个方案利用的是`Aria2`的`web ui`来实现下载管理,`Filerun`来实现文件的管理的,下载后端是`Aria2`这个开源的下载软件。 本篇文章要讲的是在`NextCloud`里面添加离线下载的功能,就类似于百度网盘的离线下载一样的。 我的`nextcloud`是用`docker`运行的,不用`docker`运行的话也是类似的。 首先是在`nextcloud`的管理后台安装应用`ocdownloader`。 作者的`github`项目主页是:[https://github.com/e-alfred/ocdownloader](https://github.com/e-alfred/ocdownloader) 这个应用的下载后端可以是`curl`和`Aria2`,这里不管`c...
 发布日期: 2018-03-05    分类: 其他   浏览量: 13010
什么是JWT?JWT全称是JSON Web Token,这是一个开放的RFC7519标准,它定义了在两者之间使用JSON安全传输数据的准则。传输的数据是可信的,并且是可验证的,因为数据已经添加了数字签名。签名可以用密钥或者是RSA密钥对签名。有什么特性呢?体积比较小,可以作为URL,POST数据等的参数,也可以放在HTTP头里面传输。另一方面,小意味着传输比较快。里面包含的信息都是可以直接拿来用的,避免了去数据库查询。什么时候应该使用JWT?典型场景:身份验证:这个是JWT最常用的场景了。一旦用户登录,之后的请求都需要带上JWT信息,验证通过之后才能访问授权的资源。比如单点登录,手机APP接口等。信息交换:因为JWT的数据是签名之后的数据,这样可以保证安全。JWT的数据结构由三部分组成,每一个部分是用点(.)分割的:Header(头);Payload(数据);Signature(签名)。所以,典型的JWT数据格式看起来像这样:xxxxx.yyyyy.zzzzz;Header头部包含两部分,token的类型,固定的JWT;哈希的算法,比如HMAC SHA256或者RSA。一般hash25...
 发布日期: 2017-07-29    分类: 其他   浏览量: 4374
在理论篇我们基本了解了DNS的整个协议原理,但是可能还会有着下面的疑问:为什么我想申请的域名都没了?DNS 域名还要备案,这是为什么啊?如何将刚申请的域名绑定到自己的网站呢?怎么才能看到那些在背后默默给我解析的域名服务器呢?他们说用一个什么文件就可以访问好多好多不存在的网站,是真的吗?可信任的域名服务器是怎么一回事,难道有些域名服务器会做坏事?怎么知道我现在用的域名服务器有没有使坏呢?……我不准备一个一个地去回答这些问题,不过相信我,读完本文,对于上面问题的答案你会有一个清晰的认识,并且可以解决其他各种各样关于 DNS 方面的问题。域名注册、绑定首先明确一点,每个人都可以去注册域名。大多数时候我们希望去注册一个顶级域名(比如selfboot.cn, google.com等),那些二级域名毕竟不够好记(比如github托管博客的域名:username.github.io)。有的顶级域名(比如.tk域名)提供免费的一年域名试用,不过绝大多时候还是要为自己的域名付费的(一般是按年付费,也不是很贵)。要想去注册域名,首先得找到域名注册商,国内的比较著名的有DNSpod等,国外的有godaddy...
 发布日期: 2017-03-01    分类: 其他   浏览量: 5795
对于 DNS(Domain Name System) 大家肯定不陌生,不就是用来将一个网站的域名转换为对应的IP吗。当我们发现可以上QQ但不能浏览网页时,我们会想到可能是域名服务器挂掉了;当我们用别人提供的hosts文件浏览到一个“不存在”的网页时,我们会了解到域名解析系统的脆弱。然而关于DNS还有一大堆故事值得我们去倾听,去思考。DNS 源起要想访问网络上的一台计算机,我们必须要知道它的IP地址,但是这些地址(比如243.185.187.39)只是一串数字,没有规律,因此我们很难记住。并且如果一台计算机变更IP后,它必须通知所有的人。显然,直接使用IP地址是一个愚蠢的方案。于是人们想出了一个替代的方法,即为每一台计算机起一个名字,然后建立计算机名字到地址的一个映射关系。我们访问计算机的名字,剩下的名字到地址的转换过程则由计算机自动完成。hosts映射早期,名字到地址的转换过程十分简单。每台计算机保存一个hosts文件,里面列出所有计算机名字和对应的IP地址,然后定期从一个维护此文件的站点更新里面的记录。当我们访问某个计算机名字时,先在hosts文件找到对应的IP,然后就可以建立连接。...
 发布日期: 2017-03-01    分类: 其他   浏览量: 6732
之前不一小心把Ubuntu16.10所有软件的apt-get配置给删了,然后就把系统给重新装了一遍。想一下以后如果要再次重装系统的话,配置服务器这些有点繁琐,然后就想了下,web服务都用docker来运行。docker基础用法,看起来还挺简单的,但是在我实际的使用中,按照自己的想法去部署服务的时候还是遇到了一些书上没说的细节问题。这些细节问题,进行不下去时候,那么我先去搜索,搜索不到再去发帖,这样有时候会在一个小点上面卡主好几天。看到这里,我当然都把这些问题一一解决了。我这里的架构是Nginx+MySQL+PHP的。一开始我是想用Dockerfile文件,把它们三个全都放到一个镜像里面取,一开始的Dockerfile内容如下:FROM ubuntu:latest RUN apt-get update RUN apt-get install -y mysql-server nginx php-fpm php-mcrypt EXPOSE 80 443 CMD ["/etc/init.d/nginx", "start"]当我build的时候,遇到的第一个问题就是,安装MySQL的时候,会弹出...
 发布日期: 2017-01-21    分类: 其他   浏览量: 8545