Leo的技术分享

记录开发的点滴

SOAP(Simple Object Access Protocol)是一种基于 XML 的 web 服务协议。SOAP 是平台独立的,不依赖于特定的语言,例如,我们可以使用 C#,C/C++,或者 Java 语言来实现 SOAP web 服务。

SOAP 的优点

SOAP 的优点有:

  • WS Security:SOAP 使用 WS Security 作为其安全的标准,安全性较高。
  • 语言与平台独立:可以使用多种语言来实现 SOAP web 服务,且可以运行在多种平台上面。

SOAP 的缺点

SOAP 的缺点有:

  • 速度较慢:SOAP 使用 XML 作为数据传输的格式,web 服务每次读取数据时都需要对 XML 进行解析,速度较慢。另外,SOAP 规定了 web 服务需要遵循的许多规范,这导致在传输过程中消耗较多的网络带宽。
  • 依赖于 WSDL:除了使用 WSDL 外,SOAP 并不提供其他的机制来让其他应用程序发现服务。
阅读全文 »

作为一款开源的 Redis 图形化监控工具,RedisLive 提供对 Redis 实例的内存使用情况,接收的客户端命令,接收的请求数量以及键进行监控。RedisLive 的工作原理基于 Redis 的 INFO 和 MONITOR 命令,通过向 Redis 实例发送 INFO 和 MONITOR 命令来获取 Redis 实例当前的运行数据。

RedisLive 提供的图形化展示界面如下图所示:

安装

RedisLive 使用 Python 实现,使用 Tornado 作为自己的 Web 服务器。运行 RedisLive 并不需要额外的编译过程。下载 RedisLive 的代码后,只须安装好依赖的相关 Python 扩展包就可以直接运行。
可以通过 Git 下载最新的 RedisLive 源代码:

1
git clone https://github.com/kumarnitin/RedisLive.git
阅读全文 »

Redis 为了支持事务,提供了 5 个相关的命令,他们分别是 MULTI,EXEC, WATCH,UNWATCH 和 DISCARD。我们先介绍 MULTI 和 EXEC 的用法,MULTI 和 EXEC 支持了 Redis 的基本事务的用法。接下来介绍 WATCH,UNWATCH 和 DISCARD,这3个命令则支持更高级的 Redis 事务的用法。

事务允许一次执行多个命令,并且带有以下两个重要的保证:

  • 事务是一个单独的隔离的操作:事务中的所有命令会按顺序执行,事务在执行过程中,不会被其他客户端发来的命令请求所打断
  • 事务是一个原子的操作:事务中的命令要么全部被执行,要么全部都不执行

Redis 的基本事务

Redis 的基本事务需要用到 MULTI 和 EXEC 命令,这种事务可以让一个客户端在不被其他客户端打断的情况下执行多个命令。被 MULTI 和 EXEC 命令包裹的所有命令会一个接一个执行,直到所有命令都执行完毕,当一个事务执行完毕之后,Redis 才会处理其他客户端的命令。

MULTI 命令用于开启一个事务,它总是返回 OK。
MULTI 执行之后,客户端可以继续向服务器发送任意多条命令,这些命令不会立即被执行,而是被放到一个队列中,当 EXEC 命令被调用时,队列中的所有命令才会被执行。
以下是一个基本事务的例子,它原子地增加了 foo 和 bar 两个健的值:

redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> INCR foo
QUEUED
redis 127.0.0.1:6379> INCR bar
QUEUED
redis 127.0.0.1:6379> EXEC

  1. (integer) 1
  2. (integer) 1
阅读全文 »

I/O多路复用除了之前我们提到的selectpoll外,epoll 也可以检查多个文件描述符的就绪状态,以达到I/O多路复用的目的。
epoll 系统调用是 Linux 系统专有的,在 Linux 内核 2.6 版本新增,epoll 的主要优点有:

  • 当检查大量的文件描述符时,epoll 的性能比selectpoll高很多
  • epoll 既支持水平触发也支持边缘触发,selectpoll只支持水平触发

