SpringCloud Eureka教程

2,071 阅读4分钟

Eureka Server配置

导入依赖

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

启动类上添加@EnableEurekaServer注解

@EnableEurekaServer//添加此注解
@SpringBootApplication
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }

}

配置application.yml

server:
  port: 8080
  
eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false
    fetch-registry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  • eureka.instance.hostname指定Eureka服务端的IP、域名;
  • eureka.client.register-with-eureka是否将服务注册到Eureka服务端
  • eureka.client.fetch-registry是否从Eureka服务端获取服务信息
  • eureka.client.serviceUrl.defaultZone指定Eureka服务端的地址 eureka.client.register-with-eurekaeureka.client.fetch-registry是区分Eureka Server和Eureka Client的关键,Eureka Server通常这两项设置为false,集群时会有所不同,下面会介绍。

效果

访问localhost:8080,注意eureka.client.serviceUrl.defaultZone配置的是客户端注册地址,而不是控制台地址。

Eureka Client配置

导入依赖

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

启动类上添加@EnableEurekaClient注解

@EnableEurekaClient//添加这个注解
@SpringBootApplication
public class EurekaClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }
}

配置application.yml

server:
  port: 8082
spring:
  application:
    # 服务名,后续可通过服务名访问这个服务,而不需要写具体的ip、端口
    name: provider
eureka:
  client:
    # 客户端这两项设置为true
    register-with-eureka: true
    fetch-registry: true
    # eureka server的注册地址
    serviceUrl:
      defaultZone: http://localhost:8080/eureka/

效果

访问localhost:8080,可以看到provider服务已经注册上去了

Eureka Server保护模式

我们现在把provider服务关掉,90秒后观察下控制台(默认90秒未续约就认为服务挂掉,客户端每隔30秒续约一次) 红色这句话,说明Eureka Server开启了自我保护,自我保护的作用是:当服务提供者因为网络波动等原因无法发送心跳包进行续约时,Eureka Server不会删除这个服务,而是继续保留。但此时已经无法判断服务提供者是否真的挂掉了,消费者请求这个服务很有可能会报错。

Eureka Server关闭自我保护

eureka:
  server:
    enable-self-preservation: false

Eureka Server集群

集群就是多个Eureka Server互相注册,形成一个集群

配置

以下两点和非集群的Eureka Server有区别

  • eureka.client.register-with-eurekaeureka.client.fetch-registry设置为true
  • eureka.client.serviceUrl.defaultZone其他注册中心的注册地址,多个注册中心用逗号分割
server:
  port: 8081
spring:
  application:
    name: eurekaServer

eureka:
  # 关闭自我保护
  server:
    enable-self-preservation: false
  instance:
    hostname: peer2
  client:
    # 集群模式这两项设置为true,默认就是true
    #register-with-eureka: false
    #fetch-registry: false
    serviceUrl:
    # 配置其他注册中心的注册地址,假如我们有三个注册中心,写另外两个的地址defaultZone: http://peer1:8080/eureka/,http://peer3:8082/eureka/
      defaultZone: http://peer1:8080/eureka/

注意两个注册中心的eureka.instance.hostname不一样,DS Replicas才会有内容,实际部署中,注册中心一般都是在不同服务器上的

效果

访问peer1:8080或peer2:8081

Eureka Server安全认证

通过Spring Security实现

导入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

最简单的配置方式

在application.yml中加入以下内容,也可以在Security配置类里面拦截url进行认证

spring:
  security:
    user:
      name: user
      password: 123456

现在访问控制台需要输入账号密码,注册地址也需要携带账号密码,否则服务无法注册上去 eureka.client.serviceUrl.defaultZone的值应该为http://账号:密码@peer2:8081/eureka/

关闭CSRF

开启安全认证后,不关闭CSRF无法注册服务,但可以打开控制台

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //禁用csrf
        http.csrf().disable();
        super.configure(http);
    }
}

其他配置

  • eureka.client.enabled是否启用Eureka Client true
  • eureka.client.register-with-eureka表示是否将自己注册到Eureka Server true
  • eureka.client.fetch-registry表示是否从Eureka Server获取注册的服务信息 true
  • eureka.client.serviceUrl.defaultZone配置Eureka Server地址,用于注册服务和获取服务 http://localhost:8761/eureka
  • eureka.client.registry-fetch-interval-seconds默认值为30秒,即每30秒去Eureka Server上获取服务并缓存
  • eureka.instance.lease-renewal-interval-in-seconds向Eureka Server发送心跳的间隔时间,单位为秒,用于服务续约,默认30秒
  • eureka.instance.lease-expiration-duration-in-seconds定义服务失效时间,即Eureka Server检测到Eureka Client木有心跳后(客户端意外下线)多少秒将其剔除默认90秒
  • eureka.server.enable-self-preservation用于开启Eureka Server自我保护功能 true
  • eureka.client.instance-info-replication-interval-seconds更新实例信息的变化到Eureka服务端的间隔时间,单位为秒,默认30秒
  • eureka.client.eureka-service-url-poll-interval-seconds轮询Eureka服务端地址更改的间隔时间,单位为秒,默认300秒
  • eureka.instance.prefer-ip-address表示使用IP进行配置为不是域名,默认false
  • eureka.client.healthcheck.enabled默认Erueka Server是通过心跳来检测Eureka Client的健康状况的,通过置为true改变Eeureka Server对客户端健康检测的方式,改用Actuator的/health端点来检测。