Eureka Server高可用集群搭建

Eureka 是 Netflix 开发的,一个基于 REST 服务的,服务注册与发现的组件

Eureka 包含两个组件:Eureka ServerEureka Client

Eureka Server 提供服务注册服务,各个节点启动后,会在 Eureka Server 中进行注册,这样 Eureka Server 中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。

Eureka Client 是一个java客户端,用于简化与 Eureka Server 的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器。 

各个微服务启动时,会通过 Eureka Client 向 Eureka Server 注册自己,Eureka Server 会存储该服务的信息

也就是说,每个微服务的客户端和服务端,都会注册到 Eureka Server,这就衍生出了微服务相互识别的话题

  • 同步:每个 Eureka Server 同时也是 Eureka Client(逻辑上的)
       多个 Eureka Server 之间通过复制的方式完成服务注册表的同步,形成 Eureka 的高可用
  • 识别:Eureka Client 会缓存 Eureka Server 中的信息
       即使所有 Eureka Server 节点都宕掉,服务消费者仍可使用缓存中的信息找到服务提供者
  • 续约:微服务会周期性(默认30s)地向 Eureka Server 发送心跳以Renew(续约)信息(类似于heartbeat)
  • 续期:Eureka Server 会定期(默认60s)执行一次失效服务检测功能
       它会检查超过一定时间(默认90s)没有Renew的微服务,发现则会注销该微服务节点

Spring Cloud 已经把 Eureka 集成在其子项目 Spring Cloud Netflix 里面

1. 部署

因为只有一台机器模拟集群,所以可以在host文件下映射多个不同的域名到本机地址。

这里使用的是:  master 127.0.0.1 backup1 127.0.0.1 backup2 127.0.0.1

首先我们通过maven导入依赖包

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.SR1</spring-cloud.version>
    </properties>

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

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

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

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement><properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.SR1</spring-cloud.version>
    </properties>

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

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

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

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

其次我们写好配置文件(以下全部采用yml)

application.yml

spring:
  profiles:
    active: master
customize:
  username: "yourusername"
  password: "yourpassword"

application-master.yml

spring:
  profiles: master
  application:
    name: EurekaMaster
server:
  port: 10237

eureka:
  instance:
    # 主机名
    hostname: master
    # 实例id(注册名)
    instance-id: ${spring.application.name}:${server.port}
    # 是否允许ip注册
    prefer-ip-address: false
    # 默认Unknow
    appname: EurekaMaster
    # 安全端口
    secure-port: ${server.port}
    # 指示是否应为流量启用安全端口
    secure-port-enabled: true
  client:
    # 是否将自身注册为服务中心(true)
    register-with-eureka: true
    # 是否开启服务查找(true)
    fetch-registry: true
    # 默认注册地址
    serviceUrl:
      defaultZone: http://${customize.username}:${customize.password}@backup1:10238/eureka/,http://${customize.username}:${customize.password}@backup2:10239/eureka/
  server:
    # 指定 Eviction Task 定时任务的调度频率,用于剔除过期的实例,此处未使用默认频率,频率为:5/秒,默认为:60/秒
    # 有效防止的问题是:应用实例异常挂掉,没能在挂掉之前告知Eureka server要下线掉该服务实例信息。这个就需要依赖Eureka server的EvictionTask去剔除。
    eviction-interval-timer-in-ms: 4000
    # 指定每分钟需要收到的续约次数的阈值,默认值是:0.85
    renewal-percent-threshold: 0.49
    # 是否开启自身保护
    enable-self-preservation: true

application-backup1.yml

spring:
  profiles: backup1
  application:
    name: EurekaBackup1
server:
  port: 10238

eureka:
  # 主机名
    hostname: backup1
    # 实例id(注册名)
    instance-id: ${spring.application.name}:${server.port}
    # 是否允许ip注册
    prefer-ip-address: false
    # 默认Unknow
    appname: EurekaBackup1
    # 安全端口
    secure-port: ${server.port}
    # 指示是否应为流量启用安全端口
    secure-port-enabled: true
  client:
    # 是否将自身注册为服务中心(true)
    register-with-eureka: true
    # 是否开启服务查找(true)
    fetch-registry: true
    # 默认注册地址
    service-url:
      defaultZone: http://${customize.username}:${customize.password}@master:10237/eureka/,http://${customize.username}:${customize.password}@backup2:10239/eureka/
  server:
    # 指定 Eviction Task 定时任务的调度频率,用于剔除过期的实例,此处未使用默认频率,频率为:5/秒,默认为:60/秒
    # 有效防止的问题是:应用实例异常挂掉,没能在挂掉之前告知Eureka server要下线掉该服务实例信息。这个就需要依赖Eureka server的EvictionTask去剔除。
    eviction-interval-timer-in-ms: 4000
    # 指定每分钟需要收到的续约次数的阈值,默认值是:0.85
    renewal-percent-threshold: 0.49
    # 是否开启自身保护
    enable-self-preservation: true

application-backup2.yml

spring:
  profiles: backup2
  application:
    name: EurekaBackup2
server:
  port: 10239

eureka:
  # 主机名
    hostname: backup2
    # 实例id(注册名)
    instance-id: ${spring.application.name}:${server.port}
    # 是否允许ip注册
    prefer-ip-address: false
    # 默认Unknow
    appname: EurekaBackup2
    # 安全端口
    secure-port: ${server.port}
    # 指示是否应为流量启用安全端口
    secure-port-enabled: true
  client:
    # 是否将自身注册为服务中心(true)
    register-with-eureka: true
    # 是否开启服务查找(true)
    fetch-registry: true
    # 默认注册地址
    service-url:
      defaultZone: http://${customize.username}:${customize.password}@master:10237/eureka/,http://${customize.username}:${customize.password}@backup1:10238/eureka/
  server:
    # 指定 Eviction Task 定时任务的调度频率,用于剔除过期的实例,此处未使用默认频率,频率为:5/秒,默认为:60/秒
    # 有效防止的问题是:应用实例异常挂掉,没能在挂掉之前告知Eureka server要下线掉该服务实例信息。这个就需要依赖Eureka server的EvictionTask去剔除。
    eviction-interval-timer-in-ms: 4000
    # 指定每分钟需要收到的续约次数的阈值,默认值是:0.85
    renewal-percent-threshold: 0.49
    # 是否开启自身保护
    enable-self-preservation: true

配置启动类

@EnableEurekaServer
@SpringBootApplication
public class EurekaserverApplication {

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

配置类

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Value("${customize.username}")
    private String username;
    @Value("${customize.password}")
    private String password;

    /**
     * 添加SpringSecurity默认帐号密码
     * 密码需要经过编码
     * @param auth
     * @throws Exception
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .passwordEncoder(new BCryptPasswordEncoder())
            .withUser(username)
            .password(new BCryptPasswordEncoder().encode(password))
            .roles("ADMIN");
    }

    /**
     * 一定要关闭csrf防护,否则无法注册
     * 并且打开Http Authorize
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
    }
}

2. 客户端

启动类

// 加上EnableEurekaClient注解
@EnableEurekaClient
@SpringCloudApplication
public class GatewayApplication {

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

配置文件

eureka:
  instance:
    prefer-ip-address: true
  client:
    service-url:
      defaultZone: http://${customize.username}:${customize.password}@master:10237/eureka/,http://${customize.username}:${customize.password}@backup1:10238/eureka/,http://${customize.username}:${customize.password}@backup2:10239/eureka/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值