¿Cuáles son algunas similitudes y diferencias entre Java RMI y los servicios web?

Pregunta interesante, por dónde empezar :). En el nivel más alto, WebServices y RMI son los mismos, ya que permiten a los usuarios tomar medidas en sistemas remotos.
El término WebServices es muy amplio y Java RMI es una tecnología muy específica, por lo que esta es una comparación difícil.

Una diferencia clave es que RMI permite a un usuario hacer un proxy para un objeto y conectarlo a un objeto remoto. Esto es muy poderoso. JMX usa RMI y he escrito interfaces de administración de clientes que se conectan directamente a aplicaciones y métodos de llamada. RMI tiene su propio transporte que es algo funky. Es como el modo pasivo FTP donde se conecta en un puerto y luego el servidor RMI le pide que vuelva a conectarse en un puerto aleatorio de alto nivel. Esto hace que RMI sea difícil con los firewalls. No codificas mucho para que RMI funcione, es solo parte de la plataforma. Crea objetos de cierta manera (usando patrones de bean) y registra estas clases y la JVM los hace accesibles de forma remota.

En los servicios web, el transporte es HTTP y generalmente hay más código involucrado para que las cosas sean neutrales en la plataforma. Realmente desea que un cliente de Python llegue a su servicio web para codificar sus resultados en json, xml, etc.

RMI es un sistema construido más completo y diseñado. Está hecho para conectarse a objetos remotos, llamar a sus métodos y obtener resultados sin tener que componer middleware y analizar json, etc. Los servicios web ofrecen una forma de hacer RMI a través de un medio http, pero la forma en que se hace exactamente esto depende principalmente del implementador y la gran cantidad de opciones SOAP, XML-RPC, etc.