Spring BOOT & microservices


@ladislavGazo

gazo@seges.sk




    huge application servers

    monolithic architecture

      long restarts

        no save-reload cycle

          wired to a set of dependencies


          Microservices


          PROS


          Each microservice is relatively small

          Easier for a developer to understand
          • The IDE is faster making developers more productive
          • The web container starts faster

          Easier to scale development. 
          • Each team can develop, deploy and scale their service independently of all of the other teams.

          PROS 2


          Improved fault isolation
          •  In comparison, one misbehaving component of a monolithic architecture can bring down the entire system.

          Each service can be developed and deployed independently

          Eliminates any long-term commitment to a technology stack

          BUT...

          (there is always at least one...)

          Developers must deal with the additional complexity of creating a distributed system
          • testing
          • transactions
          • use-cases span multiple microservices


          Deployment complexity In production

          Increased memory consumption

          ... TACKLE WITH


          when to split to multiple microservices

          what should be inside one microservice

          single responsibility principle

          ...

          it is the art

          Spring BOOT





          opinionated way how to do modern applications


          Very easy to start


          <parent>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-parent</artifactId>
              <version>1.1.8.RELEASE</version>
          </parent>
          <dependencies>
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-web</artifactId>
              </dependency>
          </dependencies>


          ta-daaaa .... web app built :)

          APP CODE

          package hello;
          
          import org.springframework.boot.*;
          import org.springframework.boot.autoconfigure.*;
          import org.springframework.stereotype.*;
          import org.springframework.web.bind.annotation.*;
          
          @Controller
          @EnableAutoConfiguration
          public class SampleController {
          
              @RequestMapping("/")
              @ResponseBody
              String home() {
                  return "Hello World!";
              }
          
              public static void main(String[] args) throws Exception {
                  SpringApplication.run(SampleController.class, args);
              }
          }

          ... the beauty of autoconfiguration


          3 options



          JRebel


          jHipster Reloader


          Spring Loaded

          jHipster reloader

          -javaagent:/home/user/.m2/repository/io/github/jhipster/loaded/agent/0.12/agent-0.12.jar

          
          <profiles>
            <profile>
              <id>reloaded</id>
                <dependencies>
                  <dependency>
                    <groupId>io.github.jhipster.loaded</groupId>
                    <artifactId>agent</artifactId>
                    <version>0.12</version>
                    <exclusions>
                      <exclusion>
                        <groupId>org.springframework</groupId>
                        <artifactId>springloaded</artifactId>
                      </exclusion>
                    </exclusions>
                  </dependency>
          
                  <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>springloaded</artifactId>
                  </dependency>
                </dependencies>
            </profile>
          </profiles>
          

          Interesting dependencies


          benefit of Spring Boot

          • MVC
          • data access
          • templating
          • security
          • ...


          ... anything from the Spring stack

          REST




          @RestController

          based on Spring MVC

          TEMPLATING


          <dependency>
          			<groupId>org.springframework.boot</groupId>
          			<artifactId>spring-boot-starter-thymeleaf</artifactId>
          </dependency>

          using Thymeleaf

          Spring Security

          <dependency>
          			<groupId>org.springframework.boot</groupId>
          			<artifactId>spring-boot-starter-security</artifactId>
          </dependency>
          @EnableWebMvcSecurity
          @EnableGlobalMethodSecurity
          http.authorizeRequests().antMatchers("/identity/login", "/page/**", "/client/**", "/user/**").permitAll().anyRequest().authenticated();
          		
          http.csrf().disable();
          		
          		http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
          http.addFilterBefore(new AuthenticationTokenFilter(identityService), AnonymousAuthenticationFilter.class);
          http.exceptionHandling().authenticationEntryPoint(new UnauthorizedEntryPoint());

          MIGRATIONS


          <dependency>
          			<groupId>org.flywaydb</groupId>
          			<artifactId>flyway-core</artifactId>
          </dependency>

          migration files

          V1.1__init.sql
          V1.2__data.sql
          ...

          DATA ACCESS


          <dependency>   			<groupId>com.h2database</groupId>
          			<artifactId>h2</artifactId>
          </dependency>

          <dependency>    	<groupId>org.postgresql</groupId>
          	<artifactId>postgresql</artifactId>
          </dependency> 

          autodetection of the driver

          DATA ACCESS II.


          spring.datasource.url: jdbc:postgresql://localhost/mydb
          spring.datasource.username: myuser
          spring.datasource.password: mypass
          spring.datasource.driverClassName: org.postgresql.Driver

          <dependency>
          			<groupId>org.springframework.boot</groupId>
          			<artifactId>spring-boot-starter-jdbc</artifactId>
          </dependency>

          CONFIGURATION


          driven mainly by:

          Spring Java Configuration

          Spring Annotations

          Spring Profiles

          simple YAML / properties file

          Cherry


          @Component
          @ConfigurationProperties(prefix="connection")
          public class ConnectionSettings {
          
              private String username;
          
              private InetAddress remoteAddress;
          
              // ... getters and setters
          
          }
          # application.yml
          
          connection:
              username: admin
              remoteAddress: 192.168.1.1

          Kontanjere       

          SKALA

          giter8 template




          curl https://raw.githubusercontent.com/n8han/conscript/master/setup.sh | sh# add to your path ~/bin
          cs n8han/giter8
          
          g8 lgazo/scala-boot



          Questions?





          @ladislavGazo
          gazo@seges.sk



          Thank YOu... for...






          ATTENTION

          Spring Boot and Microservices

          By lgazo

          Spring Boot and Microservices

          How to start building microservices with Spring Boot

          • 1,325