SpringCloud_Eureka服务注册与发现

╰+哭是因爲堅強的太久メ 2023-07-24 02:58 121阅读 0赞

文章目录

  • 基础知识
    • 服务治理
    • 服务注册于发现
    • 组件
      • Eureka Server
      • Eureka CLient
  • 单机Eureka构建步骤
    • Eureka Server构建
    • Eureka Client构建
  • 集群Eureka构建
    • 修改Eureka Server 集群的yaml
    • 修改Eureka Client 微服务模块的yaml
    • 如果微服务模块为集群,通过在eureka上注册过的微服务名称调用
    • 使用@LoadBalanced注解赋予RestTemplate负载均衡的能力
  • actuator微服务信息完善
    • 主机名称:服务名称修改&访问信息有IP信息提示
  • 服务发现Discovery
  • Eureka自我保护
    • 禁止自我保护
    • 设置微服务心跳间隔和超时限制
  • 参考Demo

基础知识

服务治理

SpringCloud封装了Netflix开发的Eureka模块实现服务治理。
在传统的RPC远程调用框架汇总,管理每个服务之间的依赖关系比较复杂,所以需要使用服务治理,实现服务调用、复杂均衡、容错等,实现服务发现与注册。

服务注册于发现

Eureka采用的CS的设计架构,Eureka Server作为服务注册功能的服务器,他是服务注册中心。而系统中的其他微服务使用Eureka客户端连接到Eureka Server并维持心跳连接。这样系统的维护人员可以通过Eureka Server来监控系统中各个微服务是否正常运行。

在服务注册于发现中,有一个注册中心。当服务器重启时,会把当前自己服务器的消息,比如服务地址通讯地址等以别名方式注册到注册中心上。另一方以该别名的方式去服务注册中心上获得实际的通讯地址,然后再实现本地RPC调用RPC远程远程调用框架,核心设计思想:在于注册中心,因为使用注册中心管理每个服务之间的依赖关系(服务治理概念)。在任何RPC远程框架中,都会有一个注册中心存放服务地址相关信息。
在这里插入图片描述

组件

Eureka Server

提供服务注册服务。各个微服务节点通过配置启动后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息,并可以在界面中直观看到。

Eureka CLient

通过注册中心进行访问。是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-ribbon)负载算法的负载均衡器,在应用启动后,将会向Eureka Server发送心跳(默认周期30s)。如果Eureka Server在多个心跳周期内没有接收到某个节点心跳,Eureka Server将会从服务注册中心中将这个服务节点移除(默认90s)

单机Eureka构建步骤

Eureka Server构建

  1. 建Module
    cloud-eureka-server7001
  2. 改Pom


    org.springframework.cloud
    spring-cloud-starter-netflix-eureka-server
  3. 写yaml

    server:
    port: 7001

    eureka:
    instance:

    1. #eureka服务端的实例名称
    2. hostname: eureka7001.com

    client:

    1. #false表示不向注册中心注册自己。
    2. register-with-eureka: false
    3. #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    4. fetch-registry: false
    5. service-url:
    6. #单机就是7001自己
    7. defaultZone: http://eureka7001.com:7001/eureka/
  4. 主启动类

    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaMain7001
    {

    1. public static void main(String[] args) {
    2. SpringApplication.run(EurekaMain7001.class, args);
    3. }

    }

  5. 测试
    http://localhost:7001/
    在这里插入图片描述

Eureka Client构建

  1. 建Module
    cloud-provider-payment8001
  2. 改Pom


    org.springframework.cloud
    spring-cloud-starter-netflix-eureka-client
  3. 写yaml

    server:
    port: 8001

    spring:
    application:

    1. name: cloud-payment-service

    eureka:
    client:

    1. #表示是否将自己注册进EurekaServer默认为true。
    2. register-with-eureka: true
    3. #是否从EurekaServer抓取已有的注册信息,默认为true。
    4. #单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    5. fetchRegistry: true
    6. service-url:
    7. #单机版
    8. defaultZone: http://localhost:7001/eureka
  4. 主启动类

    @SpringBootApplication
    @EnableEurekaClient
    public class PaymentMain8001
    {

    1. public static void main(String[] args) {
    2. SpringApplication.run(PaymentMain8001.class, args);
    3. }

    }

  5. 测试
    http://localhost:7001/
    在这里插入图片描述

集群Eureka构建

微服务RPC远程服务调用最核心的就是高可用,搭建Eureka注册中心集群,实现负载均衡和故障容错。

修改Eureka Server 集群的yaml

  1. server:
  2. port: 7001
  3. eureka:
  4. instance:
  5. #eureka服务端的实例名称
  6. hostname: eureka7001.com
  7. client:
  8. #false表示不向注册中心注册自己。
  9. register-with-eureka: false
  10. #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
  11. fetch-registry: false
  12. service-url:
  13. #集群指向其它eureka
  14. defaultZone: http://eureka7002.com:7002/eureka/

