基于OpenResty和Node.js的微服务架构实践

什么是微服务?

传统的单体服务架构是单独服务包,共享代码与数据,开发成本较高,可维护性、伸缩性较差,技术转型、跨语言配合相对困难。而微服务架构强调一个服务负责一项业务,服务可以单独部署,独立进行技术选型和开发,服务间松耦合,服务依赖的数据也独立维护管理。虽然微服务存在部署复杂、运维难度较大、分布式事务控制难、容错要求高等缺点,但总体而言,微服务的优点远大于其复杂性。

微服务架构需要注意哪些问题?

微服务架构,首先考虑客户端与服务端之间的通信问题。有两种解决办法,一是客户端与多个服务端直接进行通信,但存在对外暴露接口细节、众多接口协议无法统一、客户端的代码复

杂、服务端升级相对困难等问题。二是客户端访问统一的API网关,由API网关调用众多服务接口,易实现统一通信协议,降低客户端和服务端代码耦合,也可以达到统一的鉴权和流控,然而此方式存在延时增加的风险,可能使API网关成为系统发展的瓶颈。

微服务架构是分布式服务架构,如何进行服务的注册和发现也是需要解决的问题。一种是通过客户端发现,调用方需要知道所有依赖服务的地址,开发成本较高,协议升级比较困难。另一种是通过统一网关发现具体服务的地址,对客户端来说实现比较简单,能够在网关进行统一鉴权和流控,要求网关高度可用性。

调用微服务尽可能做到有序,避免相互调用,杜绝循环调用。服务间要有清晰的层次关系,上层服务可以依赖下层服务,如果遇到下层服务需要同步消息给上层调用方的情况,可以考虑通过消息队列异步解耦,比如订单/审核系统在创建订单或者改变订单状态时,可以考虑使用双写(即写入数据库后,同时在消息队列也写一份),异构系统(比如订单执行系统)可以通过订阅消息保存异构数据。

个推在微服务上有哪些实践?

个推的服务场景主要有三种。其一是个推推送场景,通过Java语言开发,SOA的架构方式来实现,保证信息推送的实时性与高并发性,这块微服务改造比较困难;其二是广告交易平台,比如投放平台、DMP数据管理,以Java为主进行开发,对并发数要求较高,我们在逐步进行基于Java的微服务框架的微服务化尝试;其三是web业务系统,它为前端提供无状态的业务API接口,是典型的request/response方式,同时,这是我们目前微服务实践最多的场景。

随着业务快速发展,公司web相关的业务系统开发需求不断增加,这些系统都涉及到用户管理,后台管理,权限管理等。为进一步提高团队开发效率,我们对服务进行平台化、模块化改造,选择了如上的技术选型。

个推的整体架构如上图所示。请求先经过LVS/HaProxy,到达基于OpenResty实现的API网关,API网关会根据请求将流量upstream到服务单元。服务单元作为一个整体,支持通过Lua、Node.js、Java等语言实现业务逻辑,启动时向Zookeeper注册,API网关会从Zookeeper获取服务单元部署信息。

服务单元如上图所示。它由Openresty统一对外暴露服务端,Openresty内置了lua语言,可以在weblua框架中通过编写lua程序来进行业务逻辑处理。Openresty通过proxy_pass,upstream将请求转给webnode处理,也可以在Openresty中通过配置处理Java业务逻辑。服务单元就像一个抽屉柜,具体的业务(app)就像一个抽屉,只要尺寸符合抽屉柜的要求,就能将抽屉推入到抽屉柜中,抽屉所用的语言不作要求。

Openresty集成了lua脚本作为编程语言,使用Zookeeper服务注册。为了解决lua与Zookeeper不适配问题,在Openresty启动时启动websocket服务,Node.js进程启动时同步启动websocket的client,这样每个Node.js进程会和Openresty保持长连接和心跳,Openresty会选择一个Node.js进程,启动Zookeeperclient完成服务注册。API网关也是基于服务单元通过类似的方式实现完成服务注册的。

服务单元在Openresty层完成了统一鉴权,不会产生额外的性能开销。

我们可以用“通道化”来阐述服务间的调用问题。我们将微服务之间的调用比喻成水管,从水管的一端流进去的是请求信息,那么从另一端流出来的也应该是请求信息,我们只要求流入流出的信息保持一致,而不关心这些信息在传输过程中经过了转换或其他过程。如上图,A、B之间的调用通过进程内require就能实现,而A、C间的调用是通过服务单元内的http完成的。

Q&A

Q:微服务架构在运维部署是否会很麻烦?

A:随着微服务的不断推进,服务数量势必会越来越多,这就需要考虑DEVOPS。比如代码提交之后通过Jenkins自动触发打包编译,自动生成版本号,进而触发自动测试部署和自动化测试,测试通过后进行一键部署升级、支持升级失败自动回滚等。我们目前已经实现了自动打包和测试部署,后续环节正在推进。

Q:Openresty里对Session管理进行了处理,开发人员会不会觉得不方便?

A:在引入微服务框架之前,公司有很多独立业务服务,每个服务都有自己的账号系统实现登录验证逻辑。虽然有现成的代码模块可以用,但每次都需要重新测试验证。如今,具体的业务服务都可以通过Openresty完成鉴权并统一对外,对开发和测试人员来说,反而减少了一定的工作量。

原文地址:https://www.cnblogs.com/evakang/p/8819492.html

时间: 2024-10-17 23:51:36

基于OpenResty和Node.js的微服务架构实践的相关文章

