Visitas: 142  
Tiempo total: 2 días con 10:17:55 hrs  

A continuación una introducción de como funciona Apache Thrift Server, dejando aun lado la definición de Wikipedia investigaremos poco más mostrando el código que sea necesario para entender que es lo que hace y que nos permite hacer Thrift Server.

Definición

Es un lenguaje de definición de interfaces y un protocolo de comunicación binaria utilizado para crear servicios en varios tipos de lenguajes. Originalmente Apache Thrift fue desarrollado por Facebook para poder obtener escalabilidad (adaptabilidad) en el desarrollo de servicios (web) entre distintos lenguajes sin perder la compatibilidad. Finalmente fue donado a Apache estando ahora disponible como Open Source.

Algunos de los lenguajes que soporta son: C#, C++, Cappuccino, Cocoa, Delphi, Erlang, Go, Haskell, Java, Node.js, OCaml, Perl, PHP, Python, Ruby and Smalltalk.

Que es?

Básicamente es una herramienta de desarrollo de software que permite la creación de servicios web de una manera bastante sencilla (con pocas instrucciones) utilizando un comando de terminal. Consiste en crear el servicio web con las funciones que utilizaremos, estas funciones devolverán los valores que indicamos o simplemente serán métodos (que no devuelven valores). A continuación un ejemplo de que es en si el lenguaje que utiliza Apache Thrift Server:

namespace py os2

service proyecto{
string hello(),
string fUpdate(1:i32 instruccion),
string fReport(1:i32 servidor)
}

Una de las características de Thrift Server es que nos permite seleccionar el lenguaje en que queremos los servicios web, en este caso seleccioné Python, pero como funciona? El condigo anterior muestra mi servicio web “proyecto” el cual tendrá tres funciones, una de prueba hello() que devolverá un simple string “mundo”, fUpate que recibe un entero (i32) al igual que fReport (que recibe un entero).

Si alguna de las funciones del servicio web necesita recibir mas valores la sintaxis seria la siguiente:

string fUpdate(1:i32 instrucción, 2:i32 valor, 3:i32 parametro)

A continuación la magia y resumen de Apache Thrift Server, el archivo con instrucciones Thrift Server lo guardamos con la extensión .thrift (hello.thrift) y ejecutamos la siguiente instrucción:

thrift -r --gen py hello.thrift

Lo que crea esta instrucción es una gema de archivos Python (Folder gen-py/), los necesarios para publicar el servicio web.

El servidor Python

Espero que el lector tenga los conocimientos básicos acerca de Python, publicando la implementación del servidor con el código generado:

#!/usr/bin/env python

import sys
import redis
import requests
sys.path.append('./gen-py')

from os2 import proyecto
from os2.ttypes import *

from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer

r = redis.StrictRedis(host='192.168.122.60', port=6379, db=0)

class proyectoHandler:
def __init__(self):
pass
#self.log = {}

def hello(self):
return "world"

def fUpdate(self, instruccion):
if instruccion == 0:
r.decr('count')
if instruccion == 1:
r.incr('count')

# supdate.count = r.get('count')
return r.get('count')

def fReport(self, servidor):
# 0 Redis Right 
ip_rr="192.168.122.61"
# 1 Redis Master
ip_rm='192.168.122.60'
# 2 Thrift Left
ip_tl='192.168.122.237'
# 3 Thrift Right
ip_tr='192.168.122.90'
# 4 Haproxy
ip_hp='192.168.122.204'

# 0 Default
ip=ip_rr
nodejs="8000"
if servidor == 1:
ip=ip_rm
if servidor == 2:
ip=ip_tl
if servidor == 3:
ip=ip_tr
if servidor == 4:
ip=ip_hp
url="http://"+ip+":"+nodejs
response = requests.get(url)
return response.text

handler = proyectoHandler()
processor = proyecto.Processor(handler)
transport = TSocket.TServerSocket(port=9090)
tfactory = TTransport.TBufferedTransportFactory()
pfactory = TBinaryProtocol.TBinaryProtocolFactory()

server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)

# You could do one of these for a multithreaded server
#server = TServer.TThreadedServer(processor, transport, tfactory, pfactory)
#server = TServer.TThreadPoolServer(processor, transport, tfactory, pfactory)

print 'Starting the server...'
server.serve()
print 'done.'

En efecto! Te has dado cuenta, mi ejemplo utiliza una base de datos Redis. Para mantener el limite en esta publicación (Aunque mi implementación Redis es bastante simple) explicare como funciona el servidor (y no Redis):

import sys
import redis
import requests
sys.path.append('./gen-py')

from os2 import proyecto
from os2.ttypes import *

from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer

La cabecera del documento muestra el import redis, que es utilizado para crear la conexión a la base de datos con la siguiente instrucción:

r = redis.StrictRedis(host='192.168.122.60', port=6379, db=0)

Ahora observamos las siguientes instrucciones que no tienen relación todavía con Apache Thrift Server: import requests es utilizado para obtener la respuesta HTML de las direcciones indicadas por la instrucción:

response = requests.get(url)
return response.text

La función fReport, recibe de los servidores indicados una respuesta en JSON utilizando Node.js, permitiendo la lectura de los módulos de kernel instalados sus sistemas operativos, informado al usuario el estado de la memoria y uso de CPU.

A continuación observamos:

from os2 import proyecto
from os2.ttypes import *

Esto significa que importamos el código generado de nuestro servicio web (que esta en la carpeta llamada os2). Esto nos permite simplemente implementar el servicio web de la siguiente manera:

class proyectoHandler:
def __init__(self):
pass

def hello(self):
return "world"

El ejemplo anterior muestra únicamente el Hola mundo, recordamos que nuestro servicio web se llamaba proyecto, entonces la clase que utilizaremos aquí se llamara proyectoHandler.

La función fUpdate muestra un ejemplo de que podríamos hacer con los servicios web, una implementación básica:

def fUpdate(self, instruccion):
if instruccion == 0:
r.decr('count')
if instruccion == 1:
r.incr('count')
return r.get('count')

Observamos que de acuerdo al entero recibido, se incremente o decrementa una variable en la base de datos Redis, retornando el valor final como String. Las ultimas instrucciones muestran el código necesario para iniciar el servidor en el puerto indicado, debemos tener en cuenta el nombre que utilizamos para definir el servicio web y así cambiar las instrucciones de acuerdo a nuestros requerimientos.

Conclusión

Básicamente esta publicación consistió en que es y como crear servicios web con Apache Thrift Server, puedo resumir que es una herramienta que nos permite quemar el código de una manera bastante rápida para poder crear servicios web, Thrift Server nos permite enfocarnos en la implementación de nuestro código, dejando en nuestras manos la selección del mejor lenguaje de acuerdo a nuestros requerimientos y condiciones.

Referencias

[http://en.wikipedia.org/wiki/Apache_Thrift]

0