epoll 编程接口的核心数据结构为 epoll 实例,它和一个打开的文件描述符相关联。这个文件描述符是内核数据结构的句柄,该内核数据结构的作用主要有两个:

  • 记录在进程中声明过的感兴趣的文件描述符列表,即 interest list
  • 维护处于I/O就绪状态中文件描述符列表,即 ready list

其中,ready list 是 interest list 的子集。

epoll 编程接口由以下3个系统调用组成:

  • epoll_create创建一个 epoll 实例,返回代码该实例的文件描述符
  • epoll_ctl增删改 epoll 实例的 interest list
  • epoll_wait返回与 epoll 实例相关联的就绪列表中的成员

创建 epoll 实例: epoll_create

系统调用epoll_create创建一个新的 epoll 实例,其对应的 interest list 初始化为空。

1
2
#include <sys/epoll.h>
int epoll_create(int size);

参数size指定了我们想要通过 epoll 实例来检查的文件描述符个数,该参数并不是一个上限,而是告诉内核应该如何为内部数据结构划分初始大小。epoll_create返回新创建 epoll 实例的文件描述符,这个文件描述符在其他几个 epoll 系统调用中会被用来表示 epoll 实例。当这个文件描述符不再使用时,应该通过close来关闭。

从 Linux 2.6.27 版内核以来,Linux 支持了一个新的系统调用 epoll_create1。该系统调用执行的任务同epoll_create,但是去掉了无用的参数size,并增加了一个可用来修改系统调用行为的flag标志。

阅读全文 »

虽然 Redis 本身也提供redis-benchmark工具来对 Redis 的性能进行测试,但为了对测试维度自由定制,我们还是通过自己编写脚本的方式来测试。

Redis 的官方文档也提到了,简单的起一个循环,然后在循环中向 Redis 发送操作命令,其实不是对 Redis 进行性能测试,而是对网络延迟进行测试。为了真正测试 Redis 的并发性能,需要使用多个 Redis 连接,或者使用 pipelining 来聚合多个命令。当然也可以使用多线程或者多进程。
我们使用 Python 脚本来作为 Redis 的测试工具,并采用每个进程一个 Redis 连接的方案。

测试脚本如下所示:

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
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import time
import datetime
from multiprocessing import Process
import redis


def write_worker(n):
print 'in write worker: %d, time: %s' % (n, datetime.datetime.now())
r = redis.StrictRedis(host='10.88.115.114', port=6380)
s = 'a' * 1024 * 1024 * 10
t1 = time.time()
bigkey = 'bigkey%d' % (n + 100)
r.set(bigkey, s)
t2 = time.time()
print 'write time: %f' % (t2 - t1)


def read_worker(n):
print 'in read worker: %d, time: %s' % (n, datetime.datetime.now())
r = redis.StrictRedis(host='10.88.115.114', port=6380)
t1 = time.time()
bigkey = 'bigkey%d' % n
r.get(bigkey)
t2 = time.time()
print 'read time: %f' % (t2 - t1)


def test():
read_processes = []
for i in range(0, 100):
read = Process(target=read_worker, args=(i,))
read.start()
read_processes.append(read)

write_processes = []
for i in range(0, 100):
write = Process(target=write_worker, args=(i,))
write.start()
write_processes.append(write)

for write in write_processes:
write.join()
for read in read_processes:
read.join()
print 'end press test'


if __name__ == '__main__':
test()
阅读全文 »

最近需要使用C++来访问 Redis,查找了一些开源C/C++ 的 Redis 客户端,发现 hiredis 目前的社区活跃度较高,且比较轻量级,就决定选用这款客户端了。

安装

以 Mac OS 为例,说明如何安装 hiredis。

  1. 下载 hiredis 的代码
1
git clone https://github.com/redis/hiredis.git
  1. 编译安装
