8 preguntas (y respuestas) sobre ASP.NET vNext

Ayer, en las oficinas de Microsoft España estuve en una mesa redonda con el grupo de MSCoders Madrid, continuando la conversación del pasado hangout e intentando resolver las posibles dudas que genera la nueva versión de ASP.NET.

Entre todas las cosas que se plantearon, tomé nota de varias preguntas para intentar responderlas en esta artículo:

¿Qué compatibilidad tengo?

Por una parte hemos de distinguir dos elementos diferentes, el Full .NET CLR, que es como teníamos .NET hasta ahora, y el Core CLR, que es la nueva versión optimizada para web, multiplataforma, y que incluye las dependencias en nuestras aplicaciones.

Por su propia naturaleza, el Core CLR está más limitado (temas como el registro de windows o el acceso al event logger no son posibles con el mismo) pero si usamos el Full .NET CLR podremos utilizar muchas de las ventajas de las ventajas de la nueva plataforma sin perder compatibilidad con proyectos existentes.

¿Qué pasa con Webforms?

La tecnología detrás we WebForms sigue teniendo una dependencia muy fuerte con System.Web, y pese a que se ha anunciado cierto soporte por parte de vNext, lo más probable es que neceitemos el Full CLR para hacer uso de Web Forms, perdiendo las ventajas del Core CLR.

¿Seguro que requiere Mono?

De acuerdo con el equipo de desarrollo, la dependencia de Mono es, de momento, temporal, así comentan en el artículo de introducción a MVC5, Microsoft pondrá a disposición de los desarrolladores una versión del CLR que será independiente del proyecto Mono, como se comenta a continuación:

We will release a cross-platform runtime for Linux and Mac OS X. When released, this runtime will enable you to develop and run .NET apps on Mac and Linux devices. We will work closely with the Mono community on this effort. Until its release, you can use the Mono CLR for cross-platform development. 

¿Significa esto que Mono tal y como lo conocemos deja de existir?

No, además de desarrollo web, Mono permite hacer desarrollo de aplicaciones de consola, y de aplicaciones de escritorio en linux mediante GTK# y en Mad a través de Xamarin. De acuerdo con el artículo publicado en el blog del proyecto Mono la integración permitirá al proyecto avenzar en la parte común.

El resto de adaptación de APIs nativas, como puede ser una abstracción del registro de Windows, o el trabajo hecho hasta la fecha con WinForms, quedan fuera de .NET Core y la comunidad Mono seguirá trabajando en el soporte para los mismos.

¿Qué pasa con CoreCLR y Entity Framework, funciona?

La primera versión compatible con CoreCLR será a partir de Entity Framework 7, que supone un cambio tan radical sobre EF6 como el que hemos visto con ASP.NET, y que está actualmente en fase de desarrollo, como podemos ver en su wiki.

Lo que sí sabemos y podemos comprobar echando un vistazo a las issues reportadas en Github es que se está trabajando en ello, con lo cual podemos estar seguros que tendremos una versión de Entity Framework con CoreCLR.

¿Pero, si los ficheros ahora no pertenecen al proyecto, puedo ocultar carpetas del solution explorer?

En el estado actual de las herramientas, no. A partir de la CTP4 de Visual Studio 14 (ahora Visual Studio 2015) el fichero kProj no guarda registro de los ficheros, sino que se lee directamente el contenido de la carpeta.

Veremos qué ocurre con las siguientes Previews de la herramienta, ya que el soporte para el tooling es bueno, pero tiene aún cierto margen para la mejora.

¿Finalmente, puedo integrar Grunt como parte de mi proceso de release y publicación?

Sí, de hecho los chicos de Microsoft Open Tech tienen un artículo corto pero muy conciso sobre cómo podemos configurar grunt en nuestro TFS

¿Donde puedo encontrar más información?

Balanceo de carga y escalabilidad con ASP.net, primer contacto

Una de los problemas a los que no he tenido la oportunidad de enfrentarme, de manera profesional, es manejar carga de servidores web, así que esta semana me he dispuesto a montar un sistema para balancear dos sitios ASP.net alojados en Azure. En este artículo veremos cómo ponerlo en marcha. Ha sido una aventura muy interesante, así que te invito a que sigas leyendo.

La arquitectura

Últimamente tenemos muchas capas de servicios que nos abstraen de la lógica necesaria para todo esto: los Azure Websites pueden escalar automáticamente, Azure proporciona su propio balanceador de carga a través del componente Traffic Manager, y Amazon tiene su Elastic Load Balancer.

