Spring Cloud之服务注册与发现(Eureka)

目录

Eureka

介绍

角色

实现流程

单机构建

注册中心

服务提供者

服务消费者

集群搭建

注册中心

服务提供者

自我保护机制

原理分析


Eureka

介绍

Eureka是spring cloud中的一个负责服务注册与发现的组件,本身是基于REST的服务,同时还提供了负载均衡、故障转移等能力。

角色

分为3个角色:服务中心、服务提供者、服务消费者

Eureka Server:服务器端,它提供了服务的注册和发现功能,即实现服务的治理。

Eureka Provider:服务提供者,它将自身服务注册到服务中心,以便"服务消费者"能通过服务器端提供的服务清单来调用它。

Eureka Consumer:服务消费者,它从Eureka获取"已注册的服务列表",消费服务

实现流程

1.搭建一个Eureka Server作为服务注册中心

2.服务提供者启动时,把当前服务器的信息以服务名的方式注册到服务注册中心

3.服务消费者启动时,把当前服务注册到服务注册中心

4.服务消费者会获取一份可用服务列表,该列表包含了所有注册到服务注册中心的服务信息(包含服务提供者和自身的消息)

5.在获得了可用服务列表后,服务消费者通过 HTTP 或消息中间件远程调用服务提供者提供的服务

服务注册中心(Eureka Server)所扮演的角色十分重要,它是服务提供者和服务消费者之间的桥梁。服务提供者只有将自己的服务注册到服务注册中心才可能被服务消费者调用,而服务消费者也只有通过服务注册中心获取可用服务列表后,才能调用所需的服务

单机构建

注册中心

搭建一个Eureka Server作为服务注册中心

1.在pom文件中添加Eureka Server依赖

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

2.在application.yml中添加配置

java 复制代码
server:
  port: 7001 #端口
# 单机版
eureka:
  instance:
    hostname: localhost  #eureka服务端的实例名字   单机服务名称
  client:
    register-with-eureka: false    #表示不向注册中心注册自己
    fetch-registry: false   #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
    service-url:
      #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/  #单机服务地址

3.启动类上添加注释

在启动类上添加 @EnableEurekaServer 注解

4.启动

访问 http://localhost:7001

服务提供者

1.在pom文件中添加Eureka client依赖

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

2.在application.yml中添加配置

java 复制代码
server:
  port: 8001 #端口
eureka:
  client:
    register-with-eureka: true #是否向注册中心注册自己
    fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认true,集群必须设置为true
    service-url:
      #      设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://localhost:7001/eureka #单机版
  instance:
    instance-id: cloud-provider-payment8001
    prefer-ip-address: true  #访问路径可以显示IP地址 鼠标悬停服务,右下角可以看到ip

3.启动类上添加注释

启动类上添加@EnableEurekaClient**注解

服务消费者

1.在pom文件中添加Eureka client依赖

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

2.在application.yml中添加配置

java 复制代码
server:
  port: 80
spring:
  application:
    name: cloud-order- service
eureka:
  client:
    register-with-eureka: true #是否向注册中心注册自己
    fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认true,集群必须设置为true
    instance:
      instance-id: cloud-consumer-order80
      prefer-ip-address: true  #访问路径可以显示IP地址
    service-url:
      #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://localhost:7001/eureka #单机版

3.创建RestTemplate

java 复制代码
@Configuration
public class ApplicationContextConfig {
    @Bean
    @LoadBalanced //让这个RestTemplate在请求时拥有客户端负载均衡的能力
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

4.先将注册中心启动,再启动服务提供者

5.创建测试类,使用RestTemplate进行测试

java 复制代码
public class OrderController {
	//单机情况下,直接ip加地址
    public static final String PAYMENT_URL = "http://localhost:8001";
    @Resource
    private RestTemplate restTemplate;

