【SpringCloud】高可用Eureka
Eureka是spring cloud只一个非常重要的组件,注册中心,也叫服务发现。功能定位类似于dubbo中的zookeeper。而Eureka和zookeeper又有所不同,Eureka强调的是CAP理论中的AP,zookeeper强调的是CP。
这里我们将要创建两个Eureka的注册中心,两个注册中心相互注册
Eureka的配置如下
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 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.2.6.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>cn.itcast.eureka</groupId><artifactId>itcast-eureka</artifactId><version>0.0.1-SNAPSHOT</version><name>itcast-eureka</name><description>Demo project for Spring Boot</description><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>Hoxton.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><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></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>
yml配置
server:port: 10086
spring:application:name: itcast-eurekaeureka:client:service-url:defaultZone: http://localhost:10087/eureka/server:eviction-interval-timer-in-ms: 5000 #剔除无效链接的间隔时间enable-self-preservation: false #关闭自我保护状态
启动类
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
@EnableEurekaServer //启动eureka服务端
public class ItcastEurekaApplication {public static void main(String[] args) {SpringApplication.run(ItcastEurekaApplication.class, args);}}
然后启动项目,等到项目启动后,我们在按照上述的配置重新在建立一个项目,修改yml中的配置即可
需要修改的yml配置如下:
server:port: 10087
spring:application:name: itcast-eurekaeureka:client:service-url:defaultZone: http://localhost:10086/eureka/server:eviction-interval-timer-in-ms: 5000 #剔除无效链接的间隔时间enable-self-preservation: false #关闭自我保护状态
在我的上一篇博客中,写了注册中心的客户端可服务端,并将它们注册给了端口为10086的注册中心,链接如下:
https://blog.csdn.net/wangyunzhao007/article/details/105776190
相互注册
等到两个注册中心启动后,并且将服务端和客户端都启动后,我们可以在浏览器输入localhost:10086,还有localhost:10087
效果如下:
10087
10086
如上可知,我虽然只把服务端和客户端注册给10086,但是10087也获取了。同样的我们也可以将服务同时注册给多个注册中心,yml配置如下:
server:port: 80
spring:application:name: service-consumer
eureka:client:service-url:defaultZone: http://localhost:10086/eureka/,http://localhost:10087/eureka/registry-fetch-interval-seconds: 5fetch-registry: true #开启拉取服务
注册中心也可以同样如此注册,如果有1,2,3,4,5个注册中心,我们可以把1注册给2,3,4,5,其他也是如此,全部注册给其他注册中心。
其他方式注册
也可以把1注册给2,2注册给3,3注册给4,4注册给5,5再注册给1,形成闭环。
但是由此产生了传递注册,如果中间有个服务宕机,后边的服务就拿不到之前的注册,现在在建立一个eureka,端口为10088,现在就有了三个eureka,我们把86注册给87,把87注册给88,把88再注册给86,然后还有一个上一篇博客中的注册中心客户端和服务端注册给86,当全部启动时,效果如下:
10086:
10087
10088
由三个图可知,只有注册过得服务才能拿到,如果存在传递的注册关系,是拿不到被注册的服务的,就好像注册在86的服务端和客户端,由于86注册在87,所以87拿得到。值得注意得是87虽然也注册给了88,但是88并没有拿到86的。