上一篇笔记写到的两个问题,Netfilx-Eureka和Ribbo会给我们一一解决。如果有看过dubbo 应该知道zookeeper,Eureka的角色就是zookeeper。
Eureka和Zookeeper主要都是作为微服务的注册和发现。
Eureka和Zookeeper不一样的是,Zookeeper是作为一个单独的应用程序,而Eureka是直接嵌套在SpringCloud当中的。所以 Eureka Server本身就是一个SpringBoot的项目。
一、服务注册和发现概念
上面的图是我网上找的。由于微服务的地址变革可能会影响很大,所以就引入了服务注册中心的角色。所有服务提供者必须将IP地址或者主机名注册到服务器注册中心当中,我们使用注册中心就是Eurika Server。服务的消费者在调用服务器之前,先要到服务注册中心查询服务提供者的网络地址信息,然后进行调用,这个原理非常相似于我们的DNS。获得服务提供者的网络地址的操作,我们称为服务发现。服务注册中心一般提供一下功能组件:
1、服务注册表:记录各个微服务的信息,例如名称、网络地址、端口号等。服务器注册表提供查询和管理的API,用于管理和查询可用的微服务实例。
2、服务注册和发现:刚刚已经说过了,微服务在启动时,将自己的信息注册到服务器注册中心当中。在消费者可以通过服务注册中心发现服务实例。
3、服务检查:检查微服务的健康情况,如果微服务实例在一段时间没有心跳信息,就会从服务实例注册表中移除该实例。
二、Eureka
Eureka是Netfilx开源的服务发现组件,本身是基于REST的服务。包含Server和Client两个部分。SpingCloud 将其集成到SpringCloud Netflix子项目中。
Eureka有两个概念分别 Region和Availability Zone。他们都是Amazon AWS的概率。其中,Region表示AWS中的地理位置,每个Region都有多个Availability Zone,各个Region之间完全隔离。
Spring Cloud 默认使用的Region是us-east-1,在非AWS环境下,可以将Availability Zone理解成机房,将Region理解为夸机房的Eureka集群。
三、Eureka Server 和 Client
Eureka Server 提供服务器的发现的能力,各个微服务启动时,都会在Eureka Server中注册自己的信息,Eureka Server 会将这些信息存储到注册表当中。
Eureka Client 这个就是一个JAVA客户端,用于简化于Eureka Server的交互。当然如果你的微服务是跨平台的,各个服务存在不同的开发语言,那就只能通过REST的方式去与Eureka Server进行交互了。REST不是我们的重点,因为我们作为一个JAVA狗,Eureka Client足够简化我们的操作。
以下是笔者的从参考书中摘录的重点概念:
1、微服务启动后,会周期性向Eureka Server 发送心跳信息默认是30秒。如果Eureka在一定的时间内(默认90秒)无法获得实例的心跳信息,Eureka Server 将会注册该实例。
2、默认情况下,Eureka Server 同时也是Eureka Client。多个Eureka Server实例,互相之间通过复制的方式,来实现服务注册表的同步。
3、Eureka Client 会缓存服务注册表中的信息。这样有非常多的好处,微服务无需每次都请求查询Eureka Server,从而降低Eureka Server的服务压力和网络压力;即使所有Eureka Server都挂了,Eureka Client还是可以根据自己的缓存注册表自给自足。
四、动手编写Eureka Server
笔者此事已经开了第三个IDE了,我的MacBook的内存开始吃不消了。建议这些还是在内存比较大的计算机上进行测试,而且同时去编译和加载会导致非常耗时间。唉··· 一会还要再加多一个Eureka Server 做高可用,呵呵!搞事情!
在Maven上我们的依赖配置如下:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency>然后在配置类当中打上@EnableEurekaServer
@SpringBootApplication @EnableEurekaServer public class EurekaserveraApplication { public static void main(String[] args) { SpringApplication.run(EurekaserveraApplication.class, args); } }最后配置一下我们的application.properties
server.port=8761 eureka.client.register-with-eureka=false eureka.client.fetch-registry=false eureka.client.service-url.defaultZone=http://lcoalhost:8761/eureka/
端口就不说了看看其他配置是什么回事:
1、register-with-eureka 这个配置是否将自己的注册到Eureka Server当中,默认true。由于当前应用就是Eureka Server 所以为false
2、fetch-registry 表示是否从Eureka Server 中获得注册信息,默认为true。目前是单点Eureka Server 所以不需要和其他Eureka Server 节点做同步,所以为false
3、service-url.default-zone 设置与Eureka Server交互的地址,查询服务和注册服务都依赖这个地址。如果多个地址即多个Eureka Server节点需要用“,”分隔。默认是http://localhost:8761/eureka
配置完成,跑起!
需要注意的是,笔者之前是使用最新的SpringCloud版本1.5.4.RELEASE 但是实际当我打开页面的过程当中发现无法打开上面的UI界面,只是有一个XML。笔者在查找了很多网上的资料后,也无法解决。但是在stackoverflow中我找到了一个帖子,说将其降级到1.5.2.RELEASE就正常出现页面了。至于1.5.4为什么不可以显示,可能后续我会有所补充。但是1.5.4其他的功能还是正常可以使用的。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>改成:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
五、Eureka Server 高可用
Eureka Server作为一个服务注册中心当然是不允许出现单点异常的,所以Eureka Server 做高可用是一个必须的操作。上面已经介绍过Eureka Server高可用的理论了,现在就操作一下。环境上笔者就不搞两台设备来做了,笔者会在hosts文件当中添加两条记录,表示当前的两台计算机的主机名:
127.0.0.1 eurekaservera eurekaserverb
然后在同一个项目当中配置两个profile,然后通过不同的profile分别代表eureka-servera、eureka-serverb的配置,然后分别启动。不清楚profile的可以看看我之前的SpringBoot的笔记SpringBoot系列(5)---SpringBoot-Web和SpringBoot基础 搜索profile即可。