前言
- SDN 期末作业验收我们是采用的参考场景一,我们在此场景的基础上来做负载均衡,下面是我们搭建的拓扑图
演示视频
负载均衡程序
相关的关键代码
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课程可以说的是收获很多了。