在分布式系统领域有个著名的CAP定理
(C-数据一致性
;A-服务可用性
;P-服务对网络分区故障的容错性
,这三个特性在任何分布式系统中不能同时知足,最多同时知足两个
); eureka是AP
,zookeeper是CP
。对于服务发现
而言,可用性
比数据一致性
更加剧要——AP赛过CP
java
Consul | zookeeper | euerka | etcd | |
---|---|---|---|---|
服务健康检查 | 服务状态,内存,硬盘等 | (弱)长链接,keepalive | 可配支持 | 链接心跳 |
多数据中心 | 支持 | — | — | — |
kv存储服务 | 支持 | 支持 | — | 支持 |
一致性 | raft | paxos | — | raft |
CAP | ca | cp | ap | cp |
使用接口(多语言能力) | 支持http和dns | 客户端 | http(sidecar) | http/grpc |
watch支持(客户端观察到服务提供者变化) | 全量/支持long polling | 支持 | 支持long polling/大部分增量 | 支持long polling |
自身监控 | metrics | — | metrics | metrics |
安全 | acl /https | acl | — | https支持(弱) |
spring cloud集成 | 已支持 | 已支持 | 已支持 | 已支持 |
raft
:Raft强依赖 Leader 节点的可用性来确保集群数据的一致性。 git
paxos
: 第一次由提交者Leader向全部其余服务器发出prepare消息请求准备,全部服务器中大多数若是回复诺言承诺就表示准备好了,能够接受写入;第二次提交者向全部服务器发出正式建议propose,全部服务器中大多数若是回复已经接收就表示成功了。github
long polling
:长轮询,客户端向服务器发送Ajax请求,服务器接到请求后hold住链接,直到有新消息才返回响应信息并关闭链接,客户端处理完响应信息后再向服务器发送新的请求。web
metrics
:做为一款监控指标的度量类库,它提供了不少模块能够为第三方库或者应用提供辅助统计信息, 它还能够将度量数据发送给Ganglia和Graphite以提供图形化的监控算法
Eureka的自我保护模式
Eureka Server
在运行期间,会统计心跳失败的比例在15分钟以内是否 低于85%,若是出现低于的状况(实际在 生产环境上一般是因为网 络不稳定致使),Eureka Server
会将当前的实例注册信息保护起来,同时提 示警告。保护模式主要用于一组客户端和Eureka Server
之间存在网络分 区场景下的保护。一旦进入保护模式,Eureka Server
将会尝试保护其服务注 册表中的信息,再也不删除服务注册表中的数据(也就是不会注销任何微服务)。
因此Eureka
的哲学是,同时保留”好数据“
与”坏数据“
总比丢掉任何”好数据“要更好,因此这种模式在实践中很是有效。,spring
ZooKeeper
是分布式协调服务,它的职责是保证数据(注:配置数据,状态数据)在其管辖下的全部服务之间保持同步、一致;(强一致性)ZooKeeper
使用单一主进程Leader
用于处理客户端全部事务请求,采用ZAB协议
将服务器数状态以事务形式广播到全部Follower
上;若是三台服务挂了两台怎么选出leader
;1 不大于 (3/2)=1的
,ZooKeeper服务
就很是的困难ZooKeeper
会将它们都从本身管理范围中剔除出去,外界就不能访问到这些节点了,自己这些节点是“健康”
的,能提供服务的包含不实的信息的结果也比什么都不返回要好
(由于暂时的网络故障而找不到可用的服务器)所以, Eureka
能够很好的应对因网络故障致使部分节点失去联系的状况,而不会像zookeeper
那样使整个注册服务瘫痪。json
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
复制代码
经过 @EnableEurekaServer
注解启动一个服务注册中心提供给其余应用进行对话,这个注解须要在springboot工程
的启动application类
上加安全
package io.ymq.example.eureka.server;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
复制代码
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
复制代码
@EnableEurekaClient
,但只有Eureka
可用,你也可使用@EnableDiscoveryClient
。须要配置才能找到Eureka注册中心服务器
discovery service
有许多种实现(eureka、consul、zookeeper
等)@EnableDiscoveryClient
基于spring-cloud-commons
,@EnableEurekaClient
基于spring-cloud-netflix
。eureka
,那么就推荐@EnableEurekaClient
,@EnableDiscoveryClient
。@SpringBootApplication
@EnableEurekaClient
@RestController
public class EurekaProviderApplication {
@RequestMapping("/")
public String home() {
return "Hello world";
}
public static void main(String[] args) {
SpringApplication.run(EurekaProviderApplication.class, args);
}
}
复制代码
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: eureka-provider
server:
port: 8081
复制代码
向Eureka
注册服务,消费者使用Ribbon
开启负载均衡springboot
Ribbon
是Netflix
发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix
的中间层服务链接在一块儿。Ribbon
客户端组件提供一系列完善的配置项如链接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)
后面全部的机器,Ribbon
会自动的帮助你基于某种规则(如简单轮询,随即链接等)
去链接这些机器。咱们也很容易使用Ribbon
实现自定义的负载均衡算法。服务器
Ribbon
在工做时首选会经过ServerList
来获取全部可用的服务列表,而后经过ServerListFilter
过虑掉一部分地址,最后在剩下的地址中经过IRule
选择出一台服务器做为最终结果。
ServerList
:用于获取地址列表。它既能够是静态的(提供一组固定的地址),也能够是动态的(从注册中心中按期查询地址列表)。ServerListFilter
:仅当使用动态ServerList
时使用,用于在原始的服务列表中使用必定策略过虑掉一部分地址。IRule
:选择一个最终的服务地址做为LB结果
。选择策略有轮询、根据响应时间加权、断路器(当Hystrix可用时)
等。简单轮询负载均衡(RoundRobin)
: 以轮询的方式依次将请求调度不一样的服务器,即每次调度执行i = (i + 1) mod n,并选出第i台服务器。随机负载均衡 (Random)
: 随机选择状态为UP的Server加权响应时间负载均衡 (WeightedResponseTime)
: 根据相应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低。区域感知轮询负载均衡(ZoneAvoidanceRule)
:复合判断server所在区域的性能和server的可用性选择server@SpringBootApplication
@EnableEurekaClient
@RestController
public class EurekaProviderApplication {
@Value("${server.port}")
String port;
@RequestMapping("/")
public String home() {
return "Hello world ,port:" + port;
}
public static void main(String[] args) {
SpringApplication.run(EurekaProviderApplication.class, args);
}
}
复制代码
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: eureka-provider
server:
port: 8081
复制代码
<!-- 客户端负载均衡 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<!-- eureka客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
复制代码
@EnableDiscoveryClient
@SpringBootApplication
public class RibbonConsumerApplication {
@LoadBalanced
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(RibbonConsumerApplication.class, args);
}
}
复制代码
/** * 描述:调用提供者的 `home` 方法 **/
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping(value = "/hello")
public String hello() {
return restTemplate.getForEntity("http://eureka-provider/", String.class).getBody();
}
}
复制代码
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: ribbon-consumer
server:
port: 9000
复制代码
依次启动服务(Eureka服务,三台service provider和service Consumer)
,查看ribbon
是否开启负载均衡
因为Consul
自身提供了服务端,因此咱们不须要像以前实现Eureka
的时候建立服务注册中心,直接经过下载consul的服务端程序就可使用。 Consul
内置了服务注册
与发现框架
(一站式)、具备如下性质(参考上面列表):
client
:客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群,全部注册到当前节点的服务会被转发到server,自己是不持久化这些信息server
:服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通信,功能和client都同样,惟一不一样的是,它会把全部的信息持久化的本地,这样遇到故障,信息是能够被保留的。 经过广域网与其余数据中心通信. 每一个数据中心的 server 数量推荐为 3 个或是 5 个.server-leader
:代表这个server是它们的老大,它和其它server不同的一点是,它须要负责同步注册的信息给其它的server,同时也要负责各个节点的健康监测。raft
:server节点之间的数据一致性保证,一致性协议使用的是raft,而zookeeper用的paxos,etcd采用的也是taft。服务发现协议
:consul采用http和dns协议,etcd只支持http服务注册
:支持两种方式实现服务注册,consul官方建议使用第二种方式。服务发现
:支持两种方式实现服务发现,关于consul
的环境搭建以及应用后续再补充吧~
在github
上有关于Spring Cloud
完整的部署。
其它相关文章
Spring cloud(1)-简介以及选择
Spring cloud(2)-服务发现(Eureka,Consul)
Spring cloud(3)-负载均衡(Feign,Ribbon)
Spring cloud(4)-熔断(Hystrix)
Spring cloud(5)-路由网关(Zuul)
Spring cloud(6)-配置管理及刷新(Config,Bus)
最后,给个 star 吧~
我的博客~
简书~