How to hot replace Spring Boot code to Azure Spring Cloud - spring-boot

I'm asking this question because of the long feedback loop when committing, pushing, building, deploying, waiting... in order to check certain changes.
Using devtools locally you can get quick feedback on changes.
For Kubernetes I believe you can use skaffold and telepresence to directly sync to a running environment.
But is there something similar for Azure Spring Cloud?
A way to hot swap code to a deployed running application?

Related

Automatically Register App after Startup in Spring Cloud Dataflow

i am using Spring Cloud Dataflow in Kubernetes. Basically i only register a Spring Batch Job that is then triggered by an integration test later. I need this app to be registered straight after the deployment.
I have multiple namespaces, so multiple SCDF instances and thus multiple Ingresses for SCDF.
Instead of registering the app on SCDF manually, i am currently doing it by using the REST API after the deployment.
As there are like 5 different namespaces and 5 different domains of SCDF accordingly, i want to simply this a bit. Ideally, the app gets registered by SCDF configuration out of the box so the app registers the app itself as soon as the app runs. Something like a "default app" or something.
Do you know if there is a possibility to do that?
Thanks in advance!
You can write a Java program to register your application using the DataFlowTemplate or you can write a CLI script using Dataflow Shell, or directly over http using something like curl.

Is it correct to say I am deploying components via Kubernetes?

