LINUX.ORG.RU

С чего начать использование Java на сервере

 ,


4

5

После возвращения из командировки у меня есть целая неделя свободного времени. Решил посвятить ее воплощению одной своей старой идеи.

Для этого необходимо, в том числе, написать серверный кусок для приложения. Решил попробовать новую для себя технологию - Java.

Задача сервера - принимать входящие сообщения от клиентов и обрабатывать их в рамках сессии. Протокол придумаю сам на базе чего-то готового (xml/json). В числе прочего сервер будет читать/писать реляционную БД.

Собственно вопрос, что уважаемые гуру посоветуют почитать и какие технологии/программы исопльзовать.

В серверной яве - полный 0, саму яву в целом знаю, но ничего серьезного на ней не писал.

★★★★★
Ответ на: комментарий от Legioner

Хотелось бы увидеть ссылки на конкретные статьи. Готов рассмотреть, в том числе, хабр.

trex6 ★★★★★
() автор топика

Говорят, на джаве сейчас модненько делать такие вещи на play...

Corey
()

Если нужно просто и быстро - прочитай что такое сервлеты. В любом туториале по сервлетам тебе расскажут как написать веб-хелловорлд. Потом туториал по JDBC и отправляешь чистый SQL в свою БД. Всё.

Если нужен Ынтерпрайз - то JDBC заменить на Hibernate. Фронтенд можно заменить на Spring (как - длинная история, нужно гуглить туториалы, Ынтерпрайзные люди должны страдать). Сервер можно заменить на какой-нибудь Jetty.

Если нужно хипстерство - то вместо Java использовать Scala, и соответственно прочитать туториал по Play Framework 2. В комплекте с ним есть все-все-все, включая встроенный production-grade сервер.

Если экстремальное хипстерство (которое я рекомендую, но не уверен что тебе это надо) - взять Clojure и любой из его легковесных веб-ферймворков. Полезные ссылки по Clojure (просто оставлю это здесь©):

http://stackoverflow.com/questions/3180688/what-is-the-good-starting-point-to...

https://github.com/weavejester/compojure
https://github.com/clojure-liberator/liberator

http://www.webnoir.org/
http://www.luminusweb.net/

https://github.com/ring-clojure/ring
http://github.com/brentonashworth/sandbar
https://github.com/cgrand/enlive

stevejobs ★★★★☆
()

И да, восьмая ява скорей всего будет уже этой весной, если у тебя там нет ничего mission-critical, что за секунду простоя с тебя снимут шкуру и отымеют в задницу, можешь качать превью Java8 и прямо сейчас использовать фишки типа замыканий. В качестве бонуса получишь, что Java8 x64 намного быстрей работает. Идея о ней уже всё знает, проблем не будет. https://jdk8.java.net

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

Ты бы лучше рассказал, что надо на серваке поставить, как код компилить и заливать. Типа «тебе понадобится tomcat, ставишь его из репы, настраиваешь на такой-то порт, заливаешь в такую-то директорию свой байткод и начинаешь тестить». Наверняка ведь в интернете куча таких статей, но я что-то не могу ничего подобного найти.


Я пока что только Java буду использовать, цель - проверить ее на реальных задачах.

trex6 ★★★★★
() автор топика
Ответ на: комментарий от trex6

конкретные статьи

servlets, jdbc - любые хэлловорлды. google://servlets tutorial, google://jdbc tutorial. В остальном нужно разбираться самостоятельно. Если захочется Play Framework, Hibernate или Spring, отличные quickstart'ы есть на их официальных сайтах. Хотя что касается Спринга, непонятно, применимо ли к нему слово «quickstart», вводный туториал там делать несколько часов надо =)

stevejobs ★★★★☆
()

Wildfly, JavaEE 7 - божественно. Там есть няшечка JAX-RS, у которого красивый REST

vertexua ★★★★★
()

Очень много словоблудства. Куча библиотек, но как только начинаешь их все подключать просто тонешь в строках. Особенно хибернейт, спринг.

А из простого поверх бд - jdbc (любая книжка по жабе), на сервер можно взять apache mina.

stave ★★★★★
()
Ответ на: комментарий от trex6

