SpringCloud(二) Eureka注册中心的使用

在SpringCloud(一)中,我们学会了使用RestTemplate进行远程调用,但是在调用user-service时候需要在order-service中发送http请求,请求中需要书写对应微服务的ip和端口号,十分不方便,如果此时有多个user-service实例的话,就不知道调用哪个了(除非每次调用的时候都对ip和端口号进行调整),所以本篇博客将介绍一个专门用来进行服务注册的组件----Eureka.

目录

[一, Eureka的机构和作用](#一, Eureka的机构和作用)

[1.1 RestTemplate存在的问题](#1.1 RestTemplate存在的问题)

[1.2 Eureka的结构和作用](#1.2 Eureka的结构和作用)

[二, Eureka的使用](#二, Eureka的使用)

[2.1 Eureka的使用步骤](#2.1 Eureka的使用步骤)

[2.2 搭建eureka-server](#2.2 搭建eureka-server)

[1, 创建eureka-server服务](#1, 创建eureka-server服务)

[2, 引入eureka依赖](#2, 引入eureka依赖)

[3, 编写启动类](#3, 编写启动类)

[4, 编写配置文件](#4, 编写配置文件)

[5, 启动eureka-server](#5, 启动eureka-server)

[2.3 服务注册](#2.3 服务注册)

[1, 引入依赖](#1, 引入依赖)

[2, 配置文件](#2, 配置文件)

[3, 启动多个user-service实例](#3, 启动多个user-service实例)

[2.4 服务发现](#2.4 服务发现)

[1, 引入依赖](#1, 引入依赖)

[2, 配置文件](#2, 配置文件)

[3, 服务拉取和负载均衡](#3, 服务拉取和负载均衡)

[2.5 Eureka的使用示例](#2.5 Eureka的使用示例)


一, Eureka的机构和作用

1.1 RestTemplate存在的问题

假如我们的服务提供者user-service部署了多个实例,如图所示:

大家需要思考几个问题:

  • order-service在发起远程调用的时候,该如何得知user-service实例的ip和端口?
  • 有多个user-service实例地址,order-service调用时该如何选择?
  • order-service如何得知某个user-service实例是否依然健康,是不是已经宕机?

1.2 Eureka的结构和作用

上述问题都需要利用SpringCloud中的注册中心来解决,其中最广为人知的注册中心就是Eureka,Eureka的结构如图所示:

order-service如何得知user-service实例地址?

获取地址信息的流程如下:

  • user-service服务实例启动后,将自己的信息注册到eureka-server(Eureka服务端),这个叫服务注册;
  • eureka-server保存服务名称到服务实例地址列表的映射关系;
  • order-service根据服务名称,拉取实例地址列表,这个叫服务发现或服务拉取.

order-service如何从多个user-service实例中选择具体端的实例?

  • order-service从实例列表中利用负载均衡算法选中其中一个实例地址;
  • 向该实例地址发起远程调用.

order-service如何得知某个user-service实例是否依然健康,是不是已经宕机?

  • user-service会每隔一段时间(默认是30s)向eureka-service发起请求,报告自己状态,称为心跳;
  • 当超过一定时间没有心跳时,eureka-server会认为微服务实例故障,将该实例从服务列表中剔除;
  • order-service拉取服务时,就能将故障实例排除了.

一个微服务,既可以是服务提供者,又可以是服务消费者,因此eureka将服务注册,服务发现等功能统一封装到了eureka-client端.

二, Eureka的使用

2.1 Eureka的使用步骤

2.2 搭建eureka-server

首先先注册eureka中心服务端,这必须是一个独立的微服务

1, 创建eureka-server服务

在cloud-demo父工程下,创建一个子模块:

填写模块信息:

填写服务信息:

2, 引入eureka依赖

引入SpringCloud为eureka提供的starter依赖:

java 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

3, 编写启动类

给eureka-server服务编写一个启动类,一定要添加一个@EnableEurekaServer注解,表示开启eureka的注册中心功能:

java 复制代码
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

4, 编写配置文件

编写一个application.yml文件,内容如下:

java 复制代码
server:
  port: 10086 //端口可以写成任意的 只要不冲突就行
spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url: 
      defaultZone: http://127.0.0.1:10086/eureka

5, 启动eureka-server

启动微服务,然后在浏览器访问:http://127.0.0.1:10086

看到一下页面表示启动成功:

2.3 服务注册

下面,将user-service注册到eureka-server中去

1, 引入依赖

在user-service的pom文件中,引入下面的eureka-client依赖:

java 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2, 配置文件

在user-service中,修改application.yml文件,添加服务名称,eureka地址:

java 复制代码
spring:
  application:
    name: userservice
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

3, 启动多个user-service实例

为了演示一个服务有多个实例的场景,我们添加一个SpringBoot的启动装置,再启动一个user-service

首先,复制原来的user-service启动配置:

填写信息,使用不同的端口号:

此时有两个user-service,端口号分别是8081和8082,启动两个实例:

此时可以看到在eureka-server的管理页面中可以看到已经注册了两个user-service实例了.

2.4 服务发现

此时,我们将order-service的逻辑修改:向eureka-server拉取user-service的信息,实现发现服务.

1, 引入依赖

服务发现和服务注册统一封装在eureka-client依赖中,因此这一步与服务注册一致,在order-service的pom文件中,引入eureka-client依赖:

java 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2, 配置文件

服务发现也需要eureka地址,因此第二步与服务注册一致,都是配置eureka信息,在order-service中修改application.yml文件,添加服务名称.eureka地址:

java 复制代码
spring:
  application:
    name: orderservice
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

3, 服务拉取和负载均衡

启动order-service之后可以发现order-service也被注册到了eureka-server中:

此时我们就可以去eureka-server中拉取user-service服务的实力列表,并且实现负载均衡,这一系列的操作只需要添加一些注解即可

负载均衡内容详细博客:SpringCloud(三) Ribbon负载均衡-CSDN博客

在order-service的OrderApplication中,给RestTemplate这个Bean添加一个@LoadBalance注解:

修改order-service服务中的cn.itcast.order.service包下的OrderService类中的queryOrderById方法,修改访问的url路径,用服务名代替ip,端口:

Spring会自动帮我们从eureka-server端,根据userservice这个服务名称,获取实例列表,而后完成负载均衡.

2.5 Eureka的使用示例

此时,我们已经将order-service和user-service都注册到了eureka-server中,就可以通过order-service发现服务从而给user-service服务发送http请求进而获取到用户的信息:

相关推荐
憧憬成为java架构高手的小白3 小时前
黑马八股--spring框架学习
java·学习·spring
Nuanyt7 小时前
SSM 学习记录 第二部分 Spring整合Mybatis&Junit AOP核心概念 Spring事务管理 SpringMVC 请求与响应 Rest风格
java·spring·junit·mybatis·restful
米码收割机7 小时前
【SSM】Spring MVC_MyBatis SSM商城系统(源码+论文)【独一无二】
spring·mvc·mybatis
用户3126874877208 小时前
@Autowired 注入的是代理对象?Spring AOP 代理选择原理一次讲透
java·spring
小罗水8 小时前
第3章 从单体项目到 Spring Cloud 微服务
spring·spring cloud·微服务
Bug收容所9 小时前
12305项目学习day5
java·spring boot·redis·mysql·spring·rocketmq
lichuangcsdn9 小时前
【Spring AI 学习(三)】实现简单的对话
java·人工智能·学习·spring·spring ai
长不胖的路人甲9 小时前
Spring Bean 完整生命周期
java·spring·rpc
辰海Coding10 小时前
MiniSpring框架学习笔记-拦截器 :如何在方法前后进行拦截?
java·笔记·学习·spring·minispring
qq_1851986921 小时前
(Spring Bean + delegateExpression)实现http服务 的完整可运行项目
spring