微服务学习SpringCloud 之服务注册中心Eureka

写在前面:后续的文章都是基于第一篇文章进行更新,我是按照SpringCloud学习顺序进行文章编写,因为项目只有一个项目,需要了解SpringCloud前面skill的可以看一下前面SpringCloud体系。

上篇文章介绍了SpringCloud的环境搭建,这里继续对上篇文章进行补充

分布式架构不管使用哪种框架都会有它的注册中心,熟悉dubbo的人应该知道zookeeper注册中心,zk是一个类似树状节点的结构,它的客户端安装到服务器就好了。

      dubbo和zk的最大区别在于他们不仅仅结构不同,实现方式不同,更重要的一点在cap选择方面Eureka遵循AP的原则,zk遵循Cp原则。对于这种怎么原则,有这样有一个面试题,在双十一怎么做选择。答案当然是选择高可用了。因为如果服务都挂了那损失得多大。

服务提供者

服务注册:

        服务提供者在启动的时候会通过rest请求方式将自己注册到Eureka server上,同时带上了自身服务的一些元数据信息。Eureka server 接收到这个rest请求之后,将元数据信息存储在一个双层结构Map中,其中第一层的key是服务名,第二层的key是具体的服务名的的实例名。

  在服务注册的时候,需要确认一下,eureka.client.register-with-eureka=true参数是否正确,该值默认为true。若设置为false将不会启动注册操作。

服务同步:

两个服务提供者分别注册到了两个不同的服务器注册中心上,也就是说,他们的信息分别被两个注册中心维护。此时,由于服务注册中心之间因互相注册为服务,当服务提供者发送请求到一个注册中心,它会将该请求转发给集群中相连的其他注册中心,从而实现注册中心之间的服务同步。通过服务同步,两个服务提供者的服务信息就可以通过这两台服务注册中心的任意一台获取到。

服务续约:

在注册完服务之后,服务提供者会维护一个心跳用来持续高速Eureka server “”我还活着“,以防止Eureka server的“剔除任务” 将该服务实例从服务列表中排除出去,我们称作服务续约,关于服务续约有两个重要的属性,我们可以关注并根据需要来进行调整;

eureka.instance.lease-renewal-interval-in-seconds=30

eureka.instance.lease-expiration-duration-in-seconds=90

eureka.instance.lease-renewal-interval-in-seconds=30参数用于定义服务续约任务调用间隔时间,默认为30s

eureka.instance.lease-expiration-duration-in-seconds参数用于定义服务失效的时间默认为90s。

服务消费者

获取服务

      当我们启动服务的时候,它会发送一个rest请求给服务注册中心,来获取 上面注册的服务清单。为了性能考虑,Eureka server会维护一份只读的服务清单来返回给客户端,同时该缓存清单会每隔30秒更新一次。

      获取服务是服务消费的基础,所有必须保证Eureka.client.fetch-regisrty=true没有被修改成false,该值默认为true。若希望修改缓存单的更新时间,可以通过Eureka.client.register.fetch-interval-seconds=30参数进行修改,该参数默认值为30,单位为秒。

服务调用

     服务消费者在回去服务清单以后,通过服务名可以获得提供服务的实例名和该实例的元数据信息。因为有这些服务实例的详情信息,所以客户端可以根据自己的需要决定具体使用哪个实例,在ribbon中会采默认采用轮训的方式进行调用,从而实现客户端的负载均衡。

服务调用

        在系统运行过程中必然会面临关闭或者重启服务的某个实例的情况,在服务关闭期间,我们自然不希望客户端会继续调用关闭了的实例。所以在客户端的程序中,当服务实例进行正常的关闭操作时,它会触发一个服务下线的rest请求给Eurekaserver,告诉服务注册中心 :“我要下线了”,服务端接受到请求之后,该服务状态设置为下线(down),并把该下线事件传播出去。

    上面便是Eureka各个核心元素的通信行为。

在本模块中依赖如下:


    <dependencies>
        <!--eureka-server服务端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
        <!-- 修改后立即生效,热部署 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>springloaded</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
    </dependencies>

这里的

spring-cloud-starter-eureka-server 是注册中心的核心,这个是Eureka的服务端,Eureka是一个基于C-S架构的框架,我们向Eureka注册的一些服务都可以理解为我们的客户端包括一些服务的提供者,消费者。

模块的结构如下:

启动类

package com.gysoft;

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

/**
 * @Description  注册中心启动类
 * @Author DJZ-WWS
 * @Date 2019/5/8 11:50
 */
@SpringBootApplication
@EnableEurekaServer//EurekaServer服务器端启动类,接受其它微服务注册进来
public class EurekaServer7001_App
{
    public static void main(String[] args)
    {
        SpringApplication.run(EurekaServer7001_App.class, args);
    }
}

这里需要注意的地方是这里需要一个注解,表示开启Eureka服务,接受其他服务注册进来,如果没有注解的话,服务是可以起来的,但是访问就会出错

访问成功页面如下:

这个Eureka的注册中心,由于没有任何服务的注册,所以这里没有显示任何服务。

yml 配置文件


server:
  port: 7001

eureka:
  instance:
    hostname: localhost #eureka服务端的实例名称
  client:
    register-with-eureka: false #false表示不向注册中心注册自己。
    fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/        #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值