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
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