将SOA与Symfony2:一ob娱乐下载年半
这个案例研究是一个帖子写的亚历山德罗Nadalin技术副总裁Namshi。希望你的公司出现在Symfony官方博客吗?ob娱乐下载发送一个建议和案例研究到fabien.potencier@sensiolabs.com
当我第一次开始着手Symfony2更新我们的架构ob娱乐下载Namshi,我真的很兴奋,因为我确信ob娱乐下载Symfony是我们业务的最佳选择。随着时间的流逝,我觉得相当有信心的选择,但我想给一个诚实的和清晰的了解哪些元素,哪些不工作,以便其他人能从我们从我们的经验中受益。
在我们开始之前
首先,让我介绍一下我们的架构,或者,至少,它看起来如何现在:在Namshi,我们运行一个快速增长的时尚电子商务门户在中东(7个国家,2种语言)。为了达到预期的增长,我们解决复杂性依靠microservices在面向服务的体系结构。
我们也多元化的发展平台,我们的前端是“本地”(移动应用程序)或用JavaScript编写的,不管是在NodeJS与AngularJS(桌面网站)或在客户端(手机网站)。
正如你可能已经猜到的,我们使用Symfony2来开发这些前端后端所使用的api。ob娱乐下载在本文中,我们将只关注后端应用程序的一部分。
FOSRest FOSRest与否?
如果您正在构建的api,您必须使用FOSRestBundle,对吧?不要这么快!
我不是说这不是一个好的软件,但在高度定制的,长期项目您可能想要考虑的东西简单,减少了自己的约束和配置域规则。
我们用FOSRestBundle但一直在慢慢地远离它的新服务迁移不需要太多抽象:我们确定一个更简单的解决方案(例如JMS序列化器+ JsonResponse)可能是我们所需要的。
支持更多的格式时,你可能会认为使用FOSRestBundle可以为您节省大量的工作。这就是为什么我认为它´s重要评估您的具体需求,然后选择使用它。在我们的例子中,我们已经看到,控制器中的一个简单的方法是我们要求:
类ApiController{公共函数createApiResponse(数据,无论如何,美元…){返回新JsonResponse ($ this - > getSerializer() - >序列化($ data, json),…);}}
再次,我认为FOSRest是一个非常好的软件。然而,我想强调这样一个事实,你可以避免额外的复杂性或抽象如果你不需要所有的功能。
身份验证
为了验证API请求我们决定去谷歌在sdk的促进,Json Web标记。
我们最终写小型图书馆在PHP中使用jwt,猜猜有人写了一个包。我们非常满意jwt迄今为止的简单性,与其它更复杂的解决方案相比,这种简单工作很好。
jw (Json Web背后的想法签名,jwt)签署版本非常简单的客户端第一次登录凭据,然后你一个标准问题,签署了JWT,包含客户机相关信息,然后客户端发送每个API请求令牌。
另一个要注意的地方,我们所有的api使用HTTPS我肯定会推荐朝着这个方向。网络越来越快,比如SPDY和LTE连接,感知开销很小。
多个包或多个应用程序?
另一件事,我们讨论很大程度上是开发N Symfony应用或者只是让我们所有不同的api在孤立的包,即在一个应用程序。ob娱乐下载
我们从后者开始以来的最快方式生产的东西,但目前走向分裂的所有服务在自己的应用程序。这个策略可以避免陷入依赖冲突(一个包需要版本X的依赖,不支持在另一个包,无论出于何种原因,等等)保持这些组件的开发过程不同。
这意味着我们可以用一个小团队的开发人员工作在一个API不取决于任何其他API。此外,团队可以实现快速、精益部署不需要部署整个API的基础设施。最后,这种方法还可以帮助如果我们想重写我们的一个服务与另一个平台(例如,NodeJS)。
当然,这些是你开始面临的问题一旦你的团队规模和范围的软件,所以我仍然推荐开始与多个包,然后简单地将它们在N个应用程序仅在必要时。
我们也有一些常见的代码/包基本上每个API并将其存储在不同的存储库,将包括通过作曲家。
性能怎么样?
说实话,没有非常具体的:我们提供我们的大部分内容通过复述和清漆Nginx,这样我们的API可以偶尔放松。
虽然我们没有达到疯狂的吞吐量性能,我们很高兴看到我们的api 75毫秒左右,足够体面,不担心表演一段时间关注其他方面的架构。
单元测试问题
真相:我们非常疏忽。我们´已经添加了功能测试没有太多关注的单元测试;我们最近开始改变这一趋势。
在任何情况下,有一些事情我想提到:
- 而不是使用PHPUnit),这是完全集成的开箱即用的Symfony,我们决定去ob娱乐下载PHPSpec因为我们觉得这是一个更现代的解决方案单元测试和让软件设计出现。
- Travis-CI几乎是一个无需用脑的事:我们已经用它好几个月了,很高兴不必管理我们自己的詹金斯实例来触发测试每次有人推GitHub。
歌珥&朋友
对那些感兴趣歌珥问题如何解决,我们开始的NelmioCorsBundle但是,因为我们需要支持旧版本的IE和解决方案xDomain不像你想象的那样简单,我们决定实施一个API代理,这样我们可以避免跨源请求。而不是请求api.example.com/users
的前端example.com
将达到example.com/api/users
和一个规则的网络服务器将请求的APIapi。
子域名。
版本控制
为了打破尽可能少,我们接受了版本控制和实现它通过网络服务器和Symfony本身。ob娱乐下载
我们采取的方法其实很简单。我们让客户点击我们的api通过urlapi.example.com/checkout/v3/..。
。诀窍是,nginx服务器需要的前两段的URL,并相应地设置两个HTTP标头:
api服务:结账
api版本:3
然后,我们有一个路由侦听器靴子控制器相应版本:它检查是否可用下一个控制器控制器\ Namshi \ CheckoutBundle \ \ V3
名称空间。如果不是,它后退,直到达到零(版本\ Namshi \ CheckoutBundle \控制器
)或者抛出一个404年
错误。
除此之外,之前发送回客户机的响应,我们有反应变压器的舞台:我们看的API版本要求,找到匹配的变形金刚版并将它们应用于响应。
变压器是一个简单的泡泡(普通PHP对象),接受一个响应
并在必要时应用的转换。例如,我们使用变压器camelCase API中响应值,添加一些缓存规则或调整的内容,我们不需要在特定的版本。这´s变压器的外观:
类CamelCaseTransformer实现ApiResponseTransformer{保护美元弯曲物;公共函数__construct (SomeInflector弯曲物美元){$ this - >弯曲物= $弯曲物;}公共函数变换(响应响应美元){$内容= $ this - >弯曲物- > camelize($响应- > getContent ());(响应- > setContent美元内容);}}
总而言之
的技术团队在Namshi远非完美,我相信还有很多工作要做,许多改进。不过,一些非常简单的选择,像我们所描述的,帮助我们超越我们的许多竞争对手由于灵活性来自减少Symfony-powered api的复杂性。ob娱乐下载
我们很高兴为我们的api和使用Symfony2确信,如果我们ob娱乐下载不得不从头再来,我们不会去别的PHP提供的生态系统。
请寄给我们你的反馈对我们做出的决定,因为我们相信我们可以而且应该学习尽可能多的聪明的大脑在Symfony社区。欧宝体育平台怎么样ob娱乐下载
最后,但并非最不重要的是,在写作的过程中我们的SOA有机会开发一些开源组件(在JavaScript和PHP)GitHub上可用:随时下降和帮助我们使他们更棒!
评论
有两件事我想说关于包和微观服务。首先我认为用户应用程序不需要使用包在symfony,因为……ob娱乐下载嗯,没有真正的理由去使用它,它使您的代码耦合symfony,它增加了两个不必要的目录层次结构(供应商和包名称),还有一些其他的原因,我现在就ob娱乐下载不记得。
那微服务——这是一个很好的分配程序员的工作,写代码解耦,它基本上是孤立的组件通常有利于测试和简单。但是有两个问题你应该保持你的关注:服务之间的依赖关系的复杂性,你把一切就变得越复杂,开发人员掌握建筑,因为一切都是分成小块,位于不同的地方,第二件事是服务之间的延迟,可以加起来,让你的响应时间更糟糕的是,他们往往会有一个自然的顺序请求你不能“加速”,异步性。
评论都关门了。
以确保评论保持相关,他们关闭了旧的帖子。
Nicolas Cabot is a certified Symfony engineer.
Get certified! Online exams available in all countries.
Register Now