[[getting-started]]
= Getting Started

This section contains information that should help you get going with `Reactor Netty`. It
includes the following information:

* xref:getting-started.adoc#getting-started-introducing-reactor-netty[Introducing Reactor Netty]
* xref:getting-started.adoc#prerequisites[Prerequisites]
* xref:getting-started.adoc#getting-started-understanding-bom[Understanding the BOM and versioning scheme]
* xref:getting-started.adoc#getting[Getting Reactor Netty]

[[getting-started-introducing-reactor-netty]]
== Introducing Reactor Netty

Suited for Microservices Architecture, `Reactor Netty` offers
backpressure-ready network engines for `HTTP` (including Websockets), `TCP`, and `UDP`.

[[prerequisites]]
== Prerequisites

`Reactor Netty` runs on `Java 8` and above.

It has transitive dependencies on:

* Reactive Streams v1.0.4
* Reactor Core v3.x
* Netty v4.1.x

[[getting-started-understanding-bom]]
== Understanding the BOM and versioning scheme

`Reactor Netty` is part of the `Project Reactor BOM` (since the `Aluminium` release train).
This curated list groups artifacts that are meant to work well together, providing
the relevant versions despite potentially divergent versioning schemes in these artifacts.

NOTE: The versioning scheme has changed between 0.9.x and 1.0.x (Dysprosium and Europium).

Artifacts follow a versioning scheme of `MAJOR.MINOR.PATCH-QUALIFIER` while the BOM is versioned using a CalVer inspired scheme of `YYYY.MINOR.PATCH-QUALIFIER`, where:

 * `MAJOR` is the current generation of Reactor, where each new generation can bring fundamental changes to the structure of the project (which might imply a more significant migration effort)
 * `YYYY` is the year of the first GA release in a given release cycle (like 1.0.0 for 1.0.x)
 * `.MINOR` is a 0-based number incrementing with each new release cycle
 ** in the case of projects, it generally reflects wider changes and can indicate a moderate migration effort
 ** in the case of the BOM it allows discerning between release cycles in case two get first released the same year
 * `.PATCH` is a 0-based number incrementing with each service release
 * `-QUALIFIER` is a textual qualifier, which is omitted in the case of GA releases (see below)

