"阅读本文大约需要 5 分钟"
在微服务的架构中,服务发现是必不可少的基础功能。它可以帮助我们在各个服务之间交互时,动态获取当前服务的可用状态,同时在代码层面不必依赖于具体的服务信息,例如连接信息,ip 地址,端口等。解除了系统间耦合性。
Spring Cloud 作为微服务的整体解决框架,通过封装 Netflix 开源的 Eureka 框架,提供了服务发现功能。下面就让我们快速构建一个项目来熟悉 Spring Cloud 中 Eureka 如何使用。
Eureka Server
与我们之前介绍的 Spring Cloud Config 类似,Eureka 也是通过一个独立的 Server 来提供服务发现和注册服务的。因此我们需要先搭建一个 Eureka Server。
和往常我们介绍 Spring Boot 相关的项目类似,我们使用 Spring Initializr 来生成我们的项目骨架,在 Eureka Server 项目中我们只需要添加 eureka server 的依赖,如下图:
![](https://img.haomeiwen.com/i13688092/bc0becf2284b6174.png)
生成项目后,我们就可以开始添加配置。首先打开 Spring Boot Application 的文件,在类上增加 annotation @EnableEurekaServer
,来启用 Eureka Server。然后打开 application.yaml
,增加如下的配置:
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
上述配置中讲服务的端口设为 8761,同时配置了 eureka server 的地址。需要注意的配置选项是 register-with-eureka
和 fetch-registry
,它们都被设置为 false
。这里涉及到了 Eureka 运行模式的相关知识。
我们项目中 Eureka 的运行方式为 Standalone 模式,即单机模式。而 Eureka 的客户端会以心跳的形式向服务器端报告当前的服务状态,在默认情况下,eureka server 也是一个 eureka client,会向自己的发送心跳。通过上述提到的两个参数可以将心跳关闭,以及不获取已注册的服务信息。
除了 Standalone 模式以外 Eureka 还支持 Peer to Peer 模式,这也是 Eureka 的默认模式。在这种模式下 eureka server 能够搭建多个副本,提供较好的高可用性。
修改完配置后,可以在项目的当前目录下运行 ./mvnw spring-boot:run
来启动 eureka server。当服务器启动后,可以通过浏览器访问 http://localhost:8761/
来检验服务器是否启动正常。
Eureka Client
服务器端启动后,我们可以开始 eureka client 端的开发。还是老样子,通过 Spring Initializr 来添加项目依赖,如下图:
![](https://img.haomeiwen.com/i13688092/fc2191428479ec9f.png)
在这个项目中我们会开发一个简单的 REST 服务,并注册给 eureka server。我们先创建一个简单的 Controller,返回一个字符串,代码如下:
package com.blackfish.eurekacallee.web.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class GreetingController {
@GetMapping(value = "/greeting")
public String greeting() {
return "hello, world";
}
}
然后我们修改 application.yaml
配置文件,添加 eureka server 的配置,具体代码如下:
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: eureka-callee
先确保我们之前配置的 eureka server 正在运行,然后同样通过 ./mvnw spring-boot:run
来启动 client 项目,并注册服务。通过浏览器访问 http://localhost:8761
可以看到 eureka server 的当前状态,同时我们在也会看到刚刚启动的 eureka callee 实例已经被成功注册到 eureka server 了。
获取服务信息
接着我们会运行第三个服务,从 eureka server 获取已经注册的服务信息。与第二个 client 端项目类似,我们添加依赖,然后添加一个 Controller,具体代码如下:
package com.blackfish.eurekacaller.web.controller;
import com.netflix.appinfo.InstanceInfo;
import com.netflix.discovery.EurekaClient;
import com.netflix.discovery.shared.Application;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class FindGreetingController {
@Autowired
private EurekaClient eurekaClient;
@GetMapping(value = "/find/greeting")
public String findGreeting() {
Application greetingApplication = eurekaClient.getApplication("EUREKA-CALLEE");
return greetingApplication.getInstances().get(0).getHomePageUrl();
}
}
上面的代码中我们使用 EurekaClient
来获取一个 application 的实例,其中传入的参数是另一端的 application name。在获取 application 对象后,便能够获取对应该 application 一系列可用的 instance。在我们项目中我们只部署了一个 instance,我们会返回 instance 的 home page url 信息。
项目的 application.yaml
配置也很简单,只是修改了默认端口防止冲突,以及 application name,具体如下:
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: eureka-caller
server:
port: 8081
结语
在 Spring Boot 中可以非常方便的配置和使用 Eureka 作为服务发现的解决方案,上面我们通过一个简单的示例工程演示了如何搭建 eureka server 和 client 进行服务注册和调用。在实际项目中 Eureka 的服务端搭建需要配置高可用,而客户端也可以与 Netflix 的其他组件相搭配,从而满足更多高级特性的需要。如果想了解 Eureka 的更多高级使用技巧,以及更多的 Spring Cloud 的应用经验,就赶快关注我们的公众号吧!
![](https://img.haomeiwen.com/i13688092/24a7eb1e78c6f3da.png)
网友评论