注册中心Eureka的简单介绍和使用(一)

一. 服务注册中心Eureka的简单介绍

(1)什么是服务治理?
管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。
(2)什么是服务注册
将服务所在主机、端口、版本号、通信协议等信息登记到注册中心上;
(3)什么是服务发现?
服务消费者向注册中心请求已经登记的服务列表,然后得到某个服务的主机、端口、版本号、通信协议等信息,从而实现对具体服务的调用;
(4)Eureka 是什么?

  1. Eureka采用了CS的设计架构,它包含两个组件:Eureka Server(服务注册功能的服务器)和Eureka Client(Eureka的客户端)
  2. Eureka Server提供服务注册服务
    各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。
  3. EurekaClient通过注册中心进行访问
    它是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)

二. Eureka 服务注册中心的搭建

具体步骤如下:
1、 创建一个 SpringBoot 项目(自行创建),并且添加 SpringBoot 的相关依赖;

    <dependencies>
        <!--这个依赖可以不加,eureka有的-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--springboot测试起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- eureka新旧版本 -->
       <!-- 以前的老版本(2018),可忽略-->
       <!--<dependency>
          <groupid>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-eureka</artifactId>
       </dependency>-->

        <!--Spring Cloud 的 eureka-server 起步依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>
   <!--依赖管理必须加,要不然spring-cloud-starter-netflix-eureka-server版本无法获得-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR10</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <!--在本地仓库找不到就到官网去找-->
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

这里注意springboot的版本为2.2.0.RELEASE

 <!--springboot的父级依赖-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

2、 添加 eureka 的依赖,上图已加
3、 在 Spring Boot 的入口类上添加一个@EnableEurekaServer注解,用于开启 Eureka 注册中心服务端

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

@SpringBootApplication
@EnableEurekaServer   //用于开启 Eureka 注册中心服务端
public class Application {

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

}

4、 在 application.properties 文件中配置 Eureka 服务注册中心信息:

# 内嵌的tomcat 的端口
server.port=8761
# 服务端的实例名称
eureka.instance.hostname=localhost
# false表示不向注册中心注册自己。默认情况下,这个应用会向注册中心注册自己
eureka.client.register-with-eureka=false
# 表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
eureka.client.fetch-registry=false
# 指定服务注册中心的位置,查询服务和注册服务都需要依赖这个地址
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka
  1. 启动与测试 Eureka 服务注册中心
    (1)、完成上面的项目搭建后,我们就可以启动 SpringBoot 程序,main 方法运行;
    (2)、启动成功之后,通过在浏览器地址栏localhost:8761访问我们的注册中心;如图
    在这里插入图片描述

三. 服务提供者向 Eureka 服务注册中心注册服务

步骤如下:
(1)、先 搭建和配置一个服务提供者, 创建一个 SpringBoot 工程(自行创建),并且添加 下面SpringBoot 的相关依赖;

    <dependencies>
        <!--springboot开发web项目的起步依赖,可以不加,eureka有-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--springboot测试的起步依赖,可以不加-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
         <!--SpringCloud 集成 eureka 客户端的起步依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>
     <!--依赖管理必须加,要不然spring-cloud-starter-netflix-eureka-server版本无法做到-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR10</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <!--在本地仓库找不到就到官网去找-->
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
      </repositories>

这里注意springboot的版本为2.2.0.RELEASE

 <!--springboot的父级依赖-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

(2)、添加 eureka 的依赖,因为服务提供者要向注册中心注册服务,需要连接 eureka,上面已完成
(3)、在 Spring Boot 的入口处,添加@EnableEurekaClient 注解来激活 Eureka,表明自己是一个 eureka 客户端,让服务提供者可以连接 eureka 注册中心

@SpringBootApplication
@EnableEurekaClient//表明自己是一个 eureka 客户端
public class Application {

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

}

(4)、配置服务名称和注册中心地址

#服务提供者内嵌tomcat的端口
server.port=9100
#配置服务名称
spring.application.name=02-springcloud-service-provider
#eureka的连接地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
#可加,可不加,主机名称:服务名称修改(也就是将IP地址,换成可读性高的名字)用的话要添加两个依赖,参考springboot文章
eureka.instance.instance-id=payment8001
#访问路径可以显示ip地址,可以添加
eureka.instance.prefer-ip-address=true

(5)、启动服务提供者 SpringBoot 程序的 main 方法运行;启动运行之后,通过在浏览器地址栏localhost:8761访问我们之前搭建好的 eureka 注册中心,就可以看到有一个服务已经注册成功了;
在这里插入图片描述

