Friday, October 5, 2018

Reflection in Java

Reflection in Java


In computer science, a Reflection is the ability of a computer program to examine, introspect, and modify its own structure and behavior at runtime:
https://en.wikipedia.org/wiki/Reflection_(computer_programming)#Java

The following snippet is an example of a Reflection in Java:

// Without a Reflection
Book eBook = new Book();
eBook.readLoudly();

// With the Reflection
import java.lang.reflect.*;
(...)
Object eBook = Class.forName("eu.microwebservices.awesomeappproject.model.Book").newInstance();

// Alternatively: Object eBook = Book.class.newInstance();
import java.lang.reflect.*;
(...)
Method meth = eBook.getClass().getDeclaredMethod("readLoudly", new Class[0]);
meth.invoke(eBook);

Class book = Class.forName("eu.microwebservices.awesomeappproject.model.Book")

int bookMods = book.getModifiers();

assertTrue(Modifier.isAbstract(bookMods));
assertTrue(Modifier.isPublic(bookMods));

Important Principles with creating microservices

Important Principles with creating microservices


Important Principles with creating microservices...


As we can read at
https://dzone.com/storage/assets/3259596-dzonerefcardz-gettingstartedmicroservices.pdf
both architectures: a monolith one and microservices should be designed following good software architecture principles. So before our BIG EXCHANGE from old architecture to microservices we must consider following principles:

1. Separate your concerns. 
Use MVC and well-defined APIs for high cohesion and low coupling.

2. Use Convention over Configuration (CoC). 
Keep configuration to a minimum by using or establishing conventions.

3. Follow the Law of Demeter. Each unit should have only limited knowledge about other units: only units "closely" related to the current unit. Each unit should only talk to its friends.
Do not talk to strangers! Only talk to your immediate friends.

4. Use Domain-Driven Design. 
Keep objects related to a domain/component together.

5. Focus on Automation. 
Automate testing and fully automated deployment pipeline.

6. Design to Interfaces / APIs.
Classes shouldn’t call other classes directly just because they happen to be in the same archive. Such group of friendship could be later one microservice...

7. Group code by functionality, not by layer. 
Monoliths usually have a layered architecture, and it’s common to group classes by layer. Instead you should break up your code into packages separated by functionalities to allow easier splitting into future microservices. It also makes easier to see the dependencies between your future microservices.

8. Make your code stateless and externalize your application’s state. 
One cannot rely on static variables or global variables as the source of your application’s state. Use external data sources such as key-values stores or databases to maintain state.

Known problems:

  1. Sharing
  2. Asynchronicity
  3. Security
  4. Simplicity
  5. Evolution
  6. Health

How can we create a docker image?
Fast... 
from dockerfile.

Where can we create a docker image from dockerfile?
On AWS.

Ready, steady, go!

The docker container with 3 main "beasts": Java, Tomcat and Alpine/Centos Linux... - very useful information we can read at:

Discovery service for microservices

Discovery service for microservices

.

"The hell" of accounts, permissions, IAM roles and grants on AWS

"The hell" of accounts, permissions, IAM roles and grants on AWS

"The hell" of accounts, permissions, IAM roles and grants on AWS...

1.
IAM stands for Identity & Access Management. 

2.
How do I add users to AWS?
Sign in to the AWS Management Console and open the IAM console at https://console.aws.amazon.com/iam/.
In the navigation pane, choose Users and then choose Add user.
Type the user name for the new user. ...
Select the type of access this set of users will have. ...
Choose Next: Permissions.

3.
Simply speaking:

We may have many Users on AWS Account.
A User may have policies.
A policy uses IAM service role.
We can add IAM permissions to a User and grant access in order to allow to run actions on AWS services...

See more:
4.


Amazon Elastic Container Service (ECS) is a highly scalable, high performance container management service that supports Docker containers and allows you to easily run applications on a managed cluster of Amazon EC2 instances. Amazon ECS eliminates the need for you to install, operate, and scale your own cluster management infrastructure. With simple API calls, you can launch and stop container-enabled applications, query the complete state of your cluster, and access many familiar features like security groups, Elastic Load Balancing, EBS volumes and IAM roles. You can use Amazon ECS to schedule the placement of containers across your cluster based on your resource needs and availability requirements. You can also integrate your own scheduler or third-party schedulers to meet business or application specific requirements.

