Running Hibernate in clustered mode - spring-boot

I am planning to use Spring Data JPA along with Spring Boot with MySQL server. What are the challenges, considerations and best practices when considering running multiple instances of Spring Boot applications connecting to the DB.
As I understand from my knowledge, Hibernate should be considered when it completely owns the DB which is good in case of building monolith applications, but in case of running multiple instances (Microservices), how will each instance manage, update the state. Please guide me.

Hibernate can be used for Microservices when there is no local state maintained in any of the service in the application. The state could be using a hibernate second-level cache. When you want to go for a second-level cache make sure it is centralized and available for all the services in the application.
In fact this is a shared database pattern and using this pattern in Microservices architecture is absolutely fine. This is discussed in Microservices architecture patterns https://microservices.io/patterns/data/shared-database.html

Related

Spring Data Redis vs Spring Session Data Redis

I am looking to implementing User Session in Spring Boot application using Redis.
I have came across two great dependencies that aims to achieve these goals. Spring Data Redis and Spring Session Data Redis.
However, I have tried looking for differences of these dependencies, but to no avail.
From my understanding, if I am looking at only using Redis for Session Management, then I should use Spring Session Data Redis (even though Spring Data Redis works as well, but not as elegant).
On the other hand, if I am looking at using Redis for Session Management && Caching, then Spring Data Redis is a better option.
In general terms, Spring Session provides support for session management in Spring applications. It supports various different backends for storing session data, one of which is Redis. This Redis support is provided by Spring Session Data Redis.
Spring Session Data Redis builds on top of Spring Data Redis, using it to simplify its code that stores session data in Redis. Given this relationship between the two, this isn’t really a question of choosing one versus the other. Uses Spring Session Data Redis for session management while at the same time using Spring Data Redis to store you application’s own data is a common usage of the two projects.
Yes your understanding is correct. You can find the documentation for spring session data redis here and Spring Data redis here

is spring boot only for building rest api?

and if not what are more things that we can do with spring boot?
i know that we can build a whole web app(frontend and backend) in one spring boot application in the folder resource/template and resource/static but in the real world does somebody uses this method to create web application with the resource/template and resource/static?
and one more question what is used in the real world hibernate(with the SessionFactory or EntityManager) or JpaRepository in the spring data jpa?
No Spring Boot isn't just for REST APIs.
Spring Boot is "just" a mechanism for autoconfiguring a Spring Framework based application.
Therefore you can use and it does get used for all kinds of stuff.
REST APIs for webservices
Full web application using Spring MVC
SOAP services (or are they called SOAP dispensers?)
Reactive web applications
Command line tools
Batch jobs
Swing / JavaFX applications
...
Of course there are many more people writing web applications than Swing applications with or without Spring.
The kind of web application you describe and which I put under "Full web application using Spring MVC" is a very well established model and when done right way better aligned with the principles of REST than the average so called REST service. My very personal guess is: They will still be around when nobody remembers what Angular is.
For your additional question:
Your question sounds a little like the relation between JPA and Spring Data JPA might not be completely clear.
(see Spring Data JDBC / Spring Data JPA vs Hibernate)
Both are certainly used in real world projects. By definition more projects use JPA than Spring Data JPA since the first is a superset of the later.
This involves complete Spring history,
Actual motive of Spring was to enable loose coupling , so that unit tests can be easily performed . Spring MVC was for developing web applications with Model View Controller having their proper boundaries.
Then Spring Boot which enabled developer to focus on business logic then configurations. That's why spring boot is a good choice for microservices.
For JPA or hibernate query , many people prefer using JPARepositoy as again you just have to define entity for the repository and Spring boot automatically provides you queries like findById and so on.
In short Spring boot have made it really easy to run the applications with different configurations and environment smoothly.

Netflix Archaius with Spring Cloud Config server

