Spring cloud搭建Eureka高可用注册中心
注册中心在微服务中是必不可少的一部分,主要用来实现服务自治的功能,本文则主要记载使用Netflix提供的Eureka作为注册中心,来实现服务自治的功能。
实际上Eureka的集群搭建方法很简单:每一台Eureka只需要在配置中指定另外多个Eureke的地址,就可以实现一个集群的搭建了
例如:
两节点
-- 节点1注册到节点2
--节点2注册到节点1
三节点
--节点1注册到节点2,3
--节点2注册到节点1,3
--节点3注册到节点1,2
我做的是两个Eureka节点构建注册中心,然后一个producer和一个customer分别进行提供服务和请求服务:见图

节点1:
先新建一个Maven项目,添加依赖(基于jdk11,如果不是jdk11,可以不添加)
pom.xml主要代码
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/>
</parent> <properties>
<java.version>11</java.version>
</properties> <!-- 依赖 -->
<dependencies>
<!-- Eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency> <!--java 11 缺少的模块 javax.xml.bind-->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency> <!-- 添加 Spring-Security 不需要则不添加-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies> <!-- Spring Cloud -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
application.yml
---
server:
###启动端口
port:
spring:
###启动的配置文件名
profiles: eureka1
###应用名
application:
name: master
eureka:
instance:
hostname: eureka1
client:
###不向注册中心注册自己
register-with-eureka: false
###不需要检索服务
fetch-registry: false
serviceUrl:
defaultZone: http://127.0.0.1:8762/eureka/
server:
###关闭自我保护模式
enable-self-preservation: false
###清理的间隔为5s
eviction-interval-timer-in-ms:
security:
basic:
###暂时关闭安全认证
enabled: false ---
server:
###启动端口
port:
spring:
###启动的配置文件名
profiles: eureka2
application:
###应用名
name: slaveone
eureka:
instance:
hostname: eureka2
client:
###不向注册中心注册自己
register-with-eureka: false
###不需要检索服务
fetch-registry: false
serviceUrl:
defaultZone: http://127.0.0.1:8761/eureka/
server:
###关闭自我保护模式
enable-self-preservation: false
###清理的间隔为5s
eviction-interval-timer-in-ms:
security:
basic:
###暂时关闭安全认证
enabled: false
启动类:EurekaServerApplication.class
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication { public static void main(String [] args){
SpringApplication.run(EurekaServerApplication.class, args);
}
}
启动参数 IDEA设置 --spring.profiles.active=eureka1
点击这个:


同理另外一个节点的启动类,application.yml和pom.xml文件与节点1相同
启动参数改为--spring.profiles.active=eureka2
此时,浏览器输入 http://127.0.0.1:8761/发现如下:


至此注册中心已经搭建完成
producer服务注册:
主要的pom.xml文件
<properties>
<java.version>11</java.version>
</properties> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/>
</parent> <!-- 依赖 -->
<dependencies>
<!-- Eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!--java 11 缺少的模块 javax.xml.bind-->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency> <!-- Actuator 健康检查 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies> <!-- Spring Cloud -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
application.properties文件:
spring.application.name=producer
server.port=8081
eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/,http://127.0.0.1:8762/eureka/ ### 配置健康检查的信息
eureka.client.healthcheck.enabled=true
### 默认30s
eureka.instance.lease-renewal-interval-in-seconds=5
### 默认90秒
eureka.instance.lease-expiration-duration-in-seconds=5
@RestController
@RequestMapping("/home")
public class HomeController { @GetMapping("/hello")
public String hello(){
return "hello";
}
}
基本的control类和启动类
@SpringBootApplication
@EnableDiscoveryClient
public class ProduceServiceApplication {
public static void main(String[] args){
SpringApplication.run(ProduceServiceApplication.class, args);
}
}
启动之后再看Eureka注册中心:两个节点应该都有

访问 http:127.0.0.1:8081/home/hello 发现正常返回字符串