Para este escenario, sin embargo, quería montarlo de manera un poco más artesanal, y esta es la arquitectura:

  • Dos Azure Websites diferentes, uno alojado en North Europe y otro en West US.
  • Una máquina virtual, con Linux (aquí meteremos el balanceador de carga) alojada en East Asia.

¿Por qué Linux? Linux tiene una gran importancia en la actualidad en el área de servidores. Llevaba tiempo sin trabajar con él y además parecía divertido combinar las diferentes plataformas.

Identificando las instancias

Un detalle que puede pasar desapercibido si vamos a nuget.org, es que en el pie de página identifican el servidor en el que estamos (You are on XXXX), con lo cual, si refrescamos la página, veremos otro servidor.

nuget

Para esta prueba sería muy útil saber qué servidor está sirviendo los contenidos, así que lo primero que haremos será crear un proyecto por defecto de ASP.net, y sustituir la acción Index de HomeController por:

public ActionResult Index()
{
    ViewBag.Title = "Home Page";
    ViewBag.ServerName = System.Environment.MachineName;
    return View();
}

Por otro lado sustituimos el código de Index.cshtml (la vista) por:

<div class="jumbotron">
    <h1>Load balancing testing</h1>
    <p class="lead">You are on @ViewBag.ServerName</p>
</div>

El resultado (en local) es este:

Lb_local

Una vez que tenemos nuestro sitio funcionando, el siguiente paso es subirlo a dos servidores diferentes, que son en este caso:

Cada máquina tiene un identificador diferente, de esta manera, cuando hagamos el balanceo de carga, podremos saber en qué máquina estamos.

Agregando el balanceador

Para el balanceador he optado por un Ubuntu Server 12 hospedado en una máquina virtual también en Azure. Una de las cosas que no debemos olvidar es abrir el puerto 80 para poder recibir tráfico normal de Internet (para este ejemplo dejamos de lado temas relacionados con HTTPS, certificados SSL y similares). Con Linux tenemos muchas opciones. Estuve probando las siguientes:

Fair

Es una opción muy sencilla para empezar, pero tiene un problema, ya que necesita un componente en cada máquina que queremos balancear, lo cual nos limita el radio de acción. Puede que en otra ocasión…

Balance

A diferencia de Fair, no necesita un componente en cada máquina, lo que era un plus. Sin embargo, el hecho de estar basado en comandos y no en configuración no me acababan de convencer. Finalmente, no pude hacerlo funcionar por problemas de puertos, permisos y otros.

HAProxy

HAproxy es, según he podido leer, el balanceador más completo y configurable. Funciona mediante un fichero de configuración y necesita direcciones IP fijas, ya que, según los ejemplos, está pensado para que los servidores a balancear estén en la misma red. Después de varios intentos, no conseguí que el balanceador funcionara, así que desistí.

Apache

Por último, descubrí que Apache tiene un módulo específico para proxy y balanceo, que se parecía bastante a lo que necesitaba. Aunque parezca matar moscas a cañonazos, al final resultó ser bastante fácil de configurar.

Instalando y configurando Apache

El primer paso es instalar Apache en nuestro sistema:

sudo apt-get install apache2

El siguiente paso es habilitar los componentes necesarios para el balanceador:

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer

Una vez tenemos activados todos los componentes, debemos escribir la configuración al final (justo antes de la directiva </IfModule>) de /etc/apache2/mods-available/proxy.conf:

<VirtualHost *:80>
ProxyRequests off
<Proxy balancer://mycluster>
    # WebHead1
    BalancerMember http://scaledemo7844.azurewebsites.net:80

    # WebHead2
    BalancerMember http://scaledemoamerica.azurewebsites.net:80

                Order Deny,Allow
                Deny from none
                Allow from all

    ProxySet lbmethod=byrequests

</Proxy>
        ProxyPass / balancer://mycluster/
</VirtualHost>

Finalmente reiniciamos el servicio:

sudo apache2 restart

Si todo ha ido bien (y espero que sí), podemos acudir a http://ubuntubalancer.cloudapp.net/ (actualmente offline), donde accederemos indistintamente a cualquiera de las dos instancias y podremos ver su identificador.

Conclusiones

En este artículo hemos visto cómo podemos escalar nuestra página y usar un balanceador intermedio para gestionar las peticiones. Es un primer paso y todavía quedaría mucho por hacer. En el próximo artículo de esta serie, veremos cómo compartir la sesión entre las diferentes páginas que componen nuestro pequeño cluster.

Enlaces Interesantes: