注册中心作为微服务架构中的核心功能,其重要性不言而喻。所以单机版的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:
  application:
    name: eureka-server1
  

server:
  port: 8762

eureka:
  instance:
    # 定义Eureka Server实例在注册中心中的命名。建议使用配置文件的后缀定义。
    hostname: eurekaserver1

  # 配置集群中其他Eureka Server节点的信息。如果需配置多节点,使用逗号','分割多个节点信息。
  # 节点的信息格式为: http://地址:端口/eureka/ 。 地址可以使用IP、域名、主机名定义。
  # 使用HTTP Basic语法,提供安全认证中需要使用的用户名和密码。
  # 语法是: http://用户名:密码@地址:端口/eureka/
  client:
    service-url:
      defaultZone: http://eurekaserver2:8763/eureka/

eurekaserver2配置

spring:
  application:
    name: eureka-server2
  

server:
  port: 8763

eureka:
  instance:
    hostname: eurekaserver2

  client:
    service-url:
      defaultZone: http://eurekaserver1:8762/eureka/

打包工程形成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:
    name: eureka-server1
  security:
    user:
      # 设定安全认证的用户名
      name: yucong
      # 设定安全认证的密码
      password: 123456

server:
  port: 8762

eureka:
  instance:
    # 定义Eureka Server实例在注册中心中的命名。建议使用配置文件的后缀定义。
    hostname: eurekaserver1

  # 配置集群中其他Eureka Server节点的信息。如果需配置多节点,使用逗号','分割多个节点信息。
  # 节点的信息格式为: http://地址:端口/eureka/ 。 地址可以使用IP、域名、主机名定义。
  # 使用HTTP Basic语法,提供安全认证中需要使用的用户名和密码。
  # 语法是: http://用户名:密码@地址:端口/eureka/
  client:
    service-url:
      defaultZone: http://yucong:123456@eurekaserver2:8763/eureka/

eurekaserver2配置

spring:

  application:
    name: eureka-server2
  security:
    user:
      name: yucong
      password: 123456

server:
  port: 8763

eureka:
  instance:
    hostname: eurekaserver2

  client:
    service-url:
      defaultZone: http://yucong:123456@eurekaserver1:8762/eureka/

修改启动类,根据官网的提示,关闭/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
数据一致性
(Consistency)

也叫做数据原子性
系统在执行某项操作后仍然处于一致的状态。在分布式系统中,更新操作执行成功后所有的用户都应该读到最新的值,这样的系统被认为是具有强一致性的。等同于所有节点访问同一份最新的数据副本。

优点: 数据一致,没有数据错误可能。

缺点: 相对效率降低。

A
服务可用性
(Availablity)

每一个操作总是能够在一定的时间内返回结果,这里需要注意的是"一定时间内"和"返回结果"。一定时间内指的是,在可以容忍的范围内返回结果,结果可以是成功或者是失败。

P
分区容错性
(Partition-torlerance)

在网络分区的情况下,被分隔的节点仍能正常对外提供服务(分布式集群,数据被分布存储在不同的服务器上,无论什么情况,服务器都能正常被访问)

定律:任何分布式系统只可同时满足二点,没法三者兼顾。

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/

