MongoDB 不让云厂商用啦,Cosmos DB了解一下?

2018-11-29  本文已影响0人  Kele_73b1

前段时间开源数据库界很热闹,大家都纷纷跳出来指责云厂商使用代码但是不回馈社区。MongoDB更是直接换了开源许可证不让云厂商使用了。
https://www.sohu.com/a/260120443_465914
MongoDB还想上云咋办,除了用MongoDB自己的Atlas之外,微软Azure还有个Cosmos DB了解一下?完全兼容MongoDB,并且轻松跨Region全球部署。

接下来我们用CosmosDB替换MongoDB搭MEAN栈的Web服务器

部署Cosmos DB

登陆Azure Portal,搜索MongoDB,可以看到直接就有一个Database as a service for MongoDB啦,这其实就是Cosmos DB的Mongo API版

创建Cosmos DB

按照界面填好设置点击Review+Create简单两部就创建好了


创建Cosmos DB

点击Connection String记录数据库连接信息


image.png

接下来我们可以创建数据库test


创建数据库

数据库建好,接下来就可以搭Web服务器了。我们这次使用的是Ubuntu 18.04

安装Node.js

sudo apt-get install -y nodejs

设置服务器

首先还需要安装body-parser包,用来处理请求中的JSON
安装npm包管理器以及正文分析包

sudo apt-get install npm
sudo npm install body-parser

创建名为Books的文件夹,在该文件夹中建立server.js文件,内容如下

var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(express.static(__dirname + '/public'));
app.use(bodyParser.json());
require('./apps/routes')(app);
app.set('port', 3300);
app.listen(app.get('port'), function() {
    console.log('Server up: http://localhost:' + app.get('port'));
});
安装 Express 并设置服务器的路由

Express 是一个微型的灵活 Node.js Web 应用程序框架,为 Web 和移动应用程序提供功能。 本教程使用 Express 将书籍信息传入和传出 MongoDB 数据库。 Mongoose 提供简洁的基于架构的解决方案来为应用程序数据建模。 本教程使用 Mongoose 来为数据库提供书籍架构。

安装 Express 和 Mongoose。

sudo npm install express mongoose

在 Books 文件夹中,创建名为 apps 的文件夹,并添加包含所定义的 Express 路由的、名为 routes.js 的文件。

var Book = require('./models/book');
module.exports = function(app) {
  app.get('/book', function(req, res) {
    Book.find({}, function(err, result) {
      if ( err ) throw err;
      res.json(result);
    });
  }); 
  app.post('/book', function(req, res) {
    var book = new Book( {
      name:req.body.name,
      isbn:req.body.isbn,
      author:req.body.author,
      pages:req.body.pages
    });
    book.save(function(err, result) {
      if ( err ) throw err;
      res.json( {
        message:"Successfully added book",
        book:result
      });
    });
  });
  app.delete("/book/:isbn", function(req, res) {
    Book.findOneAndRemove(req.query, function(err, result) {
      if ( err ) throw err;
      res.json( {
        message: "Successfully deleted the book",
        book: result
      });
    });
  });
  var path = require('path');
  app.get('*', function(req, res) {
    res.sendfile(path.join(__dirname + '/public', 'index.html'));
  });
};

在 apps 文件夹中,创建名为 models 的文件夹,并添加包含所定义的书籍模型配置的、名为 book.js 的文件。将其中的mongodb连接串替换成之前创建的。

var mongoose = require('mongoose');
mongoose.connect('mongodb://kelemongodbtest.documents.azure.cn:10255/test?ssl=true&replicaSet=globaldb',{
        auth:{
                user:'kelemongodbtest',
                password:'2vsIXLu1aVyrnxpcjrKGOdzA2n7dwgKmfTEpD3XyckNMpu8mAVQK48oCEjJZVMeMsQTurjEVxMZvDZOvA0gM5Q=='
        }
        });
mongoose.connection;
mongoose.set('debug', true);
var bookSchema = mongoose.Schema( {
  name: String,
  isbn: {type: String, index: true},
  author: String,
  pages: Number
});
var Book = mongoose.model('Book', bookSchema);
module.exports = mongoose.model('Book', bookSchema);
使用 AngularJS 访问路由

AngularJS 提供一个 Web 框架用于在 Web 应用程序中创建动态视图。 本教程使用 AngularJS 将网页与 Express 相连接,并针对书籍数据库执行操作。

将目录切换回到 Books (cd ../..),然后创建名为 public 的文件夹,并添加包含所定义的控制器配置的、名为 script.js 的文件。

var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope, $http) {
  $http( {
    method: 'GET',
    url: '/book'
  }).then(function successCallback(response) {
    $scope.books = response.data;
  }, function errorCallback(response) {
    console.log('Error: ' + response);
  });
  $scope.del_book = function(book) {
    $http( {
      method: 'DELETE',
      url: '/book/:isbn',
      params: {'isbn': book.isbn}
    }).then(function successCallback(response) {
      console.log(response);
    }, function errorCallback(response) {
      console.log('Error: ' + response);
    });
  };
  $scope.add_book = function() {
    var body = '{ "name": "' + $scope.Name + 
    '", "isbn": "' + $scope.Isbn +
    '", "author": "' + $scope.Author + 
    '", "pages": "' + $scope.Pages + '" }';
    $http({
      method: 'POST',
      url: '/book',
      data: body
    }).then(function successCallback(response) {
      console.log(response);
    }, function errorCallback(response) {
      console.log('Error: ' + response);
    });
  };
});

在 public 文件夹中,创建包含所定义的网页的、名为 index.html 的文件。

<!doctype html>
<html ng-app="myApp" ng-controller="myCtrl">
  <head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
    <script src="script.js"></script>
  </head>
  <body>
    <div>
      <table>
        <tr>
          <td>Name:</td> 
          <td><input type="text" ng-model="Name"></td>
        </tr>
        <tr>
          <td>Isbn:</td>
          <td><input type="text" ng-model="Isbn"></td>
        </tr>
        <tr>
          <td>Author:</td> 
          <td><input type="text" ng-model="Author"></td>
        </tr>
        <tr>
          <td>Pages:</td>
          <td><input type="number" ng-model="Pages"></td>
        </tr>
      </table>
      <button ng-click="add_book()">Add</button>
    </div>
    <hr>
    <div>
      <table>
        <tr>
          <th>Name</th>
          <th>Isbn</th>
          <th>Author</th>
          <th>Pages</th>
        </tr>
        <tr ng-repeat="book in books">
          <td><input type="button" value="Delete" data-ng-click="del_book(book)"></td>
          <td>{{book.name}}</td>
          <td>{{book.isbn}}</td>
          <td>{{book.author}}</td>
          <td>{{book.pages}}</td>
        </tr>
      </table>
    </div>
  </body>
</html>

运行应用程序

将目录切换回到 Books (cd ..),并通过运行以下命令启动服务器:

nodejs server.js

打开 Web 浏览器并导航到针对 VM 记录的地址。 例如,http://13.72.77.9:3300。 应显示以下页面所示的内容:


刷新页面之后能看到书已经添加成功了

回到Data Explorer,也能看到数据库里面已经有了。

总结

所以虽然MongoDB现在已经收紧了开源的License,但是微软的Azure上我们还是有对应的产品能够满足大家的需求,并且CosmosDB还有一些其他的特性,比如全球部署,精确定义好的一致性级别。更多信息可以去https://docs.azure.cn/zh-cn/cosmos-db/ 查看

参考资料
https://docs.azure.cn/zh-cn/virtual-machines/linux/tutorial-mean-stack

上一篇下一篇

猜你喜欢

热点阅读