微服务系列-03服务与服务之间如何通信?

前言

在上一篇博客中我们知道了客户端通过API网关访问服务,那么这些服务之间又是如何通信的呢?

写博客的原因是想把自己的知识点分享给大家,为了方便理解,用词可能会不太官方,希望大家多多包涵,如果大家发现博客中有错误,欢迎大家指正留言

服务指什么,如何通信

想要知道服务与服务之间是如何通信的,我们首先就要知道这里的服务都包括什么?
微服务系列-03服务与服务之间如何通信?_第1张图片

服务 是指什么?
部署WEB网页的是服务,每天手机上的APP是服务,API网关是服务,所以我们先把服务简单的理解为 独立的进程 ,存在于一个独立的容器中。

服务与服务之间 是指什么?
在上图中,我通过一道比较粗的红色的线将图片分为了上下两个部分,大家可能听过这样一句话 对外REST,对内RPC 先可以感性的理解为红色线以上的部分称为 红色线以下的部分称为
内外通信
像WEB网页,APP与API网关的通信,我(仅仅是我)把它称为内外通信。
内部通信
像API网关与用户服务之间的通信,我(仅仅是我)把它称为内部通信。

所以服务与服务之间通信就包含两种:内外通信内部通信

服务与服务之间的通信方式

同步通信

REST API
REST API通信是通过JSON格式的字符串进行数据传输的,而字符串是可以在网络中穿透防火墙的。也就是说,REST API可以穿透防火墙。同时字符串也可以不用受开发语言的限制,可以同时完成后端与WEB,后端与APP(Android,IOS)之间的通信。

RPC
RPC通信又称远程过程调用,在内网中速度非常快,效率高。但是RPC通信方式的数据时无法穿透防火墙的,也就是说,RPC的通信不是通过字符串通信,那么RPC是如何通信的呢?
我们先来看一下在单体结构中两个模块是如何通信的?
比如我们在订单模块需要一个用户模块的对象,我们只需要在订单模块中 User user = new User();,此时我们便可以通过user调用用户模块的方法。那么对应到微服务体系中的RPC通信方式,同样的是在订单服务中调用用户服务,我们也只需要在订单服务中User user = new RPCUser();,此时我们便可以通过user调用用户服务的方法。所以说,RPC调用与本地调用(单体模块之间的调用方式)是一模一样的,所以实现这种调用方式的就是远程过程调用(RPC调用。

图示说明
微服务系列-03服务与服务之间如何通信?_第2张图片
微服务系列-03服务与服务之间如何通信?_第3张图片
不完美的地方
大家可以从图中看出来,此时的订单服务会依赖用户服务,如果用户服务出现问题,同样的订单服务也好出错,无法找到RPCUser。

实现RPC的框架
Dubbo:只能在Java中使用。需要掌握
Thrift:可以跨语言。Java对象可以被PHP使用,这便是跨语言。了解即可。

异步通信

提到异步通信,我们先来介绍一下 生产者,消费者模式 ,一句话概括就是,生产者只管产生消息(产生请求),消费者处理消息(处理请求)

异步通信带来的问题
这样便会产生一个问题,当消费者挂掉后,生产者还在一如既往的生产消息,而消费者是无法去处理的,这样就是造成消息(请求)的丢失。无法保证数据最终的一致性。
微服务系列-03服务与服务之间如何通信?_第4张图片
解决方案
微服务系列-03服务与服务之间如何通信?_第5张图片
异步通信的框架
Kafka:没有broker,不保证数据一致性,适合对日志的处理。
消息队列:保证数据一致性。

总结

问:服务与服务之间如何通信?
答:
同步通信方案
对外REST,对内RPC。
微服务系列-03服务与服务之间如何通信?_第6张图片
异步通信方案
消息队列。后端接口实现幂等性。
微服务系列-03服务与服务之间如何通信?_第7张图片
幂等性以后解释。

你可能感兴趣的:(SaaS)