服务化架构

服务化框架技术选型实践

2017-05-29  本文已影响0人  章耿

前言

首先本文不讨论为什么要服务化,包括服务化的优点缺点。
其次本文也不讨论什么是微服务,也不讨论微服务和SOA的区别。
最后本文也不讨论哪个技术最优。

服务化框架构成

最基本的服务框架

基本的服务化框架包括如下模块:统一的RPC框架,服务注册中心,管理平台。
有了这三个模块,就能实现基本的服务化。
下面对三个模块进行具体分析。

RPC框架选型

为什么一定要是统一的RPC框架,而不是随便啥框架,这里主要是为了技术对齐,减少开发人员的学习成本,减少团队间沟通成本。
好,那么选择一个RPC框架,我们都需要考量什么东西呢?

这里我总结下:

另外如果是从开源里面选择,那么我们还需要考量:

下面是常见的一些开源框架的比较,大家可以看一下。

x Thrift RESTful dubbo gRPC
代码规范 基于Thrift的IDL生成代码 基于JAX-RS规范 无代码入侵 基于.Proto生成代码
通讯协议 TCP HTTP TCP HTTP/2
序列化协议 thrift JSON 多协议支持,默认hessian protobuf
IO框架 Thrift自带 Servlet容器 Netty3 Netty4
负载均衡 客户端软负载
跨语言 多种语言 多种语言 Java 多种语言
可扩展性 一般

Ps:SOAP,RMI,Hessian,ICE就不列举了。

选型小结:

注册中心选型

注册中心相当于是服务提供者和服务调用者之间的引路人,在服务治理中的作用极为重要。

选择注册中心基本要考量:

如果是从开源里面选择,那么还需要考量:

下面是常见的一些使用开源项目做注册中心的比较,大家可以看一下。

ZooKeeper etcd Consul Eureka
一致性 强一致性paxos 强一致性Raft 强一致性Raft 弱一致性
数据结构 Tree K/V K/V K/V
通讯协议 TCP HTTP、gRPC HTTP、DNS HTTP
客户端 ZKClient - - Eureka-client
CAP原则 CP CP CP AP

Ps:Redis和MySQL没有列举。

选型小结:

简易管理端

管理端没啥特殊要求,最起码能看到服务提供者和调用者即可。

完善的服务化框架

如果需要一个完善的服务化框架,那么必须增加外部模块,常见的模块如下图:


完善的服务化框架

接口文档管理

提供一个接口文档管理以及接口查询的入口,可以是一个公共的WIKI,也可以是独立的系统,等等。
这里可以定义接口的文档,包括接口描述,方法定义,字段定义
可以定义接口的SLA,包括支持的并发数,tp99多少,建议配置是什么
还有就是接口的负责人等一些查询的入口。

配置中心

提供一个配置管理的地方,这里说的配置主要指的是服务相关的一些配置。
配置包括分组配置、路由策略、黑白名单、降级开关、限流信息、超时时间、重试次数等等,任何可以动态变更的所有数据。
这样服务提供者和服务调用者可以不需要重启自己的应用,直接进行配置的变更。
配置中心可以独立于注册中心,也可以和注册中心合并。

监控中心

监控服务关注接口维度,实例(例如所在JVM实例)维度的数据。
RPC框架可以定时上报调用次数,耗时,异常等信息。
监控中心可以统计出服务质量信息,也可以进行监控报警。

分布式跟踪

区别于监控中心,以调用链的模式对服务进行。
RPC框架作为分布式跟踪系统的一个天然埋点,可以很好的进行一个数据输出。

服务治理(重点)

我这边列了常见的服务治理功能,例如:

  1. 服务配置
  2. 全局配置
  1. Mock:出现异常或者测试情况下,返回Mock数据
  2. 熔断:客户端超时或者服务端超时
  3. 拒绝服务:服务端压力大时,自动拒绝服务,保护自己

网关

RPC框架大部分场景都是P2P的,什么时候会需要一个网关呢?

网关可以提供如下功能:

服务注册中心Plus

需要逻辑处理能力,例如对数据进行筛选过滤整合,计算服务路由等功能。

同时还需要有与RPC框架交互的功能。

管理端Plus

管理端除了之前的简单服务管理功能外,还需要提供配置信息展示,监控信息展示,各种维度的数据展示。也就是上面提到的服务治理功能,都可以在管理端进行管理。

另外,常见的服务治理功能,我们都可以作为开放服务供开发人员进行一个调用。

京东实践

第一代SAF背景

2012年初,京东从.NET转Java。各个部门,各个业务线都没有一个统一的服务化框架,有的是dubbo,有的是WebService,有的是Hessian等等。

同时各个业务系统自己有非常多的业务代码。通过统计接口规模在1K左右,服务节点在50K左右,机器规模在8K左右,机房比较少拓扑简单。

所以当时的愿景和目标比较明确:

第一代SAF选择

OK,结合我们的情况和上面的一些选型小结,我们当时的选择如下:

于2012年4月上线,最大规模时,接口数3K,接入最大IP数20K。

第二代JSF背景

随着京东业务的不断快速增长,接口、机器数也呈数量级增长。
同时京东成立子公司,在全国各地新建机房,部署结构也变得比较复杂。
加上SAF遗留的一些问题,大概面临如下几点:

第二代JSF选择

所以在2014年初,我们进行了第二代JSF的一个全部自研过程。
我们主要做了如下技术选型:(全部自研)

开发周期:7人/年(2014.1-2015.1)。包括开发、测试、预发、上线、推广。

JSF架构简图

JSF架构简图

JSF注册中心

京东的注册中心是自研的,基于DB做的数据最终一致,也就是上面说的AP系统。

注册中心主要实现的就是服务列表的注册订阅推送,服务配置的获取下发,服务状态的实时查看等功能。

注册中心节点是无状态的,可水平扩展的。整个注册中心集群下的所有注册中心几点都是等价的。

每个机房部署多个注册中心节点。同机房的RPC框架会优先连本机房的注册中心节点。

主要亮点如下:

JSF RPC框架

RPC框架作为服务化里面的最基本的组件,其实都大同小异,因为RPC调用都绕不开代理、网络、序列化这些操作。

JSF的RPC框架也类似,主要分为图中的几个模块:


RPC模块图

下面大概列下一些功能特性:

JSF管理平台

提供强大管理功能,包括服务管理,监控管理,注册中心管理等功能。


管理端服务管理 管理端服务详情 管理端监控界面

我们针对服务治理的功能,提供了很多API,可以授权给开发人员或者外部系统使用。

例如单元测试调用,限流配置/开关,动态分组,上下线等都提供了开放API。

JSF HTTP网关

网关是为了方便跨语言通过HTTP+JSON调用JSF服务,而不需要使用JSF的RPC框架。

特性如下:

JSF遇到京东弹性云

京东的JSF服务开发在京东弹性云的研发推广之前完成,自从京东弹性云落地以来,也遇到不少问题。

例如:

JSF规模

总结

上一篇下一篇

猜你喜欢

热点阅读