一、微服务的通信方式有哪些?
二、实现这些通信方式的框架有哪些?
1.RPC
- Dubbo;
- Grpc;
- Apache Thrift;
- Hessian;
- RMI。
2.HTTP
- SpringCloud Open Feign;
- SpringMVC;
- Okhttp;
- SpringBoot。
3.Message
- JMS;
- ActiveMQ;
- RabbitMQ;
- Kafka。
三、分布式微服务通信过程中遇到了哪些问题?
这里我列举比较典型的2个问题:
- 微服务通信超时;
- 微服务通信报错。
1.微服务通信超时
A服务调B服务,B服务调C服务,而此时C服务这时突然不给B服务响应了,最终造成服务之间通信超时报错,最终将错误由B服务抛给了A服务。
2.微服务通信报错
报错的原因有很多,不一定是代码的问题,也可能与与服务器的磁盘、CPU、内存、网络以及用户访问量、调用其它微服务没有给予正常的数据反馈等有关系。
四、如何解决这样的问题呢?
最近生产环境有一个W微服务应用就出现了微服务通信超时的问题。
W微服务部署在应用服务器x中,而应用服务器x中是处于内网的情况下,相当于与外部网络隔绝,而W微服务中的某一接口每天每小时都需要接入第三方某网的数据推送,其中某网的数据推送的一个接口推送是外网图片URL数据,而这些外网图片URL数据是需要W微服务将其下载至应用服务器x中临时图片存储文件夹上,然后进行图片裁剪,最终存入到应用服务器x中的某个文件夹下。而内网中的W微服务是无法下载远程图片的(出现了通信超时问题),而此功能相对比较重要,W微服务与另外的E微服务关系紧密,相当于W微服务接入第三方某网的数据推送,将推送的数据组装处理后,转发E微服务对应的接口实现数据最终的计算入库的流程。如果贸然将W微服务迁移至外网Web服务器x上可能会对W微服务将数据转发给E微服务的流程有影响,为了避免万一,采用了一个办法,即将W微服务重新打包修改相关配置信息发布到外网Web服务器x上,然后与第三方某网人员沟通,将那个推送图片URL数据的接口改为推送到新地址上,原有其它数据接口不变,这样就能解决这个问题。当然了,这仅仅只是一个临时的办法。要想根本解决问题,就要重新梳理一些各个微服务,那些微服务是可以放在内网的,那些微服务是必须要放在外网的。
问题解决流程:
报错信息-明确问题-追踪代码-问题解决方案-执行方案-事后针对问题进行复盘。