springcloud eureka入门与实践

Eureka是spring cloud中的一个负责服务注册与发现的组件。符合分布式系统CAP原则中的AP原则。

什么是CAP 原则?

  • 一致性(Consistency)
  • 可用性(Availability)
  • 分区容错性(Partition tolerance)

 

1、什么是一致性,可用性,分区容错性?

 

 

 一致性(C):各节点数据时刻保持一致。分布式系统一个节点写入数据,所有的节点读取的都应该是最新的数据。

可用性(A):系统始终保持可用性,用户无法感知到异常。

分区容错性(P):分布式系统的基础,最重要的一环。分布式系统中某个节点因为系统故障、网络、硬件等原因挂掉了,整个系统仍可以对外提供服务。体现分区性,各个分区互不影响。

2、为什么不能同时满足CAP原则?

现实中,应用难免会因为网络延误,服务器硬件故障等原因,导致节点服务失去响应。这时候,在A和C中做选择,就成了各微服务框架间的区别。

3、springcloud 和 dubbo区别?

springcloud遵循AP原则:在某节点发生故障时(心跳异常),选择将该节点下线,暂时不保证该节点的数据一致性,保证其他节点可用,整体服务可用。

dubbo遵循CP原则:在某节点故障时,(在一定时间内)会等待该节点上线,同步最新数据至该节点,等待服务上线过程中,整体服务不可用。

 

Eureka原理

eureka分为服务端和客户端,客户端将自身注册到服务端上,客户端之间调用用过服务端分配相关的服务。

 

 

 

Eureka功能

服务注册

服务提供者启动时,会通过 Eureka Client 向 Eureka Server 注册信息,Eureka Server 会存储该服务的信息。

提供注册表

服务消费者在调用服务时,如果 Eureka Client 没有缓存注册表的话,会从 Eureka Server 获取最新的注册表。

同步状态

Eureka Client 通过注册、心跳机制和 Eureka Server 同步当前客户端的状态。

Eureka Client 会每隔 30 秒发送一次心跳来续约。 通过续约来告知 Eureka Server 该 Eureka Client 运行正常,没有出现问题。 默认情况下,如果 Eureka Server 在 90 秒内没有收到 Eureka Client 的续约,Server 端会将实例从其注册表中删除,此时间可配置,一般情况不建议更改。

Eureka集群

Eukeka server之间可以互相组成集群,各server平等,不分主从节点,数据自动同步。

Eureka client连接所有的所有的server,一个server故障,自动切换其他的server,保障服务可用。

 

Eureka工作流程

1、Eureka Server 启动成功,等待服务端注册。在启动过程中如果配置了集群,集群之间定时通过 Replicate 同步注册表,每个 Eureka Server 都存在独立完整的服务注册表信息

2、Eureka Client 启动时根据配置的 Eureka Server 地址去注册中心注册服务

3、Eureka Client 会每 30s 向 Eureka Server 发送一次心跳请求,证明客户端服务正常

4、当 Eureka Server 90s 内没有收到 Eureka Client 的心跳,注册中心则认为该节点失效,会注销该实例

5、单位时间内 Eureka Server 统计到有大量的 Eureka Client 没有上送心跳,则认为可能为网络异常,进入自我保护机制,不再剔除没有上送心跳的客户端

6、当 Eureka Client 心跳请求恢复正常之后,Eureka Server 自动退出自我保护模式

7、Eureka Client 定时全量或者增量从注册中心获取服务注册表,并且将获取到的信息缓存到本地

8、服务调用时,Eureka Client 会先从本地缓存找寻调取的服务。如果获取不到,先从注册中心刷新注册表,再同步到本地缓存

9、Eureka Client 获取到目标服务器信息,发起服务调用

10、Eureka Client 程序关闭时向 Eureka Server 发送取消请求,Eureka Server 将实例从注册表中删除

开发环境

IDEA 2019

JDK1.8

SPRINGBOOT  2.0.6.RELEASE

SPRINGCLOUD Finchley SR1

 

开发入门

Eureka服务端

1、引入依赖

<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.SR1</spring-cloud.version>
        <lombok-version>1.18.10</lombok-version>
        <spring-boot.version>2.0.6.RELEASE</spring-boot.version>
    </properties>

    <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>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
                <version>${spring-boot.version}</version>
            </dependency>

        </dependencies>
    </dependencyManagement>

 

2、配置application.yml

server:
port: 8761


spring:
application:
name: eureka

eureka:
client:
#是否将自己注册到 Eureka-Server 中,默认的为 true
register-with-eureka: false
#是否需要拉取服务信息,默认未true
fetch-registry: false
service-url:
#eureka 集群配置
defaultZone: http://127.0.0.1:18761/eureka
server:
#自我保护机制,开启后 服务断了,eureka会提示emergency
enable-self-preservation: false

 

3、新建Springboot入口类

@SpringBootApplication
//enableXXX  SpringCloud系列应用最常用的组件开启方式 @EnableEurekaServer
public class EurekaApplication { public static void main(String[] args){ SpringApplication.run(EurekaApplication.class, args); } }

4、项目整体结构

 

 

 5、项目运行

 运行项目后,访问 http://localhost:8761,即可出现eureka的界面,表示搭建成功。

 

 Eureka客户端

1、引入依赖

    <dependencies>

        <!--注意这个client依赖,不是spring-cloud-netflix-eureka-client,要加starter-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>${web.version}</version>
        </dependency>
  

    </dependencies>

 

2、修改application.yml

server:
  port: 8081

spring:
  application:
    name: producer-service


eureka:
  instance:
    #以IP地址注册到服务中心,相互注册使用IP地址
    prefer-ip-address: true
  client:
    serviceUrl:
      defaultZone: http://127.0.0.1:8761/eureka,http://127.0.0.1:8761/eureka

 

3、修改springboot入口类

@SpringBootApplication
@EnableEurekaClient   #启动eureka客户端
public class ProducerApplication {

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

 

4、启动服务

服务启动后,可以在eureka中看到注册的服务

 

 服务管理与服务调用

服务间调用采用服务名称调用的方式,应用间不需要知晓对方的具体地址。

@Service
public class ProducerServiceImpl {

    @Autowired
    private BasedataClient basedataClient;

    //@Autowired
    @Resource
    private RestTemplate restTemplate;

    public StudentDto test() {
        return basedataClient.get();
    }

    public String testRest() {
        //请求绑定servername即可
        return restTemplate.getForObject("http://PRODUCER-SERVICE/getUser", String.class);
    }

}

 

posted @ 2021-03-09 18:44  嗷大喵is  阅读(233)  评论(0编辑  收藏  举报