springcloud-注册中心实战篇(eureka)
2019-03-20 本文已影响0人
翟文龙
一、高可用注册中心搭建
- idea-->File-->New-->Project-->Spring Initializr-->next
- 填写基本信息
- 选择Cloud Discovery-->Eureka Server-->next-->finish
- 我们可以看到pom文件中已经包含了相关依赖,pom文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>erueka</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>erueka</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<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>
</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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 查看EruekaApplication启动类。里面需要添加注解@EnableEurekaServer
代码如下:
@SpringBootApplication
@EnableEurekaServer
public class EruekaApplication {
public static void main(String[] args) {
SpringApplication.run(EruekaApplication.class, args);
}
}
- 接下里就是最重要的配置文件编写,这里我们采用yml
spring:
application:
name: EUREKA
--- #注意这里是三个"减号"
spring:
profiles: eureka1
server:
port: 8001
eureka:
instance:
hostname: eureka1
client:
serviceUrl:
defaultZone: http://eureka2:8002/eureka/,http://eureka3:8003/eureka/
fetch-registry: true
register-with-eureka: true
---
spring:
profiles: eureka2
server:
port: 8002
eureka:
instance:
hostname: eureka2
client:
serviceUrl:
defaultZone: http://eureka1:8001/eureka/,http://eureka3:8003/eureka/
fetch-registry: true
register-with-eureka: true
---
spring:
profiles: eureka3
server:
port: 8003
eureka:
instance:
hostname: eureka3
client:
serviceUrl:
defaultZone: http://eureka1:8001/eureka/,http://eureka2:8002/eureka/
fetch-registry: true
register-with-eureka: true
配置说明
- spring.application.name:服务名,表示我们注册到eureka的服务的名字
- spring.profiles:我们需要多个配置来做高可用的注册中心这个profile用来指定使用哪个配置启动
- server.port:启动端口号
- eureka.instance.hostname:设置当前实例的主机名称,这里在同一台机器上配置,需要host文件中添加映射
- eureka.client.serviceUrl.defaultZone:这个是指当前实例要注册到哪个eureka服务中。
我们把eureka1注册到eureka2、eureka3,eureka2注册到eureka1、eureka3,eureka3注册到eureka1,eureka2。这样我们保证每个服务都是相互注册的。以保证高可用性
- eureka.client.register-with-eureka:是否向服务注册中心注册自己
- eureka.client.fetch-registry:是否检索服务
- 完成上述步骤之后分别启动3个active,然后查看我们的 http://eureka1:8001、http://eureka2:8002、http://eureka3:8003
-
可以看到如下图的结果:
eureka1
image
eureka2
image
eureka3
image
- 至此我们的高可用注册中心已经搭建完成
2.客户端配置(服务提供者+服务消费者)
- idea-->File-->New-->Project-->Spring Initializr-->next
- 填写基本信息
- 选择Cloud Discovery-->Eureka Discovery-->next-->finish
- 我们可以看到pom文件中已经包含了相关依赖.pom文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>eurekaclient</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eurekaclient</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<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-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
5.我们的客户端一般是在已有的项目上面做更改,这里我们可以把需要用到的内容摘出来直接复制到我们现有的服务中(demo项目)。pom文件需要拷贝的内容如下:
<properties>
<spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties>
-------
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
-------
<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>
- 启动类添加@EnableDiscoveryClient
- 配置文件需要添加的内容如下(这里采用的properties文件)
spring.application.name=demo
server.port=8080
eureka.client.serviceUrl.defaultZone=http://eureka1:8001/eureka/
-
这时我们的demo服务已经在注册中心注册,刷新eureka注册中心查看到如下截图
image
- 我们在demo项目中添加一个rest服务helloword。后续我们在服务调用中使用
++敲黑板:++
此处可以看到我们的demo服务只是注册到了eureka1注册中心,但是在eureka2和eureka3中同样会有这个注册信息。此时断开eureka1,同样是可以调用到demo服务的。
但是个人不建议这么配置,如果demo服务挂掉,eureka2和eureka3把demo服务剔除掉之后,重启的时候eureka1还没有启动,demo只是往eureka1中注册会注册失败,导致服务不可用
知识点:
- 我们在单机测试的时候很容易满足心跳失败比例在 15 分钟之内低于 85%,这个时候就会触发 Eureka 的保护机制,一旦开启了保护机制,则服务注册中心维护的服务实例就不是那么准确了,此时我们可以使用eureka.server.enable-self-preservation=false来关闭保护机制,这样可以确保注册中心中不可用的实例被及时的剔除,具体开关可参照(https://www.cnblogs.com/xishuai/p/spring-cloud-eureka-safe.html)
- 配置详解参考(https://www.cnblogs.com/xiemubg/p/7381055.html)
- 我们的注册中心服务端最好不要跟其他的服务混在一块,单纯的以注册中心服务来做高可用的注册中心
其他参考文档