基于传染机制的分布式组件
项目简介
Martian-cloud 是 Martian 的官方分布式组件,基于传染机制,不再需要注册中心
- 完全丢弃了注册中心,且不依赖任何注册中心,采用传染机制实现服务的发现与治理
- 服务间通话采用 rest 风格
- 对 Martian 的侵入非常小
什么是传染机制
- 常规的分布式采用的是 [生产者->注册中心->消费者] 模型,生产者将接口给注册中心,消费者从注册中心发现其他的服务,实现调用
- 传染机制就是丢弃注册中心,可以把接口看做病毒,服务看做是人,服务之间只要有直接或者间接的联系,最终都会被染上病毒(接口)
比如我们现在有三个服务
http://mars-framework.com/img/ws-blank.png
这些服务之间是相互独立的,他们无法发现对方,所以我们需要做一些事
可以将他们连接起来
比如像这个样子 [图 1 ]
http://mars-framework.com/img/ws-one.png
也可以是这样子 [图 2 ]
http://mars-framework.com/img/ws-two.png
连接方式随意,只要别让任何服务落单即可
当这些服务连接后,会发生什么
我们用图 1 来举例
- 当 A 启动时,此时只有一台服务,所以相安无事,完全独立
- 当 B 启动时,由于 A 连接的是 B,所以 A,B 之间产生了关系,他们的接口会互相传染,此时 A 中有 B 的接口,B 中有 A 的接口
- 当 C 启动时,由于 B 连接的是 C,所以 B,C 之间产生了关系,而 B 和 A 又存在关系,所以三台服务器都产生了关系,他们的接口再一次相互传染了,此时 A,B,C 都有对方的完整接口列表
- 如果三台服务中任意一个宕机了,也没关系,因为他们的接口已经传染开了,所有服务都产生了联系,可以跳过一开始的传染途径,直接进行感染
- 宕机的这个服务的接口会从其他的服务上自动消失
使用起来也很简单
一、 仅需一个依赖
<dependency>
<groupId>com.github.yuyenews</groupId>
<artifactId>mars-cloud-starter</artifactId>
<version>最新版,具体看《组件介绍》</version>
</dependency>
二、 支持 Feign 调用
/*
这个注解的 serverName 跟你要调用的那个服务的 name 一致(配置类里 cloud 配置的 name )
beanName 不写的话,默认为类名首字母小写
*/
@MarsFeign(serverName="mars-demo",beanName="demoFeign")
public interface DemoFeign {
/*
这里面的所有方法,跟你要调用的那个 API 中的方法名一致
*/
返回类型 insert(DemoEntity entity);
/*
可以用 @MarsContentType 注解 来指定本次请求的 ContentType
*/
@MarsContentType(ContentType = ContentType.JSON)
返回类型 selectList(DemoEntity entity);
}
三、 也支持 RestTemplate
返回类型 result = MarsRestTemplate.request(服务 name,MarsApi 接口的方法名,new Object[]{参数对象 1,参数对象 2},返回类型.class, ContentType.FORM);