Chapter
New demands in enterprise systems
Modern way of realizing enterprise systems
Relevance of Java EE in modern systems
Java EE 8 update and roadmap
What to expect in the book
Chapter 2: Designing and Structuring Java Enterprise Applications
The purpose of enterprise applications
What developers should focus on
Meeting customer's demands
Outer enterprise project structure
Business and team structures
Software projects contents
Single versus multi-module projects
Organizational challenges
Reusability considerations
Build systems for Java EE
Structuring for modern frontend technologies
Enter JavaScript frameworks
Organizing modern frontends
Enterprise project code structure
Situation in enterprise projects
Horizontal versus vertical layering
Business-driven structure
Designing reasonable modules
Realizing package structures
Horizontal package layering
Don't over-enforce architecture
Chapter 3: Implementing Modern Java Enterprise Applications
Core domain components of modern Java EE
EJB and CDI - differentiation and integration
Design patterns revisited
External and cross-cutting concerns in enterprise applications
Communication with external systems
How to choose communication technology
Synchronous HTTP communication
Representational State Transfer
Java API for RESTful web services
Mapping HTTP content types
Accessing external systems
Stability when consuming HTTP
Accessing Hypermedia REST services
Asynchronous communication and messaging
Asynchronous HTTP communication
Message-oriented communication
Connecting enterprise technology
Integrating RDBMS systems
Integrating database systems
Relational databases versus NoSQL
Asynchronous and reactive JAX-RS
Concepts and design principles of modern Java EE
Preserving maintainable code with high quality
Chapter 4: Lightweight Java EE
Lightweight enterprise technology
Convention over configuration
Dependency management of Java EE projects
Lightweight way of packaging applications
Java EE application servers
One application per application server
Chapter 5: Container and Cloud Environments with Java EE
Stability and production readiness
Container orchestration frameworks
Realizing container orchestration
Java EE in orchestrated containers
Connecting external services
Configuring orchestrated applications
12-factor applications and Java EE
Have one codebase tracked in revision control, many deploys
Explicitly declare and isolate dependencies
Store config in the environment
Treat backing services as attached resources
Strictly separate build and run stages
Execute the app as one or more stateless processes
Export services via port binding
Scale out via the process model
Maximize robustness with fast startup and graceful shutdown
Keep development, staging, and production as similar as possible
Treat logs as event streams
Run admin/management tasks as one-off processes
Cloud, Cloud native, and their benefits
Chapter 6: Application Development Workflows
Motivation and goals of productive development workflows
Realizing development workflows
Version control everything
Adding database structures
Changing database structures
Removing database structures
Continuous Delivery culture and team habits
Immediately fixing issues
Requirements of well-crafted tests
Definition of test scopes
Delegating test components
Running integration tests
Code level integration tests versus system tests
Shortcomings of integration tests
Shortcomings of system tests
Simulating external concerns
Deploying and controlling external mocks
Key performance indicators
Developing performance tests
Maintaining test data and scenarios
Importance of maintainable tests
Signs of lack of test quality
Chapter 8: Microservices and System Architecture
Motivations behind distributed systems
Challenges of distribution
How to design systems landscapes
Context maps and bounded contexts
How to design system interfaces
Breaking the business logic
Hypermedia REST and versioning
Consistency versus scalability
Event sourcing, event-driven architectures, and CQRS
Shortcomings of CRUD-based systems
Eventually consistent real world
Event-driven architectures
Eventual consistency in event-driven architectures
Microservice architectures
Sharing data and technology in enterprises
Shared-nothing architectures
12-factor and cloud native applications
When to use and when not to use microservices
Implementing microservices with Java EE
Zero-dependency applications
Implementing application boundaries
Example scenario using Apache Kafka
Integrating further CQRS concepts
Java EE in the age of distribution
Communicating resiliently
Breaking timeouts and circuits
Shaking hands and pushing back
Chapter 9: Monitoring, Performance, and Logging
Collecting business metrics
Integrating the environment
Meeting performance requirements in distributed systems
Achieving SLAs in distributed systems
Tackling performance issues
Identifying performance regression with jPDM
Operating system and hardware
jPDM instances - production situations
Analyzing the jPDM instances
Dominating consumer - none
Dominating consumer - JVM
Dominating consumer - application
Types of technical metrics
High frequency monitoring versus sampling
Collecting technical metrics
Shortcomings of traditional logging
The concerns of applications
Wrong choice of technology
Logging in a containerized world
Tracing in a modern world
Typical performance issues
Logging and memory consumption
Lessons learned from the past
Security in a modern world
Delegate security concerns
Treat user credentials properly
Avoid storing credentials in version control
Possibilities and solutions
Protocol-based authentication
Integration in modern environments
Implementing security in Java EE applications
Java principals and roles
Authentication mechanisms
Accessing security information
Motivations in enterprise development
Cloud and Continuous Delivery
API updates introduced in Java EE 8
Eclipse Enterprise for Java
Appendix: Links and further resources