下面是 Spring Cloud Eureka 服务发现实现过程的详细攻略。
1. 什么是 Spring Cloud Eureka
Spring Cloud Eureka 是 Spring Cloud 项目中比较重要的组件之一,它是一个服务注册和发现的组件。简单来说,就是服务提供者将自己的信息(比如服务地址、端口号等)注册到 Eureka 中心服务器上去,服务消费者从 Eureka 中心服务器上查询可用的服务提供者信息,以完成调用。
2. Spring Cloud Eureka的核心特性:
- 服务注册和发现:Spring Cloud Eureka 作为服务的注册中心和发现中心,可以管理各个微服务实例的注册和注销。
- 负载均衡:Spring Cloud Eureka 在服务发现的基础上,对服务的负载均衡提供了支持。
- 自动失效剔除:Spring Cloud Eureka 提供了自动失效剔除的能力,即当某个微服务实例在一定时间内没有向 Eureka 续约,就会自动从 Eureka 服务端的服务列表中剔除。
3. Spring Cloud Eureka 服务发现实现过程
3.1 pom.xml 加依赖
在使用 Eureka 前,需要先在 pom.xml 中引入以下依赖:
<!-- Eureka 服务发现组件 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
3.2 application.yml 配置
在配置文件中配置 Eureka 的客户端和服务端:
- Eureka服务端
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
- Eureka客户端
server:
port: 8001
spring:
application:
name: eureka-client
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
3.3 主启动类配置
在主启动类上添加@EnableEurekaServer注解开启 Eureka服务端的功能。如下:
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
3.4 Eureka REST服务接口
# 查看所有服务信息列表
GET http://localhost:8761/eureka/apps
# 查看某个服务的信息
GET http://localhost:8761/eureka/apps/{serviceName}
3.5 搭建 Eureka客户端
- 引入 Eureka 客户端依赖
在 pom.xml 中加入以下依赖:
<!-- 引入 Eureka 客户端依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 配置文件中配置 Eureka 客户端信息
server:
port: 8001
spring:
application:
name: eureka-client
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
- 在主启动类上添加@EnableDiscoveryClient开启客户端服务发现功能。如下:
@SpringBootApplication
@EnableDiscoveryClient
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
- 在客户端 Controller 中加入获取服务信息接口
@RestController
@RequestMapping("/client")
public class EurekaClientController {
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/info")
public Object getInfo() {
List<ServiceInstance> list = discoveryClient.getInstances("eureka-client");
if (list != null && !list.isEmpty()) {
return list.get(0);
}
return null;
}
}
3.6 Eureka 客户端如何调用服务
在客户端中可以通过 RestTemplate 实现服务调用。具体代码如下:
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/getProduct")
public String getProduct() {
String url = "http://eureka-client/product/get";
String result = restTemplate.getForObject(url, String.class);
return result;
}
}
在上述代码中,我们使用 RestTemplate 以 HTTP 方式进行调用,调用的 URL 是另一台服务(eureka-client)的 /product/get 接口。
4. 示例说明
在这里,我们以一个简单的服务提供者和服务消费者为例,来展示 Spring Cloud Eureka 的服务注册、发现、调用流程。
4.1 客户端服务提供者
假设我们有一个名为 Product 的服务提供者,监听端口为 8080,提供一个 /get 接口:
@RestController
@RequestMapping("/product")
public class ProductController {
@GetMapping("/get")
public String getProduct() {
return "Product Info";
}
}
4.2 服务器端
我们编写一个名为 EurekaServer 的服务端,监听端口为 8761。在这个 EurekaServer 中,Eureka 注册中心默认的 /eureka/** URL 支持程序的注册和发现。从 EurekaServer 的 log 可以看到,这个注册中心已经在启动并成功接收了 Product 的服务注册请求。
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
4.3 客户端服务消费者
接下来,我们编写一个名为 Order 的服务消费者,监听端口为 8081,并向 Eureka 注册中心注册自己:
@SpringBootApplication
@EnableDiscoveryClient
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
在 OrderController 中通过 RestTemplate 实现服务调用:
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/getProduct")
public String getProduct() {
String url = "http://product-service/product/get";
String result = restTemplate.getForObject(url, String.class);
return result;
}
}
在上述的调用代码中,我们使用 RestTemplate 以 HTTP 方式进行调用,调用的 URL 是另一台服务(product-service)的 /product/get 接口。
5. 总结
通过以上实例,我们展示了 Spring Cloud Eureka 的服务注册、发现、调用流程。需要注意的是,每个服务在注册到 Eureka Server 时,都要给自己注册进 Eureka Server 独立的 applicationName,并且每一个 applicationName 会被视为一个微服务。
希望本文能够帮助你更好地了解 Spring Cloud Eureka 的使用方法,以及它在微服务架构中的重要作用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringCloud Eureka服务发现实现过程 - Python技术站