• eureka


    描述:

    eureka是一个服务注册中心,每个服务向注册中心登记自己的服务。

    eureka注册中心单体

    server:
      port: 7001
    
    eureka:
      instance:
        hostname: localhost #eureka服务端的实例名称
      client:
        #false表示不向注册中心注册自己。
        register-with-eureka: false
        #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
        fetch-registry: false
        service-url:
          #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
          defaultZone: http://localhost :7001/eureka/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    启动类注解

    @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) //不连接数据库
    @EnableEurekaServer  //声明注册中心服务端
    
    • 1
    • 2

    生产者和消费者服务

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

    生产者和消费者注册进注册中心,生产者提供支付服务,消费者提供订单服务
    生产者提供服务的接口

    @GetMapping("/get")
        public CommonResult create(Long id){
            Payment payment = paymentService.getById(id);
            log.info("=========8001响应========");
            return new CommonResult(200,"处理成功",payment);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    消费者去调用生产者的接口
    构建restTemplate调用方法

    @Configuration
    public class ApplicationContextConfig {
    
        @Bean
        @LoadBalanced  //集群模式需要加上这个注解,可以通过服务名去调用生产者服务
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    调用支付者的接口

    @GetMapping("/get")
        public CommonResult create(Long id){
            log.info("请求参数:{}",id);
            CommonResult result = restTemplate.getForObject(PaymentSrv_URL + "/payment/get?id=" + id, CommonResult.class);
            Object data = result.getData() == null ? null : result.getData();
            if (Objects.nonNull(data)){
                return new CommonResult(200,"处理成功",result.getData());
            }else {
                return new CommonResult(300,"处理失败",result.getData());
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    eureka注册中心集群

    配置文件修改service-url:
    7001和7002服务相互守望,配置文件中配置对方的地址

    service-url:
          #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
          defaultZone: http://eureka7002.com:7002/eureka/
    
    • 1
    • 2
    • 3

    生产者改成集群模式需要把服务名称都改成统一,这样消费者去调用可以直接通过服务名称去调用

    spring:
      application:
        name: cloud-payment-service
    
    • 1
    • 2
    • 3

    消费者调用生产者不再通过写死的地址去调用

    public static final String PaymentSrv_URL = "http://cloud-payment-service";  //生产者服务名称
    
    @GetMapping("/get")
        public CommonResult create(Long id){
            log.info("请求参数:{}",id);
            CommonResult result = restTemplate.getForObject(PaymentSrv_URL + "/payment/get?id=" + id, CommonResult.class);
            Object data = result.getData() == null ? null : result.getData();
            if (Objects.nonNull(data)){
                return new CommonResult(200,"处理成功",result.getData());
            }else {
                return new CommonResult(300,"处理失败",result.getData());
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    消费者向注册中心提供服务,生产者集群也向注册中心提供服务,eureka接收到消费者的服务后,会进行负载均衡的处理生产者集群提供的服务。

    失效删除

    有些时候,我们的服务实例并不一定会正常下线,可能由于内存溢出、网络故障等原因使服务不能正常运作。而服务注册中心并未收到“服务下线”的请求,为了从服务列表中将这些无法提供服务的实例剔除,Eureka Server在启动的时候会创建一个定时任务,默认每隔一段时间(默认为60秒)将当前清单中超时(默认为90秒)没有续约的服务剔除出去。

    自我保护

    服务注册到Eureka Server后,会维护一个心跳连接,告诉Eureka Server自己还活着。Eureka Server在运行期间会统计心跳失败的比例在15分钟以之内是否低于85%,如果出现低于的情况,Eureka Server会将当前实例注册信息保护起来,让这些实例不会过期。这样做会使客户端很容易拿到实际已经不存在的服务实例,会出现调用失败的情况。因此客户端要有容错机制,比如请求重试、断路器。
    关闭自我保护

    server:
        #关闭自我保护机制,保证不可用服务2000毫秒就清除
        enable-self-preservation: false
        eviction-interval-timer-in-ms: 2000
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    全球与中国BGO晶体市场:增长趋势、竞争格局与前景展望
    【数据结构】栈和队列重点知识汇总(附有OJ题)
    Apache Httpd 常见漏洞解析(全)
    谷粒商城(一)
    【流程图——讲解】
    C语言之break continue详解
    seata事务回滚引起的skywalking数据库存储空间剧增的问题排查
    硬核评测 | 百分点科技NLP、知识图谱产品获“可信AI”多项最高级
    机器人——力控
    【Python 零基础入门】 Numpy
  • 原文地址:https://blog.csdn.net/weixin_42193335/article/details/126767268