Качаешь Томкат и запускаешь, он запускается на порту 8080. Потом делаешь сервлет (по любому туториалу, например: http://helloworldprograms.blogspot.ru/2010/08/servlet-hello-world.html). Заливаешь его в директорию tomcat/webapps/yourappname. Идешь на http://localhost:8080/yourappname, радуешься. Потом гуглишь туториал по JDBC (например, http://docs.oracle.com/javase/tutorial/jdbc/basics/), заменяешь строчку «хэлловорлд» в твоем предыдущем опыте на обращение к БД. Собственно, всё.

Это где-то в 100 раз проще, чем аналогичная настройка PHP и в тысячу раз проще аналогичной настройки C++. Все просто работает с первого раза.

stevejobs ★★★★☆
()
Последнее исправление: stevejobs (всего исправлений: 1)
Ответ на: комментарий от stevejobs

Эм... Судя по всему в этом случае ответ будет возвращаться в виде HTTP. А просто серверное приложение развернуть, которое само будет рулить протоколом? HTTP - это не совсем то, что бы я хотел. Я планировал соединение с клиентом на всем протяжении сессии не разрывать.

В любом случае статью посмотрю.

trex6 ★★★★★
() автор топика
Последнее исправление: trex6 (всего исправлений: 1)

Дэвид Хеффельфингер «Разработка приложений Java EE 6 в NetBeans 7», ДМК Пресс, 2013 г. ISBN 978-5-94074-914-1, 978-5-94074-914-1

iZEN ★★★★★
()
Ответ на: комментарий от trex6

Ну да, это веб-сервисы.

Если правильно понял что ты хочешь, то

1) Смотришь как в яве писать хэлловорлд и запускать его (лучше сразу научиться делать это в IDE, типа IntelliJ IDEA Community Edition, а не в Емаксе, ибо в яве без IDE ты будешь страдать)

2) Потом читаешь туториал, как делать клиент-серверную пару (например, http://docs.oracle.com/javase/tutorial/networking/sockets/) (процесс аналогичен любому другому языку) и заменяешь этим кодом твою строчку «хэлловорлд».

3) PROFIT

