From 8343cf501c3ea7d4c1269b160f97ce28ec3252ee Mon Sep 17 00:00:00 2001 From: Inaki Fernandez Date: Thu, 11 Jun 2020 19:00:35 +0200 Subject: [PATCH] update --- docs/SpringFramework.md | 5 ----- docs/faq.md | 5 +++++ docs/git.md | 1 + docs/images/history_of_microservices.png | Bin 0 -> 64765 bytes docs/java-and-java-performance-optimization.md | 4 ++++ docs/java_frameworks.md | 12 ++++++++++-- docs/kubernetes.md | 15 ++++++++++++--- docs/message-queue.md | 15 +++++++++++++++ docs/postman.md | 1 + docs/rancher.md | 1 + 10 files changed, 49 insertions(+), 10 deletions(-) delete mode 100644 docs/SpringFramework.md create mode 100644 docs/images/history_of_microservices.png diff --git a/docs/SpringFramework.md b/docs/SpringFramework.md deleted file mode 100644 index 3fea3b5a..00000000 --- a/docs/SpringFramework.md +++ /dev/null @@ -1,5 +0,0 @@ -# Spring Framework -- [spring.io](https://spring.io/) -- [javatutorial.net: Introduction to Spring Web Framework](https://javatutorial.net/introduction-to-spring-web-framework) -- [javarevisited.blogspot.com: 10 JdbcTemplate Examples in Spring Framework](https://javarevisited.blogspot.com/2020/05/10-jdbctemplate-examples-in-spring.html) -- [medium.com: Top 10 Courses to Learn Microservices in Java and Spring Framework](https://medium.com/javarevisited/top-5-courses-to-learn-microservices-in-java-and-spring-framework-e9fed1ba804d) diff --git a/docs/faq.md b/docs/faq.md index adecbd18..5590c58d 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -8,6 +8,9 @@ - [Dzone: Programming Styles Compared: Spring Framework vis-a-vis Eclipse MicroProfile 🌟🌟](https://dzone.com/articles/programming-styles-spring-boot-vis-a-vis-with-ecli) - [Dzone: Containerization in 2020](https://dzone.com/articles/containerization-in-2020) Let's look at how containerization has changed enterprise development in the past few years and what developers should know when considering a container strategy. +## History of Microservices +- [History of Microservices](https://bit.ly/kubeappserver) + ## Kubernetes Native - [developers.redhat.com: Why Kubernetes native instead of cloud native? 🌟](https://developers.redhat.com/blog/2020/04/08/why-kubernetes-native-instead-of-cloud-native/) @@ -20,6 +23,8 @@ ---
+[![history of microservices](images/history_of_microservices.png)](https://bit.ly/kubeappserver) + [![microservice arch](images/microservice_arch.png)](https://medium.com/javarevisited/10-free-spring-boot-tutorials-and-courses-for-java-developers-53dfe084587e) [![Full Stack developer](images/Full_Stack_cybercoders.png)](https://www.cybercoders.com/insights/what-hiring-managers-look-for-in-a-full-stack-developer/) diff --git a/docs/git.md b/docs/git.md index 3b37e215..59a36d47 100644 --- a/docs/git.md +++ b/docs/git.md @@ -50,6 +50,7 @@ * [10 useful Git commands you wish existed – and their alternatives](https://datree.io/blog/useful-git-commands-list/) * [github.blog: How to undo (almost) anything with Git](https://github.blog/2015-06-08-how-to-undo-almost-anything-with-git/) * [dev.to: Git Explained - The Basics](https://dev.to/milu_franz/git-explained-the-basics-igc) +* [medium: 7 Best Courses to Master Git and Github for Programmers](https://medium.com/javarevisited/7-best-courses-to-master-git-and-github-for-programmers-d671859a68b2) These are the best courses to learn Git from scratch and also advanced concepts like branching and merging. It also includes a free course to learn git. ## Design By Contract [Wikipedia: Design by contract (DbC)](https://en.wikipedia.org/wiki/Design_by_contract), also known as contract programming, programming by contract and design-by-contract programming, is an approach for designing software. diff --git a/docs/images/history_of_microservices.png b/docs/images/history_of_microservices.png new file mode 100644 index 0000000000000000000000000000000000000000..947c9fa99f27fc454fa4deb9a7e5c9008d2cb81e GIT binary patch literal 64765 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 Y%g+y19R9WhA9O@rSxc$({^RHW3k}nHumAu6 literal 0 HcmV?d00001 diff --git a/docs/java-and-java-performance-optimization.md b/docs/java-and-java-performance-optimization.md index 2617c1be..253b6761 100644 --- a/docs/java-and-java-performance-optimization.md +++ b/docs/java-and-java-performance-optimization.md @@ -1,5 +1,6 @@ # Java and Memory Management - [Java Performance Optimization](#java-performance-optimization) + - [Benchmarking modern Java Virtual Machines and the next-generation garbage collectors](#benchmarking-modern-java-virtual-machines-and-the-next-generation-garbage-collectors) - [Relevant JVM Metrics](#relevant-jvm-metrics) - [Common JVM Errors](#common-jvm-errors) - [Tuning Jenkins GC](#tuning-jenkins-gc) @@ -20,6 +21,9 @@ - [DZone refcard: Java Caching](https://dzone.com/refcardz/java-caching) * [Dzone: 7 JVM Arguments of Highly Effective Applications 🌟🌟🌟](https://dzone.com/articles/7-jvm-arguments-of-highly-effective-applications-1) How to use 7 JVM arguments to help increase your application's performance and avoid common memory pitfalls. +### Benchmarking modern Java Virtual Machines and the next-generation garbage collectors +* [jet-start.sh: Performance of Modern Java on Data-Heavy Workloads, Part 1 🌟](https://jet-start.sh/blog/2020/06/09/jdk-gc-benchmarks-part1) The Java runtime has been evolving more rapidly in recent years and, after 15 years, we finally got a **new default garbage collector: the G1**. Two more GCs are on their way to production and are available as experimental features: **Oracle's ZGC** and **OpenJDK's Shenandoah**. We at Hazelcast thought it was time to put all these new options to the test and find which choices work well with workloads typical for our distributed stream processing engine, [Hazelcast Jet](https://jet-start.sh/). + ### Relevant JVM Metrics Metric|Details / Reference :---|:--- diff --git a/docs/java_frameworks.md b/docs/java_frameworks.md index b83b063d..71de8984 100644 --- a/docs/java_frameworks.md +++ b/docs/java_frameworks.md @@ -6,6 +6,7 @@ - [Jakarta EE](#jakarta-ee) - [Eclipse MicroProfile](#eclipse-microprofile) - [Spring](#spring) + - [Spring Cloud](#spring-cloud) - [SpringBoot](#springboot) - [SpringBoot with Docker](#springboot-with-docker) - [CI/CD for kubernetes with SpringBoot](#cicd-for-kubernetes-with-springboot) @@ -69,9 +70,14 @@ optimizing Enterprise Java for the microservices architecture. ## Spring - [Spring](https://spring.io/) -- [SpringBoot](https://spring.io/projects/spring-boot) +- [Spring Framework Architecture 🌟](https://www.javacodegeeks.com/2019/02/spring-framework-architecture.html) +- [javatutorial.net: Introduction to Spring Web Framework](https://javatutorial.net/introduction-to-spring-web-framework) +- [javarevisited.blogspot.com: 10 JdbcTemplate Examples in Spring Framework](https://javarevisited.blogspot.com/2020/05/10-jdbctemplate-examples-in-spring.html) +- [medium.com: Top 10 Courses to Learn Microservices in Java and Spring Framework](https://medium.com/javarevisited/top-5-courses-to-learn-microservices-in-java-and-spring-framework-e9fed1ba804d) + +### Spring Cloud - [Spring Cloud](https://spring.io/projects/spring-cloud) - - [Spring Cloud Kubernetes for hybrid microservices architecture](https://medium.com/javarevisited/spring-cloud-kubernetes-for-hybrid-microservices-architecture-f487d67328d0) +- [Spring Cloud Kubernetes for hybrid microservices architecture](https://medium.com/javarevisited/spring-cloud-kubernetes-for-hybrid-microservices-architecture-f487d67328d0) ### SpringBoot - [SpringBoot](https://spring.io/projects/spring-boot) @@ -83,6 +89,8 @@ optimizing Enterprise Java for the microservices architecture. - [javatutorial.net: Spring vs. Java EE](https://javatutorial.net/spring-vs-java-ee) - [medium.com: Spring Cloud kubernetes for hybrid microservices architecture](https://medium.com/javarevisited/spring-cloud-kubernetes-for-hybrid-microservices-architecture-f487d67328d0) - [10 Free Spring Boot Courses and Tutorials for Java Developers](https://medium.com/javarevisited/10-free-spring-boot-tutorials-and-courses-for-java-developers-53dfe084587e) +- [**Spring Boot Istio library**: Spring Boot library for integration with Istio](https://piotrminkowski.com/2020/06/10/spring-boot-library-for-integration-with-istio/) +* [Spring Boot native images. The path towards Spring Boot native applications](https://spring.io/blog/2020/06/10/the-path-towards-spring-boot-native-applications) ### SpringBoot with Docker * [spring.io: spring boot with docker](https://spring.io/guides/gs/spring-boot-docker/) diff --git a/docs/kubernetes.md b/docs/kubernetes.md index b63e44ee..e6fb6e01 100644 --- a/docs/kubernetes.md +++ b/docs/kubernetes.md @@ -24,6 +24,7 @@ - [Helm Kubernetes Tool](#helm-kubernetes-tool) - [Helm Charts repositories](#helm-charts-repositories) - [Helm Charts](#helm-charts) + - [Helm Books](#helm-books) - [Lens Kubernetes IDE](#lens-kubernetes-ide) - [Cluster Autoscaler Kubernetes Tool](#cluster-autoscaler-kubernetes-tool) - [HPA and VPA](#hpa-and-vpa) @@ -150,7 +151,6 @@ * [enterprisersproject.com: Kubernetes: Everything you need to know (2020) 🌟](https://enterprisersproject.com/article/2020/4/kubernetes-everything-you-need-know) * [learnk8s.io: Provisioning cloud resources (AWS, GCP, Azure) in Kubernetes 🌟](https://learnk8s.io/cloud-resources-kubernetes) * [padok.fr: Kubernetes’ Architecture: Understanding the components and structure of clusters 🌟](https://www.padok.fr/en/blog/kubernetes-architecture-clusters) -* [medium.com: Top 15 Online Courses to Learn Docker, Kubernetes, and AWS for Fullstack Developers and DevOps Engineers](https://medium.com/javarevisited/top-15-online-courses-to-learn-docker-kubernetes-and-aws-for-fullstack-developers-and-devops-d8cc4f16e773) * [Allocatable memory and CPU in Kubernetes Nodes 🌟](https://learnk8s.io/allocatable-resources) Not all CPU and memory in your Kubernetes nodes can be used to run Pods. In this article, you will learn how managed Kubernetes Services such AKS, EKS and GKE reserve resources for workloads, operating systems, daemons and Kubernetes agent. * [5 open source projects that make Kubernetes even better: Prometheus, Operator framework, Knative, Tekton, Kubeflow 🌟](https://enterprisersproject.com/article/2020/5/kubernetes-5-open-source-projects-improve) Open source projects bring many additional capabilities to Kubernetes, such as performance monitoring, developer tools, serverless capabilities, and CI/CD workflows. Check out these five widely used options * [**Optimize** Kubernetes cluster management with these 5 tips 🌟](https://searchitoperations.techtarget.com/feature/Optimize-Kubernetes-cluster-management-with-these-5-tips) Effective Kubernetes cluster management requires operations teams to balance pod and node deployments with performance and availability needs. @@ -158,6 +158,8 @@ * [blog.pipetail.io: 10 most common mistakes using kubernetes 🌟](https://blog.pipetail.io/posts/2020-05-04-most-common-mistakes-k8s/) * [4 trends for Kubernetes cloud-native teams to watch in 2020 🌟](https://searchapparchitecture.techtarget.com/tip/4-trends-for-Kubernetes-cloud-native-teams-to-watch-in-2020) Today's software architectural landscape seems to change like the weather. Stay ahead of the curve with these cloud-related trends, including GitOps and service meshes. * [opensource.com: A beginner's guide to Kubernetes container orchestration](https://opensource.com/article/20/6/container-orchestration) Understanding the building blocks of container orchestration makes it easier to get started with Kubernetes. +* [thenewstack.io: 5 Best Practices for Configuring Kubernetes Pods Running in Production](https://thenewstack.io/5-best-practices-for-configuring-kubernetes-pods-running-in-production/) +* [Creating a Kubernetes cloud provider, doesn't required boiling the ocean](https://thebsdbox.co.uk/2020/03/18/Creating-a-Kubernetes-cloud-doesn-t-required-boiling-the-ocean/?utm_sq=gf0mhghh60)
[![Kubernetes architecture](images/kubernetes-pod-creation.png)](https://www.padok.fr/en/blog/kubernetes-architecture-clusters) @@ -300,6 +302,9 @@ kubectl get secret --namespace=β€Š-o yaml | sed β€˜s/names * [Jmeter](https://github.com/helm/charts/tree/master/stable/distributed-jmeter) * [bitnami: create your first helm chart](https://docs.bitnami.com/kubernetes/how-to/create-your-first-helm-chart/) +### Helm Books +- [Learn Helm](https://www.packtpub.com/cloud-networking/learn-helm) + ## Lens Kubernetes IDE * [Lens Kubernetes IDE 🌟](https://k8slens.dev/) Lens is the only IDE you’ll ever need to take control of your Kubernetes clusters. It's open source and free. Download it today! @@ -400,6 +405,7 @@ kubectl get secret --namespace=β€Š-o yaml | sed β€˜s/names * [kubedev 🌟](https://relferreira.github.io/kubedev/) is a Kubernetes Dashboard that helps developers in their everyday usage * [Kubectl SSH Proxy 🌟](https://github.com/little-angry-clouds/kubectl-ssh-proxy) Kubectl plugin to launch a ssh socks proxy and use it. This plugin aims to make your life easier when using kubectl a cluster that's behind a SSH bastion. * [K9s - Kubernetes CLI To Manage Your Clusters In Style!](https://github.com/derailed/k9s) K9s provides a terminal UI to interact with your Kubernetes clusters. The aim of this project is to make it easier to navigate, observe and manage your applications in the wild. K9s continually watches Kubernetes for changes and offers subsequent commands to interact with your observed resources. +* [kubectl-images](https://github.com/chenjiandongx/kubectl-images) Show container images used in the cluster. Kubectl-images is a kubectl plugin that shows the container images used in the cluster. It first calls kubectl get pods to retrieve pods details and filters out the container image information of each pod then prints out the final result in a table view. ## Kubernetes Troubleshooting * [Kubernetes troubleshooting diagram 🌟](https://github.com/redhatspain/awesome-kubernetes/blob/master/docs/images/kubernetes-troubleshooting.jpg) @@ -428,8 +434,7 @@ kubectl get secret --namespace=β€Š-o yaml | sed β€˜s/names * [dzone: kubernetes in 10 minutes a complete guide to look](https://dzone.com/articles/kubernetes-in-10-minutes-a-complete-guide-to-look) * [magalix.com: The Best Kubernetes Tutorials 🌟](https://www.magalix.com/blog/the-best-kubernetes-tutorials) * [35 Advanced Tutorials to Learn Kubernetes 🌟](https://medium.com/faun/35-advanced-tutorials-to-learn-kubernetes-dae5695b1f18) -* [ -* geekflare.com: 14 Kubernetes Tutorials for Beginner to Master](https://geekflare.com/learn-kubernetes/) +* [geekflare.com: 14 Kubernetes Tutorials for Beginner to Master](https://geekflare.com/learn-kubernetes/) ### Online Training * [katacoda.com 🌟](https://www.katacoda.com/) Interactive Learning and Training Platform for Software Engineers @@ -450,6 +455,8 @@ kubectl get secret --namespace=β€Š-o yaml | sed β€˜s/names ### Famous Kubernetes resources of 2020 * [javarevisited.blogspot.com: Top 5 courses to Learn Docker and Kubernetes in 2020 - Best of Lot](https://javarevisited.blogspot.com/2019/05/top-5-courses-to-learn-docker-and-kubernetes-for-devops.html) +* [medium.com: Top 15 Online Courses to Learn Docker, Kubernetes, and AWS for Fullstack Developers and DevOps Engineers](https://medium.com/javarevisited/top-15-online-courses-to-learn-docker-kubernetes-and-aws-for-fullstack-developers-and-devops-d8cc4f16e773) +* [medium.com: 7 Free Online Courses to Learn Kubernetes in 2020](https://medium.com/javarevisited/7-free-online-courses-to-learn-kubernetes-in-2020-3b8a68ec7abc) * [skillslane.com: 10 Best Kubernetes Courses [2020]: Beginner to Advanced Courses](https://skillslane.com/learn-kubernetes-from-these-best-online-courses/) ## Kubernetes Patterns @@ -501,6 +508,7 @@ kubectl get secret --namespace=β€Š-o yaml | sed β€˜s/names * [magalix.com: Creating Custom Kubernetes Operators](https://www.magalix.com/blog/creating-custom-kubernetes-operators) * [medium.com: Writing Your First Kubernetes Operator](https://medium.com/faun/writing-your-first-kubernetes-operator-8f3df4453234) * [bmc.com: What Is a Kubernetes Operator?](https://www.bmc.com/blogs/kubernetes-operator/) +* [Writing a Kubernetes Operator in Java Cheat Sheet](https://developers.redhat.com/cheat-sheets/writing-kubernetes-operator-java/) ## Kubernetes Networking * [kubernetes.io: The Kubernetes network model. How to implement the Kubernetes networking model](https://kubernetes.io/docs/concepts/cluster-administration/networking/) @@ -514,6 +522,7 @@ kubectl get secret --namespace=β€Š-o yaml | sed β€˜s/names * [AWS and Kubernetes Networking Options and Trade-Offs (part 1)](https://www.weave.works/blog/introduction-to-kubernetes-pod-networking--part-1) * [AWS and Kubernetes Networking Options and Trade-Offs (part 2)](https://www.weave.works/blog/aws-networking-overview---part-2) * [AWS and Kubernetes Networking Options and Trade-Offs (part 3)](https://dzone.com/articles/aws-and-kubernetes-networking-options-and-trade-of) +* [medium: Service Types in Kubernetes? 🌟](https://medium.com/faun/service-types-in-kubernetes-24a1587677d6) A Service enables network access to a set of Pods in Kubernetes. ### Xposer Kubernetes Controller To Manage Ingresses * [Xposer 🌟](https://github.com/stakater/Xposer) A Kubernetes controller to manage (create/update/delete) Kubernetes Ingresses based on the Service diff --git a/docs/message-queue.md b/docs/message-queue.md index 2806b5ae..9bbfb11e 100644 --- a/docs/message-queue.md +++ b/docs/message-queue.md @@ -16,7 +16,10 @@ - [Data Processing (aka Streaming Data, Data Pipeline or Big Data Pipeline)](#data-processing-aka-streaming-data-data-pipeline-or-big-data-pipeline) - [Apache Kafka](#apache-kafka) - [Banzai Cloud Supertubes (Cloud Native Kafka implementation)](#banzai-cloud-supertubes-cloud-native-kafka-implementation) + - [Apache Pulsar](#apache-pulsar) - [Apache Flink](#apache-flink) + - [Hazelcast JET](#hazelcast-jet) + - [KsqlDB](#ksqldb) - [Red Hat AMQ (ActiveMQ Artemis broker and Apache Kafka)](#red-hat-amq-activemq-artemis-broker-and-apache-kafka) - [Red Hat AMQ Broker (ActiveMQ Artemis)](#red-hat-amq-broker-activemq-artemis) - [Red Hat AMQ Streams](#red-hat-amq-streams) @@ -106,10 +109,22 @@ - [Banzai Kafka Operator](https://github.com/banzaicloud/kafka-operator) - [The benefits of integrating Apache Kafka with Istio](https://banzaicloud.com/blog/kafka-on-istio-benefits/) +### Apache Pulsar +- [Apache Pulsar](https://pulsar.apache.org/) is an open-source distributed pub-sub messaging system originally created at Yahoo and now part of the Apache Software Foundation +- [Pulsar vs Kafka – Comparison and Myths Explored](https://www.kai-waehner.de/blog/2020/06/09/apache-kafka-versus-apache-pulsar-event-streaming-comparison-features-myths-explored/) + ### Apache Flink - [Apache Flink](https://flink.apache.org/) Apache Flink is a framework and distributed processing engine for stateful computations over unbounded and bounded data streams. Flink has been designed to run in all common cluster environments, perform computations at in-memory speed and at any scale. - [How to set up Apache Flink on Kubernetes for real time data processing](https://ci.apache.org/projects/flink/flink-docs-stable/ops/deployment/kubernetes.html) +### Hazelcast JET +- [Hazelcast JET](https://jet-start.sh/) Open-Source Distributed Stream Processing +- [devops.com: Hazelcast Simplifies Streaming for Extremely Fast Event Processing in IoT, Edge and Cloud Environments](https://devops.com/hazelcast-simplifies-streaming-for-extremely-fast-event-processing-in-iot-edge-and-cloud-environments/) + +### KsqlDB +- [ksqlDB](https://ksqldb.io/) The event streaming database purpose-built for stream processing applications. +- [Kafka Streams and ksqlDB Compared – How to Choose](https://www.confluent.io/blog/kafka-streams-vs-ksqldb-compared/) + ## Red Hat AMQ (ActiveMQ Artemis broker and Apache Kafka) - [**Red Hat AMQ overview**](https://developers.redhat.com/products/amq/overview) - [Red Hat AMQ](https://www.redhat.com/en/technologies/jboss-middleware/amq) = AMQ Broker (Apache ActiveMQ Artemis) + AMQ Streams (Apache Kafka) diff --git a/docs/postman.md b/docs/postman.md index 33668d03..1bcc5774 100644 --- a/docs/postman.md +++ b/docs/postman.md @@ -7,6 +7,7 @@ - [Dzone: how to use postman to manage and execute your APIs](https://dzone.com/articles/how-to-use-postman-to-manage-and-execute-your-apis) - [Dzone: how to download and install postman REST client](https://dzone.com/articles/how-to-download-and-install-postman-rest-client-so) - [Dzone: using postman REST client, quick tips](https://dzone.com/articles/using-postman-rest-client-cleverly-some-quick-tips) +- [Linkedin: API Testing with Postman](https://www.linkedin.com/pulse/api-testing-postman-michael-montgomery/) ## Newman - [Newman](https://github.com/postmanlabs/newman) is a command-line collection runner for Postman diff --git a/docs/rancher.md b/docs/rancher.md index 80758dcc..7d79519a 100644 --- a/docs/rancher.md +++ b/docs/rancher.md @@ -42,6 +42,7 @@ * [K8s vs k3s](https://www.civo.com/blog/k8s-vs-k3s) "K3s is designed to be a single binary of less than 40MB that completely implements the Kubernetes API. In order to achieve this, they removed a lot of extra drivers that didn't need to be part of the core and are easily replaced with add-ons. K3s is a fully CNCF (Cloud Native Computing Foundation) [certified Kubernetes](https://www.cncf.io/certification/software-conformance/) offering. This means that you can write your YAML to operate against a regular "full-fat" Kubernetes and they'll also apply against a k3s cluster. Due to its low resource requirements, it's possible to run a cluster on anything from 512MB of RAM machines upwards. This means that we can allow pods to run on the master, as well as nodes. And of course, because it's a tiny binary, it means we can install it in a fraction of the time it takes to launch a regular Kubernetes cluster! We generally achieve sub-two minutes to launch a k3s cluster with a handful of nodes, meaning you can be deploying apps to learn/test at the drop of a hat." * [**k3sup (said 'ketchup')**](https://github.com/alexellis/k3sup) is a light-weight utility to get from zero to KUBECONFIG with k3s on any local or remote VM. All you need is ssh access and the k3sup binary to get kubectl access immediately. * [Install Kubernetes with k3sup and k3s](https://medium.com/@alexellisuk/walk-through-install-kubernetes-to-your-raspberry-pi-in-15-minutes-84a8492dc95a) +* [k3s-gitlab](https://github.com/apk8s/k3s-gitlab) k3s + Gitlab install notes. Steps for utilizing k3s to manage a self-hosted Gitlab instance. ### K3S Use Cases - [K3S Use Cases](https://www.youtube.com/watch?v=2LNxGVS81mE):