Kubernetes vs. Docker

Kubernetes vs. Docker



only root has permitions:
/usr/bin/kubectl

/usr/bin/dockerd

--

docker pull gerardorosiles/amazonlinux-tomcat85

from:
https://hub.docker.com/r/gerardorosiles/amazonlinux-tomcat85
integrates tomcat 8.5.24 to amazonlinux with jdk8_152

(a modification of https://hub.docker.com/r/bpatterson/centos7-tomcat85/ )


docker pull gerardorosiles/amazonlinux-tomcat85

docker images

docker run gerardorosiles/amazonlinux-tomcat85

internal:
docker run -it gerardorosiles/amazonlinux-tomcat85

Kubernetes orchestrations

Kubernetes orchestrations

.

Microservices are awesome

Microservices are awesome

Microservice architecture (MSA) is a logical structure for the design of a software program involving loosely-coupled modular components known as microservices.

Microservices (https://en.wikipedia.org/wiki/Microservices) are a software development technique - a variant of the service-oriented architecture (SOA) architectural style that structures an application as a collection of loosely coupled services

In a microservices architecture (MSA), services are fine-grained and the protocols (based on HTTP methods) are lightweight. The benefit of decomposing an application into different smaller services is that it improves modularity

This makes the application easier to understand, develop, test, and become more resilient to architecture erosion than it is possible ...with Monolithic applications.
It parallelizes development by enabling small autonomous teams to develop, deploy and scale their respective services independently.

Microservices have a lot of advantages with a large "statistical scale", but...
there is also a criticism of the microservices approach for a number of issues e.g.:
  • Testing and deployment are more complicated.
  • The whole complexity (from monolithic one) is moved to the architectural organization, a larger amount of interfaces and network traffic.
  • Microservices require a lot of additional software to control and react with failures and errors, because of distributed business goals and autonomous (loosely coupled) services.
  • Information barriers occurs in processes.
  • Inter-service calls over a network have a higher cost in terms of network latency and message processing time than in-process calls within a monolithic service process.


See more:



The meaning of AWS abbreviations EC2 S3 etc.

The meaning of AWS abbreviations EC2 S3 etc.

AWS = Amazon Web Services = 
the Amazon.com's cloud-computing platform

EC2 = Amazon Elastic Compute Cloud (Amazon EC2) =
a web service that provides secure, resizable compute capacity in the cloud. It is designed to make web-scale cloud computing easier for developers. It forms a central part AWS, by allowing users to rent virtual computers on which to run their own computer applications.

Route 53 = Amazon Route 53 =
a scalable and highly available Domain Name System (DNS) service. 
The name is a reference to TCP or UDP port 53, where DNS server requests are addressed.

S3 = Amazon Simple Storage Service (Amazon S3) =
a "simple storage service" offered by AWS that provides object storage through a web service interface. Amazon S3 uses the same scalable storage infrastructure that Amazon.com uses to run its global e-commerce network.

SQS = Amazon Simple Queue Service = 
fully managed message queues for microservices, distributed systems, and serverless applications






Docker twin copies, not replicas

Docker twin copies, not replicas

.

Technology pack and stack with microservices

Technology pack and stack with microservices


Can we create a docker image from dockerfile?
Yes, we can.

Can we create a docker image from dockerfile on Amazon cloud (AWS)?
Yes, we can.

Ready, steady, go!

The docker container with 3 main "beasts": Java, Tomcat and Alpine/Centos Linux... - very useful information we can read at:

How to separate the monolith to microservices?

How to separate the monolith to microservices?


How to separate the monolith to microservices?
This is not a trivial problem... But it is worth its price.

Thanks God we have DZONE.com :-)

As we can read at
https://dzone.com/storage/assets/3259596-dzonerefcardz-gettingstartedmicroservices.pdf
before we can start breaking up a monolith, it’s important to make sure the monolith is designed following good software architecture principles.

Some common rules are:
1. Separate your concerns. 
Consider using Model-ViewController (MVC) for front-end abstraction.
Use welldefined APIs for high cohesion and low coupling.
Separate interfaces/APIs and implementations.

2. Use Convention over Configuration (CoC). 
Keep configuration to a minimum by using or establishing conventions.

3. Follow the Law of Demeter. (similar to "Single Responsibility Principle" = SRP) Each unit should have only limited knowledge about other units: only units "closely" related to the current unit. Each unit should only talk to its friends. Do not talk to strangers! Only talk to your immediate friends.

4. Use Domain-Driven Design. 
Keep objects related to a domain/component together.

5. Focus on Automation. 
Automate testing and fully automated deployment pipeline.

6. Design to Interfaces / APIs.
Classes shouldn’t call other classes directly just because they happen to be in the same archive. Such group could be later a microservice...

7. Group code by functionality, not by layer. 
Monoliths usually have a layered architecture, and it’s common to group classes by layer. Instead you should break up your code into packages separated by functionalities to allow easier splitting into future microservices. It also makes easier to see the dependencies between your future microservices.

8. Make your code stateless and externalize your application’s state. 
One cannot rely on static variables or global variables as the source of your application’s state. Use external data sources such as key-values stores or databases to maintain state.

Known problems:

  1. Sharing
  2. Asynchronicity
  3. Security
  4. Simplicity
  5. Evolution
  6. Health

Billing and TCO calculator on AWS

Billing and TCO calculator on AWS
Sometimes it is very hard to predict on AWS all the costs of our service.

In my opinion, the TCO calculator is too easy and not complex and it does not allow to calculate useful ideas :-(

Useful sites:







Docker images on AWS

Docker images on AWS


At the very begining we should create docker image from dockerfile...

The docker container with 3 main "beasts": Java, Tomcat and Alpine/Centos Linux... - very useful information we can read at:
https://dzone.com/articles/performance-patterns-in-microservices-based-integr-1


Amazon Elastic Container Service (ECS) or on Fargate cluster...


Amazon Elastic Container Service (ECS) is a highly scalable, high performance container management service that supports Docker containers and allows you to easily run applications on a managed cluster of Amazon EC2 instances. Amazon ECS eliminates the need for you to install, operate, and scale your own cluster management infrastructure. With simple API calls, you can launch and stop container-enabled applications, query the complete state of your cluster, and access many familiar features like security groups, Elastic Load Balancing, EBS volumes and IAM roles. You can use Amazon ECS to schedule the placement of containers across your cluster based on your resource needs and availability requirements. You can also integrate your own scheduler or third-party schedulers to meet business or application specific requirements.

Spring Boot App

Spring Boot App




Spring Boot is Spring's "convention-over-configuration" solution for creating stand-alone, production-grade Spring-based Applications that you can "just run".

It is preconfigured with the Spring's "opinionated view" of the best configuration and use 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...

See more at:

FARGATE cluster on AWS

FARGATE cluster on AWS

AWS Fargate is a compute engine for Amazon ECS that allows you to run containers without having to manage servers or clusters. With AWS Fargate, you no longer have to provision, configure, and scale clusters of virtual machines to run containers as Docker with Tomcat and Java...

But pay attention with billing with Fargate on AWS!

Fargate cluster doubles costs, because it is cluster (e.g. two "legs"/nodes):


Example:
vCPU = $0,05 per hour * 700 hours (25 days) * 2 nodesOfCluster = $70 per 1 month (25 days) = $70

Sharding in the Blockchain

Sharding in the Blockchain


Sharding is a relatively new concept in the Blockchain.

Sharding: a solution to the scalability, latency and transaction throughput issues. 
Sharding is a concept that's widely used in databases, to make them more efficient. 

In case of the blockchain, each node will have only a part of the data on the blockchain, and not the entire information, when sharding is implemented.

A blockchain (https://en.wikipedia.org/wiki/Blockchain), originally block chain, is a growing list of records, called blocks, which are linked using cryptography.
Each block contains a cryptographic hash of the previous block, a timestamp, and transaction data (generally represented as a merkle tree root hash).

In cryptography and computer science, a hash tree or Merkle tree is a tree in which every leaf node is labelled with the hash of a data block, and every non-leaf node is labelled with the cryptographic hash of the labels of its child nodes.

By design, a blockchain is resistant to modification of the data. It is "an open, distributed ledger that can record transactions between two parties efficiently and in a verifiable and permanent way". For use as a distributed ledger, a blockchain is typically managed by a peer-to-peer network collectively adhering to a protocol for inter-node communication and validating new blocks. Once recorded, the data in any given block cannot be altered retroactively without alteration of all subsequent blocks, which requires consensus of the network majority. 

See more about implementations of blockchain in Java:

LinkedBlockingQueue vs ConcurrentLinkedQueue

LinkedBlockingQueue vs. ConcurrentLinkedQueue


Why and when do we use Blocking Queues and Non Blocking Queues with working with streams and media? Unbounded or not? What is when the best choice?

Once upon a time, in a galaxy far, far away, there was a beautiful young Queue...  :-)



Following operations are allowed e.g.:

bqueue.take() to take form a stream...

What are the advantages/disadvantages of unbounded queue?
With an unbounded queue, a producers can get far ahead of the consumers. Pay attention for OutOfMemoryError! How can we signal a producer that the queue is full?

ASPECTS:




  • speed
  • concurrency 
  • time to access last element
  • blocking
  • unbounded

LinkedBlockingQueue

LinkedBlockingQueue is a good choice for many pools (depending on the pool management strategy):
https://www.geeksforgeeks.org/linkedblockingqueue-class-in-java/
https://www.geeksforgeeks.org/java-8-linkedblockingqueue-spliterator-method-with-examples/

The LinkedBlockingQueue is an optionally-bounded blocking queue based on linked nodes. It means that the LinkedBlockingQueue can be bounded, if its capacity is given, else the LinkedBlockingQueue will be unbounded. The capacity can be given as a parameter to the constructor of LinkedBlockingQueue.

This queue orders elements FIFO (first-in-first-out). It means that the head of this queue is the oldest element of the elements present in this queue. The tail of this queue is the newest element of the elements of this queue. The newly inserted elements are always inserted at the tail of the queue, and the queue retrieval operations obtain elements at the head of the queue. Linked queues typically have higher throughput than array-based queues but less predictable performance in most concurrent applications.

ConcurrentLinkedQueue

The ConcurrentLinkedQueue is good as well in many cases:
 https://www.javacodex.com/Concurrency/ConcurrentLinkedQueue-Example

ConcurrentLinkedQueue is an unbounded thread-safe queue based on linked nodes. This queue orders elements as a FIFO (first-in-first-out). The head of the queue is that element that has been on the queue the longest time. The tail of the queue is that element that has been on the queue the shortest time. New elements are inserted at the tail of the queue, and the queue retrieval operations obtain elements at the head of the queue.

A ConcurrentLinkedQueue is a good choice when many threads share access to a common collection. Like most other concurrent collection implementations, this class does not permit the use of null elements.


A limited capacity of BlockingQueue 

(https://www.javacodex.com/Concurrency/BlockingQueueExample) is also helpful if you want to throttle some sort of request.

Useful sites to learn it deeper:

https://www.javacodex.com/Concurrency/

https://dzone.com/articles/a-specialized-high-performance-concurrent-queue







Microservices on Amazon AWS

Microservices on Amazon AWS


Microservices are an architectural and organizational approach to software development where software is composed of small independent services that communicate over well-defined APIs. These services are owned by small, self-contained teams.

Microservices architectures make applications easier to scale and faster to develop, enabling innovation and accelerating time-to-market for new features.

Useful page:
https://aws.amazon.com/microservices/

We need to have or create an account on AWS to try building the Microservices on AWS...:
https://aws.amazon.com/
AWS Accounts Include 12 Months of Free Tier Access.