    @GetMapping("/payment/get/{id}")
    public CommonResult<Payment> getPayment(@PathVariable("id") Long id) {
        return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
    }
}

6.浏览器访问

集群搭建

注册中心

两个注册中心的配置都差不多,区别就是端口、hostname、defaultZone属性值不一样。

现在是模拟的是2台机器做在集群,需要在defaultZone修改,让两台机器相互注册。

7001的defaultZone就应该是:defaultZone: http://eureka7002.com:7002/eureka/

7002的defaultZone就应该是:defaultZone: http://eureka7001.com:7001/eureka/

java 复制代码
server:
  port: 7001
#集群版
eureka:
  instance:
    hostname: eureka7001.com    #eureka服务端的实例名字
  client:
    register-with-eureka: false    #表示不向注册中心注册自己
    fetch-registry: false   #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
    service-url:
      #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://eureka7002.com:7002/eureka/  #这个是集群版开启 互相注册

服务提供者

修改配置文件,同时注册进两个注册中心:

java 复制代码
server:
  port: 8001
eureka:
  client:
    register-with-eureka: true #是否向注册中心注册自己
    fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认true,集群必须设置为true
    service-url:
      #      设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka  #集群版
  instance:
    instance-id: cloud-provider-payment8001
    prefer-ip-address: true  #访问路径可以显示IP地址 鼠标悬停服务,右下角可以看到ip

自我保护机制

当我们在本地调试基于 Eureka 的程序时,Eureka 服务注册中心很有可能会出现如下图所示的红色警告,这个警告是触发了 Eureka 的自我保护机制而出现的

默认情况下,如果注册中心在90秒内没有接收到某个服务提供者的心跳,就会将这个服务提供者提供的服务从服务注册表中移除,这样消费者就无法获取到该服务,更无法调用该服务。

实际情况中,服务提供者可能会出于网络故障而无法与注册中心正常通信。若此时注册中心因为没有接收心跳而误将健康的服务从服务列表中移除,这显然是不合理的。而 Eureka 的自我保护机制就是来解决此问题的。

Eureka 的自我保护机制:其中心思想就是,如果注册中心在一段时间内没有接收到服务提供者的心跳,那么注册中心就会开启自我保护模式,将所有的服务提供者的注册信息保护起来,而不是直接从服务注册表中移除。一旦网络恢复,这些服务提供者提供的服务还可以继续被服务消费者消费。

默认情况下,Eureka 的自我保护机制是开启的,如果想要关闭,则需要在配置文件中添加以下配置:

java 复制代码
eureka:
  server:
    enable-self-preservation: false # false 关闭 Eureka 的自我保护机制,默认是开启,一般不建议大家修改

原理分析

1.当启动eurake客户端应用,比如上面说到的会员服务member,会把当前服务比如服务地址和端口以别名的注册到注册中心

2.当服务消费者比如上面说到的order订单服务,在接口调用的时候,使用服务别名也就是service id去注册中心获取实际的rpc远程调用地址

  1. 服务消费者在获取到实际的rpc远程调用地址后,在本地使用HttpClient技术调用远程接口

流程图如下:

相关推荐
职略1 小时前
负载均衡类型和算法解析
java·运维·分布式·算法·负载均衡
A22741 小时前
LeetCode 196, 73, 105
java·算法·leetcode
容若只如初见2 小时前
项目实战--Spring Boot + Minio文件切片上传下载
java·spring boot·后端
阿里巴巴P8资深技术专家2 小时前
Java常用算法&集合扩容机制分析
java·数据结构·算法
weixin_440401692 小时前
分布式锁——基于Redis分布式锁
java·数据库·spring boot·redis·分布式
码农爱java2 小时前
Spring Boot 中的监视器是什么?有什么作用?
java·spring boot·后端·面试·monitor·监视器
lpruoyu3 小时前
【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【18】认证服务02—微博社交登录
分布式·微服务·架构·社交登录
zengson_g3 小时前
当需要对大量数据进行排序操作时,怎样优化内存使用和性能?
java·数据库·算法·排序算法
血战灬狂龙3 小时前
pom.xml文件加载后没有变成maven图标
xml·java·maven
无名指的等待7124 小时前
SpringBoot实现图片添加水印(完整)
java·spring boot·后端