I followed this documentation for Archaius and some other online articles. However, presumably, each service should have Archaius or configuration related codes/dependencies(-jars) to load configuration values. My concern is that if a change is required in loading configuration, then each service has to be reloaded/redeployed.
Q1. Can anyone let me know how to keep a centralized Archaius configuration service so that client services pull configurations.
On the contrary, Spring Cloud Config server does that job - all configurations are in one place. But I feel that it lacks loading configurations from a custom resource - data loads from a database as Archaius provides, for example.
Q2. Is there a work around to make Config Server loads configurations from Archaius ?
For Q1, you should look at the 2.x branch of Archaius, specifically https://github.com/Netflix/archaius/blob/2.x/archaius2-persisted2/src/main/java/com/netflix/archaius/persisted2/Persisted2ConfigProvider.java. This is configured to make a rest call to some service which will front your Config. At Netflix, we have a rest service backed by Cassandra. Naturally, you can back that with whatever you would like. But fair warning, this Archaius setup was made for Guice and requires a bit of manual setup. It is not quite as seamless as you might expect if you've been working with Spring Boot/Cloud starters for example.
For Q2, Spring Cloud Config does indeed support loading data from a DB. Also, in my experience with the Spring products, they are almost always quite easy to extend to your own purposes if you'd like to do something more custom.
General suggestion: If you have no other need/use of Archaius aside from remote config and you are a Spring user, I'd suggest just going with Spring Cloud. It would be far easier to configure and probably serve your requirements just fine.
Archaius provides a way to deal with reading dynamically changing Config with minimal performance impact. If you're not in Spring, or happen to need fast access to dynamic properties, consider Archaius.

Does Spring Boot needs to be run on AppServer like Weblogic?

I have used only Spring framework and deployed as spring boot application It just opens and runs as a java application , Why do a companies with only spring framework runs on app server they can run on JAVA application as usual ? why do they need App server? What all can an app server does ?
Application servers are usually designed to host multiple applications, and manage a set of services that are used by all these applications. These services might include transaction management, timers and task management, HTTP request routing, a message broker (for inter-process communication, among other things), user management, etc. There's usually a graphical or command-line management console, or both.
The Spring framework is usually used to build a single, mostly-self-contained application. Spring does provide common services like transaction management, although they typically require a deal more developer understanding than is the case with, say, a JEE appserver.
There are all sorts of application containers and frameworks, offering different kinds of services in different ways. Often there is no killer reason to pick one over the other, and they are to some extent interchangeable. Spring Boot seems to be rising in popularity right now, because (perhaps) of its better fit to the microservices-type development models that are currently popular.

How to do service discovery for Spring Boot REST endpints

If I have multiple Spring Boot embedded tomcat containers and each can have service endpoints like
http://localhost:8080/employeeSelfService/getDetails
http://localhost:8081/employeeSelfService/getDetails
How can do load balancing using 2 micro services such that clients can hit any of the URL's mentioned based on some load balancing startegy
One option thats come to my mind is to use NetFlix Curator (or) have a apache webserver acting as reverse proxy but with apache, when you create new instances of your services, you will have have an entry of that service as a member in httpd.conf
Does Spring Boot provides any service discovery and load balancing mechanism ?
Spring Boot does not provide this feature, as it is already usually provided by a reverse proxy such as apache/nginx running in front of the Spring Boot server.
See here for an example here how the commercial version of nginx provides the functionality of dynamically scaling and reducing the upstream nodes.
So in this case it's for the dynamic instance, in this case the Spring Boot process to signal it's presence/unregister itself to the upstream server at initialization/shutdown.
See here how to do so in the case of nginx, this procedure will be different from server to server.
Arguably it's not really an application's role to manage its own load-balancing, and Spring Boot focuses on the implementation of an application (or service, equivalently). We have been thinking about whether we could provide features in Spring (Boot or otherwise) to make it easy to write your own load-balancer, or service registry app, but even then I don't think that was what the question was really about (or was it?).
If I interpret the question, and the example use case, literally, I would say that the most natural answer is an out-of-the-box reverse proxy solution (as the other answers pointed out). I also note that such a reverse proxy is an essential and natural part of a PaaS solution, so if you need it to "just work" and don't want to know about the details, PaaS would be a natural path (e.g. see cloudfoundry as an example of such a solution that I happen to have worked on).
Indeed Spring Boot has not inherit support for load-balancing. Just to add to the list of available solutions for load-balancing, here are the instructions to configure an Apache for load-balancing.

Resources