Microservicios Java: una guía práctica

Puede usar esta guía para comprender qué son los microservicios de Java, cómo los desarrollará y creará. Y también obtenga una descripción general de las bibliotecas para desarrollar microservicios Java.


Nota: Probablemente no valga la pena leer un artículo de ~ 7000 palabras en un dispositivo móvil. Marcarlo y volver más tarde.


Contenido



Los fundamentos de los microservicios de Java


Para tener una idea real de los microservicios de Java, tiene sentido comenzar con lo más básico: el infame monolito en Java, qué es y cuáles son sus ventajas o desventajas.


¿Qué es un monolito de Java?


Imagine que está trabajando para un banco o una startup fintech. Proporciona a los usuarios una aplicación móvil que pueden usar para abrir una nueva cuenta bancaria.


Este código Java requiere una clase de controlador, que, de manera simplificada , se parece a la que se muestra a continuación.


@Controller
class BankController {

    @PostMapping("/users/register")
    public void register(RegistrationForm form) {
        validate(form);
        riskCheck(form);
        openBankAccount(form);
        // etc..
    }
}

Quieres:


  1. Validar el formulario de registro.
  2. Verifique el riesgo en la dirección del usuario para decidir si desea abrir una cuenta bancaria para él o no.
  3. Abrir cuenta bancaria

BankController bank.jar bank.war : , , . ( .jar / .war 1-100 ).


.jar — , Java.



Java ?


, Java . , :


  1. / / ...
  2. — ...

bank.jar , .


Java?


, . bank.jar JVM, . .


: « , Mono (lithic) Bank, , , , Java.


Java?


, riskCheck() BankController / bean- Maven / Gradle, . .


RiskCheck , , ( ).


  1. , 5-7 ?
  2. 100 1000 ?
  3. - ?

, , :


  1. — .
  2. , .

, : JVM, . JVM RiskCheck, JVM. .


?


Java ?


, : .


HTTP/REST


HTTP REST- , XML JSON — (, , Google Protocol Buffers).


REST-, , , : , .


Java REST?



JMS / , AMQP. , / SMTP.


, , , « », -, , , - .


Java?


: REST API Java


, , Java . , , HTTP-.


@Controller
class BankController {

    @Autowired
    private HttpClient httpClient;

    @PostMapping("/users/register")
    public void register(RegistrationForm form) {
        validate(form);
        httpClient.send(riskRequest, responseHandler());
        setupAccount(form);
        // etc..
    }
}

, , Java () : RiskCheck. JVM, . :



, Java Microservices: ( .jar .war) .


: ? ? ?


.


Java


. , .



— . , «» , — .


.


:


. :


  1. / / .
  2. , , , , , .
  3. , : , .

, Java- — .


  1. , « », , , , .
  2. « », .
  3. , PDF .

: -


UML- , . , , . ?


, , , , ().


, , , 7- Hibernate , , , .


, ? , , .


@simonbrown Twitter:


… , .
I'll keep saying this… if people can't build monoliths properly, microservices won't help.
Simon Brown


Java. , :


  1. , .
  2. , .
  3. : : , (: agile :) )

, Java .



, . Hadi Hariri (https://twitter.com/hhariri) «Extract Microservice» IntelliJ.



, , , , .



@Service
class UserService {

    public void register(User user) {
        String email = user.getEmail();
        String username =  email.substring(0, email.indexOf("@"));
        // ...
    }
}

Java


@Service
class UserService {

    @Autowired
    private HttpClient client;

    public void register(User user) {
        String email = user.getEmail();
        // now calling the substring microservice via http
        String username =  httpClient.send(substringRequest(email), responseHandler());
        // ...
    }
}

, , , Java HTTP, . , , : Java.


: .


, workflow ( )


Java .


: , () , CRM .


, , , XML.


XML- ():


  1. , XML
  2. : 1- ?
  3. XML
  4. XML ,
  5. , « » «, — »

, .


. , , RabbitMQ, .



, , , :


  1. XML-?
  2. ? ? API?
  3. , ? ?
  4. (, , ), , ?
  5. / .

, , , . :



, , .


...


  • , .
  • , , , .
  • , , .
  • , (. Java ?).
  • , — .

:


:


  • Netflix ( ) ...
  • , , Chaos Monkey, , 5 .
  • , @monzo 1500 , .

→ .


. .:
Chaos Monkey — Netflix stateless- — - . Chaos Monkey , .

.


— . (, ) , ( XML, XML, XML).


, , Java , , . .


, DevOps / / .


-


, : ( : ).


, XML Java, Haskell ( ), Erlang ( :) ).


