You are on page 1of 12

H PHÂN TÁN

BÀI TH C HÀNH
H C PH N: H PHÂN TÁN
1: T NG QUAN VÀ KI N TRÚC HPT

1. Web server apache2


1.1. N i dung

Trên l ch t r ng t t c các
d ch v m u s d ng lý thuy t c a H Phân Tán. bài th c hành này các b n s
th tri n khai d ch v WWW. C th , các b n s t 1 web server.

1.2. Yêu c u
1.2.1. Lý thuy t
Làm ch Unix OS
Ki n th n c a M ng máy tính
1.2.2. Thi t b
PC ho c VM
1.2.3. Ph n m m

1.3. c th c hành
1.3.1. t web server apache2

c h t chúng ta ph t m t ph n m m máy ch web, và ngày nay thì apache


là thông d ng nh t. Hãy s d ng l nh sau:

sudo apt install apache2

Th truy c p vào webserver này b a ch IP c a mày này t m t máy


khác (2 máy c n trong cùng 1 m ng LAN). Các b n s th y hi n lên trang web m c
nh c a apache (Có ch b t
thành công webserver.

Câu h i 1: ng d n file html ch a n i dung m nh c a trang web các b n


v a xem là gì?

Câu h i 2: C ng m nh c a d ch v www là gì?


1.3.2. t virtual hosts cho apache2
Máy ch apache2 có kh a nhi u máy o v i ch a ch IP. Bây gi chúng
ta hãy t u tiên, t c có ch a n i

sudo mkdir -p /var/www/example.com/public_html


sudo mkdir -p /var/www/test.com/public_html

1
H PHÂN TÁN

i quy b ng l nh sau:

sudo chmod -R 755 /var/www

Câu h i 3: Hãy gi i thích quy n mang s 755 là gì?

Vi t n nh s a n i dung c
m c public_html mà b n v a t

<html>
<head>
<title>Welcome to Example.com!</title>
</head>
<body>
<h1>Success! The example.com virtual host is working!</h1>
</body>
</html>

(Nh i thành test.com v c test.com).

File c u hình m nh c a các máy o c a apache là:

/etc/apache2/sites-available/000-default.conf

Bây gi hãy t o 2 file sau:


/etc/apache2/sites-available/example.com.conf
/etc/apache2/sites-available/test.com.conf

i dung c a file example.com.conf

<VirtualHost *:80>
ServerAdmin admin@example.com
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public_html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

i dung c a file test.com.conf :

<VirtualHost *:80>
ServerAdmin admin@test.com
ServerName test.com
ServerAlias www.test.com
DocumentRoot /var/www/test.com/public_html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

2
H PHÂN TÁN

Ch y 2 l kích ho t 2 file trên:

sudo a2ensite example.com.conf


sudo a2ensite test.com.conf

Kh ng l i d ch v apache:
sudo service apache2 restart

M file /etc/hosts và thêm nh ng dòng sau:

127.0.0.1 example.com
127.0.0.1 test.com

Bây gi hãy m trình duy t web và th nghi a ch example.com và test.com

Câu h i 4: B n quan sát th y n a ch trên? Gi i thích.

Câu h i 5: Th truy c p t các máy tính khác trong cùng m ng LAN vào 2 trang web

2. Interface trong Java

2.1. N i dung

Trên l cv Tính m trong H m b o Tính


m , chúng ta c n ph i xây d ng các interface gi a các thành ph n c a h th ng.
Trong ph n th c hành này, chúng ta s xây d ng m t mô hình client- n,
g i m t chu i s lên cho server. Server s s p x p nh ng s nh n
c v i vi c s d c sort c khai báo trong interface. Chúng ta s
th y có nhi u các tri c sort i phát bi u
c a tính m là cho phép nhièu nhà s n xu t có th tham gia vào xây d ng các thành
ph n theo các cách khác nhau).

2.2. Yêu c u
2.2.1. Lý thuy t
L p trình Java
2.2.2. Thi t b
PC
2.2.3. Ph n m m
Eclipse IDE
JDK/JRE

2.3. c th c hành

3
H PHÂN TÁN

2.3.1. t các công c c n thi t


-T iv t IDE Eclipse: https://www.eclipse.org/downloads/packages/
- T i JDK/JRE:
https://www.oracle.com/technetwork/java/javase/downloads/index.html

