多语言展示
当前在线:534今日阅读:183今日分享:45

经典Java面试题:微服务之间是如何独立通讯的 ?

系统之间各个服务是可以独立部署,是松耦合的。每个服务仅关注于完成一个任务并很好的完成该任务。围绕业务能力组织服务,自动化部署,智能端点,对语言和数据的去中心话控制。
工具/原料
1

dubbo

2

springcloud

3

REST

4

json

5

RabbitMq

6

ActiveMq

7

Kafka

方法/步骤
2

同步通信:dubbo通过 RPC 远程过程调用、springcloud通过 REST接口json调用等。异步:消息队列,如:RabbitMq、ActiveMq、Kafka 等。

3

微服务能解决了单体应用以及SOA带来的的问题,但是微服务使整个应用服务增多,服务间通讯更复杂,也会带来大量 的问题。比如单体如何拆分成多个微服务,团队间沟通更多,运维成本增高,分布式事务问题,依赖管理变得复杂,测试 更加困难,故障更难于定位等等。

4

API Gateway是解决微服务通信的一个不错的方法。以客户端为例。一个客户端可以向多个微服务中的任意一个微服务发出请求。API Gateway负责请求转发、合成和协议转换。所有请求都要先经过API Gateway,然后再将请求转发到对应的微服务中。

5

这种通信不但可以实现一对一、一对多。还可以实现同步和异步请求。

6

其中代理访问我们使用的是netflix-zuul,只要是对外暴露请求的所有网关,主要用在oauth项目;服务之间的相互请求多使用feign request使用的是openfeign,主要用在需要立即响应,聚合功能和数据的请求;消息队列我们使用的是腾讯的CMQ,一般用在不需要立即返回,同时需要业务解耦,肖峰填谷的业务请求上。

7

API是服务端和客户端之间的契约。不管选择了什么样的IPC机制,重要的是使用某种交互式定义语言(IDL)来精确定义一个服务的API。甚至有一些关于使用API first的方法(API-first approach)来定义服务的很好的理由。在开发之前,你需要先定义服务的接口,并与客户端开发者详细讨论确认。这样的讨论和设计会大幅度提到API的可用度以及满意度。

8

选择服务如何相互通信时,最直接的方式往往是 HTTP。事实上,我们可以提出一个案例,即所有通信渠道都来自这个渠道。但是除此之外,服务之间的 HTTP  调用是服务到服务通信的可行选择。

9

与HTTP通信不同,所涉及的服务不直接相互通信。相反,服务将消息推送到其他服务订阅的消息代理。这消除了许多与 HTTP 通信相关的复杂性。它不需要服务知道该如何相互交流,它消除了直接相互调用的服务需求。相反,所有服务都知道消息代理,并且它们将消息推送到该代理。其他服务可以订阅代理中自己关心的消息。如果我们的应用在 Amazon Web Services 中,可以用简单通知服务(SNS)作为消息代理。现在 ServiceA 可以将消息推送到  ServiceB 监听的 SNS 主题。

注意事项
1

单体架构所有功能耦合在一起,开发效率低

2

SOA架构的总线模式与某种技术耦合过高

3

轻量级运行时技术的出现(node.js, WAS Liberty等)

4

新的轻量级协议(RESTful API接口, 轻量级消息机制)

5

新的可替代数据持久化模型:如NoSQL, MapReduce, BASE, CQRS等

推荐信息