, ( ), , , : .


, , Haskell , .


: . Fortune 500 Spring, « ». — , .


: , . : Kotlin Java ( JVM 100% ), Haskell Java.


Java


, . Java-, , — .jar / .war.


Java, , , JVM: Java , , , Java, JVM).


, , Docker, Kubernetes The Cloud. ? :


Java


, monobank.jar () riskengine.jar ( ).


, , , .properties, URL .


, , :


-r-r------ 1 ubuntu ubuntu     2476 Nov 26 09:41 application.properties
-r-x------ 1 ubuntu ubuntu 94806861 Nov 26 09:45 monobank-384.jar

ubuntu@somemachine:/var/www/www.monobank.com/java$ java -jar monobank-384.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
...

-r-r------ 1 ubuntu ubuntu     2476 Nov 26 09:41 application.properties
-r-x------ 1 ubuntu ubuntu 94806861 Nov 26 09:45 risk-engine-1.jar

ubuntu@someothermachine:/var/www/risk.monobank.com/java$ java -jar risk-engine-1.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
...

: .properties .jar ?


, .


, SSH Ansible Java


, Java- — , Java- 20 . :


  • (Maven, Gradle)
  • SSH / SCP .jars
  • Bash
  • : Ansible.

«» , chaos monkeys, , , ZooKeeper , .


, , .


Docker Java


. Docker .


, , :




, JVM . JVM.zip Raspberry Pi ( ), .jar.


, PHP Python, .


, Java- ( ): , Postgres, , Redis.


, Docker Java, Java, :


  • , Testcontainers.
  • "" . Discourse. Docker , , : Discourse, Ruby, Postgres, Redis.

Oracle , Docker.


, , .jar, :


  • JAR Docker
  • Docker

Docker Swarm Kubernetes Java


, Docker. , Java, Docker, .jar. Java, : .


: , Docker, , , (brrrr)?


— Docker Swarm Kubernetes.


, : , YAML (. : Yaml) . , , .


, Java :


  • Docker Swarm / Kubernetes
  • YAML, .

Java


, , n- ? , , ?


:


  1. ( , Spring Boot), Wrapper.java — , . .
  2. Docker Swarm Kubernetes .
  3. . DEV / TEST. , , .

, Java , , (, ActiveMQ RabbitMQ) , , , Java .


DevOps. Microservice Testing Libraries, .


, :


Java


, Java, , .


Java ?


, JVM
.


( , JVM ), .


, : , .


, , BillingService.


HTTP / REST


, . , - PDF.


, HTTP. ( , PDF . .)


@Service
class BillingService {

    @Autowired
    private HttpClient client;

     public void bill(User user, Plan plan) {
        Invoice invoice = createInvoice(user, plan);
        httpClient.send(invoiceRequest(user.getEmail(), invoice), responseHandler());
        // ...
    }
}

, HTTP-. , :


  1. : , .
  2. DELAYED: , .
  3. ERROR: , , .

, , . , API, .


Chaos Monkey, , , , .


— . , , 50 10 . , , BillingService . , .


, , , , , , (, , , )


, , Hystrix Netflix. , .



. BillingService , , Spring RabbitMQ .


, RabbitMQ, , . PDF .


@Service
class BillingService {

    @Autowired
    private RabbitTemplate rabbitTemplate;

     public void bill(User user, Plan plan) {
        Invoice invoice = createInvoice(user, plan);
        // converts the invoice to,for example, json and uses it as the message's body
        rabbitTemplate.convertAndSend(exchange, routingkey, invoice);
        // ...
    }
}

, OK ERROR, HTTP-. :


  1. ? ? ( -).
  2. ? ? ( ).
  3. : « / » « ?» ( -).

, . , , . :


  • JMS, ActiveMQ, (XA) .
  • RabbitMQ, , , , .
  • - , , ActiveMQ RabbitMQ , Docker.

Java- ?


