美文网首页
服务发现:Spring Cloud Netflix Eureka

服务发现:Spring Cloud Netflix Eureka

作者: 睦月MTK | 来源:发表于2020-05-19 15:38 被阅读0次

    声明:入门级文档,更多内容会持续更新,不足之处,望不吝指点


    一、服务(注册)中心
    • 依赖
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
    • 启用当前应用为Eureka服务中心@EnableEurekaServer
    @EnableEurekaServer
    @SpringBootApplication
    public class ServiceRegistryAndDiscoverServerEndApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ServiceRegistryAndDiscoverServerEndApplication.class, args);
        }
    }
    
    • 配置
    #不向注册中心注册自己
    eureka.client.register-with-eureka=false
    #注册中心本身不需要拉去服务列表
    eureka.client.fetch-registry=false
    
    • 额外-心跳机制与保护模式
      Eureka通过设置心跳机制来判断注册的服务是否还存在,Renews threshold值表示一分钟应当收到的心跳数,Renews (last min)表示上一分钟实际收到的心跳数,如果实际收到的心跳数小于阈值,则Eureka认为是网络出现了波动,此时Eureka将会开启保护模式,保护模式期间所有的服务信息将不会被删除,不论该服务是否真的不可用了。如果实际心跳数高于阈值,但某个服务在一定时间内还是没有发来心跳数据,则Eureka将该服务注销。这一块涉及的配置有
    #是否开启保护模式
    eureka.server.enableSelfPreservation = true
    #设置应收心跳数与实际心跳数的比值,其实就是根据理论实际心跳数来设置阈值
    eureka.server.renewal-percent-threshold=0.85
    #设置Eureka清理无效服务的间隔
    eureka.server.eviction-interval-timer-in-ms=60000
    
    • 额外-敏感界面加密
      默认情况下,Eureka的服务中心是可以直接在浏览器上访问的,为了将该界面加密,可以引入spring security为其加密,具体步骤如下:
      • 依赖
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-security</artifactId>
      </dependency>
      
      • 配置
      spring.security.user.name=username
      spring.security.user.password=password
      
      • 开启WebSecurity
      @SpringBootApplication
      @EnableEurekaServer
      @EnableWebSecurity
      public class ServiceRegistryAndDiscoverServerEndApplication {
      
          public static void main(String[] args) {
              SpringApplication.run(ServiceRegistryAndDiscoverServerEndApplication.class, args);
          }
      
          @Bean
          public WebSecurityConfigurerAdapter webSecurityConfiguration(){
              return new WebSecurityConfigurerAdapter() {
                  @Override
                  public void configure(HttpSecurity http) throws Exception {
                      //关闭csrf防护,避免其他服务无法访问服务中心
                      http.csrf().disable();
                      http.authorizeRequests().anyRequest().authenticated().and().formLogin().and().httpBasic();
                  }
              };
          }
      
      }
      
      • 实际效果


        spring-security-login.PNG
    • 额外-Eureka状态监听器
      Eureka提供了一些列事件来满足对特定事件监听的需求,比如注册中心的启动,服务的上线与下线等等。
      • EurekaInstanceCanceledEvent --- 服务下线事件
      • EurekaInstanceRegisteredEvent --- 服务注册事件
      • EurekaInstanceRenewedEvent --- 服务续约事件
      • EurekaRegistryAvailableEvent Eureka --- 注册中心启动事件
      • EurekaServerStartedEvent --- Eureka Server启动事件
    @EventListener
    public void listen(EurekaRegistryAvailableEvent event){
        System.out.println("注册中心启动");
    }
    

    二、客户端(服务)
    • 依赖
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    
    • 启动当前应用为Eureka客户端(服务)
    @SpringBootApplication
    @EnableEurekaClient
    public class ServiceRegistryAndDiscoverApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ServiceRegistryAndDiscoverApplication.class, args);
        }
    
    }
    
    • 配置
    # 应用(服务)的名字
    spring.application.name=server-client-1
    #Eureka 注册中心的地址
    eureka.client.service-url.defaultZone=http://username:password@localhost:8761/eureka/
    

    实际上注册中心的配置是eureka.client.service-url,defaultZone不过是个键名罢了

    • 额外-使用ip地址进行服务的注册
      开启该配置后Eureka将会使用ip地址来注册该服务,而不是使用主机名来注册
    eureka.instance.prefer-ip-address=true
    
    • 额外-设置服务的实例id显示格式
    eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
    
    • 额外-心跳相关设置
    #每隔多少秒发送一次心跳信息
    eureka.instance.lease-renewal-interval-in-seconds=30
    #自上次发送心跳数据后,多少秒后未接到该服务的心跳数据,可以认为该服务下线并可以进行删除
    eureka.instance.lease-expiration-duration-in-seconds=90
    #是否启用/actuator/health来进行服务的健康检查而不是使用心跳数据
    eureka.client.healthcheck.enabled=false
    
    • 额外-使用安全的https协议来进行与Eureka之间的交互
    eureka.instance.non-secure-port-enabled=false
    eureka.instance.secure-port-enabled=true
    
    • 额外-使用RestTemplate而不是Jersey来进行Rest服务的访问
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        <exclusions>
            <exclusion>
                <groupId>com.sun.jersey</groupId>
                <artifactId>jersey-client</artifactId>
            </exclusion>
            <exclusion>
                <groupId>com.sun.jersey</groupId>
                <artifactId>jersey-core</artifactId>
            </exclusion>
            <exclusion>
                <groupId>com.sun.jersey.contribs</groupId>
                <artifactId>jersey-apache-client4</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
    • 额外-客户端配置刷新机制
      Eureka Client会定时进行配置的检查并刷新,当刷新行为发生时,将会导致服务暂时的不可用。可以通过下列配置来关闭该功能
    eureka.client.refresh.enable=false
    
    • 额外-配置服务的状态和健康信息页面(如果你没有使用actuator的话)
    #配置服务的状态信息页面,第一个是绝对路径,第二个是相对路径
    #eureka.instance.status-page-url
    eureka.instance.status-page-url-path=${server.servletPath}/info
    #配置服务的健康信息页面,第一个是绝对路径,第二个是相对路径
    #eureka.instance.health-check-url
    eureka.instance.health-check-url-path=${server.servletPath}/health
    
    • 额外-使用DiscoveryClient(org.springframework.cloud.client.discovery.DiscoveryClient)类来手动拉去服务中心的服务信息
      • DiscoveryClient#getServices拉去服务中心的服务名列表
      • DiscoveryClient#getInstances获取指定服务的服务实例对象
      List<ServiceInstance> list = discoveryClient.getInstances(instanceId);
      

    参考文档:
    [1] Spring Cloud Netflix

    相关文章

      网友评论

          本文标题:服务发现:Spring Cloud Netflix Eureka

          本文链接:https://www.haomeiwen.com/subject/nrovohtx.html