一、概述
1.1、版本问题
1、springcloud与springboot的版本对应
- springcloud技术栈与springcloud版本对应大全:springcloud官网
1.2、创建一个springcloud工程
1、 idea创建springcloud项目图文教程(EurekaServer注册中心)
2、 注册中心的pom.xml:一定要检查springboot和springcloud是否版本对立
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.eureka</groupId>
<artifactId>cloud-eureka</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cloud-eureka</name>
<description>learn for spring cloud redistribution eureka</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR3</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>
3、启动类配置
- @EnableEurekaServer声明此工程是一个eureka服务注册中心
@SpringBootApplication
@EnableEurekaServer
public class CloudEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(CloudEurekaApplication.class, args);
}
}
4、修改配置文件,yaml格式
server:
port: 8761
eureka:
client:
service-url:
defaultZone: localhost:{server.port}/eureka/
- 启动应用程序,我们发现控制台报错
- 但是访问注册中心路径依然能够成功:控制台的报错是因为这个eureka服务注册中心程序也作为一个client注册自己本身,解决办法就是忽略掉本身的注册。
5、忽略掉注册中心本身的注册
server:
port: 8761
eureka:
instance:
hostname: localhost # 指定注册中心主机名称
server:
enable-self-preservation: false # 关闭自我保护模式(默认为打开);生产环境不能这样子做
eviction-interval-timer-in-ms: 5000 # 续期时间,即扫描失效服务的间隔时间(缺省为60*1000ms)
client:
register-with-eureka: false # 关闭自我注册功能
fetch-registry: false # 由于自己就是服务器,不需要从服务器获取注册信息
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
- eureka.client.register-with-eureka:对于同一个进程,既可以作为注册中心的服务端,也可以作为注册中心的客户端,在本例中,注册中心提供单一的注册服务功能,不提供其他接口服务能力,所以设置为false,最终不作为服务实例注册在注册中心中供其他服务调用;即忽略掉注册中心本身的注册。
- eureka.server.enable-self-preservation:是否开启自我保护模式,默认为true;
1、默认情况下,如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务。
2、Eureka通过“自我保护模式”来解决这个问题——当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。
1.3、eureka client 的使用
1、引入eureka client 依赖
2、pom.xml文件
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.eureka</groupId>
<artifactId>eureka-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-client</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR3</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>
3、启动类配置
-
@EnableEurekaClient声明这是一个eureka client 服务发现工程
@SpringBootApplication @EnableEurekaClient public class EurekaClientApplication { public static void main(String[] args) { SpringApplication.run(EurekaClientApplication.class, args); } }
4、工程文件配置
- 注册上面已经完成的注册中心
server:
port: 8091
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: eurekaClient
5、SpringCloud-Eureka-Client 启动后自动停止问题解决
- 加入如下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
6、测试
- 先启动注册中心,然后启动eureka client 服务
- 服务注册成功
7、@EnableDiscoveryClient与@EnableEurekaClient的区别
- @EnableDiscoveryClient基于spring-cloud-commons;如果是其他的注册中心,那么推荐使用@EnableDiscoveryClient
- @EnableEurekaClient基于spring-cloud-netflix;如果选用的注册中心是eureka,那么就推荐@EnableEurekaClient
8、springcloud Eureka注册中心配置详解
二、springcloud高可用
2.1、为什么要用到高可用解决方案
- springcloud高可用主要是解决单个注册中心宕机后整个微服务崩溃的问题;Eureka Server的设计一开始就考虑了高可用的问题,在Eureka的服务设计中, 所有节点即是服务提供方,也是服务消费方,服务注册中心也不例外;所以在生产环境下一般会配置两个或者两个以上的注册中心‘’
2.2、配置两个服务注册中心
1、基本结构图
2、创建一个新的微服务注册中心工程
-
配置文件:两个注册中心需要两两注册、所有的微服务都要在以上两个注册中心注册
-
第一个注册中心的配置:
server: port: 8761 eureka: instance: hostname: localhost # 指定注册中心主机名称 server: enable-self-preservation: false # 关闭自我保护模式(默认为打开);生产环境不能这样子做 eviction-interval-timer-in-ms: 5000 # 续期时间,即扫描失效服务的间隔时间(缺省为60*1000ms) client: register-with-eureka: false # 关闭自我注册功能 fetch-registry: false # 由于自己就是服务器,不需要从服务器获取注册信息 service-url: defaultZone: http://localhost:8762/eureka/ spring: application: name: cloud-eureka
-
第二个注册中心配置:
server: port: 8762 eureka: instance: hostname: localhost # 指定注册中心主机名称 server: enable-self-preservation: false # 关闭自我保护模式(默认为打开);生产环境不能这样子做 eviction-interval-timer-in-ms: 5000 # 续期时间,即扫描失效服务的间隔时间(缺省为60*1000ms) client: register-with-eureka: false # 关闭自我注册功能 fetch-registry: false # 由于自己就是服务器,不需要从服务器获取注册信息 service-url: defaultZone: http://localhost:8761/eureka/ spring: application: name: cloud-registry
-
eureka client 服务配置:
server: port: 8091 eureka: client: service-url: defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/ spring: application: name: eurekaClient
-
先启动第一个注册中心,在自动第二个,最后启动eureka client 服务;测试结果:哪一个注册中心先启动,服务就在哪一个注册。如果第一启动的注册中心发生故障,服务就会找第二个注册中心进行服务注册;这样就可以避免上述的问题了。
**