├── .gitignore ├── README.md └── images ├── Image_ContinuousIntegration.png ├── image_Dev_QA_Stage_Prod.png ├── image_EventDriven_Microservice.png ├── image_LoadBalancer_Caching.png ├── image_LoadBalancer_Simple.png ├── image_Microservices_Scalability.png ├── image_Monolith_vs_Microservice.png └── image_TDD_Red_Green_Refactor.png /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled class file 2 | *.class 3 | 4 | # Log file 5 | *.log 6 | 7 | # BlueJ files 8 | *.ctxt 9 | 10 | # Mobile Tools for Java (J2ME) 11 | .mtj.tmp/ 12 | 13 | # Package Files # 14 | *.jar 15 | *.war 16 | *.ear 17 | *.zip 18 | *.tar.gz 19 | *.rar 20 | *.cmd 21 | *.classpath 22 | *.settings 23 | *.project 24 | *.mvn 25 | mvnw 26 | target 27 | *.DS_Store 28 | 29 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 30 | hs_err_pid* 31 | bin 32 | .settings 33 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Java Technology for Beginners 2 | 3 | In my 15 years of designing and developing more than 100 java web applications, I have learnt that techies love coining new terminologies. They are great as we don't need to explain each time but imagine the state of a beginning programmer or a non techie - a Tester or Business Analyst or your Product Owner. They hardly understand them. This guide is to demystify these terms through videos! 4 | 5 | As I find time, I will create more videos. Request some patience :) 6 | 7 | If you think, I'm missing an important topic, shoot an email or create a pull request! 8 | 9 | If you have a great video for one of these topics, which does not have a video attached, submit a pull request! 10 | 11 | ## Presentation Template 12 | - https://app.mindmup.com/map/_free/ff0bce00baa611e6ae8525496545fc76 13 | 14 | ## Keep Learning Every Day 15 | - **1:** [FOLLOW](https://links.in28minutes.com/lin) Ranga on LinkedIn 16 | 17 | ## Check Out Our Amazing ROADMAPS 18 | - **1:** [AWS Roadmap](https://github.com/in28minutes/roadmaps/blob/main/README.md#aws-roadmap) 19 | - **2:** [Azure Roadmap](https://github.com/in28minutes/roadmaps/blob/main/README.md#azure-roadmap) 20 | - **3:** [Google Cloud Roadmap](https://github.com/in28minutes/roadmaps/blob/main/README.md#google-cloud-roadmap) 21 | - **4:** [Cloud Beginner Roadmap](https://github.com/in28minutes/roadmaps/blob/main/README.md#cloud-beginner-roadmap) 22 | - **5:** [DevOps Roadmap](https://github.com/in28minutes/roadmaps/blob/main/README.md#devops-roadmap) 23 | - **6:** [Java Full Stack Roadmap](https://github.com/in28minutes/roadmaps/blob/main/README.md#java-full-stack-roadmap) 24 | - **7:** [Java Microservices Roadmap](https://github.com/in28minutes/roadmaps/blob/main/README.md#java-microservices-roadmap) 25 | 26 | 27 | 28 | 29 | 30 | 31 | ## Languages/Frameworks/Data Formats 32 | - Java 33 | - Spring 34 | - Spring Boot 35 | - Spring MVC 36 | - Spring Data 37 | - Spring Data Flow 38 | - Spring Data Rest 39 | - Spring Cloud 40 | - Spring Batch 41 | - Spring Initializr 42 | - Spring Security 43 | - Spring HATEOAS 44 | - Spring Integration 45 | - Unit Testing 46 | - JUnit 47 | - Mockito 48 | - EasyMock 49 | - PowerMock 50 | - Cobertura 51 | - Emma 52 | - Database 53 | - Hibernate 54 | - iBatis 55 | - Rest Services 56 | - Jersey Framework 57 | - Play Framework 58 | - Spring REST (actually Spring MVC) 59 | - Others 60 | - Quartz 61 | - Guava 62 | - Guice 63 | - EhCache 64 | - Drools 65 | - Apache Commons 66 | - JavaScript 67 | - NodeJS 68 | - JQuery 69 | - AngularJS 70 | - Ember.js 71 | - React.js 72 | - Redux 73 | - ECMAScript 74 | - CSS 75 | - Bootstrap 76 | - Formats 77 | - XML 78 | - XPath 79 | - JSON 80 | - SOAP 81 | - Swagger 82 | - Spring Rest Docs 83 | - Others 84 | - jHipster 85 | 86 | ## Java 87 | - JDK 88 | - JVM 89 | - JRE 90 | - JAR 91 | - WAR 92 | - EAR 93 | - Classloader 94 | - Annotations 95 | - Platform Independence 96 | 97 | ## Concepts 98 | - OOPS 99 | - Interface 100 | - Inheritance 101 | - Abstract Class 102 | - Coupling 103 | - Cohesion 104 | - Encapsulation 105 | - Polymorphism 106 | - Abstraction 107 | - Mocking and Mock objects 108 | - Dependency Management 109 | - Readable Code 110 | - Dependency Injection 111 | - Inversion of Control 112 | - Synchronization 113 | - Logging 114 | - Caching 115 | - Exception Handling 116 | - Cross Cutting Concerns 117 | - Aspect Oriented Programming (AOP) 118 | - Spring 119 | - Autowiring 120 | - Component Scan 121 | - Application Context 122 | 123 | ## Practices 124 | - Coding Standards 125 | - Code Review 126 | - Refactoring 127 | - Pair Programming 128 | - Unit Testing 129 | - Automation Testing 130 | - Load Testing 131 | - User Acceptance Testing (UAT) 132 | - Test Driven Development (TDD) 133 | - Behavior Driven Development (BDD) 134 | - Acceptance Test Driven Development (ATDD) 135 | - Continuous Integration (CI) 136 | - Continuous Delivery (CD) 137 | - DevOps 138 | 139 | ## Terminologies 140 | - Cloud 141 | - Big Data 142 | - Microservices 143 | - Cloud Native Applications 144 | - 12 factor app 145 | - Micro front-end 146 | - HATEOAS 147 | - Functional Programming 148 | - Reactive Programming 149 | - In memory Database 150 | - SPA (Single Page Application) 151 | - Code Quality 152 | - Technical Debt 153 | - Code Coverage 154 | - Legacy Code 155 | - Tech Design 156 | - Evolutionary Design 157 | - Code First 158 | - Contract First 159 | - Web Service 160 | - RESTful Web Service 161 | - Static Code Analysis (Security) 162 | - Vertical Slice 163 | - Internationalization or Localization 164 | - Transaction Management 165 | - NFR (Non Functional Requirements) 166 | - Authentication 167 | - Authorization 168 | - Performance 169 | - Scalability 170 | - Load Balancing 171 | - Availability 172 | - Resilience 173 | - Maintainability 174 | - Portability 175 | - Security 176 | - Cross Site Scripting (XSS) 177 | - SQL Injection 178 | - Containerization 179 | 180 | ## Java EE 181 | - http://www.oracle.com/technetwork/java/javaee/tech/index.html 182 | - Batch Applications for the Java Platform - JSR 352 183 | - Contexts and Dependency Injection for Java 1.1 - JSR 346 184 | - Dependency Injection for Java 1.0 - JSR 330 185 | - Java Persistence 2.1 - JSR 338 186 | - Java Message Service API 2.0 - JSR 343 187 | - Java Transaction API (JTA) 1.2 - JSR 907 188 | - Java API for RESTful Web Services (JAX-RS) 2.0 - JSR 339 189 | - Java API for XML-Based Web Services (JAX-WS) 2.2 - JSR 224 190 | - Java Authentication Service Provider Interface for Containers 1.1 - JSR 196 191 | - Java Architecture for XML Binding (JAXB) - JSR 222 192 | - Java Database Connectivity 4.0 - JSR 221 193 | - Java Management Extensions (JMX) 2.0 - JSR 003 194 | - JSTL 195 | 196 | ## Design 197 | - Design Patterns 198 | - 4 Principles of Simple Design 199 | - SOLID principles 200 | - UML 201 | 202 | ## Tools 203 | - IDE 204 | - Eclipse 205 | - NetBeans 206 | - Intellij 207 | - Code Quality 208 | - SonarQube 209 | - CheckStyle 210 | - PMD 211 | - Findbugs 212 | - Application/Web/Http Servers 213 | - Tomcat 214 | - WebSphere 215 | - Weblogic 216 | - Lightweight 217 | - Jetty 218 | - Undertow 219 | - API Gateways 220 | - Distributed Cache 221 | - Hazelcast 222 | - Databases 223 | - In memory 224 | - H2 225 | - HSQL 226 | - Big Data 227 | - Mongo DB 228 | - Redis 229 | - Build 230 | - Ant 231 | - Maven 232 | - Gradle 233 | - Nexus 234 | - Message Brokers 235 | - Kafka 236 | - Performance 237 | - jProfiler 238 | - VisualVM 239 | - Productivity 240 | - jRebel 241 | - Continuous Integration 242 | - Jenkins 243 | - Automation Testing 244 | - Selenium 245 | - Integration 246 | - Camel 247 | - Spring Integration 248 | - ESB 249 | - BDD 250 | - Cucumber 251 | - Version Control 252 | - Git 253 | - Stash 254 | - SVN 255 | - Containerization 256 | - Docker 257 | - Kubernetes 258 | - DevOps 259 | - Chef 260 | - CMS 261 | - Load Testing 262 | - JMeter 263 | 264 | ## Processes 265 | - Agile 266 | - Scrum 267 | - Kanban 268 | - Waterfall 269 | 270 | ## Details 271 | 272 | ### Spring 273 | The Spring Framework is a Java platform that provides comprehensive infrastructure support for developing Java applications. Spring handles the infrastructure so you can focus on your application. 274 | http://docs.spring.io/spring/docs/current/spring-framework-reference/html/overview.html 275 | 276 | #### Video 277 | COMING SOON.. 278 | 279 | #### What 280 | - Lets Programmers focus on Business Logic 281 | - Key feature is Dependency Management 282 | - Enables Testability 283 | - Inversion of Control 284 | - Application Context 285 | 286 | #### Why 287 | - Why is Unit Testing Important? 288 | - Loose Coupling 289 | - Testable Code 290 | - Plumbing Code 291 | - JDBC 292 | - JMS 293 | - Clean Architecture 294 | - Easy implementation of cross cutting concerns 295 | - Architectural Flexibility 296 | - Integration with other frameworks 297 | - Design Patterns 298 | 299 | #### How 300 | - Add a Maven Dependency 301 | 302 | #### Best Practices 303 | - Use Spring Initializr 304 | - Consider Spring Boot 305 | - Write Unit Tests 306 | - Use BOM 307 | - Use Maven or Gradle 308 | 309 | #### Challenges 310 | - Difficult for Starting Programmer to understand 311 | - Once You understand, you cannot stop using it! 312 | 313 | #### What Else? 314 | - Spring Modules https://github.com/in28minutes/SpringIn28Minutes/blob/master/Spring%20Tutorial%20For%20Beginners%20with%20Examples_v2.pdf 315 | - Spring Projects http://spring.io/projects 316 | - Spring Initializr https://start.spring.io 317 | 318 | #### Course 319 | https://www.udemy.com/course/spring-tutorial-for-beginners/ 320 | 321 | ### Spring Boot 322 | Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run". We take an opinionated view of the Spring platform and third-party libraries so you can get started with minimum fuss. Most Spring Boot applications need very little Spring configuration. 323 | http://projects.spring.io/spring-boot/ 324 | 325 | #### Video 326 | COMING SOON.. Fingers crossed 327 | 328 | #### What 329 | 330 | - Reduces effort in starting up a project 331 | - How long does it take to start a new project? 332 | - What do you do in Sprint 0? 333 | - Integrating Frameworks may be complex! 334 | - Configuration Management 335 | - Logging 336 | - Transaction Management 337 | - Error/ Exception Handling 338 | - Monitoring & Health Checks 339 | - Integrate Unit Testing and Mocking Frameworks 340 | - Migrating to different version is tough 341 | - Incompatible Jars - Jar Hell 342 | - Which version of other frameworks (Hibernate etc..) to upgrade to? 343 | 344 | #### Why 345 | - Reduce start up time of a project 346 | - Microservice Architecture! 347 | - No of small projects increase exponentially 348 | - Starter Projects make integration with other frameworks easy 349 | - spring-boot-starter-web-services - Starter for using Spring Web Services 350 | - spring-boot-starter-web - Starter for building web, including RESTful, applications using Spring MVC. Uses Tomcat as the default embedded container 351 | - spring-boot-starter-test - Starter for testing Spring Boot applications with libraries including JUnit, Hamcrest and Mockito 352 | - spring-boot-starter-hateoas - Starter for building hypermedia-based RESTful web application with Spring MVC and Spring HATEOAS 353 | - spring-boot-starter-jersey - Starter for building RESTful web applications using JAX-RS and Jersey. An alternative to spring-boot-starter-web 354 | - spring-boot-starter-security - Starter for using Spring Security 355 | - spring-boot-starter-data-jpa - Starter for using Spring Data JPA with Hibernate 356 | - spring-boot-starter-data-rest - Starter for exposing Spring Data repositories over REST using Spring Data REST 357 | - Developer Tools 358 | - Easy to debug and hot deploy! 359 | 360 | #### How 361 | - Spring Initializr https://start.spring.io 362 | 363 | #### Challenges 364 | - You need to understand Spring to solve problems 365 | - Standardize a little before you use Spring Boot in all your microservices 366 | - Make sure to put right security around Actuator 367 | 368 | ##### Deployment & Scalability 369 | - Can be deployed to Cloud Services easily. 370 | 371 | #### Course 372 | ADD_LATER 373 | 374 | ### Spring MVC 375 | 376 | #### Video 377 | https://www.youtube.com/watch?v=BjNhGaZDr0Y 378 | 379 | #### What 380 | - Great MVC & Rest Services Framework 381 | - Loosely Coupled Design 382 | - Support for multiple view technologies 383 | - Integrates well with all popular frameworks 384 | 385 | #### Course 386 | ADD_LATER 387 | 388 | ### Spring Data Rest 389 | Spring Data REST is part of the umbrella Spring Data project and makes it easy to build hypermedia-driven REST web services on top of Spring Data repositories. http://projects.spring.io/spring-data-rest/ 390 | org.springframework.boot:spring-boot-starter-data-rest 391 | 392 | #### Video 393 | COMING SOON 394 | 395 | #### What 396 | - Expose Services from your Data without a lot of code 397 | - Supports SQL based and No SQL based databases 398 | - Pagination 399 | - Filtering 400 | - Sorting 401 | - HATEOAS 402 | - defaultPageSize 403 | 404 | #### Why 405 | - Simple Projects want to quickly expose Rest Services 406 | 407 | #### How 408 | - Simplest way is to use the Spring Boot Starter Project 409 | 410 | #### Challenges 411 | - Not recommended for Complex Applications 412 | 413 | #### Example Code 414 | \pom.xml 415 | ``` 416 | 418 | 4.0.0 419 | com.in28minutes 420 | spring-data-rest-example 421 | 0.0.1-SNAPSHOT 422 | 423 | org.springframework.boot 424 | spring-boot-starter-parent 425 | 1.4.2.RELEASE 426 | 427 | 428 | 429 | 1.7 430 | 431 | 432 | 433 | 434 | org.springframework.boot 435 | spring-boot-starter-data-rest 436 | 437 | 438 | 439 | org.springframework.boot 440 | spring-boot-starter-data-jpa 441 | 442 | 443 | 444 | com.h2database 445 | h2 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | org.springframework.boot 454 | spring-boot-maven-plugin 455 | 456 | 457 | 458 | 459 | 460 | 461 | spring-releases 462 | https://repo.spring.io/libs-release 463 | 464 | 465 | 466 | 467 | spring-releases 468 | https://repo.spring.io/libs-release 469 | 470 | 471 | 472 | ``` 473 | \src\main\java\com\in28minutes\Application.java 474 | ``` 475 | package com.in28minutes; 476 | 477 | import org.springframework.boot.SpringApplication; 478 | import org.springframework.boot.autoconfigure.SpringBootApplication; 479 | 480 | @SpringBootApplication 481 | public class Application { 482 | 483 | public static void main(String[] args) { 484 | SpringApplication.run(Application.class, args); 485 | } 486 | } 487 | ``` 488 | \src\main\java\com\in28minutes\data\Todo.java 489 | ``` 490 | package com.in28minutes.data; 491 | 492 | import javax.persistence.Entity; 493 | import javax.persistence.GeneratedValue; 494 | import javax.persistence.GenerationType; 495 | import javax.persistence.Id; 496 | 497 | @Entity 498 | public class Todo { 499 | 500 | @Id 501 | @GeneratedValue(strategy = GenerationType.AUTO) 502 | private long id; 503 | 504 | private String user; 505 | 506 | private String desc; 507 | 508 | private boolean isDone; 509 | 510 | public long getId() { 511 | return id; 512 | } 513 | 514 | public String getUser() { 515 | return user; 516 | } 517 | 518 | public void setUser(String user) { 519 | this.user = user; 520 | } 521 | 522 | public String getDesc() { 523 | return desc; 524 | } 525 | 526 | public void setDesc(String desc) { 527 | this.desc = desc; 528 | } 529 | 530 | public boolean isDone() { 531 | return isDone; 532 | } 533 | 534 | public void setDone(boolean isDone) { 535 | this.isDone = isDone; 536 | } 537 | 538 | @Override 539 | public String toString() { 540 | return String.format( 541 | "Todo [id=%s, user=%s, desc=%s, isDone=%s]", 542 | id, user, desc, isDone); 543 | } 544 | 545 | } 546 | ``` 547 | \src\main\java\com\in28minutes\data\TodoRepository.java 548 | ``` 549 | package com.in28minutes.data; 550 | 551 | import java.util.List; 552 | 553 | import org.springframework.data.repository.PagingAndSortingRepository; 554 | import org.springframework.data.repository.query.Param; 555 | import org.springframework.data.rest.core.annotation.RepositoryRestResource; 556 | 557 | @RepositoryRestResource(collectionResourceRel = "todos", path = "todos") 558 | public interface TodoRepository 559 | extends PagingAndSortingRepository { 560 | 561 | List findByUser(@Param("user") String user); 562 | 563 | } 564 | ``` 565 | 566 | 567 | #### Example Execution 568 | ``` 569 | POST to http://localhost:8080/todos 570 | Use Header => Content-Type:application/json 571 | Request: 572 | 573 | { 574 | "user": "Jill", 575 | "desc": "Learn Hibernate", 576 | "done": false 577 | } 578 | 579 | Response: 580 | 581 | { 582 | "user": "Jill", 583 | "desc": "Learn Hibernate", 584 | "done": false, 585 | "_links": { 586 | "self": { 587 | "href": "http://localhost:8080/todos/1" 588 | }, 589 | "todo": { 590 | "href": "http://localhost:8080/todos/1" 591 | } 592 | } 593 | } 594 | ``` 595 | http://localhost:8080/todos 596 | ``` 597 | { 598 | "_embedded" : { 599 | "todos" : [ { 600 | "user" : "Jill", 601 | "desc" : "Learn Hibernate", 602 | "done" : false, 603 | "_links" : { 604 | "self" : { 605 | "href" : "http://localhost:8080/todos/1" 606 | }, 607 | "todo" : { 608 | "href" : "http://localhost:8080/todos/1" 609 | } 610 | } 611 | } ] 612 | }, 613 | "_links" : { 614 | "self" : { 615 | "href" : "http://localhost:8080/todos" 616 | }, 617 | "profile" : { 618 | "href" : "http://localhost:8080/profile/todos" 619 | }, 620 | "search" : { 621 | "href" : "http://localhost:8080/todos/search" 622 | } 623 | }, 624 | "page" : { 625 | "size" : 20, 626 | "totalElements" : 1, 627 | "totalPages" : 1, 628 | "number" : 0 629 | } 630 | } 631 | ``` 632 | http://localhost:8080/todos/1 633 | ``` 634 | { 635 | "user" : "Jill", 636 | "desc" : "Learn Hibernate", 637 | "done" : false, 638 | "_links" : { 639 | "self" : { 640 | "href" : "http://localhost:8080/todos/1" 641 | }, 642 | "todo" : { 643 | "href" : "http://localhost:8080/todos/1" 644 | } 645 | } 646 | } 647 | ``` 648 | - http://localhost:8080/todos?user=Jill 649 | - http://localhost:8080/todos/search/findByUser?user=Jill 650 | 651 | ### Spring Cloud 652 | Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems http://projects.spring.io/spring-cloud/ 653 | 654 | #### Video 655 | COMING SOON 656 | 657 | #### What 658 | - What is Cloud? 659 | - Why Cloud? 660 | - Features of Spring Cloud 661 | - Configuration management 662 | - Service discovery 663 | - Circuit breakers 664 | - API Gateway 665 | - Routing 666 | 667 | Projects 668 | - Spring Cloud Config 669 | - Spring Cloud Netflix : Integrates with Netflix OSS components (Eureka, Hystrix, Zuul...) 670 | - Spring Cloud Security : OAuth2 rest client support. 671 | - Spring Cloud Data Flow : Orchestration service for microservice. Create microservice based data pipelines using 672 | - DSL 673 | - Drag-and-drop GUI 674 | - REST-APIs 675 | 676 | #### Why 677 | - Cloud Native Applications vs Micro Services 678 | - Dynamic deployment to cloud needs a lot of automation 679 | 680 | #### How 681 | - Spring Boot Starter Project 682 | 683 | #### Challenges 684 | - Its still a young evolving set of projects. Experience of Netflix is surely a good thing. 685 | 686 | ### Spring Batch 687 | A lightweight, comprehensive batch framework designed to enable the development of robust batch applications vital for the daily operations of enterprise systems. 688 | http://projects.spring.io/spring-batch/ 689 | 690 | #### Video 691 | Coming Soon 692 | 693 | #### Why 694 | - Restartability : Easy to restart a batch program from where it failed 695 | - Different Readers and Writers : Provides great support to read from JMS, JDBC, Hibernate, iBatis etc. It can write to JMS, JDBC, Hibernate and more. 696 | - Chunk Processing : If we have 1 Million records to process, these can be processed in configurable chunks (1000 at a time or 10000 at a time). 697 | - Easy to implement proper transaction management even when using chunk processing. 698 | - Easy to implement parallel processing. With simple configuration, different steps can be run in parallel. 699 | 700 | #### What 701 | A Job in Spring Batch is a sequence of Steps. Each Step can be configured with 702 | - next : next step to execute 703 | - tasklet : task or chunk to execute. A chunk can be configured with a Item Reader, Item Processor and Item Writer. 704 | - decision : Decide which steps need to executed. 705 | 706 | A Job Launcher can be used to execute a Spring Batch Job. A job can be launched/scheduled in a web container as well. 707 | - Each execution of a job is called a Job Instance. Each Job Instance is provided with an execution id which can be used to restart the job (if needed). 708 | - Job can be configured with parameters which can be passed to it from the Job Launcher. 709 | 710 | #### How 711 | ``` 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | ``` 725 | 726 | #### When 727 | For Batch Programs 728 | 729 | #### Best Practices 730 | - Be careful about Exception Handling and Transaction Management 731 | - Be as near to data as possible 732 | - Allocate enough memory 733 | - Stress test from the start of the project. Identify production data volumes and evolve the application to meet those needs. 734 | 735 | #### What Else? 736 | Spring Batch 3.0 supports JSR-352 -java specification for batch processing 737 | 738 | ### Spring Initializr 739 | Quick Start for Spring Projects. http://start.spring.io/ 740 | 741 | #### Video 742 | Coming Soon.... 743 | 744 | #### What 745 | - Choose Maven or Gradle 746 | - Choose Version of Spring Boot 747 | - Add all the stuff you want! 748 | - Download the project 749 | - Run... Thats it!!! 750 | 751 | #### Why 752 | - Awesome and Simple way to create Spring Boot Projects 753 | - Supports more than 50 different frameworks 754 | 755 | #### How 756 | - Lets do a quick demo! 757 | 758 | #### When 759 | - Start of a project or when you want to do a quick prototype 760 | 761 | ### Spring Security 762 | Authentication and Authorization framework. (What is Authentication?) http://projects.spring.io/spring-security/ 763 | 764 | #### Video 765 | Coming Soon.. 766 | 767 | #### What 768 | - Great support for authentication and authorization 769 | - Provides out of the box support to prevent session fixation, clickjacking and XSS 770 | 771 | #### Why 772 | - Integrates well with Spring and Spring Boot Projects 773 | - Proven Framework. You do not want to play with Authentication and Authorization. 774 | - Great Integration with wide range of technologies 775 | - HTTP BASIC authentication headers 776 | - HTTP X.509 client certificate exchange 777 | - LDAP 778 | - Form based 779 | - JAAS 780 | 781 | #### How 782 | - org.springframework.security:spring-security-web 783 | - Or use the spring security starter project! 784 | 785 | #### Demo 786 | Lets do a quick demo... 787 | 788 | ### Spring HATEOAS 789 | Spring support for HATEOAS (Hypermedia as Representation of Application State) http://projects.spring.io/spring-hateoas/ 790 | 791 | #### Video 792 | 793 | #### What 794 | - Create services that include HATEOAS links in the response.. 795 | - Create clients for services using HATEOAS 796 | 797 | #### Why 798 | #### How 799 | #### When 800 | #### Where 801 | #### Best Practices 802 | #### Challenges 803 | #### Example 804 | #### What Else? 805 | #### Tips 806 | #### Perspectives 807 | ##### Code 808 | ##### Test 809 | ##### Design 810 | ##### Architecture 811 | ##### Management 812 | ##### Deployment 813 | ##### Operations 814 | ##### Performance 815 | ##### Scalability 816 | ##### Maintainability 817 | ##### Availability 818 | ##### Security 819 | #### Course 820 | 821 | ### Topic 822 | #### Video 823 | #### What 824 | #### Why 825 | #### How 826 | #### When 827 | #### Where 828 | #### Best Practices 829 | #### Challenges 830 | #### Example 831 | #### What Else? 832 | #### Tips 833 | #### Perspectives 834 | ##### Code 835 | ##### Test 836 | ##### Design 837 | ##### Architecture 838 | ##### Management 839 | ##### Deployment 840 | ##### Operations 841 | ##### Performance 842 | ##### Scalability 843 | ##### Maintainability 844 | ##### Availability 845 | ##### Security 846 | #### Course 847 | 848 | ### Topic 849 | #### Video 850 | #### What 851 | #### Why 852 | #### How 853 | #### When 854 | #### Where 855 | #### Best Practices 856 | #### Challenges 857 | #### Example 858 | #### What Else? 859 | #### Tips 860 | #### Perspectives 861 | ##### Code 862 | ##### Test 863 | ##### Design 864 | ##### Architecture 865 | ##### Management 866 | ##### Deployment 867 | ##### Operations 868 | ##### Performance 869 | ##### Scalability 870 | ##### Maintainability 871 | ##### Availability 872 | ##### Security 873 | #### Course 874 | 875 | ### Topic 876 | #### Video 877 | #### What 878 | #### Why 879 | #### How 880 | #### When 881 | #### Where 882 | #### Best Practices 883 | #### Challenges 884 | #### Example 885 | #### What Else? 886 | #### Tips 887 | #### Perspectives 888 | ##### Code 889 | ##### Test 890 | ##### Design 891 | ##### Architecture 892 | ##### Management 893 | ##### Deployment 894 | ##### Operations 895 | ##### Performance 896 | ##### Scalability 897 | ##### Maintainability 898 | ##### Availability 899 | ##### Security 900 | #### Course 901 | 902 | ### Topic 903 | #### Video 904 | #### What 905 | #### Why 906 | #### How 907 | #### When 908 | #### Where 909 | #### Best Practices 910 | #### Challenges 911 | #### Example 912 | #### What Else? 913 | #### Tips 914 | #### Perspectives 915 | ##### Code 916 | ##### Test 917 | ##### Design 918 | ##### Architecture 919 | ##### Management 920 | ##### Deployment 921 | ##### Operations 922 | ##### Performance 923 | ##### Scalability 924 | ##### Maintainability 925 | ##### Availability 926 | ##### Security 927 | #### Course 928 | 929 | ### Topic 930 | #### Video 931 | #### What 932 | #### Why 933 | #### How 934 | #### When 935 | #### Where 936 | #### Best Practices 937 | #### Challenges 938 | #### Example 939 | #### What Else? 940 | #### Tips 941 | #### Perspectives 942 | ##### Code 943 | ##### Test 944 | ##### Design 945 | ##### Architecture 946 | ##### Management 947 | ##### Deployment 948 | ##### Operations 949 | ##### Performance 950 | ##### Scalability 951 | ##### Maintainability 952 | ##### Availability 953 | ##### Security 954 | #### Course 955 | 956 | 957 | ### Cloud 958 | 959 | #### Video 960 | Coming Soon 961 | 962 | #### What 963 | - Dynamic provisioning of resources (computing, network, servers, applications) on need. 964 | 965 | #### Why 966 | - Imagine a startup. Do you know how fast you will grow? 967 | - Imagine a shopping company. Do you really need all the infrastructure you bought planning for the peak period (Black Friday, Holiday Season) during the lean periods of the year? 968 | - Imagine applications for businesses have a year end peak period. What would the infrastructure be doing rest of the year? 969 | 970 | #### Types 971 | - Private 972 | - Public 973 | 974 | #### Advantages 975 | - Agility 976 | - Cost reductions 977 | - Scalability and elasticity 978 | - Reliability 979 | 980 | #### How 981 | - Make sure your applications are Cloud Native 982 | - Choose a platform 983 | - Microsoft Azure 984 | - AWS 985 | - Google's Cloud Platform 986 | 987 | #### Best Practices 988 | - 12 factor apps 989 | 990 | #### Challenges 991 | - Security 992 | - Application Compatibility 993 | 994 | #### What Else? 995 | - IaaS (Infrastructure as a Service) 996 | - PAAS (Platform as a Service) 997 | - SAAS (Software as a Service) 998 | 999 | ### Big Data 1000 | 1001 | #### Video 1002 | Coming Soon 1003 | 1004 | #### What 1005 | - Large volumes of data 1006 | - Few dozen terabytes to many petabytes of data 1007 | - Data Sources 1008 | - Social Networking - Facebook, Twitter 1009 | - Cameras 1010 | - Software Logs 1011 | 1012 | #### Why 1013 | - Faster, more intelligent decisions 1014 | - Business Trends 1015 | 1016 | #### How 1017 | - Different Parts 1018 | - Capture 1019 | - Storage & Transfer 1020 | - Search 1021 | - Analysis 1022 | - Visualization 1023 | 1024 | #### Example 1025 | The Apache Hadoop software library is a framework that allows for the distributed processing of large data sets across clusters of computers using simple programming models. It is designed to scale up from single servers to thousands of machines, each offering local computation and storage. Rather than rely on hardware to deliver high-availability, the library itself is designed to detect and handle failures at the application layer, so delivering a highly-available service on top of a cluster of computers, each of which may be prone to failures. 1026 | Modules 1027 | - Hadoop Common: The common utilities that support the other Hadoop modules. 1028 | - Hadoop Distributed File System (HDFS™): A distributed file system that provides high-throughput access to application data. 1029 | - Hadoop YARN: A framework for job scheduling and cluster resource management. 1030 | - Hadoop MapReduce: A YARN-based system for parallel processing of large data sets 1031 | 1032 | ### Microservices 1033 | 1034 | #### Video 1035 | Coming Soon 1036 | 1037 | #### What 1038 | - Keep it Small - Small methods, Small classes, Small Components, Small Services, Small Deployable Units. 1039 | - Microservices are another step in the direction of “Keep it Small”. Fundamental change is to keep the deployable unit small. 1040 | 1041 | #### Why 1042 | - Many organizations found that embracing fine-grained, microservice architectures enable delivering software faster and adapt to new technologies. 1043 | - Evolved from on the ground experiences at Netflix, eBay, Amazon, Groupon 1044 | 1045 | #### Characteristics 1046 | - Small, Lightweight 1047 | - Loosely coupled service-oriented architectures with bounded contexts 1048 | - Bounded Scope, Limited Scope, Solve one problem well 1049 | - Interoperable with message based communication 1050 | - Independently deployable and testable services 1051 | - Building systems that are replaceable over being maintainable 1052 | - Smart endpoints and dump pipes 1053 | 1054 | #### When 1055 | - When you are having problems taking your releases live! 1056 | 1057 | #### Advantages 1058 | - Faster Time To Market 1059 | - Experimentation and Speed of innovation 1060 | - Team Autonomy 1061 | - Independent Teams 1062 | - Scaling 1063 | - High Tuning Ability 1064 | 1065 | #### Challenges 1066 | - Identifying the right bounded contexts 1067 | - Challenges due to change in thinking towards event driven architectures 1068 | - Increased need for Automation 1069 | - More complex Monitoring & Application health management 1070 | - Fault Isolation 1071 | - Correlation Ids 1072 | - Eventual Consistency through Standardization 1073 | - Need to decide what you want to standardize and what you do not want to standardize. 1074 | 1075 | #### Microservices vs SOA 1076 | SOA started with similar aims. Let’s highlight a couple of significant differences. 1077 | - However, as time passed, SOA is characterized by large product based implementations arounds ESBs. These ESBs became the magnet for all business logic and over a period of time became the bottleneck. 1078 | - Microservices approach place additional focus on microservices being autonomous and independently deployable. 1079 | 1080 | #### What Else? 1081 | - Spring Boot 1082 | - Spring Cloud 1083 | 1084 | ### Cloud Native Applications 1085 | 1086 | #### Video 1087 | Coming Soon 1088 | 1089 | #### What 1090 | Applications which are easily deployable on cloud. 1091 | 1092 | #### Challenges 1093 | - Visibility 1094 | - Fault Isolation 1095 | - Fault Tolerance 1096 | - Automated Recovery 1097 | 1098 | #### Other useful stuff 1099 | - DevOps 1100 | - Continuous Delivery 1101 | - Microservices - Bounded Context & Choreography 1102 | - Containerization 1103 | 1104 | #### Best Practices 1105 | - 12 factors app 1106 | - Codebase - One codebase tracked in revision control, many deploys 1107 | - Dependencies - Explicitly declare and isolate dependencies 1108 | - Config - Store config in the environment 1109 | - Backing services - Treat backing services as attached resources 1110 | - Build, release, run - Strictly separate build and run stages 1111 | - Processes - Execute the app as one or more stateless processes 1112 | - Port binding - Export services via port binding 1113 | - Concurrency - Scale out via the process model 1114 | - Disposability - Maximize robustness with fast startup and graceful shutdown 1115 | - Dev/prod parity - Keep development, staging, and production as similar as possible 1116 | - Logs - Treat logs as event streams 1117 | - Admin processes - Run admin/management tasks as one-off processes 1118 | 1119 | ###12 Factor App 1120 | A methodology for building modern, scalable, maintainable software-as-a-service apps. Originated from developers at Heroku. 1121 | 1122 | #### Video 1123 | Coming Soon 1124 | 1125 | #### What 1126 | - Best practices for Cloud native applications. 1127 | 1128 | #### How 1129 | - 12 factors app 1130 | - Codebase - One codebase tracked in revision control, many deploys 1131 | - Dependencies - Explicitly declare and isolate dependencies 1132 | - Config - Store config in the environment 1133 | - Backing services - Treat backing services as attached resources 1134 | - Build, release, run - Strictly separate build and run stages 1135 | - Processes - Execute the app as one or more stateless processes 1136 | - Port binding - Export services via port binding 1137 | - Concurrency - Scale out via the process model 1138 | - Disposability - Maximize robustness with fast startup and graceful shutdown 1139 | - Dev/prod parity - Keep development, staging, and production as similar as possible 1140 | - Logs - Treat logs as event streams 1141 | - Admin processes - Run admin/management tasks as one-off processes 1142 | 1143 | #### Related Topics 1144 | - Cloud Native Applications 1145 | 1146 | ### Micro Frontend 1147 | Microservices With Front-End 1148 | 1149 | #### Video 1150 | Coming Soon 1151 | 1152 | #### Why 1153 | - Backend teams can't deliver business value without the frontend being updated 1154 | - Needs communication between frontend and backend teams 1155 | 1156 | #### What 1157 | A new approach to developing microservices, with both front-end and back-end included. 1158 | 1159 | #### Advantages 1160 | - Easy to take live - since only one microservice needs to be deployed 1161 | - One team works end to end! 1162 | 1163 | #### Challenges 1164 | - How to make sure that the individual frontends are consistent. Common Framework is an option. However the risk is the coupling a common framework might create 1165 | - Different UIs for different devices - Computer, Mobile, iPad etc.. 1166 | 1167 | ### HATEOAS 1168 | 1169 | #### Video 1170 | Coming Soon 1171 | 1172 | #### What 1173 | - Hypermedia as the Engine of Application State. 1174 | - One of the important constraints of REST application architecture. 1175 | - Any REST service should include contextual hypermedia links with the response. 1176 | 1177 | #### Example 1178 | ``` 1179 | { 1180 | "_embedded" : { 1181 | "todos" : [ { 1182 | "user" : "Jill", 1183 | "desc" : "Learn Hibernate", 1184 | "done" : false, 1185 | "_links" : { 1186 | "self" : { 1187 | "href" : "http://localhost:8080/todos/1" 1188 | }, 1189 | "todo" : { 1190 | "href" : "http://localhost:8080/todos/1" 1191 | } 1192 | } 1193 | } ] 1194 | }, 1195 | "_links" : { 1196 | "self" : { 1197 | "href" : "http://localhost:8080/todos" 1198 | }, 1199 | "profile" : { 1200 | "href" : "http://localhost:8080/profile/todos" 1201 | }, 1202 | "search" : { 1203 | "href" : "http://localhost:8080/todos/search" 1204 | } 1205 | }, 1206 | "page" : { 1207 | "size" : 20, 1208 | "totalElements" : 1, 1209 | "totalPages" : 1, 1210 | "number" : 0 1211 | } 1212 | } 1213 | ``` 1214 | 1215 | XML Example 1216 | ``` 1217 | 1218 | 1219 | 12345 1220 | 100.00 1221 | 1222 | 1223 | 1224 | 1225 | 1226 | ``` 1227 | #### Why 1228 | - Less Coupling with URI Structures 1229 | 1230 | #### Related Topics 1231 | - HAL (Hypertext Application Language) is a simple format that gives a consistent and easy way to hyperlink between resources in your API. 1232 | - Resources have: 1233 | - Links 1234 | - Embedded Resources - other resources contained within them 1235 | - State - the actual resource data 1236 | - Links have: 1237 | - A target (a URI) 1238 | - A relation (a name) 1239 | 1240 | Example 1241 | ``` 1242 | { 1243 | "links": { 1244 | "self": { "href": "http://api.com/items" }, 1245 | "item": [ 1246 | { "href": "http://api.com/items/1" }, 1247 | { "href": "http://api.com/items/2" } 1248 | ] 1249 | "data": [ 1250 | {"itemName":"a"}, 1251 | {"itemName":"b"} 1252 | ] 1253 | } 1254 | ``` 1255 | ### Functional Programming 1256 | Should be driven with an Example! 1257 | 1258 | ### Reactive Programming 1259 | Should be driven with an Example! 1260 | 1261 | ### In memory Database 1262 | - IMDB or MMDB 1263 | - Main memory used as primary storage 1264 | 1265 | #### Why? 1266 | - In unit testing scenarios, you do not want to depend on external resources like a database. In memory databases help us to launch a database in memory, populate the data, run the tests and verify the results. 1267 | - Quick Prototyping and Learning 1268 | 1269 | #### What? 1270 | - Typically support a subset of the SQL (Structured Query Language) standard. 1271 | - Browser based console 1272 | 1273 | #### Examples 1274 | - H2 http://www.h2database.com/html/main.html 1275 | - HSQL 1276 | 1277 | #### How to use? 1278 | - Include a jar 1279 | - Point your datasource to the url 1280 | - Database is automatically created 1281 | 1282 | #### Demo 1283 | - Quick demo - Spring JDBC Example? 1284 | 1285 | ### SPA (Single Page Application) 1286 | - Load one page and dynamically update the page on user actions. 1287 | - Provides user experience similar to a desktop application. 1288 | - Typically use AJAX and HTML5 1289 | - Complete page is never reloaded! 1290 | 1291 | #### Demo 1292 | - http://demos.telerik.com/kendo-ui/websushi 1293 | - Gmail, Twitter and Facebook! 1294 | 1295 | #### How 1296 | Typical architectures involve 1297 | - Building REST Services in the background! Java(most popular Spring Boot) or NodeJs 1298 | - Front-ends developed with frameworks like AngularJS, Ember.js, Meteor.js, ExtJS and React 1299 | 1300 | #### Advantages 1301 | - Improved User Experience 1302 | - Reduced load on servers because only parts of page are reloaded 1303 | - Leads to more microservice based architectures! 1304 | 1305 | #### Challenges 1306 | - Needs completely different mindset! 1307 | 1308 | #### How to Learn? 1309 | - Start developing a quick app with AngularJS with a stubbed/mocked backend! 1310 | 1311 | ### Code Quality 1312 | Why duplicate? Reuse existing video? 1313 | 1314 | ### Technical Debt 1315 | - Cost of not using the best possible design and standards. 1316 | - Or how much cost is involved in getting to a good design meeting all standards 1317 | - Martin Fowler "extra effort that we have to do in future development because of the quick and dirty design choice" 1318 | - Impossible to measure accurately 1319 | 1320 | #### How is it measured? 1321 | - First thing: It cannot be measured perfectly! How do you find the technical debt because of wrong choice of technology, lack of common components, bad variable or method names. 1322 | - SonarQube - http://docs.sonarqube.org/display/SONARQUBE52/Technical+Debt 1323 | - Measures technical debt against different Non Functional Requirements! Gives a SQALE rating! 1324 | 1325 | #### Consequences 1326 | As the application becomes bigger, the productivity of the team goes down. You would notice that the velocity of the team comes down. 1327 | 1328 | #### How to reduce Technical Debt? 1329 | - Simple Architecture (4 Principles of Simple Design) 1330 | - Continuous Refactoring 1331 | - Good Unit Tests 1332 | - TDD 1333 | - Static Analysis 1334 | - Good Standards 1335 | - Peer Reviews 1336 | - Fingers crossed (Nobody can predict future architecture and when current architecture becomes obselete) 1337 | - Maintain a Technical Backlog 1338 | - Do a cleanup spring once in a while! 1339 | 1340 | #### Challenges? 1341 | - How do you improve a project which already has a large Technical Debt? 1342 | - Identify potential areas of improvement 1343 | - Identify changes in the next 6 months 1344 | - Write test for areas which are gonna be changed in the next 6 months 1345 | - Refactor 1346 | - Build the test base over a period of time 1347 | 1348 | #### Best Practices 1349 | - Have Technical Debt as part of Definition of Done 1350 | - Measure Technical Debt from day one of the project! 1351 | 1352 | ### Code Coverage 1353 | How much percentage of your source code is covered by unit tests? 1354 | 1355 | #### Example 1356 | http://www.sonarqube.org/manage-code-coverage-by-unit-tests-with-sonar/ 1357 | 1358 | #### Why is it important? 1359 | - Unit Testing is one of the most important modern development practices. 1360 | - Good Unit Tests are there for ever! They catch defects in future! 1361 | - Systems with good unit tests improve over a period of time! Developers are not worried about breaking functionality. So, they continuously refactor! 1362 | 1363 | #### Challenges 1364 | - Not having proper asserts 1365 | - Writing tests just for coverage! 1366 | - Certains parts of the applications are not designed for unit testing 1367 | - Old frameworks - Web and database especially 1368 | 1369 | #### How to measure? 1370 | - SONAR 1371 | - Eclipse - Cobertura and EclEmma plugins 1372 | - Inbuilt in Intellij 1373 | 1374 | #### Best Practices 1375 | - Have Code Coverage as part of Definition of Done 1376 | - Measure Code Coverage from day one of the project! 1377 | 1378 | #### Related Topics 1379 | Unit Testing 1380 | Dependency Injection 1381 | In memory databases 1382 | 1383 | ### Legacy Code 1384 | Make your choice 1385 | - Old Code! 1386 | - Code without Tests? 1387 | - Code with Lot of Technical Debt? 1388 | - Code with old out of date frameworks and languages? 1389 | 1390 | #### Challenges 1391 | - Unexpected impact - Changing one part of application impacts another part 1392 | - Large code bases 1393 | - Large teams 1394 | - Long Release Cycles 1395 | 1396 | #### Dealing with Legacy Code 1397 | - Refactor (atleast very important areas) 1398 | - Replace :) 1399 | - Have good code review process 1400 | - Introduce Static Analysis where possible 1401 | - Introduce Unit Testing where possible 1402 | - Measure Technical Debt 1403 | - Have Automated Regression Tests at least 1404 | - Especially as writing good unit tests might be difficult 1405 | - Develop new functionality outside using new architecture and connect using services 1406 | 1407 | #### Related Topics 1408 | - Refactoring 1409 | - Code Quality 1410 | 1411 | ### Tech Design 1412 | - Lets not worry about it! 1413 | 1414 | ### Evolutionary Design 1415 | In water fall model, we followed an approach where we architected and designed the entire system before we started coding. Evolution Design is using a combination of good tests and high level architecture base to drive you to a good design. You apply basic design principles (4 Principles of Simple Design) and continuously refactor your code ensuring good design emerges. Uses an iterative approach. 1416 | At each pass - add, refactor and test 1417 | 1418 | #### Advantages 1419 | - Avoids over design 1420 | - Avoids designing for some future feature which never materializes 1421 | - Continuous & Immediate feedback as we are not waiting for all design to complete before we deliver value to customer 1422 | 1423 | #### Challenges 1424 | - Need clear separation between Design and Architecture 1425 | - Need skilled and experienced developers/architects to guide and govern 1426 | - Needs Continuous Integration 1427 | - Needs high focus on tests. If tests are not good, design cannot evolve as developers are reluctant to make changes! 1428 | 1429 | #### Best Practices 1430 | - Use TDD 1431 | - Use Continuous Integration 1432 | 1433 | #### How to Learn? 1434 | - Good Question. Experience it to learn it. Pair with Good Programmers. 1435 | 1436 | ### Code First 1437 | When we develop any service, we have two approaches 1438 | - Code First 1439 | - Contract First 1440 | 1441 | In Code First approach we write the code for the service first and generate the contract for the service from code! 1442 | 1443 | #### Examples 1444 | Swaggerizing Spring Boot Services 1445 | Generating WSDL from Web Service Code 1446 | 1447 | #### Demo 1448 | Exposing Swagger contract from REST Services 1449 | 1450 | #### Advantages 1451 | - Does not need additional effort to create the contract! 1452 | - Contract and Code always in sync! 1453 | 1454 | #### Disadvantages 1455 | - Makes it difficult to develop in parallel! 1456 | - Teams do not know the target! As contract is not agreed ahead of time, teams might make more changes than necessary. 1457 | - In old frameworks, sometimes the generated contract was not compatiable across platforms! 1458 | - How do we support versioning? 1459 | 1460 | #### Move from WSDL to JSON REST Services 1461 | - Makes it more difficult to make a choice 1462 | - Tools are evolving. Today some of the disadvantages of Code First have alternatives. 1463 | 1464 | ### Contract First 1465 | When we develop any service, we have two approaches 1466 | - Code First 1467 | - Contract First 1468 | 1469 | In Contract First approach we agree on the contract for the service first. We write code based on the contract. 1470 | 1471 | #### Advantages 1472 | - Teams can develop in parallel! 1473 | - Teams know what to expect. Can use some stub framework to mock the service based on the contract. 1474 | - Cross Platform Compatible 1475 | - Enables reuse of Schemas 1476 | 1477 | #### Disadvantages 1478 | - Some initial additional effort 1479 | - Needs some effort to ensure that the updated contracts are shared as when needed 1480 | 1481 | #### Move from WSDL to JSON REST Services 1482 | - Makes it more difficult to make a choice 1483 | - Tools are evolving. Today some of the disadvantages of Code First have alternatives. 1484 | 1485 | ### Web Service 1486 | - Everything on the web is a web service! 1487 | - Fundamental to SOA and Microservice approaches. 1488 | 1489 | #### Example 1490 | - You send a request to Google.com. Google.com responds with HTML. Browser renders it. 1491 | ![Example Web Service](http://3.bp.blogspot.com/-RSSyK3JhGhw/VVTOQyaX2jI/AAAAAAAAAL8/BZL6jYEZXL4/s640/WebService_BrowserGoogle.png) 1492 | 1493 | #### Some Terminologies 1494 | - Service Provider : Google.com is the service provider. Handles the request and sends a response back. 1495 | - Service Consumer : Browser is the service consumer. Creates Request. Invokes Service. Processes the Response. 1496 | - Data Exchange Format : In this example, Data Exchange is done over HTTP protocol. Request is HTTP request and Response is HTTP Response. Data exchange format can be something else as well. XML (in case of SOAP web services) and JSON (most RESTful services). 1497 | - Contract : Agreement to the definition of a service. 1498 | 1499 | #### Types of Webservices 1500 | - SOAP : Simple Object Access Protocol 1501 | - REST : RESTful Web services 1502 | 1503 | #### Advantages 1504 | - Re-use : Web services avoid the need to implement business logic repeatedly. If we expose a web service, other applications can re-use the functionality 1505 | - Modularity : For example, tax calculation can be implemented as a service and all the applications that need this feature can invoke the tax calculation web service. Leads to very modular application architecture. 1506 | - Language Neutral : Web services enable communication between systems using different programming languages and different architectures. For example, following systems can talk with each other : Java, .Net, Mainframes etc. 1507 | - Web Services are the fundamental blocks of implementing Service Oriented Architecture in an organization. 1508 | 1509 | #### Approaches to developing web services 1510 | - Contract First vs Code First 1511 | - SOAP vs REST 1512 | - REST is winning the race. Lightweight. With JSON, more options for consumers. 1513 | - HTTP vs JMS vs AMQP vs... 1514 | - As we move towards Microservices with event driven architectures, AMQP is getting more popular as a means of programming language neutral asynchronous communication approach. 1515 | - Defining Contracts 1516 | - WSDL for SOAP Services 1517 | - Swagger/RestDocs for RESTful JSON Services 1518 | 1519 | #### Best Practices 1520 | - Keep your contracts programming language neutral 1521 | - Follow contract first 1522 | - JSON based RESTful services are emerging as a popular approach. They are lightweight and consumable from browser and mobile apps. 1523 | 1524 | #### Demo 1525 | - Let run a web service and call it using Postman? 1526 | 1527 | ### SOAP Web Services 1528 | - Refer web service section above for understanding what a web service is. 1529 | - In SOAP web services, data exchange (request and responses) happens using SOAP format. SOAP is based on XML. 1530 | 1531 | #### SOAP 1532 | - SOAP is a platform independent messaging protocol. Allows communication between disparate operation systems. For example, a system using Windows can talk to as sytem using UNIX using services built using SOAP protocol. 1533 | - SOAP format defines a SOAP-Envelope which envelopes the entire document. SOAP-Header (optional) contains any information needed to identify the request. Also, part of the Header is authentication, authorization information (signatures, encrypted information etc). SOAP-Body contains the real xml content of request or response. 1534 | - All the SOAP web services use this format for exchanging requests and responses. In case of error response, server responds back with SOAP-Fault. 1535 | ![SOAP Web Services](http://4.bp.blogspot.com/-DyySh3d6XUs/VVTOTSlv3RI/AAAAAAAAAMQ/MGYhbgtYuo4/s640/WebService_SoapMessge.png) 1536 | 1537 | #### Steps in creating a SOAP Web Service 1538 | - Define a Contract 1539 | - Create Service Provider 1540 | - Create Service Consumer 1541 | 1542 | #### How it works 1543 | Request/Response Client Side Server Side 1544 | Request (1)Java Object => SOAP Request XML ----o-------> (2)SOAP Request XML => C# Object 1545 | Response (4)Java Object <= SOAP Response XML <----o----- (3) SOAP Response XML <= C#Object 1546 | 1547 | - Structure of Request and Response XML are defined in WSDL 1548 | - Converting Java object to SOAP xml. This is called Marshalling. 1549 | - Converting SOAP xml to Java object. This is called Unmarshalling. 1550 | JAXB and XMLBeans are frameworks which enable use to do marshalling and unmarshalling easily. 1551 | 1552 | #### Security 1553 | - At transport level, SSL is used to exchange certificates (HTTPS). This ensures that the server (service producer) and client (service consumer) are mutually authenticated. It is possible to use one way SSL authentication as well. 1554 | - At the application level, security is implemented by transferring encrypted information (digital signatures, for example) in the message header (SOAP Header). This helps the server to authenticate the client and be confident that the message has not been tampered with. 1555 | 1556 | #### Demo 1557 | - Let run a web service and call it using Postman? 1558 | 1559 | ### REST Web Services 1560 | - There are a set of architectural constraints called REST Constraints. Any service which satisfies these constraints is called RESTful Web Service. 1561 | - There are a lot of misconceptions about REST Web Services : They are over HTTP , based on JSON etc. Yes : More than 90% of RESTful Web Services are JSON over HTTP. But these are not necessary constraints. We can have RESTful Web Services which are not using JSON and which are not over HTTP. 1562 | 1563 | #### RESTful Constraints 1564 | The five important constraints for RESTful Web Service are 1565 | - Client-Server : There should be a service producer and a service consumer. 1566 | - The interface (URL) is uniform and exposing resources. Interface uses nouns (not actions) 1567 | - The service is stateless. Even if the service is called 10 times and there is no change in the state of the resource, the result must be the same. 1568 | - The service response should be Cacheable. 1569 | - Client should not assume direct connection to server - it might be getting info from a middle layer - cache. 1570 | 1571 | #### What is HTTP? 1572 | - HTTP is the protocol to exchange or transfer hypertext. 1573 | - Request–Response protocol 1574 | - HTTP Request - The request message consists of the following: 1575 | - A request line with request method and URI (e.g., GET /images/logo.png HTTP/1.1, which requests a resource called /images/logo.png from the server). 1576 | - Request header fields (e.g., Accept-Language: en). 1577 | - An optional message body. 1578 | - HTTP Response - The response message consists of the following: 1579 | - A status (e.g., HTTP/1.1 200 OK). 1580 | - Response header fields (e.g., Content-Type: text/html). 1581 | - An optional message body. 1582 | 1583 | - HTTP methods: indicate the desired action to be performed on the identified resource. GET, POST, PUT, PATCH, DELETE among a host of others. 1584 | - Different HTTP Status Codes 1585 | 1586 | #### Applying RESTful Constraints to HTTP web services 1587 | - While designing any API, the most important thing is to think about the api consumer i.e. the client who is going to use the service. What are his needs? Does the service uri make sense to him? Does the request, response format make sense to him? 1588 | - Always use HTTP Methods. Best practices with respect to each HTTP method is described below: 1589 | - GET : Should not update anything. Should be idempotent (same result in multiple calls). Possible Return Codes 200 (OK) + 404 (NOT FOUND) +400 (BAD REQUEST) 1590 | - POST : Should create new resource. Ideally return JSON with link to newly created resource. Same return codes as get possible. In addition : Return code 201 (CREATED) is possible. 1591 | - PUT : Update a known resource. ex: update client details. Possible Return Codes : 200(OK) 1592 | - DELETE : Used to delete a resource. 1593 | - Have properly structure URIs. URI’s should be hierarchical and as self descriptive as possible. Prefer plurals. 1594 | - Friends List - GET /users/Ranga/friends 1595 | - Add a Friend - POST /users/Ranga/friends 1596 | - Get details about a specific friend - GET /users/Ranga/friends/Ravi 1597 | 1598 | #### Implementation Approaches in Java 1599 | - JAX RS 1600 | - Spring MVC 1601 | 1602 | #### JAX-RS 1603 | JAX-RS is the JEE Specification for Restful web services implemented by all JEE compliant web servers (and application servers). Important Annotations 1604 | - @ApplicationPath("/"). @Path("users") : used on class and methods to define the url path. 1605 | - @GET @POST : Used to define the HTTP method that invokes the method. 1606 | - @Produces(MediaType.APPLICATION_JSON) : Defines the output format of Restful service. 1607 | - @Path("/{id}") on method (and) @PathParam("id") on method parameter : This helps in defining a dynamic parameter in Rest URL. @Path("{user_id}/followers/{follower_id}") is a more complicated example. 1608 | - @QueryParam("page") : To define a method parameter ex: /users?page=10. 1609 | Useful methods: 1610 | - Response.OK(jsonBuilder.build()).build() returns json response with status code. 1611 | - Json.createObjectBuilder(). add("id",user.getId()); creates a user object. 1612 | 1613 | #### Document REST Services 1614 | - Swagger 1615 | - Restdocs 1616 | 1617 | #### Richardson Maturity Model 1618 | Richardson Maturity Model defines the maturity level of a Restful Web Service. Following are the different levels and their characteristics. 1619 | - Level 0 : Expose SOAP web services in REST style. Expose action based services (http://server/getPosts, http://server/deletePosts, http://server/doThis, http://server/doThat etc) using REST. 1620 | - Level 1 : Expose Resources with proper URI’s. Ex: http://server/accounts, http://server/accounts/10. However, HTTP Methods are not used. 1621 | - Level 2 : Resources use proper URI's + HTTP Methods. For example, to update an account, you do a PUT to . The create an account, you do a POST to . Uri’s look like posts/1/comments/5 and accounts/1/friends/1. 1622 | - Level 3 : HATEOAS (Hypermedia as the engine of application state). You will tell not only about the information being requested but also about the next possible actions that the service consumer can do. When requesting information about a facebook user, a REST service can return user details along with information about how to get his recent posts, how to get his recent comments and how to retrieve his friend’s list. 1623 | 1624 | #### Best Practices 1625 | - Have a RESTful api standard across organization- YARAS 1626 | - Message and URI Layout, HATEOAS, Sorting, Filtering, Pagination 1627 | - Use HATEOAS where possible 1628 | - Have Great Unit Tests! 1629 | 1630 | #### Demo 1631 | - Show case a Spring MVC Based REST Service 1632 | - Show case HATEOAS 1633 | - Show case Swagger Documentation 1634 | 1635 | ### Static Code Analysis 1636 | - Isn't this already done? 1637 | 1638 | ### Vertical Slice 1639 | - We want to build a large application talking to multiple services. When we start developing an application, we want to lay down the architecture and design, set up frameworks, integrate them and setup unit testing. 1640 | - Vertical Slice can be a small use case which ensures all layers are involved 1641 | - Database 1642 | - External Services 1643 | 1644 | #### Why? 1645 | - Vertical Slice is used to identify and solve technology risks at the very start of a project. 1646 | - Vertical Slice acts as a reference for other developers as they start building more stuff. 1647 | 1648 | #### Best Practices 1649 | - Ensure that Static Analysis is in place in parallel and Vertical Slice adheres to all standards 1650 | - Ensure that continuous integration is in place. 1651 | - Do developers need trainings on the frameworks? 1652 | 1653 | #### Challenges 1654 | - Identify the right use case for the vertical slice! Usually choose a relatively complex use case! 1655 | 1656 | ### Internationalization or Localization or i18n 1657 | Customizing an application for use in different locations and languages - for different Locales! 1658 | 1659 | #### Why? 1660 | - You don't want 100 applications for 100 Locales 1661 | 1662 | #### How to implement Internationalization? 1663 | - Lets take a quick demo of implementing it with Spring MVC! 1664 | 1665 | #### Challenges 1666 | - Sometimes data from database tables need to be internationalized. This needs a custom solution. 1667 | 1668 | #### Best Practice 1669 | Build it in from the first day. Should be part of vertical slice usually. 1670 | 1671 | ### Transaction Management 1672 | - Already done! 1673 | 1674 | ### Non Functional Requirements NFRs 1675 | Requirements which are not typically specified as part of how application should behave 1676 | - Authentication and Authorization 1677 | - Performance 1678 | - Scalability 1679 | - Availability 1680 | - Resilience 1681 | - Maintainability 1682 | - Portability 1683 | - Security 1684 | 1685 | #### Best Practices 1686 | - Have clearly stated non functional requirements 1687 | - Build vertical slices where-ever possible to eliminate most important non functional risks - scalability or performance 1688 | - Will the framework be able to withstand a specific load? 1689 | - Check for Security from start of the project. 1690 | - Use Static Analysis from start of the project. 1691 | - Use Secure Code Static Analysis tools from start of the project. 1692 | 1693 | #### Challenges 1694 | - Sometimes you do not know the target for non functional requirement? What if your app becomes more popular than what you expect? 1695 | 1696 | ### Authentication and Authorization 1697 | - Authentication: Are you who you state you are? 1698 | - Authorization: Do you have access to the specific resource or functionality? 1699 | 1700 | #### Best Practices 1701 | - Use HTTPS - SSL 1702 | - Use Standard Frameworks - Spring Security 1703 | - Authorization: Have a clear framework. Check before performing action. Best way to implement is to use Filters 1704 | - Use Server Side Validations. 1705 | - Don't re-invent the wheel. 1706 | - Don't allow your access tokens to last forever. 1707 | - Don't store access tokens or passwords in plaintext. 1708 | - Build visibility into volumes of authentication failures. 1709 | - Do not use Basic Authentication 1710 | - Use secure cookies only 1711 | 1712 | ### Performance 1713 | How fast is your application? 1714 | 1715 | #### Best Practices 1716 | - Have clear performance objectives 1717 | - Make the right architecture choice for your needs 1718 | - If needed, implement a vertical slice quickly to test performance 1719 | - Measure Early 1720 | - Use Load Tests early in the cycle 1721 | - NO premature optimizations. Any optimization decision should be based on numbers or past experience. In Donald Knuth's paper "Structured Programming With GoTo Statements", he wrote: "Programmers waste enormous amounts of time thinking about, or worrying about, the speed of non critical parts of their programs, and these attempts at efficiency actually have a strong negative impact when debugging and maintenance are considered. We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%." 1722 | - Session size - Small 1723 | - Implement Caching where ever possible 1724 | - Create necessary Indexes on Database. Collect Statistics and Remove unnecessary data 1725 | - In critical parts - write unit tests for performance. 1726 | - Java Specific 1727 | - Set initial size on Collections 1728 | - Be conscious about create as few objects as possible. Especially in loops. 1729 | - Avoid String Concatenation 1730 | - Eliminate Obselete Object References 1731 | - Close connections and Streams 1732 | 1733 | ### Scalability 1734 | - Will your system handle more load if you give it more resources? 1735 | - "A system whose performance improves after adding hardware, proportionally to the capacity added, is said to be a scalable system." 1736 | - If supporting X users needs Y resources, will I be able to support 2X users or better with 2Y resources? 1737 | 1738 | #### Types 1739 | - Horizontal : Add more nodes to cluster. Now popular with the cloud bringing in new possibilities. 1740 | - Vertical : Add resources to the current node. Increase main memory, for example. 1741 | - Comparison 1742 | - There are limits to how much you can scale vertically. 1743 | 1744 | #### Notes 1745 | - Usually databases become the bottleneck in large systems. 1746 | 1747 | #### Best Practices 1748 | - Have clear scalability targets 1749 | - Test Early 1750 | - Be wary of typical bottlenecks - Things which are difficult to scale horizontally 1751 | - Load balancers 1752 | - Databases (Do not have a large database! Try splitting up databases! Transaction database, Reporting database. See if you can have as small databases as possible) 1753 | - Large Monolithic Application (difficult to deploy!) 1754 | - Caching can improve scalability 1755 | - Static Resources 1756 | - Configuration Data 1757 | - User Data 1758 | - Service Responses 1759 | - Think of a Distribute Cache 1760 | - Build visibility and build alerts 1761 | - Build cloud native microservice based applications and make use of the cloud! 1762 | 1763 | ### Availability 1764 | - Proportion of time that the system is functional and working 1765 | - Downtime can be caused by 1766 | - Software Errors 1767 | - Infrastructure Problems 1768 | - Denial of Service Attacks 1769 | - High Load 1770 | - Examples 1771 | - High load on database 1772 | - A server crash because of a bug in code 1773 | 1774 | #### Best Practices 1775 | - Build Redundancy 1776 | - Identify possible bottlenecks or choke points and plan to reduce them 1777 | - Install Security Updates of Operating System and Software 1778 | - Load Test with real time loads 1779 | - Have proper exception handling 1780 | - Have Automated Visibility to detect unusual patterns. 1781 | - Validate data on the Server 1782 | 1783 | ### Resilience 1784 | - How does your system respond in case of a failure of a specific component or a service? 1785 | - Can it provide reduced set of functionality instead of completely breaking down? 1786 | - Especially important in the world of microservices. Things become more distributed increasing the chances of failure 1787 | - Will the entire amazon.com be down if product recommendations service is down? 1788 | 1789 | #### Best Practices 1790 | - Always think what if a service is down? 1791 | - Test for service failures. Switch off a service and see how the system reacts 1792 | - Use Circuit Breaker Frameworks like Hystrix 1793 | 1794 | ### Maintainability 1795 | - How is easy is it to make changes to your system? 1796 | 1797 | #### Questions to ask? 1798 | - How frequently do things break when you make a change? 1799 | - How many defects come as a result of changes? 1800 | - How much effort does it take to make a change? 1801 | 1802 | #### Best Practices 1803 | - Coding Standards, Static Code Analysis and Peer Reviews 1804 | - Loose Coupling and High Cohesion 1805 | - Proper Layering 1806 | - Small Applications compared to Monoliths 1807 | - Continuous Integration 1808 | - Automation Testing - Unit Testing and Integration Testing 1809 | - Sufficient Documentation 1810 | 1811 | ### Portability 1812 | - How easy is it to move other Language, Database, Framework or a Platform? 1813 | - How easy can you move from Hibernate to other framework? JPA 1814 | - How easy can you move from Websphere to Weblogic? Adhere to JEE standards 1815 | - How easy to move from Windows to Unix? If you have a java based application, you already made a good start 1816 | - How easy is to move from Oracle to mySql? Are you adhering to Ansi SQL Standards? Are you using any Oracle specific features? 1817 | 1818 | ### Testability 1819 | - How easy is to test parts/components of your application? 1820 | 1821 | #### Best Practices 1822 | - Avoid Monoliths 1823 | - Too much business logic. Too difficult to test. 1824 | - Simple Design using Dependency Injection 1825 | - Design for Testability 1826 | - Agreed contacts for Services 1827 | - Architectures build with development needs - Stubs & Mocks 1828 | - Focus on Unit testing and Integration testing from the first day of the project 1829 | - Use TDD and Continuous Refactoring 1830 | 1831 | ### Security 1832 | - Protect from unintended use! 1833 | - Protect from denial of service attacks. 1834 | - Protect unauthorized users from gaining access 1835 | - Restrict authorized users access only to the specific modules or data they are supposed to access! 1836 | 1837 | #### Principles 1838 | - Least Priviliges : Build with security in mind from the initial project stages. Think about various user roles and accesses 1839 | - Complete Mediation : Similar to building a security for a King's fort. One Gate through which every body has to pass through. Ex: Spring Security 1840 | - Defence in Depth : Have Multiple levels of security. 1841 | - Trust Nothing 1842 | - Validate all data into system. 1843 | - Sanitise data 1844 | - Economy of Mechanism. Keep it simple. Simple systems are easy to protect 1845 | - Openness of Design 1846 | - Opposite to "Security through Obscurity" 1847 | 1848 | #### Three Parts 1849 | - Prevention 1850 | - Detection 1851 | - Reaction 1852 | 1853 | #### Best Practices 1854 | - Think of security from day one 1855 | - Educate developers, testers, operations teams and business about the threats 1856 | - Be aware of OWASP and their recommendations 1857 | - Test Early 1858 | - Use Security Static Analysis tool 1859 | - Get external security testers to hack your applications! 1860 | - OWASP 1861 | - Have an approved software/framework/platfrom list by a Security Team 1862 | - Use latest versions 1863 | - Safeguard web server, app server, os & hardware. 1864 | - Web sphere admin console example - Deleting default accounts & Exposing it outside enterprise. 1865 | - Use encryption for sensitive data. One way functions. When hashing use some salt - Salt can be stored in Db for each user. 1866 | 1867 | ### SQL Injection 1868 | Injecting a part of query through a form field! 1869 | 1870 | #### Other Types of Injections 1871 | - LDAP 1872 | - XML Xpath 1873 | - Log 1874 | - OS Command 1875 | - XSS (Javascript) 1876 | 1877 | ##### Prevention 1878 | - Parameterised Queries 1879 | 1880 | ### Cross Site Scription - XSS 1881 | 1882 | #### Cause 1883 | - Invalid Data 1884 | - external services 1885 | - databases 1886 | - user 1887 | 1888 | #### Types 1889 | - Stored : Stored in db from ui. Problem happens when info is shown to user at a later point. 1890 | - Reflected : Dom - Untrusted data processed in JavaScript 1891 | 1892 | #### Possible Abuse 1893 | - Stealing Session Cookies 1894 | - Page Content Rewrite 1895 | - Logging Keystrokes 1896 | 1897 | #### Solutions 1898 | - Validate untrusted data 1899 | - Encode all data - even trusted data 1900 | - Encoding should be contextual 1901 | - CSS 1902 | - HTML 1903 | - JS 1904 | - Ideally contextual encoding should be built into the frameworks 1905 | - Use JSTL & Other tag libraries 1906 | - Use Content Security Policy 1907 | - XSS Prevention Cheat Sheet 1908 | 1909 | ### Insecure Direct Object References 1910 | User changes link on the browser from resource he has access to to one which he has no access to 1911 | - /account/123 to /account/125 1912 | - especially vulnerable if the reference appears in url 1913 | 1914 | #### Prevention 1915 | - Proper Authorization using Mediation - Filters 1916 | - Use object references in urls 1917 | - Avoid predictability of urls 1918 | 1919 | #### Insufficient Transport Layer Security 1920 | - things that can be compromised in non secure request 1921 | - passwords 1922 | - session ids 1923 | - Other sensitive data on page 1924 | 1925 | #### Prevention 1926 | - Use TLS 1927 | - All elements on page should use TLS 1928 | - Popups 1929 | - Other websites we redirect to 1930 | - Possibility of sending session id cookie insecurely to a NON https website redirect 1931 | - Use Secure Cookies : Mark cookies as secure. These are sent only to secure (https) websites 1932 | - Use Trusted Certificates 1933 | - Reissue session tokens when switching between secure and insecure website pages 1934 | 1935 | ### Cross Site Request Forgery (CSRF) 1936 | Reuse of an user's existing session on a banking website on a forum to fire a unauthorised url or ajax request 1937 | - I log into a banking website and go to a forum without logging out 1938 | - My session cookie is in my browser!! It can be abused 1939 | 1940 | #### Prevention 1941 | - Include an unpredictable UNIQUE token with every request called CSRF Protection token. typically a hidden form field 1942 | - Reauthenticate user when performing significant actions 1943 | - Use frameworks like OWASP CSRF Guard or Spring Security 1944 | 1945 | ### Session Management 1946 | - Http is stateless 1947 | - How to identify a user between subsequent requests 1948 | 1949 | #### Mechanisms 1950 | - Url Rewrite - Session id in url 1951 | - vulnerable to sniffing 1952 | - Url is logged in multiple places including web server logs 1953 | - When you visit a third party site, the url is sent as a REFERRAL URL in request header 1954 | - Recommendation: Use https for entire session 1955 | - Basic Authentication : Base 64 encoded userid and password in every request 1956 | - Sniffing 1957 | - NOT RECOMMENDED 1958 | - Cookies 1959 | - Use domain : which hosts should this cookie be sent to path 1960 | - Use expiration date 1961 | - Mark as secure : sent only to https websites 1962 | 1963 | ### Missing Function Level Access Controls 1964 | Improper Authorization 1965 | - Complete Mediation Principle 1966 | - Filters or interceptors 1967 | - Have well defined roles 1968 | 1969 | #### Exploitation 1970 | - Changing url in browser 1971 | - Firing AJAX Requests 1972 | 1973 | ### Containerization 1974 | - OS level virtualization technology 1975 | - Shares the host operating system kernel 1976 | - No dedicated operating system 1977 | 1978 | #### Advantages 1979 | - Lightweight 1980 | - High performance 1981 | - TODO MORE 1982 | 1983 | Copy Again~~~~~~~~~~~~~~~~~~~~~~ 1984 | ### Topic 1985 | #### Video 1986 | Coming Soon 1987 | #### What 1988 | #### Why 1989 | #### How 1990 | #### When 1991 | #### Where 1992 | #### Best Practices 1993 | #### Challenges 1994 | #### Example 1995 | #### What Else? 1996 | #### How to Learn? 1997 | #### Related Topics 1998 | #### Tips 1999 | #### Perspectives 2000 | ##### Code 2001 | ##### Test 2002 | ##### Design 2003 | ##### Architecture 2004 | ##### Management 2005 | ##### Deployment 2006 | ##### Operations 2007 | ##### Performance 2008 | ##### Scalability 2009 | ##### Maintainability 2010 | ##### Availability 2011 | ##### Security 2012 | #### Course 2013 | 2014 | ### Troubleshooting 2015 | - Refer our TroubleShooting Guide - https://github.com/in28minutes/in28minutes-initiatives/tree/master/The-in28Minutes-TroubleshootingGuide-And-FAQ 2016 | 2017 | ## Youtube Playlists - 500+ Videos 2018 | 2019 | [Click here - 30+ Playlists with 500+ Videos on Spring, Spring Boot, REST, Microservices and the Cloud](https://www.youtube.com/user/rithustutorials/playlists?view=1&sort=lad&flow=list) 2020 | 2021 | ## Keep Learning in28Minutes 2022 | 2023 | in28Minutes is creating amazing solutions for you to learn Spring Boot, Full Stack and the Cloud - Docker, Kubernetes, AWS, React, Angular etc. - [Check out all our courses here](https://github.com/in28minutes/learn) 2024 | -------------------------------------------------------------------------------- /images/Image_ContinuousIntegration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in28minutes/java-technology-for-beginners/bc3bc907a5892c4fcf3948e19849a3d4002be00f/images/Image_ContinuousIntegration.png -------------------------------------------------------------------------------- /images/image_Dev_QA_Stage_Prod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in28minutes/java-technology-for-beginners/bc3bc907a5892c4fcf3948e19849a3d4002be00f/images/image_Dev_QA_Stage_Prod.png -------------------------------------------------------------------------------- /images/image_EventDriven_Microservice.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in28minutes/java-technology-for-beginners/bc3bc907a5892c4fcf3948e19849a3d4002be00f/images/image_EventDriven_Microservice.png -------------------------------------------------------------------------------- /images/image_LoadBalancer_Caching.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in28minutes/java-technology-for-beginners/bc3bc907a5892c4fcf3948e19849a3d4002be00f/images/image_LoadBalancer_Caching.png -------------------------------------------------------------------------------- /images/image_LoadBalancer_Simple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in28minutes/java-technology-for-beginners/bc3bc907a5892c4fcf3948e19849a3d4002be00f/images/image_LoadBalancer_Simple.png -------------------------------------------------------------------------------- /images/image_Microservices_Scalability.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in28minutes/java-technology-for-beginners/bc3bc907a5892c4fcf3948e19849a3d4002be00f/images/image_Microservices_Scalability.png -------------------------------------------------------------------------------- /images/image_Monolith_vs_Microservice.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in28minutes/java-technology-for-beginners/bc3bc907a5892c4fcf3948e19849a3d4002be00f/images/image_Monolith_vs_Microservice.png -------------------------------------------------------------------------------- /images/image_TDD_Red_Green_Refactor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/in28minutes/java-technology-for-beginners/bc3bc907a5892c4fcf3948e19849a3d4002be00f/images/image_TDD_Red_Green_Refactor.png --------------------------------------------------------------------------------