美文网首页随笔
eureka客户端强制刷新可用服务列表-样例

eureka客户端强制刷新可用服务列表-样例

作者: 刘勇_leo | 来源:发表于2021-05-21 20:54 被阅读0次

服务端下线接口

@GetMapping(path = "/shutdown")
public String shutdown() {
    //主动将自身从eureka服务器注销
    DiscoveryManager.getInstance().shutdownComponent();
    return "ok";
}

客户端

获取可用服务信息
@Resource
private CachingSpringLoadBalancerFactory lbClientFactory;
@Value("${spring.application.name}")
private String applicationName;

@GetMapping(path = "/serverList")
public Map<String, List<MachineDTO>> getServerList() {
    DiscoveryClient discoveryClient = DiscoveryManager.getInstance().getDiscoveryClient();
    List<Application> applications = discoveryClient.getApplications().getRegisteredApplications();
    if (CollectionUtils.isEmpty(applications)) {
        return Collections.emptyMap();
    }

    List<MachineDTO> machineList;
    Map<String, List<MachineDTO>> result = Maps.newHashMap();
    for (Application application : applications) {
        // 过滤掉自身服务信息
        if (application.getName().equalsIgnoreCase(applicationName)) {
            continue;
        }

        machineList = application.getInstances().stream()
                .map(item -> new MachineDTO(item.getIPAddr(), String.valueOf(item.getPort())))
                .collect(Collectors.toList());
        result.put(application.getName(), machineList);
    }
    return result;
}

/**
 * 机器信息
 * @author liuyong
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MachineDTO {
    private String ip;
    private String port;
}
触发下线与刷新本地缓存
@GetMapping(path = "/offline")
@SuppressWarnings({"rawtypes"})
public String offlineFormService(@RequestParam String ip, String port) throws IOException, NoSuchMethodException, IllegalAccessException, InvocationTargetException,
        InterruptedException {
   // 给服务端发送请求,要求下线
    URL url = new URL("http://" + ip + ":" + port + "/quickform/shutdown");
    URLConnection connection = url.openConnection();
    connection.connect();
    String responseStr = new BufferedReader(new InputStreamReader(connection.getInputStream())).lines()
            .collect(Collectors.joining());
    String success = "ok";
    if (!success.equals(responseStr)) {
        return "下线远程服务失败";
    }

    FeignLoadBalancer feignLoadBalancer = lbClientFactory.create(InterfaceService.SERVICE_NAME);
    DynamicServerListLoadBalancer loadBalancer = (DynamicServerListLoadBalancer) feignLoadBalancer.getLoadBalancer();
    // ribbion负载均衡操作时,从balancer中获取可用的服务地址,因此可以用来判断是否更新成功
    int curAvailableCount = loadBalancer.getReachableServers().size();
    do {
        //触发下线后,不能eureka服务端信息更新也有延迟,因此需要重试
        TimeUnit.SECONDS.sleep(1);
        //更新eureka
        updateEurekaInfo();
        //调用更新ribbon环境的机器信息
        loadBalancer.updateListOfServers();
    } while (curAvailableCount == loadBalancer.getReachableServers().size());
    return "下线成功!";
}

// eureka缓存的机器信息
private void updateEurekaInfo() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
    DiscoveryClient discoveryClient = DiscoveryManager.getInstance().getDiscoveryClient();
    Method fetchRegistry = DiscoveryClient.class.getDeclaredMethod("fetchRegistry", boolean.class);
    fetchRegistry.setAccessible(true);

    fetchRegistry.invoke(discoveryClient, true);
}

总结

本文为单机测试代码,对于线上的实际情况,需要在触发服务器下线后,给所有客户端机器广播下线消息,从而让所有的客户端进行都刷新操作!!!

相关文章

  • eureka客户端强制刷新可用服务列表-样例

    服务端下线接口 客户端 获取可用服务信息 触发下线与刷新本地缓存 总结 本文为单机测试代码,对于线上的实际情况,需...

  • Spring Cloud学习笔记- 高可用服务治理

    Spring Cloud 高可用服务治理 Eureka 客户端 配置多Eureka 注册中心 激活 :@Enabl...

  • 负载均衡器-Ribbon简介

    eureka属于客户端发现,软负载均衡,也就是客户端会向服务器,比如eureka Server获取已注册的可用服务...

  • Eureka

    Eureka: 服务注册中心,给客户端提供可供调用的服务列表,客户端在进行远程服务调用时,根据服务列表然后选择服务...

  • eureka服务的高可用

    前言 本文介绍如何实现eureka服务的高可用,本文以2个eureka为例。 操作步骤 在idea中同一个服务器启...

  • 服务发现比较:Consul vs Zookeeper vs Et

    Eureka是一个服务发现工具。该体系结构主要是客户端/服务器,每个数据中心有一组Eureka服务器,通常每个可用...

  • Eureka 快速配置

    Eureka netflex旗下,服务注册中心 eureka server 服务提供者,客户端通过eureka进行...

  • spring-cloud微服务项目实战(2)-搭建eureka注

    目标: 搭建高可用eureka注册中心,服务端注册server服务,对于客户端调用,本章不讨论,下一章会讨论 eu...

  • 常用命令

    LRU列表可用页数量 缓冲池脏页数量达到90%时,强制刷新脏页 磁盘每秒IO Full purge回收undo页数量

  • 帮助文档

    eureka-node-client 帮助文档 eureka-node-client 客户端和 eureka 服务...

网友评论

    本文标题:eureka客户端强制刷新可用服务列表-样例

    本文链接:https://www.haomeiwen.com/subject/kukgjltx.html