《springcloud学习》六 eureka2.0 高可用集群环境搭建

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   服务的应用名要保持一致,不然会有冲突的问题。

扫描二维码关注公众号,回复: 8686164 查看本文章

                    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]

如果你热衷技术,喜欢交流,欢迎加入我们! 

发布了263 篇原创文章 · 获赞 366 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/qq_16855077/article/details/95940638