此时
搭建customer请求服务
pom.xml 和application.properties文件
<properties>
<java.version>11</java.version>
</properties> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/>
</parent> <!-- 依赖 -->
<dependencies>
<!-- Eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!--java 11 缺少的模块 javax.xml.bind-->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency> <!-- Actuator 健康检查 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies> <!-- Spring Cloud -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
spring.application.name=customer
server.port=
eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/,http://127.0.0.1:8762/eureka/ ### 配置健康检查的信息
eureka.client.healthcheck.enabled=true
### 默认30s
eureka.instance.lease-renewal-interval-in-seconds=
### 默认90秒
eureka.instance.lease-expiration-duration-in-seconds=
获取RestTemplate的类:
@Configuration
public class BeanConfiguration { @Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
control类
@RestController
@RequestMapping("/customer/")
public class CustomerServiceController { @Autowired
private RestTemplate restTemplate; @GetMapping("/callHello")
public String callHello(){
return restTemplate.getForObject("http://producer/home/hello", String.class);
}
}
启动类:
@SpringBootApplication
@EnableDiscoveryClient
public class CustomerMainApplication {
public static void main(String[] args){
SpringApplication.run(CustomerMainApplication.class, args);
}
}
首先,正常情况下访问 http://localhost:8082/customer/callHello

然后停掉节点1,继续访问看是否成功:

请求正常
重新启动节点1,查看节点2的日志:

节点2在丢失节点1之后会不断重试
直到找到节点1,高可用重新生成
如果有什么错误或者纰漏,恳请指正,谢谢
Spring cloud搭建Eureka高可用注册中心的更多相关文章
- spring cloud 系列第2篇 —— eureka 高可用注册中心的搭建 (F版本)
源码仓库地址:https://github.com/heibaiying/spring-samples-for-all 一.项目结构 eureka-server为服务注册中心,负责服务的管理: eur ...
- eureka高可用注册中心
Eureka高可用注册中心 两个配置文件: application-peer1.properties application-peer2.properties 都需要加上 eureka.client. ...
- 笔记:Spring Cloud Eureka 高可用注册中心
在微服务架构这样的分布式环境中,我们需要充分考虑发生故障的情况,所以在生产环境中必须对各个组件进行高可用部署,对与微服务和服务注册中心都需要高可用部署,Eureka 高可用实际上就是将自己作为服务向其 ...
- 从零开始学spring cloud(八) -------- Eureka 高可用机制
一.Eureka高可用机制介绍 Eureka服务器没有后端存储,但注册表中的服务实例都必须发送心跳以使其注册保持最新(因此可以在内存中完成). 客户端还有一个Eureka注册的内存缓存(因此,他们不必 ...
- Spring Cloud Eureka 高可用注册中心
参考:<<spring cloud 微服务实战>> 在微服务架构这样的分布式环境中,各个组件需要进行高可用部署. Eureka Server 高可用实际上就是将自己作为服务向其 ...
- spring cloud 使用Eureka作为服务注册中心
什么是Eureka? Eureka是在AWS上定位服务的REST服务. Eureka简单示例,仅作为学习参考 在pom文件引入相关的starter(起步依赖) /*定义使用的spring cloud ...
- springcloud搭建高可用注册中心的时候注册中心在unavailable-replicas中的问题
在搭建springcloud eureka高可用注册中心时,发现另一个注册中心一直在unavailable-replicas不可用分片,原因为原来为单个注册中心的时候,禁止了注册中心自主注册为服务和检 ...
- (2-1)SpringCloue-Eureka实现高可用注册中心
高可用注册中心 在微服务架构这样的分布式环境中,我们需要充分考虑发生故障的情况,所以在生产环境中必须对各个组件进行高可用部署.在eureka-server中的application.yml中我们还记得 ...
- spring cloud(学习笔记)高可用注册中心(Eureka)的实现(一)
最近在学习的时候,发现微服务架构中,假如只有一个注册中心,那这个注册中心挂了可怎么办,这样的系统,既不安全,稳定性也不好,网上和书上找了一会,发现这个spring cloud早就想到了,并帮我们解决了 ...
随机推荐
- 【MyEclipse常见错误】-java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory的解决
ApacheJavaTomcatMyeclipse 自己前一段时间出现了这个问题,通过在网上搜索,大概知道了原因,整理下一,以供大家参考. 将项目部署好后,启动tomcat后报错,java.lang ...
- php PAC 安装
LIUNX wget http://pecl.php.net/get/APC-3.1.8.tgz tar -zxvf APC-3.1.8.tgz cd APC-3.1.8 /usr/local/php ...
- C#最新功能(6.0、7.0)
一直用C#开发程序,.NET的功能越来越多,变化也挺大的,从最初的封闭,到现在的开源,功能不断的增加,一直在进步.作为C#的强烈支持者,C#的变化,我不能不关注,这篇文章主要介绍,C#6.0和C#7. ...
- 【转】子弹短信内部技术分享:Redis
原理 Redis 是一个内存型「数据库」,除存储之外,它还有许多强大的命令,使之远远超出了数据库的定义,所以官方称之为「data structure store」,数据结构存储系统. 通过 Redis ...
- Adam和学习率衰减(learning learning decay)
目录 梯度下降法更新参数 Adam 更新参数 Adam + 学习率衰减 Adam 衰减的学习率 References 本文先介绍一般的梯度下降法是如何更新参数的,然后介绍 Adam 如何更新参数,以及 ...
- 快速开发第一个SpringBoot应用
通过笔者这段实践SpringBoot的学习,发现自从使用了SpringBoot后,就再也回不去SpringMVC了,因为相比于SpringMVC,SpringBoot真是太高效率了.下面我们看看它效率 ...
- kubernetes实战篇之创建密钥自动拉取私服镜像
系列目录 前面我们讲解了如何搭建nexus服务器,以及如何使用nexus搭建docker私有镜像仓库,示例中我们都是手动docker login登陆私服,然后通过命令拉取镜像然后运行容器.然而这种做法 ...
- spring 5.x 系列第13篇 —— 整合RabbitMQ (xml配置方式)
源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构说明 本用例关于rabbitmq的整合提供简单消 ...
- 并发编程-concurrent指南-Lock-可重入锁(ReentrantLock)
可重入和不可重入的概念是这样的:当一个线程获得了当前实例的锁,并进入方法A,这个线程在没有释放这把锁的时候,能否再次进入方法A呢? 可重入锁:可以再次进入方法A,就是说在释放锁前此线程可以再次进入方法 ...
- python3 连接数据库注意点
类库:pymysql ''' Created on 2019年 @author: Root ''' import pymysql from name import getName # 数据库连接信息 ...