外行人都能看得懂的Spring Cloud服务注册与发现,错过了血亏!

来自:程序员私房菜(微信号:eson_15),作者:倪升武

Spring Cloud 中的服务与发现使用的是 Eureka,什么是 Eureka 呢?我们先来看看官方的解释,然后再看看我的解释。


1. 什么是Eureka(官方版)


Eureka 是 Netflix 的一个子模块, 也是核心模块之一,Eureka 是一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。服务注册与发现对于微服务架构来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了。


而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server 并维持心跳连接。这样系统的维护人员可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。Spring Cloud 的一些其他模块就可以通过 Eureka Server 来发现系统中的其他微服务,并执行相关的逻辑。


是不是看着很别扭?很拗口?看看武哥版的解释。


2. 什么是Eureka(武哥版)


现在有很多创业公司,很多城市都鼓励大学生创业,政府搞了一些经济开发区,里面有很多写字楼,那么这些创业公司就可以注册到经济开发区大楼,租一间写字楼作为自己的办公地点。


那么这里的创业公司就相当于微服务,而开发区大楼的注册登记表就相当于 Eureka。


每个创业公司都要定期向开发区负责人或者机构交房租和物业费,如果某个创业公司不交物业费了,那么该开发区大楼负责人员就会去要,若多次不给,那么就会将其移出开发区大楼。这就是 Eureka 的心跳机制。


这样是不是就能明白其原理了?接下来看下 Eureka 的架构图,从宏观上把握一下。


3. Eureka的架构图


Eureka 架构本身主要包含两个组件:Eureka Server 和 Eureka Client,分别表示服务端和客户端。如下图所示:



Eureka Server 提供服务注册服务,各个节点启动后,会在 Eureka Server 中进行注册,这样 Eureka Server 中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在 Eureka 的界面(下文会说明)中直观的看到。这就相当于经济开发区的注册登记表,简称“花名册”


Eureka Client 是一个 Java 客户端,用于简化 Eureka Server 的交互,在应用启动后,将会向 Eureka Server 发送心跳。如果Eureka Server 在多个心跳周期内没有接收到某个节点的心跳。Eureka Server 将会从服务注册表中把这个服务节点移除。这就相当于创业公司交房租费,你多次不交,那就不好意了


4. Eureka架构的实现


根据上面的架构图,我们来搭建一下 Eureka Server和Eureka Client


Eureka Server端


我们新创建一个服务,一般分三步走:导入依赖、配置文件、启动注解。首先导入依赖:我们用的 Spring Cloud 版本是 Finchley,依赖如下:


<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>


接下来是 Spring Boot 项目配置文件:application.yml


server:
 port7001

eureka:
 instance:
   #eureka服务端的实例名称
   hostname: eureka01
 client:
   # false表示不向注册中心注册自己
   register-with-eureka: false
   # false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
   fetch-registry: false
   service-url:
     #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址(单机)。
     defaultZonehttp://${eureka.instance.hostname}:${server.port}/eureka/


我们定义 Eureka Server 的服务端口为7001,然后定义了 Eureka 服务的服务名以及该服务的地址。相关信息见上面的注释。当然咯,要在hosts文件中配置 127.0.0.1 和 eureka01 的映射。


最后在 Spring Boot 工程的启动类中添加 @EnableEurekaServer 注解,表示该服务是 Eureka Server,接受其他微服务注册进来。如下:


/**
* eureka-server
@author shengwu ni
* '@EnableEurekaServer' 注解表示服务器端启动类,接受其他微服务注册进来
*/

@SpringBootApplication
@EnableEurekaServer
public class EurekaServer01 {

   public static void main(String[] args) {
       SpringApplication.run(EurekaServer01.class, args);
   }
}


OK,接下来启动服务,在浏览器输入eureka01:7001,如果出现下面的网页,说明 Eureka server 服务OK。这就是 Eureka 的可视化界面,可以监控一些注册进来的服务信息。



Eureka Client 端


Eureka Client 端即服务的提供方,将自身服务注册到 Eureka Server,从而使服务消费方能够找到。


创建 Eureka Client,还是分三步走:导入依赖、配置文件、启动注解。Eureka Client 端所依赖的注解如下:


<!--eureka-client客户端-->
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>


项目配置文件需要添加如下信息:


spring:
 application:
   name: microservice-order # 对外暴露的服务名称

# 客户端注册进eureka服务列表里
eureka:
 client:
   service-url:
     defaultZonehttp://eureka01:7001/eureka/


可以看到,我们给该服务起了个名称,该名称是服务对外暴露的名称。除此之外,我们指定了将该 Client 端注册到哪个 Eureka 服务列表里。


这里的 http://eureka01:7001/eureka/ 就是上面我们定义的 Eureka Server 的服务地址。这样就可以将 Eureka Client 端和 Eureka Server 端联系起来了。


最后在 Spring Boot 工程的启动类中添加 @EnableEurekaClient 注解,表示该服务是 Eureka Client,启动后会自动注册到指定的 Eureka Server。如下:


/**
* 订单服务
@author shengwu ni
* "@EnableEurekaClient" 服务启动后会自动注册到eureka服务中心
*/

@SpringBootApplication
@EnableEurekaClient
@MapperScan("com.itcodai.springcloud.dao")
public class OrderProvider01 {

   public static void main(String[] args) {
       SpringApplication.run(OrderProvider01.class, args);
   }
}


现在我们将 Eureka Server 和 Eureka Client 端都写好了,来测试一下,刚刚 Eureka Server 端已经启动了,现在我们来启动一下这个 OrderProvider01 服务,然后刷新一下 Eureka 可视化界面即可看到该服务已经注册进来了。



以看出,已经有个微服务注册进来了,名字为:MICROSERVICE-ORDER。这个名字从哪来的呢?还记得上面 Eureka Client 中的配置文件吗?里面指定了暴露的服务名称,只不过 Eureka 里默认全部大写而已。也可以看出,该服务的端口是8001。


OK,Spring Cloud 的 Eureka 服务注册中心就介绍这么多。

推荐↓↓↓
Java编程
上一篇:Netty、MINA、Twisted一起学系列01:实现简单的TCP服务器 下一篇:Java人才市场年度盘点:转折与终局