知足常乐

知足常乐

部署Eureka集群实现高可用服务

2021-07-15

部署Eureka集群,记录在此

1.环境准备

服务器:Ubuntu-Server 20.04 TLS
JDK:jdk-11.0.8
SpringBoot: 2.3.7.RELEASE
SpringCloud:Hoxton.SR9

Ubuntu安装可以参考文末链接

2.部署Eureka集群

这里推荐使用阿里云脚手架创建Eureka服务项目 脚手架生成
image.png

启动类启动Eureka注册中心

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

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

}

编写yml配置

192.168.73.128配置文件

server:
  port: 21000

spring:
  application:
    name: eureka-server

#Eureka setting
eureka:
  instance:
    hostname: 192.168.73.128
  client:
    register-with-eureka: true #是否将自己注册到注册中心上
    fetch-registry: true #是否从Eureka上获取注册信息
    service-url:
      defaultZone: http://192.168.73.129:21000/eureka/,http://192.168.73.130:21000/eureka/

192.168.73.129配置文件

server:
  port: 21000

spring:
  application:
    name: eureka-server

#Eureka setting
eureka:
  instance:
    hostname: 192.168.73.129
  client:
    register-with-eureka: true #是否将自己注册到注册中心上
    fetch-registry: true #是否从Eureka上获取注册信息
    service-url:
      defaultZone: http://192.168.73.128:21000/eureka/,http://192.168.73.130:21000/eureka/

192.168.73.130配置文件

server:
  port: 21000

spring:
  application:
    name: eureka-server

#Eureka setting
eureka:
  instance:
    hostname: 192.168.73.130
  client:
    register-with-eureka: true #是否将自己注册到注册中心上
    fetch-registry: true #是否从Eureka上获取注册信息
    service-url:
      defaultZone: http://192.168.73.128:21000/eureka/,http://192.168.73.129:21000/eureka/

分别在当前主机注册其它两台主机
达到三台主机都互相注册

打jar包,分别放到三台服务器上启动~

128节点上
image.png

129节点上
image.png

130节点上
image.png

3.部署服务

创建producer服务

@EnableEurekaClient
@SpringBootApplication
public class ProducerApplication {

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

}

配置文件 注册到三个EurekaServer中

server:
  port: 18000

spring:
  application:
    name: producer-server

#Eureka setting
eureka:
  instance:
    prefer-ip-address: true #使用ip进行注册
  client:
    register-with-eureka: true #是否将自己注册到注册中心上
    fetch-registry: true #是否从Eureka上获取注册信息
    service-url:
      defaultZone: http://192.168.73.128:21000/eureka/,http://192.168.73.129:21000/eureka/,http://192.168.73.130:21000/eureka/

提供sayhalo接口

@RestController
@RequestMapping("producer")
public class ProducerController {
    @GetMapping("sayhalo")
    public String sayhalo(){
        return "sayhalo";
    }
}

启动producer服务 可以看到 在三个注册中心都已经注册上了
image.png
image.png
image.png

创建consumer服务

@EnableFeignClients
@EnableEurekaClient
@SpringBootApplication
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}
server:
  port: 18001

spring:
  application:
    name: consumer-server

#Eureka setting
eureka:
  instance:
    prefer-ip-address: true #使用ip进行注册
  client:
    register-with-eureka: true #是否将自己注册到注册中心上
    fetch-registry: true #是否从Eureka上获取注册信息
    service-url:
      defaultZone: http://192.168.73.128:21000/eureka/,http://192.168.73.129:21000/eureka/,http://192.168.73.130:21000/eureka/

使用feign调用producer服务的sayhalo接口

@FeignClient("producer-server")
public interface ProducerFeign {

    @GetMapping("producer/sayhalo")
    public String sayhalo();

}
@RestController
@RequestMapping("consumer")
public class ConsumerController {

    @Autowired
    ProducerFeign feign;

    @GetMapping("getproducer")
    public String getproducer(){
        return feign.sayhalo();
    }

}

启动consumer服务 可以看到在三个eureka注册中心都已经注册上了
image.png
image.png
image.png

调用producer服务的sayhalo接口
image.png
可以看到通过consumer服务调用producer服务的sayhalo接口成功

4.测试高可用

关闭128节点的eureka 可以看到在其它两个注册中心上已经没有128节点的eureka服务了
image.png
image.png

我们再次请求接口 是没有问题的
image.png
我们把128节点启动 在其它节点可以看到它注册上来了
image.png
image.png

上边是eureka正常退出的情况,我们模拟下因网络波动或者无法抗拒的原因导致的非正常退出情况
我直接把130的node关机 可以看到eureka集群上还是可以看到这个节点,但是上边出现了一行红色的字
这是因为Eureka的自我自我保护机制,它会认为服务可能网络波动在等待服务上线 可以参考文末的Eureka自我保护机制
image.png

现在是128 129 两台Eureka,我同时也起了两个生产者服务,也断掉了一台。
这时候我们压测一下,可以看到成功率是百分之百的。
image.png
image.png

5.Code

代码已上传github.
Eureka集群部署Demo

参考

Ubuntu-Server 20.04 安装详细过程(图文)

Spring Cloud Eureka 自我保护机制