Skip to content
This repository has been archived by the owner on Jun 6, 2018. It is now read-only.

Overview

Calvin Xiao edited this page Jan 20, 2017 · 30 revisions

1. 设计原则

  • 兼顾简单与性能,而且跨语言的传输层。
  • 契约式编程,Java First IDL,无代码生成,贴近SpringBoot RESTful的开发体验。
  • Spring Cloud 更好的服务路由与治理能力。

2. 总体架构

总体架构

3. 传输层设计

3.1 传输协议

简单通用的HTTP/HTTPS,支持多路复用与头压缩的HTTP/2。

Netty4.1对HTTP2的封装较为低级,观摩了一下gRPC的代码后,为了快速投入生产,使用Jetty

为性能考虑,不直接使用Servlet/Spring MVC体系,而是实现Jetty的Handler。

3.2 负载协议

简单通用的JSON,二进制的Protocol Buffers

为了达成 Java First无生成代码的设计原则,均使用Jackson实现(暂只支持PB v2)

3.3 跨语言实现

其他语言只作为客户端,不作为服务端。

HTTP/HTTP2/JSON/ProtoBuf均有跨语言实现。

其他语言需要按文档拼装相应的JSON负载,并放入协议规定的HTTP Headers。

(未来可考虑https://github.com/swagger-api/swagger-codegen来生成其他语言的客户端SDK,以及Jackson输出PB IDL)

3.4 同步/异步

支持同步接口,同时支持基于Future的异步接口,基于Callback的异步接口。

(未来可考虑支持基于Quasar的协程实现)

4. Java First契约式编程 与 SpringBoot开发体验

4.1 契约式编程

客户端通过服务方提供的SDK,使用接口类直接调用服务。

4.2 Java First IDL

在Java接口上使用定制扩展的Swagger Annotation定义服务.

Swagger提供在线测试与文档中心。

无代码生成过程,通过Java Proxy/CGLib快速反射/Jackson ProtocolBuf等技术实现框架。

同时Swagger也有Java版的CodeGen作为备选。

4.3 SpringBoot集成

深度集成SpringBoot,应用里可继续基于嵌入式的Jetty与Spring MVC,运行传统RESTful,Web页面,运维API。

5. 服务路由与治理能力

5.1 服务路由

  • 基于ZooKeeper/Etcd3的服务注册与发现
  • 带权重的负载均衡策略:支持随机,轮询,一致性哈希。
  • 自定义规则路由:可根据来源地址,来源应用,请求方法,Cookie值等进行路由。
  • 跨机房路由:同机房优先,机房间短距离优先。

5.2 高可用

  • 超时,重试
  • 熔断: 粗粒度(针对整个服务)/细粒度(针对单台服务器/单个方法)
  • 限流: 客户端并行度限流/服务端漏桶算法限流
  • 降级: 拒绝服务/服务端降级函数
  • 健康度检查: 容器健康度/服务自定义健康度

5.3 服务代理

5.3.1 跨语言支持

Java客户端中自带服务路由/服务治理模块。

而其他语言,必须通过包含相同模块的Proxy(基于Jetty,与Netty相比在异步多路复用上稍差)

如果路由治理功能升级频繁,且客户端众多,则Java客户端也同样建议使用本地Proxy。

5.3.2 部署模式

可简单使用中央Proxy集群;

也可以使用本地Proxy实现去中心化,提高性能,但需要实现本地Proxy与中央Proxy集群间的切换保证高可用性。

5.3.3 通用服务代理

未来考虑做一个跨RPC框架的通用代理。无论RESTful还是某种RPC方案,只要在代理上做好适配器,代理就都可以提供服务路由,服务治理的能力。

5.4 服务治理中心

  • DashBoard
  • 服务配置(针对服务的配置如路由,超时等)
  • 文档中心

5.5 体系集成

  • 配置中心(针对业务的配置和开关)
  • 分布式调用链监控系统
  • 安全中心

6. 开发生命周期

开发生命周期

框架必须对整个生命周期提供支持,充分利用IDL提供各种能力,包括MockServer,压测客户端等。