1.疑问
1.1为什么需要搭建eureka2.0 HA集群环境?
因为在微服务架构中,注册中心是核心,所有的服务都需要通过注册中心来进行交互,如果是单机版环境,注册中心一挂,会导致整个微服务环境不可用。
1.2 eureka2.0 HA环境怎么样才算HA?
一般来说,搭建环境最好是奇数台,所以,至少是3台(个人建议,当然2台也可以)。
1.3 eureka HA使用的是什么原理?
使用的是相互注册原理。从而实现数据的相互注册。
2.eureka HA集群环境搭建
springcloud_eureka 服务注册 8100
springcloud_eureka_ha 服务注册 9100
eureka HA集群环境建议3台
父模块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 http://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.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.fqyd</groupId>
<artifactId>springcloud</artifactId>
<version>1.0-SNAPSHOT</version>
<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.RELEASE</spring-cloud.version>
</properties>
<modules>
<module>springcloud_eureka</module>
<module>springcloud_eureka_ha</module>
<module>springcloud_product</module>
<module>springcloud_product_member</module>
<module>springcloud_consumer</module>
</modules>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- Spring Cloud 管理依赖 -->
<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>
2.1 springcloud_eureka
2.1.1 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.fqyd</groupId>
<artifactId>springcloud</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.fqyd</groupId>
<artifactId>springcloud_eureka</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springcloud_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>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
2.1.2 application.yml
####服务器端口号
server:
port: 8100
##定义服务名称
spring:
application:
name: fqyd-eureka
eureka:
instance:
####服务注册ip
hostname: 127.0.0.1
client:
###因为本身是注册中心,是否需要将自己注册给自己的注册中心(集群的时候需要设置成true)
registerWithEureka: true
###因为本身是注册中心,不需要去检索服务
fetchRegistry: true
###注册地址
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:9100/eureka/
注意:1.registerWithEureka和fetchRegistry需要设置成true
2.defaultZone: http://${eureka.instance.hostname}:9100/eureka/ 9100是另一个注册中心的端口,主要是使用相互注册的原理。
3.spring.application. name: fqyd-eureka 服务的应用名要保持一致,不然会有冲突的问题。
2.1.3 启动类
package com.fqyd;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer //表示开启eureka服务
public class SpringcloudEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudEurekaApplication.class, args);
}
}
2.2 springcloud_eureka_ha
2.2.1 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.fqyd</groupId>
<artifactId>springcloud</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.fqyd</groupId>
<artifactId>springcloud_eureka_ha</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springcloud_eureka_ha</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>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
2.2.2 application.yml
####服务器端口号
server:
port: 9100
##定义服务名称
spring:
application:
name: fqyd-eureka
eureka:
instance:
####服务注册ip
hostname: 127.0.0.1
client:
###因为本身是注册中心,是否需要将自己注册给自己的注册中心(集群的时候需要设置成true)
registerWithEureka: true
###因为本身是注册中心,不需要去检索服务
fetchRegistry: true
###注册地址
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:8100/eureka/
注意: defaultZone: http://${eureka.instance.hostname}:8100/eureka/ 这里是8100,相互注册
2.2.3 启动类
package com.fqyd.springcloud_eureka_ha;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer //表示开启eureka服务
public class SpringcloudEurekaHaApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudEurekaHaApplication.class, args);
}
}
3 效果
先启动8100,再启动9100,8100服务启动过程中会报如下错误,报错正常,因为8100是注册在9100上,而9100还没有启动,所以才报这个错。还有一个问题需要注意,通过http://localhost:8100/访问,启动后,立即查看, 发现只有一个服务,而9100有两个服务,需要耐心等待一小会,才能看到两个服务,这也是因为8100启动时,报错的问题,需要一段时间才能同步。
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112) ~[eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) ~[eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59) ~[eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77) ~[eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) ~[eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.DiscoveryClient.register(DiscoveryClient.java:829) ~[eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:121) ~[eureka-client-1.9.2.jar:1.9.2]
at com.netflix.discovery.InstanceInfoReplicator$1.run(InstanceInfoReplicator.java:101) [eureka-client-1.9.2.jar:1.9.2]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_101]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_101]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_101]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.8.0_101]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_101]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_101]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_101]
如果你热衷技术,喜欢交流,欢迎加入我们!