Добрый день.
Как отметил коллега, каждый микросервис может быть написан на разных языках и это нормальная практика.
Теперь, что касается Java. Ну во-первых, касаемо используемых фреймворков. Удобонее писать микросервисы на Spring (Spring Boot) или Quarkus.
Приложения могут быть запущены в Tomcat, Jetty, Netty, GlassFish и т.д.
По умолчанию в Spring Boot есть embedded зависимость для самозапускающихся приложений. Например, embedded tomcat.
В Node.js сервисы обычно запускают в Docker, я слышал что в Java для этого используют Tomcat, в чем разница между ними? (или это вообще разные вещи?)
Это разные вещи. Приложения написанные в Java тоже можно контейнезировать и запустить внутри докера.
В Node.js для запуска сервера обычно используют express.js, а что для этого используется в Java? (Servlet, Spring или что-то еще?)
Сервлет, есть сервлет. Spring это фреймворк. А для запуска используется то, что я указал выше.
Допустим я сделал сервер на Servlet, как запускать это в docker контейнере?
https://sematext.com/blog/docker-java-tutorial/
Если я запущу 10 Java сервисов в отдельных Docker контейнерах, в каждом из них будет отдельный экземпляр JRE\JDK?
В этом и есть суть докер контейнера и микросервисов. Каждый микросервис является автономным модулем. Каждый контенер является полноценной системой.
Преимущество Java мискросервисов перед Node.js? (или наоборот)
Не хочу холиварить. У каждого языка и фреймворка свои преимущества. Потому, микросервисы могут быть написаны на разных языках и не только на ноде, но и на Rust, Kotlin, Go и т.д.
https://runnable.com/docker/java/dockerize-your-ja...