• 6.eureka服务发现实例(springcloud)


    什么是服务发现
    根据服务名称发现服务的实例过程
    客户端会在本地缓存服务端的列表
    拉取列表是有间隔周期的 (导致服务上线 客户端不能第一时间感知到 (可以容忍)
    其实每次做服务发现 都是从本地的列表来进行的

    1.首先启动一个eureka-server

    本次测试为了方便选择使用单机配置

    application.yml

    1. #单机
    2. server:
    3. port: 8761 #eureka��Ĭ�϶˿�
    4. spring:
    5. application:
    6. name: eureka-server #Ӧ������
    7. #eureka的配置分为3类,server client 实例的 eureka-server既是服务端又是客户端
    8. eureka:
    9. server:
    10. eviction-interval-timer-in-ms: 1000 #服务端间隔多少毫秒做定期删除的操作
    11. renewal-percent-threshold: 0.85 #续约百分比,超过85%的应用没有和你续约,那么eureka会保护服务,不会提出任何一个
    12. instance: #实例的配置
    13. instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port} #主机名称:应用名称:端口号
    14. hostname: localhost #主机名称或则服务的ip
    15. prefer-ip-address: true #以ip的形式显示具体的服务信息
    16. lease-renewal-interval-in-seconds: 5 #服务实例的续约时间间隔
    17. #集群
    18. #server:
    19. # port: 8761
    20. #spring:
    21. # application:
    22. # name: eureka-server
    23. #eureka:
    24. # client:
    25. # service-url:
    26. # defaultZone: http://peer2:8762/eureka,http://peer3:8763/eureka
    27. # instance:
    28. # instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
    29. # hostname: peer1
    30. # prefer-ip-address: true
    31. # lease-renewal-interval-in-seconds: 5
    32. #集群的终极方案
    33. #server:
    34. # port: 8761
    35. #spring:
    36. # application:
    37. # name: eureka-server
    38. #eureka:
    39. # client:
    40. # service-url:
    41. # defaultZone: http://peer1:8761/eureka,http://peer2:8762/eureka,http://peer3:8763/eureka
    42. # instance:
    43. # instance-id: ${spring.application.name}:${server.port}
    44. # prefer-ip-address: true
    45. # lease-renewal-interval-in-seconds: 5

    2.编写eureka-client-b的配置

    application.yml
     

    1. server:
    2. port: 8081
    3. spring:
    4. application:
    5. name: eureka-client-b
    6. eureka:
    7. client:
    8. service-url:
    9. defaultZone: http://localhost:8761/eureka
    10. instance:
    11. prefer-ip-address: true
    12. instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
    13. hostname: localhost
    14. lease-renewal-interval-in-seconds: 10

    3.编写eureka-client-a的配置文件

    1. #单机
    2. server:
    3. port: 8080 #�ͻ��˵Ķ˿�û��Ҫ��
    4. spring:
    5. application:
    6. name: eureka-client-a
    7. #ע��
    8. eureka:
    9. client:
    10. service-url: #ע���ַ
    11. defaultZone: http://localhost:8761/eureka
    12. register-with-eureka: true #可以不往eureka-server注册
    13. fetch-registry: true #应用是否去拉取服务列表到本地
    14. registry-fetch-interval-seconds: 10 #为了缓解服务列表的脏读问题
    15. instance:
    16. hostname: localhost #应用的主机名称 最好写主机ip
    17. instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
    18. prefer-ip-address: true #显示ip
    19. lease-renewal-interval-in-seconds: 10 #实例续约的时间
    20. #集群
    21. #server:
    22. # port: 8080 #�ͻ��˵Ķ˿�û��Ҫ��
    23. #spring:
    24. # application:
    25. # name: eureka-client-a
    26. ##ע��
    27. #eureka:
    28. # client:
    29. # service-url: #ע���ַ
    30. # defaultZone: http://peer1:8761/eureka
    31. # register-with-eureka: true #可以不往eureka-server注册
    32. # fetch-registry: true #应用是否去拉取服务列表到本地
    33. # registry-fetch-interval-seconds: 10 #为了缓解服务列表的脏读问题
    34. # instance:
    35. # hostname: localhost #应用的主机名称 最好写主机ip
    36. # instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
    37. # prefer-ip-address: true #显示ip
    38. # lease-renewal-interval-in-seconds: 10 #实例续约的时间

    4.在eureka-client-a的model里面创建DiscoveryController

    里面编写方法,通过服务eureka-client-b的应用名,找到服务eureka-client-b的具体信息。

    1. package com.it.controller;
    2. import org.springframework.beans.factory.annotation.Autowired;
    3. import org.springframework.cloud.client.ServiceInstance;
    4. import org.springframework.cloud.client.discovery.DiscoveryClient;
    5. import org.springframework.web.bind.annotation.GetMapping;
    6. import org.springframework.web.bind.annotation.RestController;
    7. import java.util.List;
    8. @RestController
    9. public class DiscoveryController {
    10. @Autowired
    11. private DiscoveryClient discoveryClient;
    12. @GetMapping("test")
    13. public String doDiscovery(String serviceName){
    14. // 这就是服务发现,通过服务的应用名,找到服务的具体信息
    15. List instances = discoveryClient.getInstances(serviceName);
    16. //
    17. instances.forEach(System.out::println);
    18. //这里去找b的ip和port
    19. return instances.get(0).toString();
    20. }
    21. }

    5.先运行eureka-server,再运行eureka-client-b,最后运行eureka-client-a

    进入localhost:8761进行查看,发现应用实例都已经注册了

     通过eureka-client-a中编写的方法,用eureka-client-b作为参数进行查询eureka-client-b的具体信息,并遍历打印出来。

    http://localhost:8080/test?serviceName=eureka-client-b

    重要的类:
    DiscoveryClient 类里面的构造方法执行线程初始化调用
    CacheRefreshThread 类里面的 run 方法执行服务列表的拉取(方便后期做服务发现)
    fetchRegistry() 方法去判断全量拉取还是增量拉取
    全量拉取发生在:当服务列表为 null 的情况 当项目刚启动就全量拉取
    增量拉取发生:当列表不为 null ,只拉取 eureka-server 的修改的数据 ( 注册新的服务,上线服务 )
    eureka 客户端会把服务列表缓存到本地 为了提高性能
    但是有脏读问题,当你启动一个新的应用的时候 不会被老的应用快速发现
  • 相关阅读:
    Linux内核分析(十六)--内存管理之管理机制
    springboot读取resources下文件方式
    MySQL 分库分表与 TiDB(平凯数据库),如何选择?
    从日志读取关键数据,按照相关日期进行数据分析
    使用 cmux smux 对 TCP 进行复用
    thinkphp5.1 获取缓存cache(‘cache_name‘)特别慢,php 7.0 unserialize 特别慢
    认识3dmax 轴心
    Windows与网络基础-5-安装eNSP软件环境
    【云原生之K8s】 Kubernetes核心组件
    使用openssl rand随机生成MAC地址的方法
  • 原文地址:https://blog.csdn.net/weixin_59334478/article/details/126961939