修改Eureka Client 微服务模块的yaml

  1. eureka:
  2. client:
  3. #表示是否将自己注册进EurekaServer默认为true。
  4. register-with-eureka: true
  5. #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
  6. fetchRegistry: true
  7. service-url:
  8. #单机版
  9. #defaultZone: http://localhost:7001/eureka
  10. # 集群版
  11. defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

如果微服务模块为集群,通过在eureka上注册过的微服务名称调用

  1. // 通过在eureka上注册过的微服务名称调用
  2. public static final String PAYMENT_URL="http://CLOUD-PAYMENT-SERVICE";
  3. @GetMapping("/consumer/payment/create")
  4. public CommonResult<Payment> create(Payment payment)
  5. {
  6. return restTemplate.postForObject(PAYMENT_URL +"/payment/create",payment,CommonResult.class);
  7. }

使用@LoadBalanced注解赋予RestTemplate负载均衡的能力

  1. @Configuration
  2. public class ApplicationContextConfig
  3. {
  4. @Bean
  5. @LoadBalanced
  6. public RestTemplate getRestTemplate()
  7. {
  8. return new RestTemplate();
  9. }
  10. }

actuator微服务信息完善

主机名称:服务名称修改&访问信息有IP信息提示

修改前:
在这里插入图片描述
修改yaml:

  1. eureka:
  2. client:
  3. #表示是否将自己注册进EurekaServer默认为true。
  4. register-with-eureka: true
  5. #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
  6. fetchRegistry: true
  7. service-url:
  8. #单机版
  9. #defaultZone: http://localhost:7001/eureka
  10. # 集群版
  11. defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
  12. instance:
  13. instance-id: payment8001
  14. #访问路径可以显示IP地址
  15. prefer-ip-address: true

修改后:
在这里插入图片描述
在这里插入图片描述

服务发现Discovery

对于注册eureka里面的微服务,可以通过服务发现来获得该服务的信息

  1. @SpringBootApplication
  2. @EnableEurekaClient
  3. @EnableDiscoveryClient
  4. public class PaymentMain8001
  5. {
  6. public static void main(String[] args) {
  7. SpringApplication.run(PaymentMain8001.class, args);
  8. }
  9. }
  10. @RestController
  11. @Slf4j
  12. public class PaymentController
  13. {
  14. @Resource
  15. private DiscoveryClient discoveryClient;
  16. @GetMapping(value = "/payment/discovery")
  17. public Object discovery()
  18. {
  19. List<String> services = discoveryClient.getServices();
  20. for (String element : services) {
  21. log.info("*****element: "+element);
  22. }
  23. List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
  24. for (ServiceInstance instance : instances) {
  25. log.info(instance.getServiceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri());
  26. }
  27. return this.discoveryClient;
  28. }
  29. }

Eureka自我保护

保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务。

如果在Eureka Server首页看到以下提示,则说明进入保护模式:
在这里插入图片描述

禁止自我保护

  1. eureka:
  2. instance:
  3. hostname: eureka7001.com #eureka服务端的实例名称
  4. client:
  5. register-with-eureka: false #false表示不向注册中心注册自己。
  6. fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
  7. service-url:
  8. #集群指向其它eureka
  9. #defaultZone: http://eureka7002.com:7002/eureka/
  10. #单机就是7001自己
  11. defaultZone: http://eureka7001.com:7001/eureka/
  12. server:
  13. #关闭自我保护机制,保证不可用服务被及时踢除
  14. enable-self-preservation: false

设置微服务心跳间隔和超时限制

  1. eureka:
  2. client:
  3. #表示是否将自己注册进EurekaServer默认为true。
  4. register-with-eureka: true
  5. #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
  6. fetchRegistry: true
  7. service-url:
  8. #单机版
  9. defaultZone: http://localhost:7001/eureka
  10. # 集群版
  11. #defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
  12. instance:
  13. instance-id: payment8001
  14. #访问路径可以显示IP地址
  15. prefer-ip-address: true
  16. #Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
  17. lease-renewal-interval-in-seconds: 1
  18. #Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
  19. lease-expiration-duration-in-seconds: 2

参考Demo

https://github.com/zzyybs/atguigu_spirngcloud2020

发表评论

表情:
评论列表 (有 0 条评论,121人围观)

还没有评论,来说两句吧...

相关阅读

    相关 服务注册发现

    在分布式系统中,各个子系统都是多个实例存在,这个时候必须要引入一个服务协调器,用于给调用方提供可用的调用提供者的命名消息。 服务协调器,如zookeeper,etcd,eu

    相关 服务注册发现---eureka

    eureka简介:云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。 话不多说直接上代码 首先新建一个springcloud eu