Clustering - studiofu/brain GitHub Wiki

Hazelcast Data Grid

Hazelcast Data Grid, Hazelcast is a distributed In-Memory Data Grid platform for Java.

https://en.wikipedia.org/wiki/Hazelcast

Hazelcast Example

https://www.heapcode.com/hazelcast-java-example/

Guide to Hazelcast with Java

http://www.baeldung.com/java-hazelcast

Sample Hazelcast Server Code

POM

        <dependency>
            <groupId>com.hazelcast</groupId>
            <artifactId>hazelcast</artifactId>
            <version>3.2</version>
        </dependency>
        <dependency>
            <groupId>com.hazelcast</groupId>
            <artifactId>hazelcast-client</artifactId>
            <version>3.2</version>
        </dependency>

Java

        Config cfg = new Config();

        /** connect node **/
        NetworkConfig network = cfg.getNetworkConfig();

        JoinConfig join = network.getJoin();
        join.getMulticastConfig().setEnabled(false);
        join.getTcpIpConfig().addMember("10.134.74.57")
            .addMember("172.24.202.239").setEnabled(true);
        network.getInterfaces().setEnabled(true)
            .addInterface("10.134.74.57").addInterface("172.24.202.239");

        HazelcastInstance instance = Hazelcast.newHazelcastInstance(cfg);
        Map<Integer, Integer> customerMap = instance.getMap("customers");

        for(int i=0;i<10;i++) {
            int key = (int)(Math.random()*100);
            int value = (int)(Math.random()*100);

            customerMap.put(key, value);
        }

        System.out.println("Map Size:" + customerMap.size());
        Set<Entry<Integer,Integer>> customers = customerMap.entrySet();

        for (Iterator<Entry<Integer, Integer>> iterator = customers.iterator(); iterator.hasNext();) {
                Entry<Integer, Integer> entry = (Entry<Integer, Integer>) iterator.next();
                System.out.println("Customer Id : "+ entry.getKey()+" Customer Value : "+entry.getValue());
      }

Spring Boot & Redis

Redis Starting Command

C:\Applications\redis>redis-server.exe redis.windows.conf

Database Change, where 1 is the database index which could be from 0 to xx

C:\Applications\redis>redis-cli.exe
127.0.0.1:6379> select 1
OK

Spring Boot, Spring Session With Redis

https://docs.spring.io/spring-session/docs/current/reference/html5/guides/boot-redis.html

Vaadin Redis Http Session Clustering - using filter to rewrite the http session and then create a filter bean (refer to spring-session-redis open source project)

:web:clustering:vaadinsessionrewritefilter.zip

@Configuration
public class SpringConfig {

    @Bean
    public Filter vaadinSessionRewriteFilter() {
        return new VaadinSessionRewriteFilter();
    }

Spring Session, Nginx Load Balance

https://blog.csdn.net/u010648555/article/details/79459953

Basic Nginx Setup

https://dotblogs.com.tw/grayyin/2017/05/18/183117

Nginx, Spring Boot as system services

https://www.linode.com/docs/development/java/how-to-deploy-spring-boot-applications-nginx-ubuntu-16-04/

Simple Setting for Fail-over load balancer by using Nginx

#user nobody;
worker_processes 1;
events{
    worker_connections 1024;
    }
http{
    upstream myproject {
        ip_hash; # apply ip hash for sticky session <-- important
        server 127.0.0.1:8888; #server 1
        server 127.0.0.1:9999; #server 2
        server 172.24.202.239:8088; #server 3

    }
    server {
        listen 80;
        server_name localhost;

        location / {
            proxy_pass http://myproject;
            proxy_next_upstream     error timeout invalid_header http_500;
            proxy_connect_timeout   2;
            }
        }
}

sample for passing client ip through firewall

upstream my_app {
    ip_hash;
    server 111.11.11.11:3001 weight=100 max_fails=5 fail_timeout=300;
    server 222.22.22.22:3002 weight=100 max_fails=5 fail_timeout=300;
    keepalive 8;
}

server {
    server_name my-app.com;

    location / {
   proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_set_header X-Real_IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;

        # This is necessary to pass the correct IP to be hashed
        real_ip_header X-Real-IP;

        proxy_pass http://my_app/;
        proxy_redirect off;
    }
}
start nginx and stop nginx

​​​​​$ nginx
$ nginx -sstop

Using Robbin as Client Side Load Balancer

https://spring.io/guides/gs/client-side-load-balancing/

⚠️ **GitHub.com Fallback** ⚠️