转载

SpringCloud实践分享 Eureka注册中心

随着业务需求增加,众多企业面临代码耦合严重、效率低下的问题。在Netflix开源了一套自己的微服务架构后,Spring随即也基于此推出SpringCloud。 目前来说,SpringCloud的门槛相对较低,在了解大致SpringCloud后即可上手,更多的是配置,或者是套路上的东西。当然我这么说只是对于希望快速上手的同学而言,源码博大精深,有兴趣可以多多研究。自己做微服务的也做了半年了,现在写一个demo,总结一下springcloud的基本用法,让我们的 微服务的小车先开起来。

spring-cloud-microservice代码

项目构成

项目采用module的形式,一个项目下分多个module,导入项目比较方便。

  • []Eureka注册中心
  • []Config配置中心
  • []Oauth2认证中心
  • []Zuul网关
  • []api-admin服务

注册中心Eureka

Eureka作为服务的注册中心,服务间的互相调用都是通过Eureka来完成,所有的服务都将自己注册到eureka中。当A服务希望调用B服务时,A只需使用B的instanceId,而不是ip,即可完成调用。在分布式应用中,服务随机部署在各个服务器中,根据ip去调用服务极其低效,你再写代码。当服务启动多个实例时候,一般使用ribbon和feign,则会自动负载均衡,无需干预。

想启动一个Eureka服务注册中心,配置上也十分简单。首先在pom.xml中加入 spring-cloud-starter-eureka-server 依赖,再在入口类中加入 注解 @EnableEurekaServer 即可。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
复制代码
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}
复制代码

如果Eureka只希望standalone模式(只启动一个实例),事实上在配置文件application.yml无需配置内容,配置上基本信息以及端口即可。 如果希望启动HighAvailability模式(即启动多个实例),则可以参考一下配置。

在部署的时候,使用编译后同一个jar包,在启动后输入不同参数。例如使用命令 java -jar -Dspring.profiles.active=master your_jar_name.jar , 则启动配置spring.profiles为配置master下的内容。而最上面一块的内容为公共配置,启动master配置时,实际的配置时公共配置+master配置;如果有些配置 两边都有,则master配置会覆盖公共配置内容。

#公共配置
server:
  port: 8080
spring:
  application:
    name: eureka-server
eureka:
  instance:
    lease-renewal-interval-in-seconds: 5
    lease-expiration-duration-in-seconds: 5
    prefer-ip-address: true
  client:
    register-with-eureka: true
    fetch-registry: true

---
# 配置master
spring:
  profiles: master
eureka:
  instance:
    hostname: master
  client:
    service-url:
      defaultZone: http://master:8080/eureka/,http://backup1:8080/eureka/,http://backup2:8080/eureka/


---
# 配置backup1
spring:
  profiles: backup1
eureka:
  client:
    service-url:
      defaultZone: http://master:8080/eureka/,http://backup1:8080/eureka/,http://backup2:8080/eureka/

---
# 配置backup2
spring:
  profiles: backup2
eureka:
  client:
    service-url:
      defaultZone: http://master:8080/eureka/,http://backup1:8080/eureka/,http://backup2:8080/eureka/

复制代码

下面来说一个几个重点配置

eureka.client.registry-fetch-interval-seconds 表示服务间隔多久去Eureka中获取注册信息,默认为30s。

eureka.instance.lease-renewal-interval-in-seconds 表示服务给Eureka发送心跳间隔,默认为30s。如果该instance实现了HealthCheckCallback,并决定让自己unavailable的话,则该instance也不会接收到流量。

eureka.instance.lease-expiration-duration-in-seconds 表示Eureka上次收到服务的心跳后,等待下一次心跳的时间,如果超时则移除实例,默认为90s。

eureka.server.enable-self-preservation 表示是否开启自我保护模式,默认为true。默认情况下,如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务。 Eureka通过“自我保护模式”来解决这个问题——当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。 综上,自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留),也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka集群更加的健壮、稳定。

eureka.server.eviction-interval-timer-in-ms 表示Eureka清理无效节点的时间间隔,默认为60,000ms。

eureka.client.register-with-eureka 表示是否将Eureka注册到自身,多实例中一边选择true。

eureka.client.fetch-registry 表示是否拉去注册的服务。假设,服务A只注册到master节点的Eureka,但是开启该选项,所有的Eureka节点都会注册该服务。

eureka.client.defaultZone 表示希望注册到Eureka的地址,格式为 http://ip:port/eureka/ ,如果部署环境有dns,也可以将ip换成域名,如果有是ha模式,配置多个地址用逗号隔开。

以上为Eureka配置相对重要的配置。

原文  https://juejin.im/post/5d84a8755188257e8e46e387
正文到此结束
Loading...