【Free Style】基于华为CCE微服务改造的技术实践(二)
在上一篇博文中,讲解了已有node web app的功能结构,技术栈,和简要部署内容。从中可以看到单一应用部署模式带来的风险:1. 任何单一功能模块出现异常,整个web app就会出现崩溃或者访问异常;2. 遇到大流量访问,模块之间的依赖会导致性能瓶颈。3. 开发效率极低。由于前后依赖,开发任务无法并行。从而降低了迭代效率,影响产品质量。
从本文开始,我们需要引入“Microservice”的概念来解决上述三个问题,这是一种新的架构设计方式。将原有的单例模式的应用,“拆解”为多个可部署,可维护的服务构成。每一个单一的服务,独立维护一部分功能,收到请求后返回请求所需要的值或者数据包。不同的服务直接可以共享公共资源,例如:key-value store 或者 db services。下面我将原有的单例模式,按照我们的用例图进行资源拆解。请看下图
图2-1 微服务改造示意图
改造后,我们将app"拆解“为6个service,每一个是一个单独的服务。
1. Public service提供基于的静态资源,例如:css,js,media file,config, font package。
2. User service提供登录,注册,认证服务,需要使用redis,mysql
3. Cousrse service提供课程查询,学习记录获取更新,课程评价。
4. Trial service提供云端DWS sql query engine的连接、查询、语句执行、以及结果处理功能。
5. Teach提供后台课程管理
6. Admin用户权限管理
根据上述服务的简要介绍,我们可以对已有工程结构进行改造,由于每一个微服务都是独立的,所以他们应该使用部分相同的文件名和目录结构,而且每一个服务仅仅需要加载本服务需要的依赖,因此服务功能包变得更好维护。下面我将展示工程目录拆解图:
图2-2 工程目录拆解图
当拆解完后,我们会需要一个问题,所有的独立微服务,如果有机组织起来,应对外界的访问,或者说是什么机制来判断该请求由哪个服务来独立完成,是不是需要一个coordinator来协调。下面我们引入一个概念”API Gateway“,它用户判断请求由哪个服务来独立完成。我们重新更新微服务拆解示意图,具体如下
图3-1 网关引入后
引入网关后,开始配置网关。编辑gateway.config.yml,设置api,services,endingpoint等参数。请参考下面的样例:
http: port: 8080 hostname: 'localhost' admin: port: 9876 hostname: 'localhost' apiEndpoints: api: host: '*' paths: - / #此处根据实际情况要做改动 - /showAllCourse #此处根据实际情况要做改动 iam: host: '*' paths: - /login #此处根据实际情况要做改动 - /login/* #此处根据实际情况要做改动 - /register #此处根据实际情况要做改动 - /logout #此处根据实际情况要做改动 serviceEndpoints: userService: url: 'http://user:3000' #此处根据实际情况要做改动 pipelines: pipeline_iAM: apiEndpoints: - iam policies: - proxy: - action: serviceEndpoint: userService #此处根据实际情况要做改动 changeOrigin: true
express gateway详细配置资料,请参考www.express-gateway.io/docs/,随后制作express gateway镜像,准备进行发布。其中6个service要映射到主机不同的端口上,例如userService是3001,adminService是3002,但是各自在container中expose的端口均是3000,具体做法可以参考docker run command样例如下:
docker run -d -p 3002:3000 --name ot-course-c1 --link redis:redis --link ot-app-mysql:mysql ot-course-api docker run -d -p 3001:3000 --name ot-trial-c1 --link redis:redis --link ot-app-mysql:mysql ot-trial-api docker run -d -p 3002:3000 --name ot-public-c1 --link redis:redis --link ot-app-mysql:mysql ot-public-api docker run -d -p 3003:3000 --name ot-course-c1 --link redis:redis --link ot-app-mysql:mysql ot-course-api docker run -d -p 3004:3000 --name ot-admin-c1 --link redis:redis --link ot-app-mysql:mysql ot-admin-api docker run -d -p 3005:3000 --name ot-user-c1 --link redis:redis --link ot-app-mysql:mysql ot-user-api docker run -d -p 3000:8080 \ --name=ot-gateway-c1 \ --link ot-user-c1:user \ --link ot-admin-c1:admin \ --link ot-course-c1:course \ --link ot-public-c1:public \ --link ot-trial-c1:trial \ ot-gateway
最后直接访问主机http://<host_ip>:8080,直接可以访问网站。为了测试验证,各api均向外expose了端口,实际使用不要暴露端口,以免遭受网络攻击。
- 点赞
- 收藏
- 关注作者
评论(0)