Repository: geshenyi/MockSecKill Branch: master Commit: 00405c4c9bd8 Files: 23 Total size: 34.0 KB Directory structure: gitextract_jjnoj99z/ ├── .gitignore ├── README.md ├── docker-compose.yml └── seckill_service/ ├── .idea/ │ ├── .name │ ├── Seckill_Service.iml │ ├── encodings.xml │ ├── jsLibraryMappings.xml │ ├── libraries/ │ │ └── Seckill_Service_node_modules.xml │ ├── misc.xml │ ├── modules.xml │ ├── runConfigurations/ │ │ └── bin_www.xml │ └── workspace.xml ├── app.js ├── bin/ │ └── www ├── package.json ├── public/ │ └── stylesheets/ │ └── style.css ├── routes/ │ ├── index.js │ ├── seckill.js │ └── users.js ├── seckill_kafka_consumer.js └── views/ ├── error.jade ├── index.jade └── layout.jade ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ node_modules/ ================================================ FILE: README.md ================================================ # MockSecKill ================================================ FILE: docker-compose.yml ================================================ version: '2' services: zookeeper: image: wurstmeister/zookeeper ports: - "2181:2181" kafka: image: wurstmeister/kafka links: - zookeeper:zk ports: - "9092:9092" depends_on: - zookeeper environment: KAFKA_ADVERTISED_HOST_NAME: 192.168.2.107 KAFKA_ADVERTISED_PORT: "9092" KAFKA_ZOOKEEPER_CONNECT: zk:2181 redis: image: redis ports: - "6379:6379" mysql: image: mysql ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: root ================================================ FILE: seckill_service/.idea/.name ================================================ Seckill_Service ================================================ FILE: seckill_service/.idea/Seckill_Service.iml ================================================ ================================================ FILE: seckill_service/.idea/encodings.xml ================================================ ================================================ FILE: seckill_service/.idea/jsLibraryMappings.xml ================================================ ================================================ FILE: seckill_service/.idea/libraries/Seckill_Service_node_modules.xml ================================================ ================================================ FILE: seckill_service/.idea/misc.xml ================================================ ================================================ FILE: seckill_service/.idea/modules.xml ================================================ ================================================ FILE: seckill_service/.idea/runConfigurations/bin_www.xml ================================================ ================================================ FILE: seckill_service/.idea/workspace.xml ================================================ true $PROJECT_DIR$ true bdd DIRECTORY false 1484492752471 ================================================ FILE: seckill_service/app.js ================================================ var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var index = require('./routes/index'); var users = require('./routes/users'); var seckill = require('./routes/seckill'); var app = express(); app.listen(3000); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); // uncomment after placing your favicon in /public //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use('/', index); app.use('/users', users); app.use('/seckill', seckill); // catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); // error handler app.use(function(err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page res.status(err.status || 500); res.render('error'); }); module.exports = app; ================================================ FILE: seckill_service/bin/www ================================================ #!/usr/bin/env node /** * Module dependencies. */ var app = require('../app'); var debug = require('debug')('seckill-service:server'); var http = require('http'); /** * Get port from environment and store in Express. */ var port = normalizePort(process.env.PORT || '3000'); app.set('port', port); /** * Create HTTP server. */ var server = http.createServer(app); /** * Listen on provided port, on all network interfaces. */ server.listen(port); server.on('error', onError); server.on('listening', onListening); /** * Normalize a port into a number, string, or false. */ function normalizePort(val) { var port = parseInt(val, 10); if (isNaN(port)) { // named pipe return val; } if (port >= 0) { // port number return port; } return false; } /** * Event listener for HTTP server "error" event. */ function onError(error) { if (error.syscall !== 'listen') { throw error; } var bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port; // handle specific listen errors with friendly messages switch (error.code) { case 'EACCES': console.error(bind + ' requires elevated privileges'); process.exit(1); break; case 'EADDRINUSE': console.error(bind + ' is already in use'); process.exit(1); break; default: throw error; } } /** * Event listener for HTTP server "listening" event. */ function onListening() { var addr = server.address(); var bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port; debug('Listening on ' + bind); } ================================================ FILE: seckill_service/package.json ================================================ { "name": "seckill-service", "version": "0.0.0", "private": true, "scripts": { "start": "node ./bin/www" }, "dependencies": { "body-parser": "~1.15.2", "cookie-parser": "~1.4.3", "debug": "~2.2.0", "express": "~4.14.0", "jade": "~1.11.0", "kafka-node": "^1.3.0", "morgan": "~1.7.0", "mysql": "^2.12.0", "redis": "^2.6.5", "serve-favicon": "~2.3.0" } } ================================================ FILE: seckill_service/public/stylesheets/style.css ================================================ body { padding: 50px; font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; } a { color: #00B7FF; } ================================================ FILE: seckill_service/routes/index.js ================================================ var express = require('express'); var router = express.Router(); /* GET home page. */ router.get('/', function(req, res, next) { res.render('index', { title: 'Express' }); }); module.exports = router; ================================================ FILE: seckill_service/routes/seckill.js ================================================ var express = require('express'); var router = express.Router(); var redis = require('redis'); var kafka = require('kafka-node'); var Producer = kafka.Producer; var kafkaClient = new kafka.Client(); var producer = new Producer(kafkaClient); var count = 0; router.post('/seckill', function (req, res) { console.log('count=' + count++); var fn = function (optionalClient) { if (optionalClient == 'undefined' || optionalClient == null) { var client = redis.createClient(); }else{ var client = optionalClient; } client.on('error', function (er) { console.trace('Here I am'); console.error(er.stack); client.end(true); }); client.watch("counter"); client.get("counter", function (err, reply) { if (parseInt(reply) > 0) { var multi = client.multi(); multi.decr("counter"); multi.exec(function (err, replies) { if (replies == null) { console.log('should have conflict') fn(client); } else { var payload = [ { topic: 'CAR_NUMBER', messages: 'buy 1 car', partition: 0 } ]; producer.send(payload, function (err, data) { console.log(data); }); res.send(replies); client.end(true); } }); } else { console.log("sold out!"); res.send("sold out!"); client.end(true); } }) }; fn(); }); module.exports = router; ================================================ FILE: seckill_service/routes/users.js ================================================ var express = require('express'); var router = express.Router(); /* GET users listing. */ router.get('/', function(req, res, next) { res.send('respond with a resource'); }); module.exports = router; ================================================ FILE: seckill_service/seckill_kafka_consumer.js ================================================ var kafka = require('kafka-node'), Consumer = kafka.Consumer, client = new kafka.Client(), consumer = new Consumer( client, [ {topic: 'CAR_NUMBER', partition: 0} ], { autoCommit: true } ); var mysql = require('mysql'); var connection = mysql.createConnection({ host : 'localhost', user : 'root', password : 'root', database : 'seckill' }); connection.connect(); consumer.on('message', function (message) { connection.query('INSERT INTO seckill set ?', {date: new Date()}, function(error, results, fields){ if(error){ console.error(error); } console.log(results); }) }); ================================================ FILE: seckill_service/views/error.jade ================================================ extends layout block content h1= message h2= error.status pre #{error.stack} ================================================ FILE: seckill_service/views/index.jade ================================================ extends layout block content h1= title p Welcome to #{title} ================================================ FILE: seckill_service/views/layout.jade ================================================ doctype html html head title= title link(rel='stylesheet', href='/stylesheets/style.css') body block content