本文将详细介绍Eureka作为服务注册与发现的核心组件,包括Eureka的概念和架构、安装和配置、服务注册和发现、高可用和负载均衡等方面的内容。通过学习本章,读者可以了解Eureka的原理和使用方法,掌握在微服务架构中实现服务注册与发现的技术。
一、注册中心简介
1.1 什么是注册中心
注册中心是微服务架构中的一个关键组件,它是一个集中式的存储库,用于保存微服务实例的相关信息,包括服务名称、服务实例的网络地址(如 IP 地址和端口号)、服务版本、服务状态等。
注册中心充当了服务提供者和服务消费者之间的中介,服务提供者在启动或运行时将其自身的信息注册到注册中心,服务消费者则从注册中心获取可用的服务实例信息,从而实现服务的发现和调用。
通过注册中心,微服务架构能够实现服务的动态管理、灵活扩展和高效通信,提高了系统的弹性、可维护性和可用性。
在微服务架构中,通常存在注册中心、服务消费者以及服务提供者三个基本角色,结构如下图所示。
- 服务提供者:负责将自身服务的相关信息,如服务名称、服务地址(IP 和端口)、服务版本、服务健康状态等,注册到注册中心。并持续向注册中心发送心跳信息以表明自身的可用性。
- 注册中心:作为服务信息的存储和管理中心,接收并存储服务提供者注册的信息。对服务提供者的心跳进行监测,以确定服务的可用性,并及时清理不可用的服务实例信息。响应服务消费者的查询请求,提供可用的服务实例列表。
- 服务消费者:从注册中心获取所需服务的实例信息。根据一定的策略(如负载均衡策略)选择合适的服务实例进行调用。处理服务调用过程中的异常情况,如所选服务实例不可用,重新从注册中心获取新的可用实例。
1.2 为什么需要注册中心
随着互联网的演进,应用系统的规模持续扩张,常规的垂直应用架构已难以应对当前的需求,分布式微服务架构的推行势在必行。从常规应用架构向微服务架构转变的过程中,会产生以下几个问题:
(1)动态服务管理:在微服务架构中,服务实例的数量和状态经常动态变化。服务注册中心能够集中管理这些动态信息,使得服务的上线、下线、扩缩容等操作能够被及时感知和处理。
(2)服务发现效率:没有注册中心,服务消费者需要通过复杂的方式去查找服务提供者的位置和信息,效率低下且容易出错。注册中心提供了一个集中的、快速可查的服务信息库,大大提高了服务发现的效率。
(3)解耦服务提供者和消费者:服务提供者无需直接向每个消费者告知自身的变化,消费者也不必事先硬编码服务提供者的信息。通过注册中心,两者实现了解耦,使得系统更具灵活性和可维护性。
(4)负载均衡支持:注册中心可以提供服务实例的列表,服务消费者基于此结合负载均衡策略选择合适的实例进行调用,有助于实现更均匀的资源利用和性能优化。
(5)故障容错:当某个服务实例出现故障时,注册中心能够及时将其标记为不可用,服务消费者就不会调用到故障实例,从而提高系统的容错能力。
(6)统一管理和监控:注册中心集中了服务的相关信息,便于进行统一的管理、监控和统计,有助于及时发现和解决系统中的问题。
以上问题促使了注册中心的诞生。需要有一个能够实现动态注册和获取服务信息的组件,用于统一管理服务名称及其对应的服务器列表信息(即服务配置中心)。
二、Eureka简介
2.1 什么是Eureka
Eureka 是Netflix开源的微服务框架中的服务注册与发现框架,它负责定位服务实例的位置和状态信息。除此之外,Eureka还具备负载均衡和故障转移的能力。作为Netflix开源的服务发现与治理框架,Eureka在实际应用中展现出了极高的可用性。
Spring Cloud 将 Eureka 集成在其子项目 spring-cloud-netflix 中,使其成为了 Spring Cloud 框架中重要的服务发现组件,被广泛应用于各种微服务架构的项目中。
- 高可用性,Eureka 采用了分布式架构,多个 Eureka 服务器节点可以共同工作,即使部分节点出现故障,也不会影响整个系统的服务注册与发现功能。
- 灵活性,Eureka 支持多种服务注册和发现的方式,可以根据实际需求进行灵活配置。同时,Eureka 也支持自定义的健康检查机制,以适应不同的业务场景。
- 易于集成,Eureka 与 Spring Cloud 等微服务框架紧密集成,使用起来非常方便。同时,Eureka 也提供了丰富的 API,方便开发者进行二次开发和定制。
通过 Eureka,微服务架构中的服务能够自动感知彼此的存在和状态,无需手动配置服务的地址信息,大大提高了系统的灵活性和可扩展性。
2.2 Eureka的架构原理
Eureka最核心的作用是服务的组成和发现,那么它是如何实现这么复杂的功能的呢?我们先来看看Eureka的架构图,如图4-3所示。
Eureka采用了客户端/服务器(C/S)的设计架构,它由两个核心组件构成:Eureka Server和Eureka Client。
- Eureka Server充当服务注册中心的角色,
- Eureka Client则是微服务架构中的客户端,包括服务消费者(Application Client)和微服务提供者(Application Service)。
三、搭建Eureka注册中心
在探讨完注册中心的基本概念、注册中心的必要性、其功能作用,以及 Spring Cloud 框架中所提供的服务注册中心组件 Eureka 之后,接下来便着手开展第一个项目。通过动手实践,于实践过程中进行学习,在应用过程中有所领悟,进而逐步深入地理解注册中心的核心原理以及 Eureka 的具体应用。
3.1 创建Eureka注册中心
接下来,通过示例演示如何创建Eureka注册中心。在开始之前需要说明Spring Boot和Spring Cloud使用的版本信息:
- Spring Boot:2.3.7.RELEASE
- Spring Cloud:Hoxton.SR5
手动新建父工程0401-spring-cloud-eureka-server后,引入Spring Boot和Spring Cloud等组件。
第一步:创建Spring Boot项目
在上面创建的父工程0401-spring-cloud-eureka-server中创建Eureka Server服务端模块:springcloud-eureka-server作为EurekaServer服务注册中心,如图下所示。
第二步:添加依赖
修改项目中的pom.xml文件,添加spring-cloud-starter-netflix-eureka-server等依赖,示例代码如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
第三步:修改启动类
修改EurekaServerApplication.java启动类,使用@EnableEurekaServer注解创建Eureka服务注册中心,示例代码如下:
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args
);
}
}
第四步:修改系统配置
修改application.properties配置文件,增加Eureka相关配置,主要是设置Eureka的服务端口,服务名等配置。示例代码如下:
spring.application.name=eureka-server
server.port=8761
第五步:验证测试
配置完Eureka Server服务之后,接下来验证服务是否正常可用。启动项目,在通过浏览器访问http://localhost:8761,浏览器显示正常的Eureka-Server服务管理平台,如图下所示。说明Eureka Server服务注册中心搭建成功。
以上,Eureka的注册中心服务搭建成功,接下来开始搭建服务提供者。
3.2 构建服务提供者
我们已经成功搭建了Eureka服务注册中心的环境。当前,在Eureka的后台管理界面上,注册的服务列表为空,这表明目前还没有客户端服务完成注册。为了进一步演示Eureka的功能,接下来创建一个服务提供者(Service Provider),并将其注册到Eureka服务注册中心。
第一步:创建Spring Boot项目
在上面创建的父工程0401-spring-cloud-eureka-server中创建Eureka Client客户端模块:springcloud-service-provider作为服务提供方,如图4-8所示。
第二步:添加依赖
修改项目中的pom.xml文件,添加spring-cloud-starter-netflix-eureka-client等依赖,示例代码如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
第三步:修改启动类
修改ProviderServiceApplication.java启动类,使用@EnableEurekaClient注解打开Eureka Client客户端,示例代码如下:
@SpringBootApplication
@EnableEurekaClient
public class ProviderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderServiceApplication.class, args
);
}
}
第四步:修改系统配置
修改application.properties全局配置文件,设置Eureka注册中心的地址以及服务提供者Provider的服务名等配置,示例代码如下:
spring.application.name=service-provider
server.port=8080
#设置服务注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
第五步:创建服务接口
服务提供者顾名思义就是提供服务的一方。我们以获取用户列表信息为例,创建一个获取用户列表信息的接口。创建UserController类并添加getUserList接口。示例代码如下所示:
@RestController
public class UserController {
@RequestMapping("/getUserList")
public String getUserList(){
return "服务提供者getUserList成功";
}
}
第六步:验证测试
创建了服务提供者springcloud-service-provider,接下来验证此服务是否能注册到Eureka服务注册中心。
首先启动注册中心eureka-server,再启动服务提供者eureka-provider,两个模块启动成功后,通过浏览器访问http://localhost:8761,在Eureka服务管理页面看到刚启动的SERVICE-PROVIDER服务,如图4-9所示。这说明服务提供者eureka-provider已经成功注册到eureka-server注册中心。
需要注意的是,eureka-server注册中心必须先启动,然后再启动服务提供者eureka-provider,否则会启动失败。
3.3 构建服务消费者
创建完服务提供者,接下来我们开始构建Consumer服务消费者,调用服务提供者eureka-provider的获取人员列表接口。
第一步:创建Spring Boot项目
在上面创建的父工程0401-spring-cloud-eureka-server中创建Eureka Client客户端项目:springcloud-service-consumer作为服务消费者,如图下所示。
第二步:添加依赖
修改项目中的pom.xml文件,添加spring-cloud-starter-netflix-eureka-client等依赖,示例代码如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
第三步:修改启动类
修改ConsumerServiceApplication.java启动类,使用@EnableEurekaClient注解打开Eureka Client客户端,示例代码如下:
@SpringBootApplication
@EnableEurekaClient
public class ConsumerServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerServiceApplication.class, args
);
}
}
第四步:修改系统配置
修改application.properties全局配置文件,设置Eureka注册中心的地址以及服务消费者Consumer的服务名等配置,示例代码如下:
spring.application.name=service-consumer
server.port=8081
#设置服务注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
第五步:创建订单服务接口
接下来,创建服务消费者的服务,这里我们以获取订单服务为例,创建一个获取获取订单的接口,同时此服务会调用服务提供者的获取用户列表接口。
首先,创建OrderController控制器,添加获取订单列表getOrderList,然后在接口中调用服务提供者eureka-provider中的getUserList接口。示例代码如下所示:
@RestController
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient;
@RequestMapping("/getOrderList")
public String getOrderList(){
//选择调用的服务的名称
//ServiceInstance 封装了服务的基本信息,如 IP,端口
ServiceInstance si = this.loadBalancerClient.choose("service-provider");
//拼接访问服务的URL
StringBuffer sb = new StringBuffer();
//http://localhost:9090/user
sb.append("http://").append(si.getHost()).append(":").append(si.getPort()).append("/getUserList");
//ResponseEntity:封装了返回值信息
ResponseEntity<String> response = restTemplate.exchange(sb.toString(), HttpMethod.GET, null, String.class);
return response.getBody();
}
}
上面的示例中,使用LoadBalancerClient类的choose方法从Eureka的服务列表中找到对应的服务信息,在使用RestTemplate发起Http请求。
第六步:验证测试
上面创建了服务消费者,并实现了调用提供者的getUserList接口,接下来验证此服务是否能注册到Eureka服务注册中心,是否能调用服务提供者中的相关接口。
首先启动注册中心eureka-server,然后启动服务提供者eureka-provider和服务消费者eureka-consumer,通过浏览器访问http://localhost:8761,在Eureka服务管理页面看到了我们刚启动的SERVICE-PROVIDER和SERVICE-CONSUMER服务,如图4-11所示。这说明服务提供者eureka-provider和服务消费者eureka-consumer已经成功注册到eureka-server注册中心。
接下来,验证服务消费者调用服务提供者的获取人员信息接口是否成功。在浏览器中输入如下地址:http://localhost:8081/getOrderList,成功返回相关数据,说明微服务间调用成功,如图4-12所示。
四、总结
以上,我们就简单介绍了Eureka ,并使用Eureka 实现了微服务的注册和发现,同时,也实现了服务间的相互调用。
本文暂时没有评论,来添加一个吧(●'◡'●)