Sure async/await makes your casde more complicated .
That reason why, I prefer use Go for I/O wait application because I don't need to manage this Go doesn't it fore me.
My code still readable and simple.
Lol, I let you use java spring boot technology. It is really bloat (ram, cpu, disk, infamous slowly startup and jit optimization, complex tuning eg. thread pool and so on). Good luck.
Discover: first request broacasted by client in order to get lease (@ip and others configurations)
Offer: response bradcasted by server with the lease (@ip and others configurations)
Request: broacasted by the client in order to confirm the usage of this lease(from this server, others server can release other lease)
Ack: ack from server