I have some questions about terminology that I should use. I have searched up the components that I am using, but I am still not sure. Can you please check if these are right way to describe each component? If not, can you please revise it?
I develop microservices using Spring Framework (Spring boot).
I deploy components on cloud via Kubernetes and Docker. (I understand Docker is used for containerizing and Kubernetes is for orchestrating multiple containers. Is it right to say "I deploy on Kubernetes or via Kubernetes"?)
CI/CD pipeline using Jenkins and Azure DevOps. (Project uses Azure DevOps for triggering CI/CD in Jenkins)
Please note that this project was already there when I joined the team, and I am new to all of these concepts. I understand what they do briefly and I know what each terminology means on entry level, but I just want to make sure if I am saying these in right ways.
I would say that you deploy services, not components, but your team might have its own terminology.
You do deploy on Kubernetes.
Docker is used to create and manage containers and container images. Kubernetes does not use Docker but can use images created via Docker to deploy containers in Pods (via the OCI format)
The rest seems right to me :)
In Kubernetes an app as a unit is called Service. It has components reachable under it, for example: deployment, pod, etc. This set of components could be for microservice or service, but terminology just a service.
You can list all services using kubectl get services
The Docker is related here only because pod has a container or sometimes few of them. So Kubernetes supports Docker and its images. It's most popular container runtime in 2021, but not the only one for Kubernetes.
To combine everything, the right sentence to me would be:
I deploy a service on Kubernetes
I deploy a service on Amazon EKS
I deploy a service on Azure Kubernetes
etc.
Adding "cloud" doesn't add so much value as Kubernetes platform is same regardless of cloud provider chosen. Of course, there are some differences in cloud, but not in Kubernetes core.
Docker doesn't fit here and usually discussed when going into details, especially about images, building them, etc.
Also off topic, but even pod is more used than container, because in Kubernetes you access the pod (while in Docker Compose, you access the container). Of course, you can access Docker container if there are multiple of them setup in a pod and container engine is Docker in this context.
I develop microservices using Spring Framework (Spring boot).
To understand in the most basic form - Microservices is an architectural pattern for developing applications, so there can be many ways to implement this pattern (which is nothing but developing applications) and Spring Boot is one of them. More precisely you should say "I develop microservices using Spring Boot"
I deploy components on cloud via Kubernetes and Docker. (I understand
Docker is used for containerizing and Kubernetes is for orchestrating
multiple containers. Is it right to say "I deploy on Kubernetes or via
Kubernetes"?)
Precisely speaking you are not correct here - you understand the purpose of Docker and Kubernetes but putting it wrongly w.r.t. application and its deployment.
Do read this, where it is clearly mentioned that K8s doesn't build or deploy code. When the official documentation is clearly saying that K8s doesn't deploy code, then how you can say that I deploy via K8s?
I would say you shouldn't put it using either of the statement you mentioned, rather you should say - "My application runs (or is deployed) in Cloud on a Kubernetes cluster (or GKE or EKS or AKS)".
CI/CD pipeline using Jenkins and Azure DevOps. (Project uses Azure
DevOps for triggering CI/CD in Jenkins)
Looks fine to me.
Please note that in general you can say anything as long as the other person is able to understand, so in general all your statements might sell well. But I guess you were looking for "precise" statements, and I gave you my thoughts on the same.
Guys here are right but I would like to add that when speaking of Kubernetes components you usually think of Control Plane Components or Node Components and when speaking of smaller units the Services and Pods comes to mind first. Note that a Kubernetes service is an abstract way to expose an application running on a set of Pods as a network service. So addressing your main question:
Is it correct to say I am deploying components via Kubernetes?
It would be better to say that you are deploying a service/application (running) on Kubernetes (on AKS/AWS/GCP/etc).

How do people host Spring Boot apps with WebFlux on Reactor Netty in production?

I know it's a vague question but that's because I am not clear enough on what people are doing to ask anything more specific. I currently run my own apps with the embedded reactor netty server for development and basically push the embedded server inside a jar to cloud foundry to run the embedded server in production.
What are the other ways out there to set up a production environment for reactive reactor netty apps that people are using, or any documentation you might have seen?
I'm no sure that there is any difference between hosting the reactive spring-webflux application and regular applications.
Spring boot creates a jar with everything bundled inside (netty or more old-school tomcat) - it doesn't matter.
Then you can take this and run it "as is" on your server (on-premise, cloud ec2 style whatever you have, this really depends on your organization) directly with java -jar app.jar
Or, if you have more advanced needs/setup:
"Containerize" the application and create a docker (usually, although there are alternatives) image that runs the spring boot application. and then deploy it on kubernetes cluster, for example. At this point you should really consult with your DevOps people so that they'll tell you what is the way of deployment in your organization.
Besides kubernetes cluster there are many other alternatives:
- cloud provider specific solutions, like ECS or Fargate in amazon AWS
- Docker Swarm to name a few
All these solutions are pretty advanced, allow auto-scaling, advanced liveness monitoring and so forth. As an organization you usually pick the one that meets your needs

Deploy my spring boot application into google cloud computer engine

I got a query to ask you all. I am looking for guides that help me deploy my spring boot application on google cloud computer engine, I type in my instance IP address when I test my spring boot application I unable to access it in REST API.
May I know do you have any guides or steps for me to follow to deploy successfully in google cloud computing engine. Why do I need to deploy in computer engine is because I deployed my angular at it and I deploy it both it seems that my angular project being replaced by my spring boot application.
Codelabs GCP / Spring series has deployment tutorials:
https://codelabs.developers.google.com/spring/
GCP has some "Getting Started" tutorials you can use here:
https://cloud.google.com/java/docs/
where the specific one for deploying a java app to GCE is here:
https://cloud.google.com/java/docs/tutorials/bookshelf-on-compute-engine
But the basic steps are as follows:
Write your Spring app
Build your Spring app
Run / test your jar locally
Push your jar to a location in Storage
Create a startup script for your GCE instance
Create a new GCE VM which uses your startup script using Console, Deployment API, or gcloud tool
After that, you need to ensure you have the proper network rules in place to be able to access your API publicly. If you do not wish to learn how to use GCE, I would suggest you look into using App Engine instead because then you do not need to learn how to deploy and instead can concentrate on your api. Here is a guide to do that

Keycloak Server on Heroku

Currently I'm working on a Spring Boot 2 project where we use Heroku as our Cloud Service. We push our changes to Github and our instance on Heroku cloud gets provisioned and deployed. After participating Javaday in my city, I attended to a speech and got to know about this amazing framework, Keycloak. After some investigation, we have decided using Keycloak as our identity and access management.
From what I understand, we need to start a Keycloak standalone server as explained here https://www.keycloak.org/docs/latest/server_installation/index.html.
But the problem is, we cannot access to filesystem on Heroku instance and thus, cannot extract the Keycloak files and start the server.
I tried to follow these steps https://github.com/yurtsevich/keycloak-swarm-heroku yurtsevich has provided but I noticed that latest version of Keycloak Swarm is not compatible with Spring Boot 2.
Can we start Keycloak server on the same Heroku instance we have? I'm unable to find any solution to this at this moment.
Edit: this button from readme will deploy Keycloak on Heroku with free dynos: https://github.com/sannonaragao/keycloak-heroku
This button deploys the lastest version straight to Heroku.
https://elements.heroku.com/buttons/mieckert/keycloak-heroku
Beware! It deploys at the Performance-M dyno, you must change to free right after if you don't want to pay some use fee.

Resources