image.png

Eureka客户端, 主要用于处理服务的注册与发现, 在应用程序运行时, eureka客户端向注册中心注册自己的服务并周期性的发送心跳来更新它的服务租约.

服务注册

搭建服务注册中心

1.依赖

  1. <!--父工程依赖管理-->
  2. <dependencyManagement>
  3. <dependencies>
  4. <!--springcloud-->
  5. <dependency>
  6. <groupId>org.springframework.cloud</groupId>
  7. <artifactId>spring-cloud-dependencies</artifactId>
  8. <version>Hoxton.SR7</version>
  9. <type>pom</type>
  10. <scope>import</scope>
  11. </dependency>
  12. <!--springboot-->
  13. <dependency>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-dependencies</artifactId>
  16. <version>2.3.3.RELEASE</version>
  17. <type>pom</type>
  18. <scope>import</scope>
  19. </dependency>
  20. </dependencies>
  21. </dependencyManagement>
  22. <!--注册中心的eureka-server-->
  23. <dependency>
  24. <groupId>org.springframework.cloud</groupId>
  25. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  26. </dependency>

2,启动类加注解@EnableEurekaServer
3.配置

  1. server:
  2. port: 30000
  3. eureka:
  4. instance:
  5. hostname: localhost
  6. client:
  7. # 注册中心自身无需向自身注册
  8. register-with-eureka: false
  9. # 注册中心无需拿到服务列表
  10. fetch-registry: false
  11. service-url:
  12. defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

4.访问 http://localhost:30000/

注册服务提供者

1.依赖(注意starter-web依赖是必须, 否则启动报204)

  1. <!--eureka-client-->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  5. </dependency>

2.启动类加注解@EnableEurekaClient
3.配置

  1. server:
  2. port: 30001
  3. eureka:
  4. client:
  5. register-with-eureka: true
  6. fetch-registry: true
  7. # 指定注册中心地址
  8. service-url:
  9. defaultZone: http://localhost:30000/eureka/
  10. spring:
  11. application:
  12. name: search-demo

高可用注册中心

即启动俩注册中心, 配置上互相注册; 客户端可以指定多个注册中心地址, 以逗号分割

服务发现与消费

  1. 1.添加ribbon依赖
  2. <!--ribbon-->
  3. <dependency>
  4. <groupId>org.springframework.cloud</groupId>
  5. <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
  6. </dependency>
  7. 2.配置负载均衡的restTemplate
  8. @Bean
  9. @LoadBalanced
  10. public RestTemplate restTemplate() {
  11. return new RestTemplateBuilder().build();
  12. }
  13. 3.发送请求
  14. ResponseEntity<String> entity = restTemplate.getForEntity("http://HELLO-SERVICE/hello", String.class);
  15. System.out.println("返回的结果是: ------------>" + entity.getBody());

Eureka详解

1.基础架构

  • 服务注册中心
  • 服务提供者
  • 服务消费者

2.服务治理机制
image.png
服务提供者:

  • 服务注册, 服务提供者在启动时会通过发送rest请求的方式将自己注册到eureka server上, 同时带上了自身服务的一些元数据信息. eureka server接收到rest请求后, 将元数据信息存储在一个双层结构map中, 其中第一层的key是服务名, 第二层的key是具体服务的实例名.

    1. eureka:
    2. client:
    3. register-with-eureka: true
  • 服务同步, 如上图, 由于服务注册中心互相注册, 当服务提供者发送请求到其中一个服务注册中心时, 它会将请求转发给集群中相连的其他注册中心, 从而实现注册中心间的服务同步. 通过服务同步, 两个服务提供者的服务信息就可以通过这两台服务注册中心的任意一台获取到

  • 服务续约, 在注册完服务之后, 服务提供者会维护一个心跳来持续告诉eureka server”我还活着”, 以防止server的”剔除任务”将服务实例从服务列表中排除出去, 我们称该操作为服务续约
    1. eureka:
    2. instance:
    3. # 服务续约任务的调用间隔时间, 默认为30s
    4. lease-renewal-interval-in-seconds: 30
    5. # 定义服务时效的时间, 默认为90s
    6. lease-expiration-duration-in-seconds: 90

服务消费者:

  • 获取服务, 当启动服务消费者时, 它会发送一个rest请求到注册中心来获取注册的服务清单, eureka server会维护一份只读的服务清单来返回给客户端, 该清单每隔30s更新一次

    1. eureka:
    2. client:
    3. fetch-registry: true
    4. # 缓存清单的更新时间, 默认30s
    5. registry-fetch-interval-seconds: 30
  • 服务调用, 服务消费者在获取服务清单过后, 通过服务名可以获得具体提供服务的实例名和该实例的元数据信息

  • 服务下线, 在客户端程序中, 当服务实例进行正常的关闭操作时, 他会触发一个服务下线的rest请求给到eureka server, 服务端接收请求之后, 将该服务状态置为下线, 并把该下线事件传播出去

服务注册中心:

  • 失效剔除, eureka server在启动时会创建一个定时任务, 默认每隔60s将当前清单中超时没有续约的服务剔除
  • 自我保护image.png

配置

服务注册类配置

image.png
image.png

服务实例类配置

image.png

元数据**
Eureka客户端在向服务注册中心发送注册请求时, 用来描述自身服务信息的对象, 其中包含了一些标准化的元数据, 比如服务名称, 服务实例, 实例IP, 实例端口等.image.png

常用元数据配置:

  • 实例名配置

image.png
image.png

  • 端点配置

image.png
image.png

  • 其他配置

image.png
image.png