四. 从 Eureka服务注册中心中发现与消费服务

服务的发现由 eureka 客户端实现,而服务的消费由Ribbon实现,也就是说服务的调用需要 eureka客户端和Ribbon两者配合起来才能实现;
Eureka 客户端是什么?
Eureka 客户端是一个 Java 客户端,用来连接 Eureka 服务端,与服务端进行交互、负载均衡,服务的故障切换等;
Ribbon 是什么?
Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡器,当使用 Ribbon 对服务进行访问的时候,它会扩展 Eureka 客户端的服务发现功能,实现从 Eureka注册中心中获取服务端列表,并通过 Eureka 客户端来确定服务端是否己经启动。
Ribbon 在 Eureka 客户端服务发现的基础上,实现了对服务实例的选择策略,从而实现对服务的负载均衡消费。
让服务消费者去消费服务:
步骤如下:

(1)、创建springboot项目,在该项目中添加 eureka 的依赖,因为服务消费者从注册中心获取服务,需要连接 eureka,所以需要 eureka 客户端的支持;

<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>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>RELEASE</version>
            <scope>test</scope>
        </dependency>
        <!--SpringCloud 集成 eureka 客户端的起步依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>
    <!--依赖管理必须加,要不然spring-cloud-starter-netflix-eureka-server版本无法做到-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR10</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <!--在本地仓库找不到就到官网去找-->
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

(2)、在 Spring Boot 的入口处,添加@EnableEurekaClient 注解来表明自己是一个 eureka 客户端,让我的服务消费者可以使用 eureka 注册中心

@SpringBootApplication
@EnableEurekaClient//开启eureka客户端的支持
public class Application {

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

(3)、在配置文件配置服务的名称和注册中心的地址:

server.port=8081

spring.application.name=03-springcloud-web-consumer
eureka.client.service-url.defaultZone=http://localhost:8761/eureka

(4)、前面我介绍了服务的发现由 eureka 客户端实现,而服务的真正调用由 ribbon实现,所以我们需要在调用服务提供者时使用 ribbon 来调用。创建配置类


@Configuration//等价与spring的xml配置文件
public class BeanConfig {
    /**
     * @Bean等价与:
     * <bean id="restTemplate"  class="xxx.xxx.restTemplate"></bean>
     *
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

(5)编写控制层代码,加入了 ribbon 的支持,那么在调用时,即可改为使用服务名称来访问:

@RestController
public class WebController {
    @Autowired
    RestTemplate restTemplate;
    @RequestMapping("/web/hello")
    public String hello(){
        return  restTemplate.getForEntity("http://02-SPRINGCLOUD-SERVICE-PROVIDER/service/hello",String.class).getBody();
    }
}

(6)、完成上面的步骤后,我们就可以启动消费者的 SpringBoot 程序,main 方法运行;启动成功之后,通过在浏览器地址栏访问我们的消费者,看是否可以正常调用远程服务提供者提供的服务;

五. Eureka 与 与 Zookeeper 的比较

(1)著名的 CAP 理论指出,一个分布式系统不可能同时满足 C(一致性)、A(可用性)和 P(分区容错性)。
(2)由于分区容错性在是分布式系统中必须要保证的,因此我们只能在 A 和 C 之间进行权衡,在此 Zookeeper 保证的是 CP, 而 Eureka 则是 AP。
(3)Zookeeper 保证 CP
在 ZooKeeper 中,当 master 节点因为网络故障与其他节点失去联系时,剩余
节点会重新进行 leader 选举,但是问题在于,选举 leader 需要一定时间, 且选
举期间整个ZooKeeper集群都是不可用的,这就导致在选举期间注册服务瘫痪。在云部署的环境下,因网络问题使得 ZooKeeper 集群失去 master 节点是大概率事件,虽然服务最终能够恢复,但是在选举时间内导致服务注册长期不可用是难以容忍的。
(4)Eureka 保证 AP
Eureka 优先保证可用性,Eureka 各个节点是平等的,某几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而 Eureka 的客户端在向某个 Eureka 注册或时如果发现连接失败,则会自动切换至其它节点,只要有一台 Eureka 还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)。所以 Eureka 在网络故障导致部分节点失去联系的情况下,只要有一个节点可用,那么注册和查询服务就可以正常使用,而不会像 zookeeper 那样使整个注册服务瘫痪,Eureka 优先保证了可用性。


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