-, , Spring Boot, .jar, -, Tomcat Jetty, . .


, , , Kubernetes GraalVM, .


: Quarkus, Micronaut, Vert.x, Helidon.


, , , , :


Spring Boot, , , , , Spring Boot .


, , , , , , - , , 50 .


, , , () « » , , , , .


.


:


  • ORM .
  • .
  • , ( , Hibernate), .

(, , , DevOps, ) , hello world. , , , JRebel DCEVM.


(Simon Brown): ( ) , ( ) — .


, .


REST Java?


HTTP REST API. , , HTTP:


Http Java ( Java 11), Http Apache OkHttp.


, «», , JAX-RS WebSocket.


, HTTP-, HTTP- . OpenFeign .


Java?


, , , ActiveMQ (Classic Artemis), RabbitMQ Kafka. , .


:


  • ActiveMQ RabbitMQ , . .
  • ActiveMQ ( ), RabbitMQ / Docker / TestContainer.
  • Kafka . , «» ( ), .

, RabbitMQ ( ) Kafka, Pivotal .


, , . , - , RabbitMQ ActiveMQ.


, RabbitMQ , 20-30K . Kafka 100K . , , .


: Alibaba Group, , ( ) . , — 99% - Java.


.


?


Spring ( Spring) - Arquillian ( JavaEE).


Docker Testcontainers, , , Oracle , .


HTTP-, Wiremock. (ActiveMQ) (RabbitMQ), Awaitility DSL.


, «», Junit, TestNG AssertJ Mockito.


, , , , .


Java?


— . , , less grep, n — , .


. , « » .


:



?


, , IPS. . , [ip = 192.168.200.1] , [ip = 192.168.200.2], .


:


  • application.properties , , .
  • (, Amazon EC2 IP-, - «» ), , , , , «» , IP .
  • , , , : , , , , ? , ? ?

, , .


, Eureka Zookeeper, «» , , , , . , .


, - ZooKeeper.


Java?


, . , HTTPS Oauth2 .


, ?


, , . Docker / Testcontainers, / Ansible.


.


: Yaml


, Yaml. , « ». , Ansible, Kubernetes.


«» YAML, Ansible , , , IDE. , .


Yaml:
  - is:
    - so
    - great

? ? ?


, . , .



Java, , . , .



, , . ?


, - . - n .


, - Java-IoT. , , . ..


, , , , « ». , - domain driven design , , « » , , , .


n ( ) « » , .



( (!)) , :


. 10 , , , . .


. .



, , :


, () , , . (.. ).


, .



, 20 ( ) 20 . , - 400 Hibernate .


: , .


, , , .


: Java- , , .



, , (, , ), , .


, , :


@Controller
class LoginController {

    // ...

    @PostMapping("/login")
    public boolean login(String username, String password) {
        User user = userDao.findByUserName(username);
        if (user == null) {
            // handle non existing user case
            return false;
        }
        if (!user.getPassword().equals(hashed(password))) {
            // handle wrong password case
            return false;
        }
        // 'Yay, Logged in!';
        // set some cookies, do whatever you want
        return true;
    }
}

(, , ): , «» UserStateChanged — - -.


Java , UserStateChanged Erlang. - - , Steve Yegge , , Google.


, , - .


? .


, .



, , , , [95: login-101: updateUserProfile].


, , , - — .


, , .



: . , , , : , .


№ 47?


? ?


?


Erlang , ?


, ! ?


, , DevOps, , , , . , .



, , . — , .



Java- — . — - Maven . .


, , Maven, .



, DevOps (, Ansible Heroku ), .


Java . . , - ( ), .


Siva Prasad Reddy ( ) :


, , 70% 30% -.

Java?


, , Google . , , -, , .



, Java, Hetzner. , Hetzner.


, Java- , , , (<10).



¿Cuántas conexiones de base de datos debe abrir su monolito Java (grupo de conexiones) en su servidor de base de datos?


¿Por qué? ¿Cuántos usuarios activos pueden (aproximadamente) escalar su monolito al mismo tiempo?


Responder


Deja tu respuesta a estas preguntas en la sección de comentarios. Espero todas las respuestas.


Ahora haz tu elección tú mismo


Si todavía estás aquí conmigo: ¡Gracias por leer!


All Articles