4) Более подробно можно почитать опять же туториалы (google://java network programming) либо книжки-кукбуки вроде этого: http://www.amazon.com/Java-Network-Programming-Third-Edition/dp/0596007213

stevejobs ★★★★☆
()
Ответ на: комментарий от trex6

Есть же просто Servlet.

Defines a generic, protocol-independent servlet. To write an HTTP servlet for use on the Web, extend HttpServlet instead.

crowbar
()
Ответ на: комментарий от another

Я пока еще до своего сервака в датацентре не дорос ((

trex6 ★★★★★
() автор топика
Ответ на: комментарий от iZEN

Для NetBeans 7.4 под примеры нужно тюнить конфигурацию (файл netbeans/etc/netbeans.conf):

netbeans_default_options="-J-client -J-Xss32m -J-Xms2048m -J-Xmx2048m -J-XX:-HeapDumpOnOutOfMemoryError -J-XX:HeapDumpPath=/dev/null -J-Dsun.java2d.noddraw=true -J-XX:+UseG1GC -J-XX:MaxGCPauseMillis=50 -J-XX:GCPauseIntervalMillis=200 --laf javax.swing.plaf.nimbus.NimbusLookAndFeel"

netbeans_jdkhome=«/<путь к>/openjdk7»

iZEN ★★★★★
()
Ответ на: комментарий от vertexua

Всё равно это надо знать, как работает внутри. А то получится «уличная магия» с/без Дэвида Блэйна.

iZEN ★★★★★
()
Ответ на: комментарий от vertexua

Аффтару нужно не http, а постоянное соединение. Что хорошего высокоуровневого ты знаешь на тему постоянных соединений?

stevejobs ★★★★☆
()

Если будешь использовать Spring, то для быстрого старта, предлагаю взглянуть на Spring Boot: http://projects.spring.io/spring-boot/ В youtube-е где-то был скринкаст от авторов. Плюс на сайте http://spring.io/guides можно найти неплохие вводные туториалы по Spring.

За Hibernate браться не советую, т.к. на него можно много времени убить, если до этого опыта не было.

php-coder ★★★★★
()

ТС, тебе не нужны сервлеты и даже JAX-RS. Тебе нужны веб-сокеты.

В Java EE 7 супер-няшные стандартизованные веб-сокеты, умеющие прозрачно преобразовывать из/в JSON и XML. Пишется всё моментально. Посмотри видеотуториал с Java EE 7 launch.

anonymous
()
Ответ на: комментарий от maxcom

Если бы этот список еще снабдить парочкой статей для совсем уж начинающего, как подобную инфраструктуру можно быстро развернуть на своем небольшом VPS-сервере, это было бы совсем круто.

trex6 ★★★★★
() автор топика
Ответ на: комментарий от trex6

Если не нужен HTTP, значит не нужен appserver, servlets и прочая муть, всё, что нужно, есть в стандартной библиотеке. Разве что JSON вроде ещё не впихнули (хоть примитивный вариант и пишется за полчаса, но лучше готовое).

Поэтому качай любую IDE (рекомендую Intellij Idea Community Edition), JDK (рекомендую 6 от оракла для начала) и начинаешь писать. По любым библиотекам и классам в интернете 1000 и 1 туториал и миллион вопросов с ответами на StackOverflow, напороться на что-то неизвестное просто нет шансов. Заморачиваться с чем то тоже смысла нет. Ко всем классам есть документация, практически ко всем есть исходный код, контрол+клик по нужному классу/методу и разбирайся, как устроено. Если понимаешь, как работают сокеты в С, проблем никаких не будет, в джаве просто обвязки вокруг этих сокетов. Всякое NIO использовать не рекомендую.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Да с этим то все понятно. Т.е. я должен буду в одном приложении уместить все, начиная с открытия основного сокета и заканчивая обработкой отдельных запросов? Я надеялся, что для Java уже есть решения, где я наследуюсь от некоего класса и мне достаточно переопределить

onClientConnected
onRequest

и все. При этом экземпляр класса создается для каждого нового клиента и существует на протяжении всего соединения.

trex6 ★★★★★
() автор топика
Последнее исправление: trex6 (всего исправлений: 1)
Ответ на: комментарий от trex6

Да с этим то все понятно. Т.е. я должен буду в одном приложении уместить все, начиная с открытия основного сокета и заканчивая обработкой отдельных запросов?

Да. Каждая операция это одна-две строчки.

Я надеялся, что для Java уже есть решения, где я наследуюсь от некоего класса и мне достаточно переопределить

Может я чего не понимаю, но сервер пишется в пару десятков строк. Зачем для этого какое-то «решение», не знаю. Тебе достаточно отнаследовать класс от Runnable, и в классе сервера написать цикл из нескольких строк - получили входящего клиента, запустили поток и передали ему новый сокет-соединение с клиентом.

Решения имеет смысл применять, когда они дают достаточно много функционала. Например реализовывать HTTP это гемор. Миллион тонкостей. Нафиг не надо такое самому делать, проще готовые сервлеты использовать. Если хочется какие-нибудь асинхронные сокеты, чтобы держать миллион вялых соединений в паре десятков потоков, такое скорее всего тоже в каком-нибудь Netty есть. А так - задача простая, и решаться должна просто. Особенно если нет понимания основ, на которых базируется Spring и всё остальное.

Можно и Spring без понимания сервлетов использовать, знаю одного, он не представляет, как работает DI - магия и всё, сами собой инициализируются приватные поля. Но я против такого подхода. Человек при наступлении нетривиальной проблемы просто останавливается и ничего не делает, пока ему не помогут, т.к. его знаний не хватает, чтобы даже понять, куда смотреть.

Legioner ★★★★★
()
Ответ на: комментарий от trex6

Зря так пренебрежительно к HTTP. С голыми сокетами проблем как бы не больше получится: открыл, закрыл, эксепшен словил, ресурсы закрыть сам забыл. Низкоуровневщина.

Если нужна постоянная сессия, то можно sockets.io воспользоваться. Будет или websockets (самое то), или же, если их нема, то эмуляция на AJAX-запросах.

Реализаций, подозреваю, несколько, можно взять первую попавшуюся, https://github.com/mrniko/netty-socketio . Клиент или браузерный, или же снова кофейный: https://github.com/Gottox/socket.io-java-client .

Ну и для небольшого приложения городить яву себе дороже. Можно node.js вместо этого потыкать палочкой. Перспективно, хипстерно и молодежно. Минимум конфигов, а sockets.io и вовсе родной.

anonymous
()
Ответ на: комментарий от Legioner

Зачем предлагать JDK, который официально уже не поддерживается?

Что значит не использовать «всякое» NIO? В Java 7 встроен новый API NIO.2.

iZEN ★★★★★
()
Последнее исправление: iZEN (всего исправлений: 2)
Ответ на: комментарий от Legioner

рекомендую 6

что?!... Почему тогда уж сразу не 1.2? Ну и на кладбище парочку могил разрыть для антуража.

stevejobs ★★★★☆
()
Последнее исправление: stevejobs (всего исправлений: 1)
Ответ на: комментарий от stevejobs

Аффтару нужен REST, причем так как его делают нормальные люди. Я тоже не как нормальные иногда пишу на сервлете когда не хочется машинерию заводить и все остальное все равно на Guice, но это уже «мсье знает толк»

vertexua ★★★★★
()
Ответ на: комментарий от anonymous

Зря так пренебрежительно к HTTP. С голыми сокетами проблем как бы не больше получится: открыл, закрыл, эксепшен словил, ресурсы закрыть сам забыл. Низкоуровневщина.
Низкоуровневщина.

Мои основные языки - С/С++.

эмуляция на AJAX-запросах
node.js
Перспективно, хипстерно и молодежно
Клиент браузерный

Это все от меня очень и очень далеко. И пусть будет как можно дальше.

Зря так пренебрежительно к HTTP

HTTP рвет соединение после обработки запроса, чтобы обойти это (а мне необходимо непрерывное соединение) придется городить сессии и т.п. Смысла в этом особенного нет.

trex6 ★★★★★
() автор топика
Ответ на: комментарий от trex6

если тебе не перфоманс http неприятен, а просто не хочется писать руками, можно просто заюзать уже готовые решения. В частности, у готового HttpServlet (того что в туториале по написаню хэлловорлда) есть ассоциированный request, и дальше HttpSession session = request.getSession(true); В сессию можно session.putValue(value), например.

Потому что писать сокеты руками - это ад и ужос, и ничуть не проще чем в C++, вот как раз чтобы из этого ада сбежать и напридумывали всякие application server'ы, которые сами делают все за тебя, надо только в нужное место вписать свою бизнес-логику.

stevejobs ★★★★☆
()
Ответ на: комментарий от trex6

В сервлете так и есть, ну разве что там doGet, doPost, ....

onClientConnected - бессмысленно. Это логин? Подключение при запросе? Но факт подключения в HTTP и его переиспользования - это вопрос оптимизации, keep-alive, тебя не должно это волновать.

Для длительных сеансов пользователя есть сессии.

Но сервлеты слегка низкоуровневы, в них ты обрабатываешь потоки ввода, вывода, парсишь URL сам. Может тебе будет лучше использовать JAX-RS?

@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/myservice/data/{id}")
public MyData getData(@PathVariable("id") Long id){
   ...
}
vertexua ★★★★★
()
Ответ на: комментарий от trex6

Все-таки, если пишется клиент-сервер, стоит к вебсокетам присмотреться. Готовое решение, работает на фиговой туче платформ, большая часть проблем уже решена и лежит под капотом. Если вдруг приложению потребуется графика, а не просто туда-сюда данные гонять, то браузер подключится мгновенно. Но нет так нет.

Раз уж душа требует чистых сокетов, то можно взять Apache Mina. Она много где в сетевых проектах используется и, видимо, не зря. Стародавний пример с хабра: http://habrahabr.ru/post/130182/ .

Правда, сам я этой библиотекой не пользовался, так что ничего конкретнее по подскажу, но это точно лучше, чем голые сокеты, а раз http-шных заморочек не нужно, то и костылей с наследованием от jetty тоже не надоть.

anonymous
()
Ответ на: комментарий от anonymous

А вот это как раз то, что нужно! Большое спасибо за ссылку. Осталось только фабрику для json найти и все будет ок.

anonymous
()
Ответ на: комментарий от trex6

что именно тебе нужно, почему жава? Например, если вся соль в минимизации падений сервера, то можно гипервизором поставить Эрланг и подключить к нему ноды, написанные на Си и Жаве. Ерланг детектит повисшие ноды просто - если не отвечает на TCP heartbeat - считаем мертвой и разбираемся чо делать. Плюс бесплатно приобретается возможность прозрачно звать функции других нод, в других технологиях для этого пришлось бы городить огород из внутреннего апи. Если этого хватит, может тогда тебе даже не придется убегать с родных сей, а когда нужна медленная бизнес-логика - писать ее на ерланге (он медленный, на уровне похапэ, можно считать что ерланг есть такая ынтерпрайзная замена похапэ). Но тогда придется измазаться в Ерланге, да, неизвестно насколько это нужно.

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

Что я действительно собираюсь вынести из этого проекта - практический опыт работы с Java. Достаточно популярный язык, с виду не плохой, надо уже и на практике с ним познакомиться.

Ну и полезность от самого проекта возможно будет.

trex6 ★★★★★
() автор топика
Ответ на: комментарий от stevejobs

Например, если вся соль в минимизации падений сервера, то можно гипервизором поставить Эрланг и подключить к нему ноды, написанные на Си и Жаве.

Нормальные сервера Java EE кластеизуются искароппки.

iZEN ★★★★★
()

А есть ещё всякие play framework, vaadin - для джавы этого добра хоть жопой кушай.
Помню, одно время была ORM nanorm - отличная, легкая (в сравнении с монстроузным hibernate), но сейчас она уже умерла.
Ну и liquibase, куда же без него?
А если без шуточек, то mybatis (orm), liquibase (миграция бд) и spring (REST, контроллеры).

GblGbl ★★★★★
()
Последнее исправление: GblGbl (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.