Tạo một Nodejs microservice và deploy với docker (Phần 2)
Bài đăng này đã không được cập nhật trong 5 năm
Trong bài viết này chúng ta sẽ tiếp tục xây dựng hệ thống microservice rạp chiếu phim và lần này chúng ta phát triển catalog của rạp chiếu:
Bảo mật Microservices và HTTP/2
Trong phần đầu tiên, chúng đã thực hiện một microservice đơn giản sử dụng HTTP/1.1 protocol. HTTP/2 là một bản nâng cấp lớn của HTTP protocol trong 15 năm, nó được tối ưu hóa và hiệu suất cao hơn. HTTP/2 là tiêu chuẩn web mới bắt đầu bởi Google’s SPDY giao thức. Nó được sử dụng cho nhiều webside lớn và được hỗ trợ bởi nhiều trình duyệt chính. </br> Có vài yêu cầu để sử dụng HTTP/2:
- Nói chỉ hoạt động trên HTTPS protocol (chúng ta cần chứng chỉ ssl hợp lệ)
- Nó là tương thích ngược. Nếu trình duyệt và các thiết bị của bạn không hỗ trợ chuẩn HTTP/2 thì nó sẽ tự giảm xuống HTTP1.1.
- Nó đi kèm với cải tiến hiệu xuất vượt trội
- Nó không yêu cầu thực hiện bất kỳ điều gì ở máy khách, máy chủ chỉ thực hiện cơ bản.
- Một vài tính năng thú vị sẽ tăng tốc thời gian tải web theo các bạn khong thể tưởng tượng đực khi triển khai HTTP1.1
Cấu trúc mạng kích hoạt HTTP/2 cho Microserices
Nó có nghĩa là chúng ta cần kích hoạt một kết nối đơn giản giữa máy chủ và máy khách và sau đó sử dụng các khả năng như Y-axis sharing (sẽ nói thêm về scale cube trong loạt bài này) là một mạng cung cấp duy trì hiệu suất của HTTP/2 cho máy khác khi kích hoạt tất cả các lợi ích vận hành và phát triển của kiến trúc microservices Vậy so phải triển khai HTTP/2, đó đối với nhà phát triển giỏi chúng ta phải bảo mật ứng dụng, cơ sở hạ tầng, thông tin liên lạc, nhiều nhất có thể, để ngăn chặn các cuộc tấn công độc hại và cũng là bởi những theo sau những nhà phát triển tốt là các thực hành tốt nhất rằng chúng ta coi như nó đem lợi ích cho chúng ta </br> Một vài cách làm bảo mật cho microservice mà nên theo:
- Khám phá và theo dõi sự liên lạc giữa các dịch vụ.
- Chia nhỏ và cô lập các ứng dụng và dịch vụ
- Mã hóa dữ liệu khi truyền tải và đứng yên </br> Những gì chúng ta sẽ làm là mã hóa thông tin liên lạc microservice đáp ứng yêu cầu và cải thiện bảo mật, đặc biệt khi truyền tải qua các mạng công cộng và đó là nguyên nhân tại chúng tôi sử dụng HTTP/2 để có hiệu suất và bảo mật hơn.
Triển khai HTTP/2 cho microservice
Đầu tiên là nâng cấp movies servies từ phần trước và triển khai giao thức HTTP/2, nhưng sau khi chúng ta tạo một thư mục ssl bên trong thư mực config.
movies-service/config:/ $ mkdir ssl
movies-service/config:/ $ cd ssl
Trong thư mục ssl, tạo một chứng chỉ ký tụ SSL (self-signed SSL certificate), bước đầu thực hiện giao thức HTTP/2 cho services của chúng ta.
# Let's generate the server pass key
ssl/: $ openssl genrsa -des3 -passout pass:x -out server.pass.key 2048
# now generate the server key from the pass key
ssl/: $ openssl rsa -passin pass:x -in server.pass.key -out server.key
# we remove the pass key
ssl/: $ rm server.pass.key
# now let's create the .csr file
ssl/: $ openssl req -new -key server.key -out server.csr
...
Country Name (2 letter code) [AU]:MX
State or Province Name (full name) [Some-State]:Michoacan
...
A challenge password []:
...
# now let's create the .crt file
ssl/: $ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt
Tiếp theo chúng ta cần cài SPDY theo dòng lệnh dưới:
cinema-catalog-service/: $ npm i -S spdy --silent
Đầu tiên tạo file index.js
trong thư mục ssl/
, đây là nơi load file key và cert, đây là một trong ít trường hợp chúng ta dùng fs.readFileSync():
const fs = require('fs')
module.exports = {
key: fs.readFileSync(`${__dirname}/server.key`),
cert: fs.readFileSync(`${__dirname}/server.crt`)
}
Sau đó chúng ta cần chỉnh sửa hai file trên, đầu tiên là file config.js
:
const dbSettings = { ... }
// The first modification is adding the ssl certificates to the
// serverSettings
const serverSettings = {
port: process.env.PORT || 3000,
ssl: require('./ssl')
}
module.exports = Object.assign({}, { dbSettings, serverSettings })
Tiếp theo là file server.js
...
const spdy = require('spdy')
const api = require('../api/movies')
const start = (options) => {
...
const app = express()
app.use(morgan('dev'))
app.use(helmet())
app.use((err, req, res, next) => {
reject(new Error('Something went wrong!, err:' + err))
res.status(500).send('Something went wrong!')
})
api(app, options)
// here is where we made the modifications, we create a spdy
// server, then we pass the ssl certs, and the express app
const server = spdy.createServer(options.ssl, app)
.listen(options.port, () => resolve(server))
})
}
module.exports = Object.assign({}, {start})
Cuối cùng là index.js
:
'use strict'
const {EventEmitter} = require('events')
const server = require('./server/server')
const repository = require('./repository/repository')
const config = require('./config/')
const mediator = new EventEmitter()
...
mediator.on('db.ready', (db) => {
let rep
repository.connect(db)
.then(repo => {
console.log('Connected. Starting Server')
rep = repo
return server.start({
port: config.serverSettings.port,
// here we pass the ssl options to the server.js file
ssl: config.serverSettings.ssl,
repo
})
})
.then(app => { ... })
})
...
Chúng ta cần rebuild lại docker image của chúng ta bằng lệnh sau:
$ docker build -t movies-service .
và chạy lại docker image movies-service
với tham số truyền vào như sau:
$ docker run --name movies-service -p 443:3000 -d movies-service
Cuối cùng chúng ta test trên trình duyệt và chúng ta chứng thực giao thức HTTP/2 của chúng ta có hoạt động link tham khảo https://medium.com/@cramirez92/build-a-nodejs-cinema-microservice-and-deploying-it-with-docker-part-2-e05cc7b126e0
All rights reserved