搭建集群版Eureka Server
注册中心作为微服务架构中的核心功能,其重要性不言而喻。所以单机版的Eureka Server在可靠性上并不符合现在的互联网开发环境。集群版的Eureka Server才是商业开发中的选择。
Eureka Server注册中心的集群和Dubbo的ZooKeeper注册中心集群在结构上有很大的不同。
ZooKeeper注册中心集群搭建后,集群中各节点呈现主从关系,集群中只有主节点对外提供服务的注册和发现功能,从节点相当于备份节点,只有主节点宕机时,从节点会选举出一个新的主节点,继续提供服务的注册和发现功能。
而Eureka Server注册中心集群中每个节点都是平等的,集群中的所有节点同时对外提供服务的发现和注册等功能。同时集群中每个Eureka Server节点又是一个微服务,也就是说,每个节点都可以在集群中的其他节点上注册当前服务。又因为每个节点都是注册中心,所以节点之间又可以相互注册当前节点中已注册的服务,并发现其他节点中已注册的服务。所以Eureka Server注册中心集群版在搭建过程中有很多的方式,找到一个最合适最可靠的搭建方式才能称为一个称职的程序员。
集群版Eureka Server可以通过Spring Boot多环境配置方式快速搭建。只要创建一个合适的Eureka Server工程,通过多个全局配置即可完成快速搭建。
本案例中搭建一个双节点的Eureka Server集群。
POM依赖
和单机版Eureka Server相同。
全局配置文件
本案例中的两个节点分别会搭建在两个Linux系统中,为这两个Linux系统分别定义域名为eurekaserver1和eurekaserver2。
在集群搭建过程中,全局配置文件的定义非常重要。其中euraka.client.service-url.defaultZone属性是用于配置集群中其他节点的。如果有多个节点,使用逗号','分隔。
有部分程序员只配置某一个集群节点信息,通过集群节点间的注册通讯实现节点的全面发现。这种配置形式是不推荐的。因为Eureka Server在服务管理上,会根据连带责任来维护服务列表,如果某集群节点宕机,那么通过这个节点注册过来的服务都会连带删除。
eurekaserver1配置
spring: eureka:
|
eurekaserver2配置
spring: server: eureka: client: |
打包工程形成jar文件
使用run -> maven package即可实现打包过程。打包后的jar文件保存在工程中的target目录中。
上传打包后的jar文件到Linux系统
设置Linux主机域名
修改/etc/hosts文件,设置主机域名。将主机域名和IP进行绑定。
vi /etc/hosts
新增内容如下:两个Linux系统修改内容相同。
192.168.2.115 eurekaserver1 192.168.2.116 eurekaserver2 |
使用命令启动Eureka Server
可以在Linux终端中,通过java命令来启动Eureka Server。在启动的时候,可以通过启动参数来设置有效的配置环境。具体命令如下:
java -jar -Dspring.profiles.active=eurekaserver1 spring-cloud-eureka-server-cluster-1.0.jar
其中-Dspring.profiles.active启动参数,用于定义本次启动的Eureka Server应用的有效全局配置命名,也就是全局配置文件的后缀。SpringBOOT在启动的时候,会根据启动参数来决定读取的有效全局配置文件是哪一个。
Eureka Server安全认证
Eureka Server作为Spring Cloud中的服务注册中心,如果可以任意访问的话,那么其安全性太低。所以Spring Cloud中也有为Eureka Server提供安全认证的方式。可以使用spring-boot-starter-security组件来为Eureka Server增加安全认证。
POM依赖
<!-- spring boot security安全认证启动器 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> |
修改全局配置文件
在全局配置文件中,开启基于http basic的安全认证。
eurekaserver1配置
spring: application: eureka: |
eurekaserver2配置
spring: application: server: eureka: client:
|
修改启动类,根据官网的提示,关闭/eureka/**
的CSRF的令牌。
@EnableEurekaServer @SpringBootApplication public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } /** * 忽略此路径下的CSRF令牌 * */ @EnableWebSecurity static class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().ignoringAntMatchers("/eureka/**"); super.configure(http); } } }
打包测试
上述内容修改完毕后,需要重新打包工程并部署到Linux中启动测试。
基于CAP定理分析注册中心特性
什么是CAP定理
CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(数据一致性)、 Availability(服务可用性)、Partition tolerance(分区容错性),三者不可兼得。
CAP由Eric Brewer在2000年PODC会议上提出。该猜想在提出两年后被证明成立,成为我们熟知的CAP定理
分布式系统CAP定理 |
|
C |
也叫做数据原子性 优点: 数据一致,没有数据错误可能。 缺点: 相对效率降低。 |
A |
每一个操作总是能够在一定的时间内返回结果,这里需要注意的是"一定时间内"和"返回结果"。一定时间内指的是,在可以容忍的范围内返回结果,结果可以是成功或者是失败。 |
P |
在网络分区的情况下,被分隔的节点仍能正常对外提供服务(分布式集群,数据被分布存储在不同的服务器上,无论什么情况,服务器都能正常被访问) |
定律:任何分布式系统只可同时满足二点,没法三者兼顾。 |
|
CA,放弃P |
如果想避免分区容错性问题的发生,一种做法是将所有的数据(与事务相关的)/服务都放在一台机器上。虽然无法100%保证系统不会出错,但不会碰到由分区带来的负面效果。当然这个选择会严重的影响系统的扩展性。 |
CP,放弃A |
相对于放弃"分区容错性"来说,其反面就是放弃可用性。一旦遇到分区容错故障,那么受到影响的服务需要等待一定时间,因此在等待时间内系统无法对外提供服务。 |
AP,放弃C |
这里所说的放弃一致性,并不是完全放弃数据一致性,而是放弃数据的强一致性,而保留数据的最终一致性。以网络购物为例,对只剩下一件库存的商品,如果同时接受了两个订单,那么较晚的订单将被告知商品告罄。 |
Eureka和ZooKeeper的特性
对比项 |
Zookeeper |
Eureka |
描述 |
CAP |
CP |
AP |
ZooKeeper分布集群是使用主从模型实现的。在一个时间点上,只有一个leader真正的对外提供服务。其他的follower都会实时备份leader中的数据,当leader宕机,则follower选举出新的leader对外提供服务。 Eureka分布集群是平等模型(无主模型),所有的节点都是平等的,客户端访问任意节点都可以提供实时的服务响应。如果某节点发送宕机等故障,接收到的请求会转交给其他的节点。无主模型,每个节点的数据可能不实时一致,节点需要通过网络通讯从其他节点获取数据,并实现数据的一致。可能有网络延迟或网络故障或通讯频率问题。 |
Dubbo集成 |
已支持 |
- |
Dubbo开发的时候不需要考虑注册中心选择。 Spring Cloud中推荐使用Eureka作为注册中心,Eureka是由Spring Cloud子项目spring-cloud-netflix集成的。是Spring Cloud中的一个组件,会有针对性的服务提供和发现组件。 |
Spring Cloud集成 |
已支持 |
已支持 |
|
kv服务 |
支持 |
- |
ZK支持数据存储,eureka不支持 |
使用接口 (多语言能力) |
提供客户端 |
http多语言 |
ZK的跨语言支持比较弱 |
watch支持 |
支持 |
支持 |
什么是Watch支持?就是客户端监听服务端的变化情况。 zk通过订阅监听来实现 eureka通过轮询的方式来实现 |
集群监控 |
_ |
metrics |
metrics,运维者可以收集并报警这些度量信息达到监控目的 |
代码:
https://github.com/yucong/spring-cloud-learning/tree/master/eureka-server-cluster1
参考资料:
https://blog.lqdev.cn/2018/09/09/SpringCloud/chapter-three/