基于 Docker 的微服务架构实践

本文来自作者 未闻 在 GitChat 分享的{基于 Docker 的微服务架构实践} 前言 基于 Docker 的容器技术是在2015年的时候开始接触的,两年多的时间,作为一名 Docker 的 DevOps,也见证了 Docker 的技术体系的快速发展.本文主要是结合在公司搭建的微服务架构的实践过程,做一个简单的总结.希望给在创业初期探索如何布局服务架构体系的 DevOps,或者想初步了解企业级架构的同学们一些参考. Microservice 和 Docker 对于创业公司的技术布局,很多声

微服务架构实践 - 你只懂docker与spring boot就够了吗?

微服务架构实践 - 你只懂docker与spring boot就够了吗? 作者 浮云发发 已关注 2017.02.27 02:50* 字数 2613 阅读 2583评论 6喜欢 35赞赏 2 微服务并不是单独存在的,为了更好地实现微服务架构,需要整合许多组件混搭使用,方能打通任督二脉,天下无敌.网上很多大拿讲了微服务治理的内容,也有人单方面讲微服务的,比如spring boot与docker,本文着重于组件选型的较量,也积累了我们团队多次PK的精华:这些组件包括spring boot.sprin

从 Spring Cloud 开始,聊聊微服务架构实践之路

[编者的话]随着公司业务量的飞速发展,平台面临的挑战已经远远大于业务,需求量不断增加,技术人员数量增加,面临的复杂度也大大增加.在这个背景下,平台的技术架构也完成了从传统的单体应用到微服务化的演进. 系统架构的演进过程 单一应用架构(第一代架构) 这是平台最开始的情况,当时流量小,为了节约成本,并将所有应用都打包放到一个应用里面,采用的架构为 .NET SQL Server: 表示层:位于最外层(最上层),最接近用户.用于显示数据和接收用户输入的数 据,为用户提供一种交互式操作的界面,平台所使用

千万级调用量微服务架构实践

微服务架构在大型电商中的运用电商是促销拉动式的场景,也是价格战驱动的场景.618和双11都是典型的促销活动.其实都是在抢用户.扩市场占有率.在这样的场景之下,对秒杀.抢购是很热衷的玩法. 促销式的拉动对系统的挑战是什么呢? 可以从上图里看到:对高可用性的要求是非常高的,需要99.99%的高可用性.快速迭代对对系统容性的要求很高,从几万单变成几十万单.百万单,架构上不能影响快速迭代,所以有空中加油或者是高速公路换轮胎的说法. 另外,为了应对瞬间的海量访问(尤其是秒杀场景),系统需要高可伸缩(快速扩

微服务架构实践

目录 业务背景 微服务概念 微服务技术选型 微服务架构设计 微服务架构设计落地 微服务架构设计过程中积累的心得 总结 一.业务背景 1.1 产品现状 1.各产品系统独立开发,代码复用率低,系统之间互相调用,耦合严重,系统解耦独立部署困难. 2.传统的单体架构,规模越来越大也越来越笨重:当新功能的开发.功能的重构变得不再敏捷可控:测试者的回归测试边界难以琢磨:系统的上线部署也变的艰难 3.高并发访问下无法提供可靠性服务 4.持续集成.持续部署.持续交付等工程效率化工具严重缺失 5.监控系统.日志分

聊聊微服务架构实践之路的4大挑战,3月31日见真章!

当容器化的兴起,为应用开发部署带来变革,也为应用设计架构和运维部署带来变化: 当持续交付.DevOps.微服务,成为企业在软件成果对抗当中胜出的有力武器,微服务架构已经随处可见: 但随之而至的是微服务框架.微服务监控.微服务配置.微服务治理等一系列挑战, 从架构到发布,挑战重重,该如何应对容器化微服务架构的各种技术难题? 2018年3月31日,数人云联合ServiceComb社区,开启Building Microservice 系列活动 第2期 北京站 带你了解最新的微服务开源框架, 解析微服务

云平台的微服务架构实践

本文是在云平台构建过程中的一些经验总结,主要说明了PaaS层的微服务架构设计和落地. 目标 降低系统的复杂度,减少系统的不确定性. 方法 量化,标准化,自动化. 架构设计 标准化业务层次 梳理业务体系和服务能力,将PaaS平台分层. 聚合领域服务能力的应用服务层 提供基本数据访问能力的领域服务层 标准化治理方式 统一使用标准化的微服务治理组件,规范微服务工程模板和领域模型. a, 治理组件 Registry: Eureka(服务发现)和Spring Cloud Config(统一配置): UAA

第一章 微服务架构实践

等写完所有的代码后,会在这里给出整个项目的一个总览图. 技术介绍: 服务注册和服务发现:consul 配置管理:consul 集群容错:hystrix 计数监控:metrics 服务路由: 负载均衡: 服务通信:retrofit.okhttp ......

NET实现的DDD、CQRS与微服务架构

WeText项目:一个基于.NET实现的DDD.CQRS与微服务架构的演示案例 最近出于工作需要,了解了一下微服务架构(Microservice Architecture,MSA).我经过两周业余时间的努力,凭着自己对微服务架构的理解,从无到有,基于.NET打造了一个演示微服务架构的应用程序案例,并结合领域驱动设计(DDD)以及命令查询职责分离(CQRS)体系结构模式,对事件驱动的微服务系统架构进行了一些实战性的探索.现将自己的思考和收获整理成文,分享给大家. 微服务架构 在介绍源代码之前,我还