NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
服务注册中心在整个微服务体系中,至关重要!如果服务注册中心挂了,整个系统都将崩溃。所以服务注册中心通常不会被部署为单点应用,而是采用集群的部署方式,其中个别节点挂掉不影响整个系统的运行。 ![](https://img.kancloud.cn/bd/8d/bd8d406ea863f58bb4af307326863fab_514x207.png) 下面,我们就来为大家介绍,如何基于CentOS7服务器构建eureka服务注册中心。 ## 一、CentOS7(linux)环境准备 | 主机名称 | 主机ip | | --- | --- | | peer1 | 192.168.161.3 | | peer2 | 192.168.161.4 | | peer3 | 192.168.161.5 | 并且在安装eureka服务注册中心之间,需要将服务器时间同步,不能相差太多,否则eureka服务有可能启动失败。可以使用ntp进行时间同步。如: ~~~ ntpdate ntp.api.bz ~~~ ## 二、profile配置文件修改 ![](https://img.kancloud.cn/53/a1/53a1679ebbdec3aef3fd05dd9884b93f_346x255.png) application-peer1.yml * hostname为peer1 * defaultZone为peer2和peer3 * 下面配置我们之所以重写了health-check-url(健康检查路径),是因为设置了context-path。默认的健康检查路径是以“/”为项目的context-path。所以我们需要修改为server.servlet.context-path配置的值。 * 因为我们设置了 context-path,所以defaultZone访问端点有两个eureka,第一个eureka是我们配置的context-path。如果不设置 context-path,defaultZone:[http://peer2:8761/eureka/,http://peer3:8761/eureka/](http://peer2:8761/eureka/,http://peer3:8761/eureka/) * 在eureka集群搭建过程中,fetch-registry和register-with-eureka一定设置为true。 网上有很多人写的垃圾东西,搭建过程遇到各种报错之后,就将fetch-registry和register-with-eureka的值改成false,来解决问题。这两个值之所以设置为true,目的是让eureka集群之间实现互相注册,互相心跳健康状态,从而达到集群的高可用。 把它们设置为false,是能解决你可能遇到的一些集群环境问题。这就好比你腿疼,你把腿砍了是不疼了,但你还能走路么。我们要的是让腿不疼,而不是把腿砍掉。“把腿砍了”这就不是“高可用”集群了,相当于你搭建了多个eureka server单点,这是“掩耳盗铃”的做法。 ~~~ server: port: 8761 servlet: context-path: /eureka spring: application: name: eureka-server eureka: instance: hostname: peer1 health-check-url: http://${eureka.instance.hostname}:${server.port}/${server.servlet.context-path}/actuator/health client: #从其他两个实例同步服务注册信息 fetch-registry: true #向其他的两个eureka注册当前eureka实例 register-with-eureka: true service-url: defaultZone: http://peer2:8761/eureka/eureka/,http://peer3:8761/eureka/eureka/ ~~~ application-peer2.yml * hostname为peer2 * defaultZone为peer1和peer3 ~~~ server: port: 8761 servlet: context-path: /eureka spring: application: name: eureka-server eureka: instance: hostname: peer2 health-check-url: http://${eureka.instance.hostname}:${server.port}/${server.servlet.context-path}/actuator/health client: #从其他两个实例同步服务注册信息 fetch-registry: true #向其他的两个eureka注册当前eureka实例 register-with-eureka: true service-url: defaultZone: http://peer1:8761/eureka/eureka/,http://peer3:8761/eureka/eureka/ ~~~ application-peer3.yml * hostname为peer3 * defaultZone为peer1和peer2 ~~~ server: port: 8761 servlet: context-path: /eureka spring: application: name: eureka-server eureka: instance: hostname: peer3 health-check-url: http://${eureka.instance.hostname}:${server.port}/${server.servlet.context-path}/actuator/health client: #从其他两个实例同步服务注册信息 fetch-registry: true #向其他的两个eureka注册当前eureka实例 register-with-eureka: true service-url: defaultZone: http://peer1:8761/eureka/eureka/,http://peer2:8761/eureka/eureka/ ~~~ ## 三、为eureka server加入actuator spring-boot-starter-actuator是为Spring Boot服务提供相关监控信息的包。因为我们的eureka server要互相注册,并检查彼此的健康状态,所以这个包必须带上。 ~~~ <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> ~~~ ## 四、CentOS7环境下部署eureka集群 如果你的网络环境内没有DNS,需要配置/etc/hosts文件,将主机名称与ip地址关联。这一步必须要做,否则linux主机之间通过hostname访问eureka服务将无效,每台eureka server主机上都要执行。 ~~~ 192.168.161.3 peer1 192.168.161.4 peer2 192.168.161.5 peer3 ~~~ 开放防火墙端口(CentOS7),每台eureka server主机上都要执行。 ~~~ firewall-cmd --zone=public --add-port=8761/tcp --permanent firewall-cmd --reload ~~~ * 第一条命令式在防火墙开放8761端口 * 第二条命令是是开放端口重新加载,使生效 将zimug-server-eureka通过maven打包,然后上传CentOS主机,启动Eureka服务注册中心集群 ~~~ # 在peer1主机执行 nohup java -jar -Dspring.profiles.active=peer1 zimug-server-eureka-1.0.jar & # 在peer2主机执行 nohup java -jar -Dspring.profiles.active=peer2 zimug-server-eureka-1.0.jar & # 在peer3主机执行 nohup java -jar -Dspring.profiles.active=peer3 zimug-server-eureka-1.0.jar & ~~~ ## 四、访问测试 访问[http://192.168.161.3:8761/eureka/](http://192.168.161.3:8761/eureka/),即:访问peer1的eureka服务。可以见到DS Replicas中已经注册了peer3、peer2。 ![](https://img.kancloud.cn/9a/47/9a47232fcec5165d4cc1b5f387d0e31d_1326x683.png) 同理: * 访问[http://192.168.161.4:8761/eureka/](http://192.168.161.3:8761/eureka/),即:访问peer2的eureka服务。可以见到DS Replicas中已经注册了peer1、peer3。 * 访问[http://192.168.161.5:8761/eureka/](http://192.168.161.3:8761/eureka/),即:访问peer3的eureka服务。可以见到DS Replicas中已经注册了peer1、peer2。 出现上面的这种eureka server之间互相注册的效果,表示我们的eureka服务注册中心集群模式搭建成功了!那么恭喜你,你是一个幸运儿。在实际的生产环境中,网络及主机环境往往更复杂,搭建过程的参数调整也更加复杂。 ## 五、其他需要注意的点: 出现 unavailable-replicas 问题,首先要去检查一下你的health-check-url是否能正常响应。如果没有设置context-path,默认是:`http://ip:端口/actuator/health`。UP状态表示处于可用状态。 ![](https://img.kancloud.cn/1b/be/1bbe10b215473e076ca7f769bf223a32_522x71.png) 如果健康检查没有问题: 1.是否开启了register-with-eureka=true和fetch-registry=true 2.eureka.client.serviceUrl.defaultZone配置项的地址,不能使用localhost,要使用ip或域名。或者可以通过hosts或者DNS解析的主机名称hostname。 3.spring.application.name要一致,不配置也可以,配置了要一致 4.默认情况下,Eureka 使用 hostname(如:peer1、peer2、peer3) 进行服务注册,以及服务信息的显示(eureka web 页面),那如果我们希望使用 IP 地址的方式,该如何配置呢?答案就是`eureka.instance.prefer-ip-address=true`。当设置prefer-ip-address: true时 ,修改配置`defaultZone:http://你的IP:9001/eureka/`。如果此时你仍然使用`http://peer1:8761/eureka`会导致健康检查失败。 **如果你在本节课中,以上的问题你都检查过了,没有搭建成功也不要气馁,看看后面的章节能否解决你的问题!**