SpringCloud-Eureka

分server和client模式

注册中心使用server模式和client模式(主要为了server之间通信)

服务提供者、消费者使用client模式

Eureka结构图

基础配置

服务端基础配置

引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

启动配置

@SpringBootApplication
@EnableEurekaServer
public class Application7001 {
    public static void main(String[] args) {
        SpringApplication.run(Application7001.class, args);
    }
}

配置文件

server:
  port: 7001

spring:
  application:
    name: eureka-server7001
  profiles:
    active: dev

eureka:
  instance:
    hostname: eureka7001.com
  server:
    #关闭自我保护机制,保证不可用服务立即被踢出
    enable-self-preservation: true
    eviction-interval-timer-in-ms: 2000
    #不读取只读的缓存服务清单,因为30秒刷新一次比较慢,读写高速缓存过期策略
    use-read-only-response-cache: false
  client:
    #false表示自己端就是注册中心,职责就是维护服务实例,并不需要去检索服务
    fetch-registry: false
    #false表示当前微服务不注册到eureka中
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/ # 单实例
      #defaultZone: http://eureka7002.com:7002/eureka/ # 多实例

defaultZone中地址最好跟host中保持一致

客户端配置

引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

客户端服务提供者配置

配置文件

server:
  port: 8001

spring:
  application:
    name: payment-service

eureka:
  client:
    fetch-registry: true # 检索注册信息
    register-with-eureka: true #注册自己
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
  instance:
    instance-id: payment8001
    # eureka网页显示ip链接
    # ip-address: 127.0.0.1
    prefer-ip-address: true
    # Eureka客户端向服务端发送信条的时间间隔,默认是30s
    lease-renewal-interval-in-seconds: 30
    # Eureka服务端收到最后一次心跳后等待时间上线,默认90s,如果服务端开始自我保护,超时将剔除该服务
    lease-expiration-duration-in-seconds: 90

Eureka会对spring.application.name属性值自动转换成大写处理

从 Spring Cloud Edgware 版本(2017 年) 开始,官方对服务注册发现机制做了优化:当项目中引入了 Eureka Client 相关依赖(如 spring-cloud-starter-netflix-eureka-client),Spring Boot 会通过 自动配置类 自动触发服务注册逻辑,无需再手动添加 @EnableEurekaClient 或 @EnableDiscoveryClient 注解。详细见EurekaClientAutoConfiguration

客户端服务消费者配置

配置文件

server:
  port: 80

spring:
  application:
    name: CONSUMER-SERVICE

logging:
  level:
    root: info

eureka:
  client:
    fetch-registry: true # 检索注册信息,集群必须是true才能配合ribbon使用负载均衡
    register-with-eureka: true # 注册自己
    registryFetchIntervalSeconds: 5 # 拉取间隔
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/
  instance:
    ip-address: 127.0.0.1
    instance-id: consumer80
    prefer-ip-address: true
    lease-renewal-interval-in-seconds: 1
    lease-expiration-duration-in-seconds: 2

Java Config

@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
    return new RestTemplate();
}

@LoadBalanced用来保证请求的时候负载均衡

使用方式

@Slf4j
@RequiredArgsConstructor
@RestController
@RequestMapping(("/consumer/user"))
public class UserController {
    private final static String PROVIDER_URL = "http://PAYMENT-SERVICE";
    private final RestTemplate restTemplate;

    @GetMapping("/{id}")
    public CommonResult<User> findById(@PathVariable("id") Long id) {
        String url = PROVIDER_URL + "/provider/user/findById/" + id;
        log.info("url:{}", url);

        return restTemplate.getForObject(url, CommonResult.class);
    }
}

服务发现

Eureka客户端通过DiscoveryClient可以获取服务发现相关信息,比如指定服务的实例信息等

@Slf4j
@RestController
@RequestMapping(("/provider/user"))
public class UserController {
    @Resource
    private DiscoveryClient discoveryClient;

    @GetMapping("/discover")
    public void discover() {
        List<String> serviceList = discoveryClient.getServices();

        // 获取所有微服务
        for (String service : serviceList) {
            log.info("service: {}", service);
        }

        // 获取所有 PAYMENT-SERVICE 服务实例
        List<ServiceInstance> instanceList = discoveryClient.getInstances("PAYMENT-SERVICE");
        for (ServiceInstance serviceInstance : instanceList) {
            log.info("PAYMENT-SERVICE instance: {}", serviceInstance.getInstanceId());
        }
    }
}

自我保护

属于CAP中的AP

某时刻某一个微服务不可用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保存

防止Eureka服务端和客户端之间由于网络延迟等问题导致心跳检测失败而注销服务

禁用方式

Eureka服务端

# 自我保护机制,保证不可用服务立即被踢出,默认是true
eureka.server.enable-self-preservation=false
# 指定清理失效服务实例的定时任务间隔,单位ms
eureka.server.eviction-interval-timer-in-ms=6000

Eureka客户端

# Eureka客户端向服务端发送信条的时间间隔,默认是30s
eureka.instance.lease-renewal-interval-in-seconds=1
# Eureka服务端收到最后一次💓后等待时间上线,默认90s,如果服务端开始自我保护,超时将剔除该服务
eureka.instance.lease-expiration-duration-in-seconds=10

客户端每隔 eureka.instance.lease-renewal-interval-in-seconds 向服务端发送一次💓
如果客户端超过 eureka.instance.lease-expiration-duration-in-seconds 时间没有发送💓,服务端就会标记为失效
服务端的定时任务每隔 eureka.server.eviction-interval-timer-in-ms 扫描一次💓,清理失效的服务

一般建议客户端的 eureka.instance.lease-expiration-duration-in-seconds 设置成 服务端 eureka.server.eviction-interval-timer-in-ms 的三倍,避免因网络延迟导致误判

posted @ 2025-08-04 23:00  一只盐桔鸡  阅读(34)  评论(0)    收藏  举报