diff --git a/backend/microservices and load balancing/app/index.js b/backend/microservices and load balancing/app/index.js index a650e1750971dad221d95a52ca5c48ef3aa7deb5..ec74e898aea872d9a5c89d9fa234fffbec693996 100644 --- a/backend/microservices and load balancing/app/index.js +++ b/backend/microservices and load balancing/app/index.js @@ -1,13 +1,36 @@ const app = require("express")(); const http = require('http'); -const appid = process.env.APPID || -1; -const port = 8090; +//Default at 8090 to enable easy development +const appid = process.env.APPID || 8090; + +app.get("/generatePoint", (req,res) => { + console.log("Generating single point") -const requestListener = app.get("/generatePoint", (req,res) => { res.send({"appid": appid, "point": generatePoint()}) }) + +app.get("/generatePointStream",(req,res)=>{ + console.log("Generating points") + var intervalId = setInterval(function(){ + + for(var i = 0; i<100;i++){ + var response = JSON.stringify({"appid": appid,"point":generatePoint()}) + res.write(response + "\n"); + } + setTimeout(function() { + clearInterval(intervalId) + res.end(); + + }, 10000); + +},10); + +}) + + + //Generate randomPoint function generatePoint(){ console.log @@ -18,13 +41,6 @@ function generatePoint(){ return {id:appid, x:xVal,y:yVal}; } - - if(appid<0){ - const server = http.createServer(requestListener); - server.listen(port); - console.log('Listening at port: ' + port); - } - else{ - app.listen(appid, ()=>console.log(`${appid} is listening on ${appid}`)) - } +app.listen(appid, ()=>console.log(`${appid} is listening on ${appid}`)) + \ No newline at end of file diff --git a/backend/package-lock.json b/backend/package-lock.json index 410756662de3fbf15a3e281fdf225d2995b310bf..456f77301023108b6a253d6a69608a28e99460c7 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -1093,6 +1093,11 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, + "streammagic": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/streammagic/-/streammagic-1.0.0.tgz", + "integrity": "sha1-vO5+93fgtV75N7h5A/HO9l0UUQ8=" + }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", diff --git a/backend/package.json b/backend/package.json index af489a5e43d6ebe8fa74d123d9fd8376a922f283..d99087d360d5222f6441cea907960a0144e0b6eb 100644 --- a/backend/package.json +++ b/backend/package.json @@ -10,7 +10,8 @@ "google-protobuf": "^3.6.1", "grpc": "^1.24.3", "grpc-web": "^1.0.0", - "lodash": "4.17.20" + "lodash": "4.17.20", + "streammagic": "^1.0.0" }, "eslintConfig": { "root": true, diff --git a/backend/projector.proto b/backend/projector.proto new file mode 100644 index 0000000000000000000000000000000000000000..a2a1dab64955b20ba82e8482070f4131dc483881 --- /dev/null +++ b/backend/projector.proto @@ -0,0 +1,71 @@ +syntax = "proto3"; + +package provee; + +import "google/protobuf/empty.proto"; + +option java_multiple_files = true; +option java_package = "nl.uuvig.provee"; +option java_outer_classname = "ProveProjectorGRCP"; +option objc_class_prefix = "PROVEE"; + + +// Interface exported by the server. +service Projector { + // A simple RPC. + // + // Start the Projector calculation + rpc start(google.protobuf.Empty) returns (google.protobuf.Empty); + + // Stop the Projector calculation + rpc stop(google.protobuf.Empty) returns (google.protobuf.Empty); + + // A server-to-client streaming RPC. + // + // Obtains the Projection Points in 2D given the trainings values stored in a row format. Results are + // streamed rather than returned at once (e.g. in a response message with a + // repeated field). + rpc getProjectionPoints(TrainingSet) returns (stream Point) {} + + // A server-to-client streaming RPC. + // + // Obtains the Projection Points in 2D given the trainings values stored in a row format. Results are + // streamed rather than returned at once (e.g. in a response message with a + // repeated field). + rpc getUpdates(google.protobuf.Empty) returns (stream Point) {} + +// // A client-to-server streaming RPC. +// // +// // Accepts a stream of Points on a route being traversed, returning a +// // RouteSummary when traversal is completed. +// rpc RecordRoute(stream Point) returns (RouteSummary) {} + +// // A Bidirectional streaming RPC. +// // +// // Accepts a stream of RouteNotes sent while a route is being traversed, +// // while receiving other RouteNotes (e.g. from other users). +// rpc RouteChat(stream RouteNote) returns (stream RouteNote) {} +} + +// Points are represented as x-y pairs +message Point { + int32 id = 1; + int32 x = 2; + int32 y = 3; +} + +// Needs description +message TrainingSet { + string modelid = 1; + repeated TrainingSetRow rows = 2; +} + +// Needs documentation +message TrainingSetRow { + // The id of the row, e.g., row index. + string id = 1; + + // The hd vector of the item. + repeated double hdvector = 2 [packed=true]; +} + diff --git a/backend/server.js b/backend/server.js index 81a527fd8debd4b7816b55dc77ae694647ec99b9..c8650dece3da401f0d326c5e5d34548e0846de5d 100644 --- a/backend/server.js +++ b/backend/server.js @@ -6,6 +6,9 @@ const axios = require('axios'); var _ = require('lodash'); var grpc = require('@grpc/grpc-js'); var protoLoader = require('@grpc/proto-loader'); +const http = require("http"); +const { hostname } = require('os'); +const { SSL_OP_SSLEAY_080_CLIENT_DH_BUG } = require('constants'); var packageDefinition = protoLoader.loadSync( PROTO_PATH, {keepCase: true, @@ -16,12 +19,9 @@ var packageDefinition = protoLoader.loadSync( }); var protoDescriptor = grpc.loadPackageDefinition(packageDefinition); var pointPackage = protoDescriptor.pointPackage; -/** - * @param {!Object} call - * @param {function():?} callback - */ - var count = 0; + +var count = 0; @@ -33,17 +33,32 @@ function sendPoint(call, callback) { }) } +function sendPointStream(call) { + http.get("http://localhost:8090/generatePointStream", res =>{ + + res.on("data", data =>{ + sendDataStream(data,call) + }) + + res.on("end",function() { + call.end(); + }) + }) +} + +function sendDataStream(data,call){ + var list = data.toString().split("\n") + for(var i =1; i <list.length-2;i++){ + var response = JSON.parse(list[i]); + call.write(response["point"]); + } +} //Points stream -function sendPointStream(call) { +function sendPointStream2(call) { - function sender(point) { - return (callback) => { - call.write(point); - _.delay(callback, 1); // in ms - }; - } + var senders = []; var count = 10; diff --git a/backend/serverv2.js b/backend/serverv2.js new file mode 100644 index 0000000000000000000000000000000000000000..0b696ce62e095e7ce92eeaf32e884fa403e57f67 --- /dev/null +++ b/backend/serverv2.js @@ -0,0 +1,85 @@ +//SETUP +var PROTO_PATH = __dirname + '/point.proto'; +var assert = require('assert'); +var async = require('async'); +const axios = require('axios'); +var _ = require('lodash'); +var grpc = require('@grpc/grpc-js'); +var protoLoader = require('@grpc/proto-loader'); +var packageDefinition = protoLoader.loadSync( + PROTO_PATH, + {keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true + }); +var protoDescriptor = grpc.loadPackageDefinition(packageDefinition); +var pointPackage = protoDescriptor.pointPackage; +var count = 0; + + + + +//SERVICE +function sendPoint(call, callback) { + axios.get('http://localhost:8090/generatePoint').then(resp=>{ + callback(null, resp["data"]["point"]); + }) +} + + + +//Points stream +function sendPointStream(call) { + + function sender(point) { + return (callback) => { + call.write(point); + _.delay(callback, 1); // in ms + }; + } + + var senders = []; + var count = 10; + for (var i = 0; i < count; i++) { + senders[i] = sender(generatePoint()); + } + async.series(senders, () => { + call.end(); + }); +} + + + +//Generate randomPoint +function generatePoint(){ + var xVal = Math.floor(Math.random()*20); + var yVal = Math.floor(Math.random()*20); + count++; + //console.log("Generated point. ID: " + count + " x: " + xVal + " y: " + yVal); + + return {id:count, x:xVal,y:yVal}; +} + +//Create server and route the grpc functions to js functions +function getServer() { + var server = new grpc.Server(); + server.addService(pointPackage.Point.service, { + readPoint: sendPoint, + readPointsStream: sendPointStream, + }); + return server; +} + +//Setup +if (require.main === module) { + var server = getServer(); + server.bindAsync( + '0.0.0.0:9090', grpc.ServerCredentials.createInsecure(), (err, port) => { + assert.ifError(err); + server.start(); + console.log("connected"); + }); +} +exports.getServer = getServer; diff --git a/frontend/README.md b/frontend/README.md index 5dabc273e90556df3d8c52e68284f116bc26005c..33f865c4f7e99e983216954f9ceae866d646045c 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -12,4 +12,9 @@ For some reason with vue it cant get the dapr.HTTP environment variable (even th docker run -d -v envoy.yaml:/etc/envoy/envoy.yaml:ro -p 7050:7050 -p 50460:50460 envoyproxy/envoy:v1.15.0 -docker run -d -v C:\Users\simen\OneDrive\Documents\GitHub\dummy-vue-grpc\envoy.yaml:/etc/envoy/envoy.yaml:ro -p 7050:7050 -p 50460:50460 envoyproxy/envoy:v1.15.0 \ No newline at end of file +docker run -d -v C:\Users\simen\OneDrive\Documents\GitHub\dummy-vue-grpc\envoy.yaml:/etc/envoy/envoy.yaml:ro -p 7050:7050 -p 50460:50460 envoyproxy/envoy:v1.15.0 + + + + +docker run -d -vC:\Users\simen\OneDrive\Documents\GitHub\dummy-vue-grpc\envoy.yaml:/etc/envoy/envoy.yaml:ro -p 8080:8080 -p 9090:9090 envoyproxy/envoy:v1.15.0 diff --git a/frontend/src/App.vue b/frontend/src/App.vue index c108c523a0429e6d9d351c613be830e602e8e8c3..8fa103abd947f380f46dd19569c7deac226d1a2e 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -61,8 +61,8 @@ export default { //Give the point to all components - var index = Math.floor(Math.random() * Math.floor(this.pointList.length)); - this.$refs.scatter.addPointToPlot(this.pointList[index]); + //var index = Math.floor(Math.random() * Math.floor(this.pointList.length)); + this.$refs.scatter.addPointToPlot(this.pointList[this.pointCount]); this.$refs.counter.setCounter(this.pointList.length) this.pointCount += 1; diff --git a/frontend/src/components/gRPCclient.vue b/frontend/src/components/gRPCclient.vue index 161f5a411a2cee9c29650eb528c9c95b275b8340..ea063adc437888d5f3538d7623af433d41ac9ba5 100644 --- a/frontend/src/components/gRPCclient.vue +++ b/frontend/src/components/gRPCclient.vue @@ -71,7 +71,6 @@ export default { //When data is received stream.on("data", (response) => { - console.log(this.pointToString(response)); this.receivedPoint(response); });