微博跨语言服务化 周晶 PHPCON2018

为了获取最佳收益我们往往会在不同的场景应用最合适的技术,这很自然造成公司技术栈的多样性,在微博整体服务化进程中跨语言间的服务化是我们绕不开的问题,PHP、Java 作为微博体系两个份额最大的技术栈我们是如何实现跨语言服务化调用的呢?结合目前最热门的 Service Mesh 理念我们的 WeiboMesh 又是如何落地的?本次分享我将从这两个方面同大家一起探讨。

展开查看详情

1.微博跨语言服务化与 WeiboMesh — 微博研发中心 / 周晶

2.内容提要 ▷ 为什么要做跨语言服务化 ▷ PHP 跨语言服务化所面临的挑战 ▷ WeiboMesh 与 泛服务化 附能 PHP 微服务

3.为什么要做跨语言服务化

4.为什么要做跨语言服务化 ▷ 痛点 ▷ 趋势

5.痛点 需求·性能·成本

6.平台体系 चԭ OpenDCP ጱ୨௔ԯᦇᓒ API+JAR 2009 2013 2015 2016 ཛྷࣘ۸‫֛ܔ‬๐‫ۓ‬ RPC Ⴐ‫ݳ‬ԯ चԭ Motan RPC ጱங๐‫ۓ‬

7.平台体系 服务注ٙ、发ሿ JAVA-Server ᨮ᫹均衡、降ᕆ、限流 秒ᕆ实෸ፊ控 Registry 自动化容量ᦧ估 智能୨性᧣度 自动ಘᖽ容 JAVA-Client ᧗求动ா路由 OpenDCP

8. C OR Go PHP … 微博广告 ᕁ包 微博ᦾ᷌ MAPI 微博搜索 ᅾ门微博 微博主站 … Restful API 平台体系 Java RPC

9.᩽۠ 微服务·容器化·云化·标准化·工程化 更快的交付 更低的成本 服务与实现方式不应该有强耦合关系

10.PHP 跨语言服务化所面临的挑战

11.跨语言服务化核心问题 交互(᧍言中立、多᧍言): HTTP / GRPC(PB) / … 治理(灵活可ಘ展): 服务注ٙ与发ሿ / ᨮ᫹均衡 / …

12.挑战一:迁移成本 与 性能 Server GRPC y tr is eg R Registry Su bs cr ib No tif e Client y Motan-PHP-Client

13.挑战二:服务治理与 RPC Server LVS、HA、Nginx PHP-FPM Server1 Server2 Cluster HA+LB …… GRPC Call ❌ PHP-GRPC Registry PHP Server WorkingNode GRPC 实ሿ成本 PHP Deamon Nginx Timer Registry 治理能力 o ver Disc Global Data

14.经验总结 PHP 服务化的ሿᇫ: LN(OR)MP 架构 / 交付效率 / 迁移成本 / … PHP ᧍言本身的局限性: 性能 / 常Ḧ能力 / … 灵活可ಘ展的服务治理: 非中心化 / 非重 Client / …

15.我们需要适合自己的跨语言解决方案 交互 · 治理

16.跨语言服务化方式对比 HTTP դቘ RPC ཛྷࣘ Agent դቘ Ꮈ‫ݎ‬౮๜ ֗ ṛ Ӿ ᖌಷ౮๜ ֗ ṛ Ӿ ֵአ౮๜ ֗ ֗ Ӿ လቘᚆ‫ێ‬ Ӿ ṛ ṛ ಘ઀ᚆ‫ێ‬ ֗ Ӿ ṛ

17.交互(语言中立、多语言)

18.协议 MotanHeader Meta Data Size Data Req Body Size Data Header Payload

19.序列化 基础类型 复合类型

20.治理(灵活可扩展)

21. PHP WM - proto /snapshot/ 灵活可ಘ展的服务治理 Go Agent JAVA-Server Registry JAVA-Client

22.Motan-PHP 跨语言调用 if ($connection->buildConnection($agent_addr)){ $this->_url_obj ->setEndpoint(Constants::ENDPOINT_AGENT); $this->_endpoint = new Agent($this->_url_obj); } else { $this->_endpoint = new Cluster($this->_url_obj); }

23.Motan-PHP Cluster 直连策略 public function call() { return $this->_ha_strategy->call($this->_load_balance); } AGENT_RUN_PATH . "/snapshot/" . $this->_group . '_' . $this->_service_str; Endpointer ಘ઀‫כ‬ବ

24. PHP PHP 做 Server CGI、HTTP Go Agent JAVA-Server Registry JAVA-Client

25.Motan-Go Provider 与 PHP extFactory.RegistExtProvider(CGI, func(url *motan.URL) motan.Provider { return &CgiProvider{url: url} }) extFactory.RegistExtProvider(HTTP, func(url *motan.URL) motan.Provider { return &HTTPProvider{url: url} }) [MOTAN_M_p] => com.weibo.motan.HelloWorldService MOTAN_* [MOTAN_SERIALIZATION] => simple [MOTAN_M_g] => motan-server-mesh-example [MOTAN_M_m] => Hello [MOTAN_M_pp] => motan2

26. OR Go PHP CGI、HTTP Go Agent JAVA-Server Registry JAVA-Client

27.

28.WeiboMesh 与 泛服务化 附能 PHP 微服务

29.传统 PHP 服务化演进 चԭ Vanilla ጱAPI Gateway API+COMMON … 2012 2015 2016 …… ཛྷࣘ۸๐‫ۓ‬ PHP-BE Vasina चԭ PHP-BE ጱங๐‫ۓ‬ೆ‫ړ‬