springCloud微服务注册中心Eureka

springCloud注册中心-Eureka

微服务的服务管理中心不论是 dubbo的zookeeper 还是springcloud的 Eureka他们必须遵循CAP定理

Eureka介绍

 Eureka是springCloud官网推荐的服务注册与发现的服务管理中心。

在这里插入图片描述

什么是CAP

CAP定理,指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。
分布式系统的CAP理论:理论首先把分布式系统中的三个特性进行了如下归纳:
一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
分区容忍性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。
任何一个分布式系统都不可能同时满足CAP三个原则。

Eureka满足CAP的AP两个原则

Eureka满足的是CAP里的 AP原则(A:可用性,P:分区容忍性)
Eureka满足A:Eureka各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册或时如果发现连接失败,则会自动切换至其它节点,只要有一台Eureka还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)。除此之外,Eureka还有一种自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时会出现以下几种情况:
1.Eureka不再从注册列表中移除因为长时间没收到心跳而应该过期的服务
2.Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用)
3.当网络稳定时,当前实例新的注册信息会被同步到其它节点中

搭建EurekaServer 服务端

EurekaServer 的搭建工程目录:
在这里插入图片描述spring-cloud-demo为父级工程的名称,他的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.1.4.RELEASE</version>
        <relativePath/>
    </parent>
    <groupId>com.wl</groupId>
    <artifactId>spring-cloud-demo</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>spring-cloud-demo</name>
    <modules>
        <module>eureka-server-demo</module>
    </modules>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
        <motan.version>0.3.0</motan.version>
        <spring.cloud.version>2.1.1.RELEASE</spring.cloud.version>
        <maven.jar.plugin>2.6</maven.jar.plugin>
        <java.version>1.8</java.version>
        <gson.version>2.8.5</gson.version>
    </properties>

    <build>
    </build>
</project>

eureka-server-demo的pom.xml 引入jar包

<?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.wl</groupId>
    <artifactId>eureka-server-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>com.wl</groupId>
        <artifactId>spring-cloud-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            <version>${spring.cloud.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>${spring.cloud.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>${gson.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>${maven.jar.plugin}</version>
                <configuration>
                    <archive>
                        <!-- 添加index则不从mainfest中读取classpath,而是从Index.list中读取 -->
                        <!-- <index>true</index> -->
                        <manifest>
                            <!-- 作为程序入口来执行的class -->
                            <mainClass>com.wl.eureka.EurekaSeverDemoApplication</mainClass>
                            <!-- 是否将依赖的classpath一起打包 -->
                            <addClasspath>true</addClasspath>
                            <!-- 依赖的classpath的前缀,也就是打包后生成的MANIFEST.MF文件里,引入的jar文件都会加上前缀。lib/,比如fastjson-1.2.7.jar,在mainfest文件里就会是lib/fastjson-1.2.7.jar -->
                            <classpathPrefix>lib/</classpathPrefix>
                            <!--<classpathLayoutType>custom</classpathLayoutType> <customClasspathLayout>
                                lib/$${artifact.groupId}.$${artifact.artifactId}.$${artifact.extension} </customClasspathLayout> -->
                        </manifest>
                        <manifestEntries>
                            <Class-Path>./</Class-Path>
                        </manifestEntries>
                    </archive>
                    <!-- 打包排除的文件 -->
                    <excludes>
                        <exclude>config/**</exclude>
                    </excludes>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>${maven.jar.plugin}</version>
                <configuration>
                    <appendAssemblyId>false</appendAssemblyId>
                    <archive>
                        <manifest>
                            <mainClass>com.zczy.generator.EntityGenerator</mainClass>
                        </manifest>
                    </archive>
                    <descriptors>
                        <descriptor>assembly/assembly.xml</descriptor>
                    </descriptors>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>assembly</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

application.properties 配置

server.port=9020
spring.application.name=eureka-service-demo

eureka.instance.prefer-ip-address=true
spring.cloud.client.ip-address=127.0.0.1
eureka.instance.instance-id=${spring.cloud.client.ip-address}\:${server.port}
#关闭自我保护主要   当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。
#一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。
#eureka.server.enableSelfPreservation=false
#禁用把自己作为客户端注册到自己里
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

启动类 EurekaSeverDemoApplication

package com.wl.eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@EnableEurekaServer
@SpringBootApplication
public class EurekaSeverDemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(EurekaSeverDemoApplication.class, args);
	}

}

运行代码访问查看控制台日志,看是否正常启动:
在这里插入图片描述正常启动访问 http://localhost:9020/
在这里插入图片描述至此eureka-server客户端搭建完毕
个人源码已上传到git上
在这里插入图片描述
git地址:https://github.com/wenlin1/spring-cloud-demo/tree/master/eureka-server-demo


版权声明:本文为weixin_37677822原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。