天天看點

SDN 期末作業驗收

前言

  • SDN 期末作業驗收我們是采用的參考場景一,我們在此場景的基礎上來做負載均衡,下面是我們搭建的拓撲圖
    SDN 期末作業驗收

示範視訊

https://pan.baidu.com/s/1htkKLPM

負載均衡程式

相關的關鍵代碼

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Base64;

import net.sf.json.*;
public class Main {
	public static JSONObject jsonObject = null;
	public static JSONObject[] jsonArray = new  JSONObject[100];
	static String url24= "http://172.17.172.244:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:2/flow-node-inventory:table/0/flow/0";
	static String url14= "http://172.17.172.244:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/flow-node-inventory:table/0/flow/1";
	static String url21= "http://172.17.172.244:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:2/flow-node-inventory:table/0/flow/0";
	static String url12= "http://172.17.172.244:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/flow-node-inventory:table/0/flow/1";

	public static JSONObject httpRequest(String requestUrl, String requestMethod,int index) {
        StringBuffer buffer = new StringBuffer();
        try {

            URL url = new URL(requestUrl);
            // http協定傳輸
            HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection();
            httpUrlConn.setDoOutput(true);
            httpUrlConn.setDoInput(true);
            httpUrlConn.setUseCaches(false);
            
            String userPassword = "admin" + ":" + "admin";
            String encoding =  Base64.getEncoder().encodeToString((userPassword).getBytes());
            httpUrlConn.setRequestProperty("Authorization", "Basic " + encoding); 
            
            httpUrlConn.setRequestProperty("Connection", "Keep-Alive"); // 設定維持長連接配接
            httpUrlConn.setRequestProperty("Charset", "UTF-8");// 設定檔案字元集:
            
            
            // 設定請求方式(GET/POST)
            httpUrlConn.setRequestMethod(requestMethod);

            if ("GET".equalsIgnoreCase(requestMethod))
            {
            	httpUrlConn.connect();
                // 将傳回的輸入流轉換成字元串
                InputStream inputStream = httpUrlConn.getInputStream();
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

                String str = null;
                while ((str = bufferedReader.readLine()) != null) {
                    buffer.append(str);
                }
                
                bufferedReader.close();
                inputStreamReader.close();
                // 釋放資源
                inputStream.close();
                inputStream = null;
                httpUrlConn.disconnect();
                jsonObject = JSONObject.fromObject(buffer.toString());
              //  System.out.println(buffer.toString());
                
            }else if("PUT".equalsIgnoreCase(requestMethod)){
            	byte[] data = (jsonArray[index].toString()).getBytes();//轉換為位元組數組
                httpUrlConn.setRequestProperty("Content-Length", String.valueOf(data.length));// 設定檔案長度
                httpUrlConn.setRequestProperty("Content-Type", "application/json;charset=utf-8");
             // 開始連接配接請求
                httpUrlConn.connect();
                OutputStream  out = httpUrlConn.getOutputStream();   
             // 寫入請求的字元串
                out.write((jsonArray[index].toString()).getBytes());
                out.flush();
                out.close();
                if (httpUrlConn.getResponseCode() == 200) {  
                	System.out.println("發送成功");
                }
                
            }else if("DELETE".equalsIgnoreCase(requestMethod)){
            	
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return jsonObject;
    }
	public static void init() throws IOException{
		String s = null;
		int i = 0;
		try {
			BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("DATA.txt"),"UTF-8"));
			while((s = br.readLine())!=null){
				jsonArray[i] = JSONObject.fromObject(s);
				i++;
			}
			String url31= "http://172.17.172.244:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:3/flow-node-inventory:table/0/flow/0";
			String url32= "http://172.17.172.244:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:3/flow-node-inventory:table/0/flow/1";
			String url11= "http://172.17.172.244:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/flow-node-inventory:table/0/flow/0";
			String url22= "http://172.17.172.244:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:2/flow-node-inventory:table/0/flow/1";
			String url13= "http://172.17.172.244:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:1/flow-node-inventory:table/0/flow/2";
			String url23= "http://172.17.172.244:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:2/flow-node-inventory:table/0/flow/2";
			String url33= "http://172.17.172.244:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:3/flow-node-inventory:table/0/flow/2";
			httpRequest(url31,"PUT",0);
			httpRequest(url32,"PUT",1);
			httpRequest(url21,"PUT",2);
			httpRequest(url11,"PUT",3);
			httpRequest(url12,"PUT",4);
			httpRequest(url22,"PUT",5);
			httpRequest(url13,"PUT",6);
			httpRequest(url23,"PUT",7);
			httpRequest(url33,"PUT",10);
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static int getReceived(String url2){
		 jsonObject =  httpRequest(url2,"GET",0);
			JSONArray j1 = (JSONArray) jsonObject.get("node-connector");
			JSONObject j2 = (JSONObject) j1.get(0);
			JSONObject j3 =  (JSONObject) j2.get("opendaylight-port-statistics:flow-capable-node-connector-statistics");
			JSONObject j4 =  (JSONObject)j3.get("bytes");
			int received = (int) j4.get("received");
			return received;
	}
	public static void main(String[] args) {
		System.out.println("-------------------------------------------------");
		try {
			init();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		String s = "";
		String url = "http://172.17.172.244:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:3/flow-node-inventory:table/0/flow/1";
		String url1= "http://172.17.172.244:8181/restconf/config/opendaylight-inventory:nodes/node/openflow:2/flow-node-inventory:table/0/flow/0";
		String url2 = "http://172.17.172.244:8181/restconf/operational/opendaylight-inventory:nodes/node/openflow:2/node-connector/openflow:2:2";
//		 jsonObject =  httpRequest(url2,"GET",0);
//		System.out.println(jsonObject.toString());
		int received ;
		int temp = 0;
		while(true){
			received = getReceived(url2);
			try {
				Thread.sleep(5000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} 
			System.out.println(received-temp);
                                //這裡我們去判斷S2交換機通過包的增長數量來選擇路徑,實作負載均衡
			if(received-temp<10000){
				//下負載均衡流表
				httpRequest(url24,"PUT",8);
				httpRequest(url14,"PUT",9);
			}else if(received-temp>10000 ){
				httpRequest(url21,"PUT",2);
				httpRequest(url12,"PUT",4);
			}
			temp = received;
		}
		
//		jsonObject =  httpRequest(url1,"PUT");
		
		
		
	}
}

           

期末分工

  • 我在本次期末作業中,主要是搭建場景,以及設計負載均衡,和最後的視訊錄制,關于代碼實作這部分我參與的比較少。

課程總結

  • 雖然在本次課程前我是有接觸過一些SDN的相關知識,但在一些課程中也有我之前從未接觸過的知識,比例ODL的使用以及開發。也同時在課程中重新複習了SDN的知識,也得到了新的知識。這次的負載均衡也是之前理論上知道,但實際并未去實作。通過這次的SDN課程可以說的是收獲很多了。