搭建集群版Eureka Server的更多相关文章

  1. SpringCloud的入门学习之Netflix-eureka(Eureka的集群版搭建)

    1.Eureka单机版的话,可能会出现单点故障,所以要保障Eureka的高可用,那么可以进行搭建Eureka的集群版. 高可用的Eureka的注册中心,将注册中心服务部署到多台物理节点上,形成一个集群 ...

  2. redis单机版和集群版搭建笔记-简略版

    搭建单机版: 解压 tar -zxf redis-3.0.0.tar.gz 编译 cd redis-3.0.0 安装 make install prefix=/usr/local/redis-inst ...

  3. spring cloud系列教程第六篇-Eureka集群版

    spring cloud系列教程第六篇-Eureka集群版 本文主要内容: 本文来源:本文由凯哥Java(kaigejava)发布在博客园博客的.转载请注明 1:Eureka执行步骤理解 2:集群原理 ...

  4. JAVAEE——宜立方商城08:Zookeeper+SolrCloud集群搭建、搜索功能切换到集群版、Activemq消息队列搭建与使用

    1. 学习计划 1.solr集群搭建 2.使用solrj管理solr集群 3.把搜索功能切换到集群版 4.添加商品同步索引库. a) Activemq b) 发送消息 c) 接收消息 2. 什么是So ...

  5. solrcloud集群版的搭建

    说在前面的话 之前我们了解到了solr的搭建,我们的solr是搭建在tomcat上面的,由于tomcat并不能过多的承受访问的压力,因此就带来了solrcloud的时代.也就是solr集群. 本次配置 ...

  6. Redis单机版以及集群版的安装搭建以及使用

    1,redis单机版 1.1   安装redis n  版本说明 本教程使用redis3.0版本.3.0版本主要增加了redis集群功能. 安装的前提条件: 需要安装gcc:yum install g ...

  7. docker下搭建fastfds集群版

    搭建过程参考 作者 https://me.csdn.net/feng_qi_1984 的课程视频 声明:集群版是在我之前写的单机版基础之上进行搭建的,我将安装了fastfds单机版的docker打包成 ...

  8. 快速搭建redis单机版和redis集群版

    单机版 第一步:需要安装redis所需的C语言环境,若虚拟机联网,则执行 yum install gcc-c++ 第二步:redis的源码包上传到linux系统 第三步:解压缩redis   tar ...

  9. 阿里云重磅发布RDS for SQL Server AlwaysOn集群版

    2018年双十一刚过,阿里云数据库发布RDS for SQL Server AlwaysOn集群版,这是业界除微软云SQL Database外,首家云计算公司基于SQL Server最新AlwaysO ...

随机推荐

  1. [笔记]动态规划(dynamic programming)

    动态规划与分治方法都是通过组合子问题的解来求解原问题,区别在于:分治方法将问题划分为互不相交的子问题,递归求解子问题,再将它们的解组合起来,求出原问题的解.分治算法可能反复的求解某些公共子问题,从而使 ...

  2. Android_(控件)使用Gallery浏览手机上SD卡中图片

    运行截图: (发现后面两张照片是自己自拍,大写的尴尬对图片进行涂鸦了!!!) 程序结构: <?xml version="1.0" encoding="utf-8&q ...

  3. python接口自动化:pycharm中import yaml报错问题解决

    一:问题 python3在cmd命令行中已经安装了yaml,且import yaml是成功的,但是pcharm中import yaml还是红色报错 二:分析原因 pycharm和python环境需要分 ...

  4. [学习笔记] MRF 入门

    MRF马尔科夫随机场入门 Intro MRF是一种广泛应用于图像分割的模型,当然我看到MRF的时候并不是因为分割,而是在图像生成领域,有的paper利用MRF模型来生成图像,因此入门一下MRF,并以分 ...

  5. Vue -3:单文件组件

    在很多 Vue 项目中,我们使用 Vue.component 来定义全局组件,紧接着用 new Vue({ el: '#container '}) 在每个页面内指定一个容器元素. 这种方式在很多中小规 ...

  6. 后端脚手架搭建--SSM(一)开篇

    一.絮叨 一直在计划自己搭建一个后台的管理系统脚手架,也已经开始着手做了,但是做的过程中一直出现混乱的状态.在前端技术选型的时候觉得Vue不错,然后去学了一段时间的Vue,准备拿来在项目里面用.然后又 ...

  7. linux添加用户所在群组

    etc目录下面有两个文件一个passwd一个grouppasswd里gid是主组,其他组是扩展组,扩展组在/etc/group里描述.useradd username如果不指定,默认创建一个与uid相 ...

  8. 前端Ajax跨域解决方案

    业务场景: 前后端分离需要对接数据接口. 接口测试是在postman做的,今天才开始和前端对接,由于这是我第一次做后端接口开发(第一次嘛,问题比较多)所以在此记录分享我的踩坑之旅,以便能更好的理解,应 ...

  9. Ceph RBD 的实现原理与常规操作

    目录 文章目录 目录 前文列表 RBD RBD Pool 的创建与删除 块设备的创建与删除 块设备的挂载与卸载 新建客户端 块设备的扩缩容 RBD 块设备的 Format 1 VS Format 2 ...

  10. SELECT * 测试

    描述 大家通常禁止在生产环境直接使用select * 已成常识了,也常常在开发规范中就会规定不允许直接使用select *,那么我们为什么不允许使用select * ,在一些什么场景下select * ...