springcloud-02-eureka(服务注册与发现)

Eureka 服务注册中心

     一.用来干什么?

              1.通过集群实现系统的高可用,多个注册中心相互注册相互监控,充当替换,互为备用

              2.注册到eureka的服务实例可以通过服务发现来获取实例信息,如:端口号,地址,服务名称等

               在上一章中我们创建了两个服务(80,8001),通过80远程调用8001

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQOiTneecvOazqg==,size_20,color_FFFFFF,t_70,g_se,x_16

        Eureka 是springcloud的核心组件之一,提供了三大功能

        1.服务注册

              对于eureka来说,上面的80和8001都是客户端( eureka client) 而eureka本身作为服          务端( eureka server) 通过服务注册由80直接调用8001变成80通过eureka调用8001

        watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQOiTneecvOazqg==,size_20,color_FFFFFF,t_70,g_se,x_16

    2.注册列表

          eureka有视图界面,所有注册到eureka的服务都会在eureka服务列表中显示出来

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQOiTneecvOazqg==,size_20,color_FFFFFF,t_70,g_se,x_16

   3.监控和实时保护

          eureka会通过接收已注册的服务发送的心跳对服务进行监控,默认30秒收到心跳,90秒内接收不到心跳eureka会认为服务宕机了,会把宕机的服务干掉(踢出注册中心),但是eureka默认开启自我保护机,就是说即使注册到eureka中的服务宕机了,eureka也不会将其踢出,因为还些是可能服务本身是好的,只是因为网络暂时不好而已。要想实现eureka踢出宕机服务,需在yaml文件中进行相应配置,即:关闭eureka的自我保护机制(下面会讲到)watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQOiTneecvOazqg==,size_20,color_FFFFFF,t_70,g_se,x_16

上代码:

    还是熟悉的一套: 建工程 --> 写pom -->写yaml -->主启动 

建工程:

 写pom:

 <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

        <!--引入自己定义的api通用包,可以使用Payment支付Entity-->
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web  -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>

    </dependencies>

    写yaml:

server:
  #端口号
  port: 7001

eureka:
  #实例
  instance:
    hostname: eureka7001  #eureka服务端的名字
  client:
    #表示不向注册中心注册自己,因为自己就是就作为注册中心
    register-with-eureka: false
    #表示自己就是注册中心,职责是维护服务实例,不需要检索服务
    fetch-registry: false
    service-url:
      #设置eureka-server交互地址,查询服务和注册服务都需要依赖这个地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
#      defaultZone: http://eureka7002:7002/eureka/
#  server:
#    enable-self-preservation: false  #关闭自我保护机制
#    eviction-interval-timer-in-ms: 10000  #设置eureka驱逐宕机服务时间间隔 这里为十秒

  主启动:

 修改80和8001的yaml文件:

8001加上:

eureka:
  instance:
    #实例id
    instance-id: payment8001
    prefer-ip-address: true #当鼠标移动到注册中心实例上时,会在左下角显示ip

#    lease-renewal-interval-in-seconds: 2 #设置向eureka服务端发送心跳的时间间隔
#    lease-expiration-duration-in-seconds: 10 #设置最后一次收到心跳后持续多少秒将client剔除
  
  client:
    #表示将自己注册到eureka(服务注册中心)
    register-with-eureka: true
    #表示是否从eureka上面抓取自己的注册信息,默认为true,
    fetch-registry: true
    service-url:
    #要注册的eureka(服务注册中心)地址
      defaultZone: http://eureka7001:7001/eureka/ # 单机版
#      defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/  #集群版

80加上:

eureka:
  instance:
    instance-id: order80
    prefer-ip-address: true #当鼠标移动到注册中心实例上时,会在左下角显示ip
  client:
    register-with-eureka: true #将自己注册到eureka中
    fetch-registry: true #从注册中心查询自己的注册信息
    service-url: # 注意: 层次缩进和http前面的空格不能少
      defaultZone: http://eureka7001:7001/eureka/
#      defaultZone: http://eureka7001:7001/eureka/ #,http://eureka7002:7002/eureka/ 

先启动eureka 7001 再启动 8001 再启动80

浏览器访问 eureka7001:7001

               这里的eureka7001是本地主机地址,默认是localhost,可以在下面的配置文件里改(改了后记得Ctrl+s保存),这样可以更好地区分注册中心与其他服务

