目录
Eureka、Zookeeper、Consul注册中心的异同点
组件名 | 语言 | CAP | 服务健康检查 | 堆外暴露接口 | spring cloud集成 |
---|---|---|---|---|---|
Eureka | Java | AP | 可配支持 | Http | 已集成 |
Consul | Go | CP | 支持 | Http/DNS | 已集成 |
Zookeeper | Java | CP | 支持 | 客户端 | 已集成 |
-
C:consistency(强一致性)
-
A:Availability(可用性)
-
P:Partition tolerance(分区容错性)
CAP理论关乎粒度是数据,而不是整体系统设计的策略
CAP原则又称CAP定理,指的是在一个分布式系统中,
一致性
(Consistency)、可用性
(Availability)、分区容错性
(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,因此,根据CAP原理将NoSQL数据库分成了满足CA原则、满足CP原则和满足AP原则三类
CA-单点集群,满足一致性、可用性的系统,通常在可扩展性上不太强大
CP-满足一致性,分区容忍性的系统,通常性能不是特别高 zk、consul
AP-满足可用性、分区容忍性的系统,通常可能对一致性要求低一些 eureka
一、Eureka
1、什么是服务治理
在传统的rpc远程调用的框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务与服务之间的依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册
2、什么是服务注册与发现
eureka采用了cs的设计架构,eureka server作为服务则测功能的服务器,他是服务注册中心,而系统中的其他微服务,使用eureka的客户端连接到eureka server 并维持心跳连接,这样系统的维护人员就可以通过eureka server来监控系统中各个微服务是否正常运行
在服务注册与发现中,有一个注册中心, 当服务器启动的时候,会把当前自己的服务器的信息,比如服务地址通讯地址以别名方式注册到注册中心上,另一方以该别名的方式去注册中心上获取到实际的服务通信地址,然后在实现本地rpc调用rpc远程调用框架核心思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理理念),在任何rpc远程框架中,都会有一个注册中心(存放服务地址相关信息(接口))
3、eureka包含两个组件:eureka servre和eureka client
- eureka server提供服务注册服务
各个微服务节点通过配置启动后,会在eurekaserver中进行注册,这样eurekaserver中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到
- eurekaclient通过注册中心进行访问
是一个java客户端,用于简化eureka server的交互,客户端同时也具备一个内置、使用轮询负载算法的负载均衡器,在应用启动后,将会向eurekaserver发送心跳(默认周期30秒),如果eurekaserver在多个心跳周期内没有接收到某个节点的心跳,eurekaserver将会从服务注册表中把这个节点移除(默认90秒)
4、pom配置
<dependency>
<groupId>org,springframework.cloud<groupId>
<actifactId>spring-cloud-starter-nerflix-eureka-client</actifactId>
</dependency>
5、yml配置
服务端:使用@EnableEruekaServer
开启服务
eureka:
instance:
hostname: localhost #erueka服务端的实例名称
client:
#false表示不向注册中心注册自己
registry-with-eureka: false
#false表示自己端就是服务中心,职责就是维护服务实例,不需要检索服务
fetch-registry: false
service-url:
defaultZone: http://${eureka,instance,hostname}:${server.port}/eureka/
客户端:使用@EnableEurekaClient
使用服务,可以用@EnableDiscoveryClient
来替代,该注解可以理解为通用客户端注解(使用zk,consul、nacos都可以使用这个)
spring:
appplication:
name: payment8001
eureka:
client:
#表示是否将自己注册进eurekaserver默认为true
registry-with-erueka: true
#是否从eurekaserver抓取已有的注册信息,默认为true,单节点无所谓,集群
#必须设置为true才能配合ribbon使用负载均衡
fetchRegistry: true
service-url:
defaultZone: http://localhost:7001/eureka
# eureka的注册默认是主机名,可以改成服务名称,只需要添加以下配置
instance-id: payment8001
# 还可以添加ip提示,在eureka页面鼠标触碰访问路径提示ip,添加配置
#prefer-ip-address: true
6、服务发现Discovery
对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息
@Resource
private DiscoveryService discoveryService;
@GetMapping(value="x")
public Object discovery(){
//获取了eureka的所有的服务
List<String> service=discoveryService.getServices();
//获取实例下面的服务列表
discovery.getInstances("CLOUD-PAYMENT-SERVCICE")
}
二、Zookeeper
使用zookeeper加springcloud开启服务中心来替代停更的Eureka
1、pom配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
2、yml配置
server:
port: 8004
spring:
application:
name: cloud-provider-zookeeper-payment
cloud:
zookeeper:
connect-string: 192.168.111.144:2181
3、启动类
@SpringBootApplication
@EnableDiscoveryClient
public class Application{
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
4、引用
@configuration
public class ApplicationContextBean{
@Bean
@LoadBalanced
public RestTemplate get RestTemplate{
return new RestTemplate();
}
}
三、Consul
1、简介
是一套分布式服务发现和配置管理系统,由go语言开发
提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据性需要单独使用,也可以一起使用以构建全方位的服务网格,总之consul提供了一种完整的服务网格解决方案
2、功能介绍
-
服务发现:提供http和dns两种发现方式
-
健康检测:支持多种方法,http、Tcp、docker、shell脚本定制化
-
kv存储:key、value的存储方式
-
多数据中心:consul支持多数据中心
-
可视化web界面
3、下载使用
-
https://learn.hashicorp.com/consul/getting-started/install.html
-
下载完成后只有一个consul.exe文件,双击运行,查看版本号
consul --version
-
使用开发者模式启动
consul agent -dev
通过地址访问consul首页:http://localhost:8500
4、官方文档(中文)
https://www.springcloud.cc/spring-cloud-consul.html
5、配置文件
1、pom配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
2、yml配置
spring:
application:
name: consul-provider-payment
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
3、启动类
@SpringBootApplication
@EnableDiscoveryClient
public class Application{
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}