2.3.2. Xây d
u tiên, m Eclipse và t o m t java project m i v i vi c ch n File New Java
project. Hãy t
Sau khi t o xong, b n s nhìn th y m c tên là src ch a
mã ngu n.
T ng cách n ph i chu c src
ch n New Package
t tên 2
com.hust.soict.your_name.client_server
com.hust.soict.your_name.helper
ng tên b n)

Trong package client_server, t o 2 l t tên là Client và Server.


Bây gi chúng ta s l

2.3.2.1. Client
Hãy m file Client.java ra và b u l p trình.
y tiên chúng ta ph i import các l p c a b n Java:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

c main, chúng ta s kh i t o m t th c th socket b ng cách


dùng l p Socket:

Socket socket = new Socket("127.0.0.1", 9898);

B n có th thay th a ch IP và s hi u c n mu a
ch IP và c ng mà server s l ng nghe các yêu c u mà Client s g i lên.
Bây gi chúng ta s kh i t o 2 th c th c a 2 l p BufferedReader và PrintWriter
g i và nh n d li u:

BufferedReader in = new BufferedReader(new


InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

Kh i t o 1 th c th cho l p Scanner:
System.out.println(in.readLine());
Scanner scanner = new Scanner(System.in);

4
H PHÂN TÁN

Câu h i 6: Hãy t vi t m th c hi n 1 vòng l p while sao cho nó s


nh n các s i dùng gõ và g i v i dùng gõ ký t
r ng r i n enter. G i ý: hãy dùng l nh n xâu ký t i dùng gõ vào:
String message = scanner.nextLine();

Cu socket và scanner l i:
socket.close();
scanner.close();

2.3.2.2. Server
Bây gi hãy m và ch nh s a file Server.java. M ng m
lu nh n các s i dùng g i lên và s p x p nó theo th t n (ho c
nh d n) và g i tr l i cho Client.
u tiên hãy import m t s n Java c n thi t:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import com.hust.soict.haianh.helper.*;
import java.util.Arrays;

c main, hãy vi

System.out.println("The Sorter Server is running!");


int clientNumber = 0;
try (ServerSocket listener = new ServerSocket(9898)) {
while (true) {
new Sorter(listener.accept(), clientNumber++).start();
}
}

Chú ý là s hi u c ng ph hi u c ng mà client g i lên.


c main, hãy t o 1 l p Sorter t lu ng. Và
nó ph i k th a t l p Thread:

private static class Sorter extends Thread {


private Socket socket;
private int clientNumber;

public Sorter(Socket socket, int clientNumber) {


this.socket = socket;
this.clientNumber = clientNumber;
System.out.println("New client #" + clientNumber + " connected at " + socket);
}

public void run() {


try {
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

// Send a welcome message to the client.

5
H PHÂN TÁN

out.println("Hello, you are client #" + clientNumber);

// Get messages from the client, line by line; Each line has several numbers separated by a space
character
while (true) {
String input = in.readLine();
if (input == null || input.isEmpty()) {
break;
}
//Put it in a string array
String[] nums = input.split(" ");

//Convert this string array to an int array


int[] intarr = new int[ nums.length ];

int i = 0;

for ( String textValue : nums ) {


intarr[i] = Integer.parseInt( textValue );
i++;
}

//Sort the numbers in this int array


new SelectionSort().sort(intarr);
//Convert the int array to String
String strArray[] = Arrays.stream(intarr)
.mapToObj(String::valueOf)
.toArray(String[]::new);
//Send the result to Client
out.println(Arrays.toString(strArray));
}
} catch (IOException e) {
System.out.println("Error handling client #" + clientNumber);
} finally {
try { socket.close(); } catch (IOException e) {}
System.out.println("Connection with client # " + clientNumber + " closed");
}
}
}

Câu h i 7: Vai trò c c run là gì? c g i?

n có th th c g i thu c l p
SelectionSort. Bây gi chúng ta s xây d ng m t giao di n (interface) và khai báo
c sort bên trong. L p SelectionSort là m t trong nh ng l p tri n khai
giao di n này.

2.3.2.3. Interface và các cách tri n khai khác nhau


Bây gi hãy n ph i chu t vào package com.hust.soict.your_name.helper , ch n New
Interface
T o m t interface m t tên nó là NumberSorter.

c sort:

public interface NumberSorter {


void sort(int arr[]);
}

V om tl t tên là SelectionSort.

6
H PHÂN TÁN

Th c t là, l p SelectionSort s tri n khai giao di n NumberSorter


th c sort d a trên thu t toán selection sort. M file SelectionSort.java và
vi n code sau:

public class SelectionSort implements NumberSorter{


public void sort(int arr[]) {
int n = arr.length;

// One by one move boundary of unsorted subarray


for (int i = 0; i < n-1; i++)
{
// Find the minimum element in unsorted array
int min_idx = i;
for (int j = i+1; j < n; j++)
if (arr[j] < arr[min_idx])
min_idx = j;

// Swap the found minimum element with the first


// element
int temp = arr[min_idx];
arr[min_idx] = arr[i];
arr[i] = temp;
}
}
}

2.3.2.4. Ch
Bây gi hãy ch y th ng quên là ph i ch c khi ch y
client.

2.3.2.5. Tri n khai các gi i thu t s p x p khác


Bây gi hãy t mình tri n khai các gi i thu t s p x p khác. B c
trên (t o l p m n khai l i interface NumberSorter).
Th tri n khai v i 3 gi i thu t sau (có th tham kh o mã ngu n trên Internet):

Bubble sort
Insertion sort
Shell sort

3. Ki n trúc Microservices
3.1. N i dung
bài th c hành này chúng ta s xây d ng m t ki n
b ng cách s d ng Kubernetes, m t n n t ng m qu n lý nh ng d ch v d ng
container. Chúng ta s s d t o ra các containers.

7
H PHÂN TÁN

3.2. Yêu c u
3.2.1. Lý thuy t
Microservices
Kube fundamentals: Pods, Services, Deployments et al.
Docker
3.2.2. Ph n c ng
Laptop/PC on Windows
3.2.3. Ph n m m
VirtualBox
Docker
The kubernetes command line tool kubectl
The minikube binary
Git bash

3.3. c th c hành
t
- t VirtualBox: https://www.virtualbox.org/wiki/Downloads
- t kubectl trên Windows, chúng ta s c n ph t Chocolatey c:
https://chocolatey.org/docs/installation#installing-chocolatey
- Bây gi t công c kubernetes v i l nh sau:
>choco install kubernetes-cli
Ki m tra l ng l nh sau:
>kubectl version
- Bây gi hãy cài minikube-windows-amd64.exe:
https://github.com/kubernetes/minikube/releases
t tên l i cho file v a t i là minikube.exe và thêm nó vào Path. (N
bi t thêm bi ng vào Path th ng d n link sau:
https://www.java.com/en/download/help/path.xml)
- i v i b n nào dùng Windows thì s b v khi cài song song Docker và
VirtualBox là t i vì Docker trên Windows thì c n Hyper-V, còn VirtualBox thì l i
không ho c v i Hyper-V. Vì v y, gi d ng
ng thì hãy s d ng Docker Toolbox:
https://docs.docker.com/toolbox/overview/

S d ng ki xây d ng ng d ng web

Bây gi chúng ta s phát tri n m t ng d n b ng vi c s d ng


ki n trúc microservices. C th chúng ta s xây d ng 4 microservices sau:
1. D ch v Apache HTTP: Apache HTTP cs d cung ng d ch v
trang web c ng 8080. Nó s làm nhi m v là chuy n ti p các HTTP
n cho 3 microservices khác. Lý do s d ng d ch v này là vì

8
H PHÂN TÁN

th t s không c n thi t n u chúng ta xây d ng cho m i microservices m t


c ng riêng trên host c a minikube, thay vì th chúng ta s d ng chung 1
m vào cho c 3 d ch v (xem hình c c u hình
t reversy proxy cho h th ch cân b ng t i thì s do
m nhi m.
2. D ch v Order: D ch v x t hàng c i dùng. D ch
v này k t n i v i d ch v l y thông tin.
3. D ch v Customer: d ch v này có nhi m v qu n lý d li u khách hàng.
4. D ch v Catalog: D ch v này qu n lý các danh m c hàng hóa.

Mã ngu n có th xem link sau: https://github.com/anhth318/microservices-


demo

S d c mà b n mu t ct iv :

>git clone https://github.com/anhth318/microservices-demo.git

c microservices-demo, ch y l nh sau:
./mvnw clean package -Dmaven.test.skip=true
ho c n u dùng Windows thì ch y l nh:
mvnw.cmd clean package -Dmaven.test.skip=true

Nh ng l build/re-build 3 d ch v trên.
n c n ph i lên t o tài kho n trên Docker Hub: https://hub.docker.com/

Ch y docker toolbox máy c a b n b ng cách click t vào bi ng

9
H PHÂN TÁN

Docker Quickstart Terminal.

Bây gi , b ch v trên vào d ng nh (images) c


b n s t i lên máy ch c tiên, b n c p vào
Docker Hub dòng l nh b ng l nh sau:

>docker login

Gõ l i username và m t kh u tài kho n c a b o trên DockerHub.

Bây gi cb nv at iv build và t i docker image c a


t ng d ch v lên DockerHub:

i v i d ch v apache:
>docker build --tag=microservice-kubernetes-demo-apache apache

>docker tag microservice-kubernetes-demo-apache


your_docker_account/microservice-kubernetes-demo-apache:latest

>docker push your_docker_account/microservice-kubernetes-demo-


apache

Câu h i 1: Hãy th c hi n gõ nh ng l i 3 d ch v còn l i.

Câu h i 2: p vào tài kho n c a b n. B n


th y nh ng gì m i xu t hi n trên docker hub repository c a b n?

Minikube là m t công c tri n khai Kubernetes m n. Nó s t o


m t máy o và tri n khai m n có ch a m t nút th c thi duy nh t.
Minikube có th ch y trên nhi u n n t ng h u hành bao g m Linux, MacOS,
Windows.
Bây gi , hãy s d t o m t cluster bao g m 1 nút th c thi
Kubernetes (máy o) duy nh t, nó s ch y các ng d ng/d ch v i d ng các
u khi n b i Kubernetes master.

>minikube start

B n tri n khai các d ch v b ng cách s d ng các nh docker mà b i nó lên


DockerHub. B n hãy m file microservices.yaml và thay th t t c nh ng ch nào
xu t hi n tên tài kho n docker hub là anhth b ng tên tài kho n c a b n, c th là
nh ng dòng b u b ng t image
- image: docker.io/anhth/microservice-kubernetes-demo-apache:latest

Ti yl tri n khai các

10
H PHÂN TÁN

>kubectl apply -f microservices.yaml

Câu l nh trên t o ra các Pods. M t Pods có th ch a m t hay nhi u Docker


Containers. Trong ví d này m i Pod ch ch a m t Docker container. Các d ch v
c t o. Các d ch v có duy nh t m a ch IP và m t b n ghi DNS. Các
d ch v có th s d cân b ng t i.

S d ng l cho hi n t t c các thông tin c a Kubernetes master c a b n:

>kubectl get all

Câu h i 3: Tr ng thái (status) c a các pods v a m i t c là gì? Bây gi , hãy


ch vài phút và gõ l i l ng thái m i c a các pods gi n thành
gì?

xem chi ti nh kubectl describe services. L nh nãy


c cho các pods (kubectl describe pods) và các deployments
(kubectl describe deployments).

B xem logs c a m t pod (thay th b ng ID c a pod c a b n):

>kubectl logs catalog-269679894-60dr0

B n th m chí có th m 1 shell c a pod c a b n:


>kubectl exec catalog-269679894-60dr0 -it /bin/sh

Hãy ch n khi tr ng thái c a t t c các pods c a b n chuy n thành "Running",


ch y ng d ng c a mình. Hãy gõ l nh sau:

>minikube service apache

V i l nh trên thì b n có th m c trang web thông qua Apache httpd server


trên trình duy t web c a b n.
Bây gi hãy ch y ng d ng.
n vào "Customer", b n s th y t t c các tên c n vào "Add
customer", b n s t c khách hàng m i.
Tr v trang ch v i Catalog.
Tr v trang ch Home, n vào Order, và hãy th thêm vào vài yêu c u mua hàng.

Sau khi k ng quên xóa toàn b các d ch v và các deployments:

>kubectl delete service apache catalog customer order

11
H PHÂN TÁN

>kubectl delete deployments apache catalog customer order

và t t cluster:
>minikube stop

12

You might also like