会看到8001和80两个服务会在eureka服务列表中显示

自测8001通过后,再通过80远程调用8001

自测通过

 通过80远程调用8001,成功拿到数据(这里的80端口号被隐藏了)

 虽然成功拿到了数据,但并不是通过eureka拿到的,因为远程调用的路径没有变,我们只是将两个服务注册到了eureka

 我们改变路径,使得80通过eureka远程调用拿到8001的数据

CLOUD-PAYMENT-SERVICE是注册到eureka的服务名称 

在配置类中加上这个注解

@LoadBalanced   不加会报错

 这里是springcloud五大组件中的ribbon起了作用,eureka整合了该组件,加上@loadbalanced注解后,可以实现ribbon的功能负载均衡

 ribbon从eureka中根据服务名称获取到服务实例,通过负载均衡算法实现从不同的服务提供者上获取到数据(8001就是一个服务提供者)

我们这里还不能实现负载均衡,因为我们只有一个服务提供者8001,但是可以实现通过eureka远程调用拿到8001里的数据

成功再次拿到数据

 你以为完了吗?要是世界如此简单就好了!!!

新问题: 要是eureka,和8001服务都宕机了呢!  

            答:那就芭比Q了

 二.集群

      一组独立的计算机系统构建出来的松耦合的多处理器系统,它们之间通过网络来进行进程通信。

简单的说就是多台机器一起工作,可以是并行,可以是备用(集群在硬件和软件中都有存在,springcloud中的微服务为了高可用大多需要进行集群)

   作用:

   1.高可用性:试想一下,上面的服务是80通过eureka(注册中心)来远程调用8001,如果eureka自己本身出问题了呢? 那么整个程序也就完了,这时如果有两个eureka,三个eureka呢,那么问题就得到了解决,一个eureka出错,其余的eureka顶上,保证程序的正常运行

   2.负载均衡:   集中式负载均衡(ribbon就是集中式负载均衡)通过服务消费方(80)从eureka中调用不同的服务提供者(目前只有8001)提供服务

我们仿造8001服务创建8002服务,除了端口号不一样外其余的服务业务都一样

启动8002后可以在eureka中看到,同一个服务名称下有两个服务实例8001,8002

 为了更好地看到负载均衡的效果,我们可以在8001,8002服务中将端口号显示出来

  在eureka已经启动的前提下重启8001,8002,80服务(注意顺序:eureka第一,8001和8002是同级的谁先谁后不影响,80最后启动),打开浏览器通过80远程调用不断点击刷新,就会看到8001,8002,8001,8002.....不断轮询从而实现了负载均衡

 上面两次查询得到的数据不一样是因为我在数据库中用了不同的表存储了不同的数据,8001和8002分别对应一张表

到此我们除了实现负载均衡外还实现了服务提供者的集群,接下来,我们实现注册中心的集群

为了更好地呈现不同的注册中心效果,可以改一下本地主机地址

 停掉所有服务后,仿造7001创建7002,

 修改7001和7002的yaml文件

 

 

 将7001注册到7002,7002注册到7001,相互注册相互监控

分别访问  eureka7001:7001  和  eureka7002:7002 可以看到

 更改8001,8002,80的yaml文件,将defaultZone:改成:http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/   即:将这三个服务同时注册到eureka7001和eureka7002上

 启动8001,8002,80服务                     分别访问   eureka7001:7001eureka7002:7002

 eureka7002的加入实现了注册中心的高可用,如果eureka7001宕机了,eureka7002顶上,解决了之前提出的问题

3.关闭自我保护机制

在上面的8001,8002,80几个服务中,如果其中之一或全部宕机了(服务关闭),注册中心并不会在列表中剔除他们,因为eureka默认开启了自我保护机制,需要在注册中心的配置文件(eureka7001和eureka7002的yaml文件)中关闭自我保护机制

这里只关闭7001的自我保护机制作为演示

 重启7001后,关闭8001服务,过一会8001会在eureka7001上消失,但eureka7002上还在

 

 因为eureka7002的自我保护机制没有关闭

eureka就说到这里,如有错误还请指正

下一章  springcloud五大核心组件之ribbon

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值