很多站长朋友们都不太清楚php调用dubbo,今天小编就来给大家整理php调用dubbo,希望对各位有所帮助,具体内容如下:
本文目录一览: 1、 生产环境出现的几次线程池被占满的问题分析 2、 Web项目开发为何要走前后端分离模式? 3、 dubbo使用zookeeper连接,zookeeper宕机后怎么处理 4、 dubbo跨语言的研究(c++) 5、 微服务跨语言调用(摘选) 6、 线程中调用dubbo服务,连续使用两次,报服务被关闭异常 生产环境出现的几次线程池被占满的问题分析项目发布后,发现生产上面dubbo的线程池迅速被耗尽,查看日志看到如下信息:
RejectedExecutionException是dubbo provide线程池的拒绝策略(详情见:引入dubbo的实战记录),默认200大小的线程池被占满了,随后我们在这段日志的上面发现了另外一段日志:
发现这个http请求调用异常了,并且发现整个接口调用花了100秒,那么问题就显而易见了,前端一个请求,发送到A系统,A系统通过dubbo调用B系统,B系统http调用php提供的一个接口,php的这个服务由于一些未知原因特别慢,导致我们的http请求花了很长时间,这时候dubbo的线程一直得不到释放,由于A系统这时候频繁调用B系统,导致B系统的dubbo线程池线程很快被耗尽(dubbo服务提供方线程池默认固定大小200,并且SynchronousQueue的初始化大小为0,也就是说线程池总的容量为200)。后来的解决方案:1.减小http的超时时长(之前设置的是60秒);2.加大dubbo线程池容量;这样就算http调用会发生超时,超时时间也很短,会让dubbo线程很快释放,增加线程池最大容量就不说了。当线程池已满时,使用界队列来存储未执行的任务有这样一个好处,当发生异常情况导致线程池被撑满时,问题能尽快的暴露出来,如果是无界队列,这样未执行的任务会一直积压在队列中,极有可能会撑满内存,最终导致整个应用不可用。
Web项目开发为何要走前后端分离模式?把前端与后端独立起来去开发,放在两个不同的服务器,需要独立部署,两个不同的工程,两个不同的代码库,不同的开发人员,前后端工程师需要约定交互接口,实现同步开发,开发结束后需要进行独立部署,前端通过接口来调用调用后端的API,前端只需要关注页面的样式与动态数据的解析和渲染,而后端专注于具体业务逻辑。具体好处有以下几点:
1.彻底解放前端
前端不再需要向后台提供模板或是后台在前端html中嵌入后台代
2.提高工作效率,分工更加明确
前后端分离的工作流程可以使前端只关注前端的事,后台只关心后台的活,两者开发可以同时进行,在后台还没有时间提供接口的时候,前端可以先将数据写死或者调用本地的json文件即可,页面的增加和路由的修改也不必再去麻烦后台,开发更加灵活。
3.局部性能提升
通过前端路由的配置,我们可以实现页面的按需加载,无需一开始加载首页便加载网站的所有的资源,服务器也不再需要解析前端页面,在页面交互及用户体验上有所提升。
4.降低维护成本
通过目前主流的前端MVC框架,我们可以非常快速的定位及发现问题的所在,客户端的问题不再需要后台人员参与及调试,代码重构及可维护性增强。
5.实现高内聚低耦合,减少后端(应用)服务器的并发/负载压力。
6.即使后端服务暂时超时或者宕机了,前端页面也会正常访问,但无法提供数据。
7.可以使后台能更好的追求高并发,高可用,高性能;使前端能更好的追求页面表现、速度流畅、兼容性、用户体验等。
我理解的前后端分离,前端是需要起服务器的,减少学习成本,可以用node,前端也要有域名的
如果是半分离, 那么前端提供js文件(css等)这个我也做过,前后端都用node就不说了,如果是两种语言,
如果一个工程文件下开发,webpack下直接打包进后台语言的静态目录下。
如果是两个工程,那么前端只提供生成的js(css)文件,git pull后台项目,扔进静态目录,这样又涉及到版本控制的问题,一般我会生成一个配置文件,直接读取的,内容是xxx.hash.js这种文件名,然后document.wirte动态写入js/css
前端起服务器就不需要动态引入了,直接html插件生成文件,更好的控制版本
半分离 还有一个问题,例如首页同构,如果更改xxx.blade.php文件,这就又动了php文件,甚至包括nginx反向代理啊,ssl这种缓存啊,都比较麻烦,你要是改了点啥,自己的ok了,后台的崩了,那就挺操蛋了,大公司有专门的运维还好,小公司真的是一团糟
后台我们采取全分离,nginx前端管理,至于升级nginx版本,http2,反向代理,https证书,都是前端自己弄,毕竟小公司,每个人水平都不一致,自己负责自己的比较好
但是这个跨域又要稍微处理一下,至今我这边后台还是*,我也没法说什么
阿里云这么便宜,如果把成本浪费在人力上,会变得很贵
一个人的精力有限,前后端分离有助于我们更专注我们所要注重的技术点,俗话说:“术业有专攻”。
比如我们后端,前后端分离有助于我们把注意力放在java基础,设计模式,jvm原理,spring+springmvc原理及源码,linux,mysql事务隔离与锁机制,mongodb,http/tcp,多线程,分布式架构(dubbo,dubbox,spring cloud),弹性计算架构,微服务架构(springboot+zookeeper+docker+jenkins),java性能优化,以及相关的项目管理等等。
而前端也可以集中精力在前端的展示上。
总的来说,前后端分离利大于弊。这也是越来越少用jsp的原因。
补充两点
1.每次请求的数据量变小,也意味着更少的响应时间。
2.也不是每个应用用前后端分离都是最合适的,要根据应用规模,工期综合判断。
dubbo使用zookeeper连接,zookeeper宕机后怎么处理zookeeper宕机后,因为消费者会缓存提供者的信息,所以应用不会有问题。但是,此时提供者和消费者都无法重连zookeeper,因为dubbo貌似配置的zkclient不会重连zookeeper,所以一旦重启一台服务提供者,那么这台就从服务消费者的缓存中消失了,此时服务消费者又连不上zookeeper,所以如果同时重启,消费者就没有提供者可用了,所以只能重启一台提供者后,再重启一个消费者,交错重启。
dubbo跨语言的研究(c++)目前来看jni反而是一个比较通用的方法,
c++的服务端使用jni对服务进行包装,通过服务总线(dubbo)发布服务,最终打包成一个jar包,启动服务。
c++客户端也使用jni方式通过服务总线(dubbo)调用服务。
我简单研究了githup中的dubbo-python、dubbo-node-client、dubbo-php-client。
基本都是这样做的:
问题,这些各个语言的dubbo库,都只是客户端的,对于服务端没有支持。
微服务跨语言调用(摘选)微服务架构已成为目前互联网架构的趋势,关于微服务的讨论,几乎占据了各种技术大会的绝大多数版面。国内使用最多的服务治理框架非阿里开源的 dubbo 莫属,千米网也选择了 dubbo 作为微服务治理框架。另一方面,和大多数互联网公司一样,千米的开发语言是多样的,大多数后端业务由 java 支撑,而每个业务线有各自开发语言的选择权,便出现了 nodejs,python,go 多语言调用的问题。
跨语言调用是一个很大的话题,也是一个很有挑战的技术活,目前业界经常被提及的解决方案有如下几种,不妨拿出来老生常谈一番:
当我们再聊跨语言调用时我们在聊什么?纵观上述几个较为通用,成熟的解决方案,可以得出结论:解决跨语言调用的思路无非是两种:
如果一个新型的团队面临技术选型,我认为上述的方案都可以纳入参考,可考虑到遗留系统的兼容性问题
旧系统的迁移成本
这也关键的选型因素。我们做出的第一个尝试,便是在 RPC 协议上下功夫。
通用协议的跨语言支持
springmvc的美好时代
springmvc
springmvc
在没有实现真正的跨语言调用之前,想要实现“跨语言”大多数方案是使用 http 协议做一层转换,最常见的手段莫过于借助 springmvc 提供的 controller/restController,间接调用 dubbo provider。这种方案的优势和劣势显而易见
通用协议的支持
事实上,大多数服务治理框架都支持多种协议,dubbo 框架除默认的 dubbo 协议之外,还有当当网扩展的 rest协议和千米网扩展的 json-rpc 协议可供选择。这两者都是通用的跨语言协议。
rest 协议为满足 JAX-RS 2.0 标准规范,在开发过程中引入了 @Path,@POST,@GET 等注解,习惯于编写传统 rpc 接口的人可能不太习惯 rest 风格的 rpc 接口。一方面这样会影响开发体验,另一方面,独树一帜的接口风格使得它与其他协议不太兼容,旧接口的共生和迁移都无法实现。如果没有遗留系统,rest 协议无疑是跨语言方案最简易的实现,绝大多数语言支持 rest 协议。
和 rest 协议类似,json-rpc 的实现也是文本序列化http 协议。dubbox 在 restful 接口上已经做出了尝试,但是 rest 架构和 dubbo 原有的 rpc 架构是有区别的,rest 架构需要对资源(Resources)进行定义, 需要用到 http 协议的基本操作 GET、POST、PUT、DELETE。在我们看来,restful 更合适互联网系统之间的调用,而 rpc 更适合一个系统内的调用。使用 json-rpc 协议使得旧接口得以兼顾,开发习惯仍旧保留,同时获得了跨语言的能力。
千米网在早期实践中采用了 json-rpc 作为 dubbo 的跨语言协议实现,并开源了基于 json-rpc 协议下的 python 客户端 dubbo-client-py 和 node 客户端 dubbo-node-client,使用 python 和 nodejs 的小伙伴可以借助于它们直接调用 dubbo-provider-java 提供的 rpc 服务。系统中大多数 java 服务之间的互相调用还是以 dubbo 协议为主,考虑到新旧协议的适配,在不影响原有服务的基础上,我们配置了双协议。
dubbo 协议主要支持 java 间的相互调用,适配老接口;json-rpc 协议主要支持异构语言的调用。
定制协议的跨语言支持
微服务框架所谓的协议(protocol)可以简单理解为:报文格式和序列化方案。服务治理框架一般都提供了众多的协议配置项供使用者选择,除去上述两种通用协议,还存在一些定制化的协议,如 dubbo 框架的默认协议:dubbo 协议以及 motan 框架提供的跨语言协议:motan2。
motan2协议的跨语言支持
motan2
motan2
motan2 协议被设计用来满足跨语言的需求主要体现在两个细节中—MetaData 和 motan-go。在最初的 motan 协议中,协议报文仅由 Header+Body 组成,这样导致 path,param,group 等存储在 Body 中的数据需要反序列得到,这对异构语言来说是很不友好的,所以在 motan2 中修改了协议的组成;weibo 开源了 motan-go ,motan-php ,motan-openresty ,并借助于 motan-go 充当了 agent 这一翻译官的角色,使用 simple 序列化方案来序列化协议报文的 Body 部分(simple 序列化是一种较弱的序列化方案)。
agent
agent
仔细揣摩下可以发现这么做和双协议的配置区别并不是大,只不过这里的 agent 是隐式存在的,与主服务共生。明显的区别在于 agent 方案中异构语言并不直接交互。
dubbo协议的跨语言支持
dubbo 协议设计之初只考虑到了常规的 rpc 调用场景,它并不是为跨语言而设计,但跨语言支持从来不是只有支持、不支持两种选择,而是要按难易程度来划分。是的,dubbo 协议的跨语言调用可能并不好做,但并非无法实现。千米网便实现了这一点,nodejs 构建的前端业务是异构语言的主战场,最终实现了 dubbo2.js,打通了 nodejs 和原生 dubbo 协议。作为本文第二部分的核心内容,重点介绍下我们使用 dubbo2.js 干了什么事。
Dubbo协议报文格式
dubbo协议
dubbo协议
dubbo协议报文消息头详解:
magic:类似java字节码文件里的魔数,用来判断是不是 dubbo 协议的数据包。魔数是常量 0xdabb
flag:标志位, 一共8个地址位。低四位用来表示消息体数据用的序列化工具的类型(默认 hessian),高四位中,第一位为 1 表示是 request 请求,第二位为 1 表示双向传输(即有返回 response),第三位为 1 表示是心跳 ping 事件。
status:状态位, 设置请求响应状态,dubbo 定义了一些响应的类型。具体类型见com.alibaba.dubbo.remoting.exchange.Response
invoke id:消息 id, long 类型。每一个请求的唯一识别 id(由于采用异步通讯的方式,用来把请求 request 和返回的 response 对应上)
body length:消息体 body 长度, int 类型,即记录 Body Content 有多少个字节
body content:请求参数,响应参数的抽象序列化之后存储于此。
协议报文最终都会变成字节,使用 tcp 传输,任何语言只要支持网络模块,有类似 Socket 之类的封装,那么通信就不成问题。那,跨语言难在哪儿?以其他语言调用 java 来说,主要有两个难点:
ps:dubbo 协议通讯demo( )
线程中调用dubbo服务,连续使用两次,报服务被关闭异常最好调用PHP接口,使用了mysql 的服务器一般都是搭建了php环境的。 可以帮你写一个规范的php接口给应用连接访问使用。
关于php调用dubbo的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。
查看更多关于php调用dubbo php调用python程序的详细内容...