The first release cycle to follow that convention is thus `2020.0.x`, codename `Europium`.
The scheme uses the following qualifiers (note the use of dash separator), in order:

 * `-M1`..`-M9`: milestones (we don't expect more than 9 per service release)
 * `-RC1`..`-RC9`: release candidates (we don't expect more than 9 per service release)
 * `-SNAPSHOT`: snapshots
 * _no qualifier_ for GA releases

NOTE: Snapshots appear higher in the order above because, conceptually, they're always "the freshest pre-release" of any given PATCH.
Even though the first deployed artifact of a PATCH cycle will always be a -SNAPSHOT, a similarly named but more up-to-date snapshot
would also get released after eg. a milestone or between release candidates.

Each release cycle is also given a codename, in continuity with the previous codename-based
scheme, which can be used to reference it more informally (like in discussions, blog posts, etc...).
The codenames represent what would traditionally be the MAJOR.MINOR number. They (mostly)
come from the https://en.wikipedia.org/wiki/Periodic_table#Overview[Periodic Table of
Elements], in increasing alphabetical order.

NOTE: Up until Dysprosium, the BOM was versioned using a release train scheme with a codename followed by a qualifier, and the qualifiers were slightly different.
For example: Aluminium-RELEASE (first GA release, would now be something like YYYY.0.0), Bismuth-M1, Californium-SR1 (service release
would now be something like YYYY.0.1), Dysprosium-RC1, Dysprosium-BUILD-SNAPSHOT (after each patch, we'd go back to the same snapshot version. would now be something
like YYYY.0.X-SNAPSHOT so we get 1 snapshot per PATCH)

[[getting]]
== Getting Reactor Netty

As xref:getting-started.adoc#getting-started-understanding-bom[mentioned earlier], the easiest way to use
`Reactor Netty` in your core is to use the `BOM` and
add the relevant dependencies to your project. Note that, when adding such a dependency,
you must omit the version so that the version gets picked up from the `BOM`.

However, if you want to force the use of a specific artifact's version, you can specify
it when adding your dependency as you usually would. You can also forego the `BOM` entirely
and specify dependencies by their artifact versions.

[[maven-installation]]
=== Maven Installation

The `BOM` concept is natively supported by `Maven`. First, you need to import the `BOM` by
adding the following snippet to your `pom.xml`. If the top section
(`dependencyManagement`) already exists in your pom, add only the contents.

[source,xml,subs=attributes+]
----
<dependencyManagement> <1>
    <dependencies>
        <dependency>
            <groupId>io.projectreactor</groupId>
            <artifactId>reactor-bom</artifactId>
            <version>{reactorReleaseTrain}</version> <2>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
----
<1> Notice the `dependencyManagement` tag. This is in addition to the regular
`dependencies` section.
<2> As of this writing, `{reactorReleaseTrain}` is the latest version of the `BOM`.
Check for updates at https://github.com/reactor/reactor/releases.

Next, add your dependencies to the relevant reactor projects, as usual (except without a
`<version>`). The following listing shows how to do so:

[source,xml]
----
<dependencies>
    <dependency>
        <groupId>io.projectreactor.netty</groupId>
        <artifactId>reactor-netty-core</artifactId> <1>
        <2>
    </dependency>
</dependencies>
<dependencies>
    <dependency>
        <groupId>io.projectreactor.netty</groupId>
        <artifactId>reactor-netty-http</artifactId>
    </dependency>
</dependencies>
----
<1> Dependency on `Reactor Netty`
<2> No version tag here

[[gradle-installation]]
=== Gradle Installation

The `BOM` concept is supported in Gradle since version 5.
The following listing shows how to import the `BOM` and add a dependency to `Reactor Netty`:

[source,groovy,subs=attributes+]
----
dependencies {
    // import a BOM
    implementation platform('io.projectreactor:reactor-bom:{reactorReleaseTrain}') <1>

    // define dependencies without versions
    implementation 'io.projectreactor.netty:reactor-netty-core' <2>
    implementation 'io.projectreactor.netty:reactor-netty-http'
}
----
<1> As of this writing, `{reactorReleaseTrain}` is the latest version of the `BOM`.
Check for updates at https://github.com/reactor/reactor/releases.
<2> There is no third `:` separated section for the version. It is taken from the `BOM`.

[[milestones-and-snapshots]]
=== Milestones and Snapshots

Milestones and developer previews are distributed through the `Spring Milestones`
repository rather than `Maven Central`. To add it to your build configuration
file, use the following snippet:

.Milestones in Maven
[source,xml]
----
<repositories>
	<repository>
		<id>spring-milestones</id>
		<name>Spring Milestones Repository</name>
		<url>https://repo.spring.io/milestone</url>
	</repository>
</repositories>
----

For Gradle, use the following snippet:

.Milestones in Gradle
[source,groovy]
----
repositories {
  maven { url 'https://repo.spring.io/milestone' }
  mavenCentral()
}
----

Similarly, snapshots are also available in a separate dedicated repository
(for both Maven and Gradle):

.-SNAPSHOTs in Maven
[source,xml]
----
<repositories>
	<repository>
		<id>spring-snapshots</id>
		<name>Spring Snapshot Repository</name>
		<url>https://repo.spring.io/snapshot</url>
	</repository>
</repositories>
----

.-SNAPSHOTs in Gradle
[source,groovy]
----
repositories {
  maven { url 'https://repo.spring.io/snapshot' }
  mavenCentral()
}
----

[[support]]
== Support and policies

The entries below are mirroring https://github.com/reactor/.github/blob/main/SUPPORT.adoc

include::partial$SUPPORT.adoc[leveloffset=2,lines=11..230]