1
2
make
make install

第一个例子

下面的例子中,首先创建了一个连接 Redis 的实例,然后通过这个连接向 Redis 发送命令。取得 Redis 的返回后,需要记住将相关的返回对象和连接对象释放,避免资源的泄漏。

阅读全文 »

根据 Web 应用架构设计的风格,可以将 Web 服务划分为以功能为中心的服务以及以资源为中心的服务。

以功能为中心的服务

以功能为中心的 Web 服务历史由来已久,它是指能够调用远程机器上的功能或者对象方法,而无须知道这些功能或者对象是如何实现的。
我们了解的 CORBA(公共对象请求代理体系架构),XML - RPC(可扩展标记语言——远程过程调用),DCOM(分布式组件对象模型),SOAP(简单对象访问协议)等技术都是关注于如何让客户端代码调用一个在远程机器上实现的功能。
本文我们重点讲述 SOAP 协议。

SOAP

SOAP 基于 XML 和 HTTP,使用 XML 来实现消息描述,使用 HTTP 实现消息传输。SOAP 最重要的一个特性是允许 Web 服务基于自身的约定描述完成服务发现并生成集成代码。

图1所示为 SOAP 的工作原理。


图1:SOAP 的工作原理

Web 服务提供者暴露一组 XML 资源,诸如 Web 服务定义语言(WSDL)文件,XML 模式定义(XSD)文件。WSDL 描述方法与可用的终端信息,XSD 描述请求与响应中用到的数据结构。这些资源文件就是 Web 服务的约定,客户端代码如何生成,Web 服务如何调用,这些必要的信息全部都在这些资源文件中。

举个例子,如果我们使用 Java 开发客户端,那么我们可以使用专门的工具和库,下载这些 Web 服务定义资源文件,然后生成 Java 本地客户端代码。这些代码就是一些 Java 类,可以被编译并用在应用程序中。在这些代码的背后,会依赖到 SOAP 相关的一些库,这些库封装了数据序列化,身份认证,路由,错误处理等各种实现细节。客户端无须知道自己调用的是远程 Web 服务,只需要简单地依赖基于 Web 服务约定(WSDL 和 XSD文件)生成的 Java 代码就可以使用这些远程服务器提供的功能了。

阅读全文 »

一开始自己的网站 leehao.me 托管在 GitHub 上面,考虑到 GitHub 的访问可能不稳定,另外,也是抱着学习的目的,就将网站迁移到阿里云上面来了。

网站的总体结构如下图所示:

域名 leehao.me 指向负载均衡 SLB(Server Load Balancer)的 IP,在 SLB 后面部署两台后端服务器 ECS(Elastic Compute Service),ECS 上部署 Hexo 的静态资源。

SLB 的监听配置如下:

阅读全文 »

由于工作调动关系,需要了解 gSOAP 的使用,写个文章记录一下学习的心得,免得以后忘记。

安装

由于本人使用的是 Mac OS 系统,故以 Mac OS 为例说明如何安装 gSOAP。

1)下载 gSOAP

可以在 https://sourceforge.net/projects/gsoap2 下载最新版本的 gSOAP。

2)安装 flex, bison, openssl

可以使用brew install进行安装:

1
brew install flex bison openssl

3)编译安装 gSOAP

解压上面下载的 gSOAP,然后执行下面的命令:

1
2
3
4
cd gsoap-2.8
./configure --with-openssl=/usr/local/opt/openssl
make
sudo make install

安装完成,会出现以下的提示:

阅读全文 »

闲逛网上文章时,发现可以对Mac的终端进行改造。之前自己一直使用默认的Mac终端 ,并没有过多的配置,使用起来并不是很便捷,这也更加坚定了自己对终端进行改造的决心。

开门见山,先直接上一幅改造后终端的最终效果图:

为了达到上图改造后的效果,需要安装以下几个软件:

我们逐个进行介绍。

阅读全文 »
0%