【微服务架构设计和实现】4.5 服务发现、注册和配置管理

这篇具有很好参考价值的文章主要介绍了【微服务架构设计和实现】4.5 服务发现、注册和配置管理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

往期回顾:

第一章:【云原生概念和技术】

第二章:【容器化应用程序设计和开发】

第三章:【基于容器的部署、管理和扩展】

第四章:【4.1 微服务架构概述和设计原则】

第四章:【4.2 服务边界的定义和划分】

第四章:【4.3 服务之间的通信和API设计】

第四章:【4.4 数据库和数据存储的分离和服务化】

4.5 服务发现、注册和配置管理

4.5.1 服务发现

在云原生下,微服务架构已经成为了应用程序的主流架构。服务发现是微服务架构中的一个重要组成部分,它负责自动发现服务实例,负载均衡和故障转移。下面是一个简单的 Java 代码示例,展示了如何在云原生下使用服务发现来自动发现微服务实例。

首先,我们需要创建一个服务注册表,用于存储所有的服务实例。在这个示例中,我们使用 Zookeeper 来存储服务实例。

import org.apache.zookeeper.*;  
import java.util.List;

public class ServiceRegistry {

   private ZooKeeper zk;  
   private String rootPath;  
   private List<ServiceInstance> services;

   public ServiceRegistry(String zkAddress, String zkPassword, String zkNodePath) {  
       this.zk = new ZooKeeper(zkAddress, 5000, new Watcher() {  
           public void process(WatchedEvent event) {  
               if (event.getState() == Watcher.Event.KeeperState.SyncConnected) {  
                   loadServices();  
               }  
           }  
       });  
       this.rootPath = zkNodePath;  
   }

   private void loadServices() {  
       try {  
           services = zk.getChildren(rootPath, false).stream()  
                   .sorted()  
                   .map(s -> new ServiceInstance(s, zk.exists(s, false)))  
                   .collect(Collectors.toList());  
       } catch (Exception e) {  
           e.printStackTrace();  
       }  
   }

   public ServiceInstance getServiceInstance(String serviceName) {  
       for (ServiceInstance service : services) {  
           if (service.getName().equals(serviceName)) {  
               return service;  
           }  
       }  
       return null;  
   }

   public void addServiceInstance(ServiceInstance serviceInstance) {  
       zk.add(rootPath, serviceInstance.toZooObject());  
   }

   public void removeServiceInstance(String serviceName) {  
       for (ServiceInstance service : services) {  
           if (service.getName().equals(serviceName)) {  
               zk.delete(service.getPath(), -1);  
               return;  
           }  
       }  
       throw new IllegalArgumentException("Service " + serviceName + " not found.");  
   }  
}

在这个示例中,我们使用 Zookeeper 来存储服务实例。当需要发现服务实例时,我们遍历所有的服务实例,并使用服务名称来找到对应的服务实例。如果服务实例不存在,则添加一个新的服务实例。如果服务实例存在,则更新服务实例的状态。

最后,我们需要编写一个服务实例类,用于表示一个微服务实例。

import org.springframework.beans.factory.annotation.Value;  
import org.springframework.stereotype.Component;

@Component  
@Value("${service.name}")  
public class ServiceInstance {

   private String path;  
   private String name;  
   private boolean enabled;

   public ServiceInstance(String path, boolean enabled) {  
       this.path = path;  
       this.name = name;  
       this.enabled = enabled;  
   }

   public String getPath() {  
       return path;  
   }

   public String getName() {  
       return name;  
   }

   public boolean isEnabled() {  
       return enabled;  
   }

   public void setEnabled(boolean enabled) {  
       this.enabled = enabled;  
   }

   public static ServiceInstance fromZooObject(org.apache.zookeeper.ZooObject zobj) {  
       return new ServiceInstance(zobj.getData().get(0).getByteValue("path"),  
                   zobj.getData().get(0).getByteValue("state") == 1);  
   }

   public static ServiceInstance fromString(String zkPath) {  
       return ServiceInstance.fromZooObject(org.apache.zookeeper.Zoo 蛋类 zobj -> zobj.getData().get(0).get(zkPath).getByteValue());  
   }  
}

在上面的示例中,我们使用fromZooObjectfromString方法来从 Zookeeper 存储中加载和生成服务实例对象。

最后,当需要发现微服务实例时,我们可以调用ServiceRegistry类中的getServiceInstance方法来获取最新的服务实例对象,并使用fromZooObjectfromString方法来生成服务实例对象。

4.5.2 服务注册

在云原生下,微服务架构中的服务注册是一个非常重要的环节。它负责将服务实例标识给其他服务,并提供服务的发现和负载均衡。下面是一个简单的 Java 代码示例,展示了如何在云原生下使用服务注册来自动注册微服务实例。

首先,我们需要创建一个服务注册表,用于存储所有的服务实例。在这个示例中,我们使用 Zookeeper 来存储服务实例。

import org.apache.zookeeper.*;    
import java.util.List;

public class ServiceRegistry {

   private ZooKeeper zk;    
   private String rootPath;    
   private List<ServiceInstance> services;

   public ServiceRegistry(String zkAddress, String zkPassword, String zkNodePath) {    
       this.zk = new ZooKeeper(zkAddress, 5000, new Watcher() {    
           public void process(WatchedEvent event) {    
               if (event.getState() == Watcher.Event.KeeperState.SyncConnected) {    
                   loadServices();    
               }    
           }    
       });    
       this.rootPath = zkNodePath;    
   }

   private void loadServices() {    
       try {    
           services = zk.getChildren(rootPath, false).stream()    
                   .sorted()    
                   .map(s -> new ServiceInstance(s, zk.exists(s, false)))    
                   .collect(Collectors.toList());    
       } catch (Exception e) {    
           e.printStackTrace();    
       }    
   }

   public ServiceInstance getServiceInstance(String serviceName) {    
       for (ServiceInstance service : services) {    
           if (service.getName().equals(serviceName)) {    
               return service;    
           }    
       }    
       return null;    
   }

   public void addServiceInstance(ServiceInstance serviceInstance) {    
       zk.add(rootPath, serviceInstance.toZooObject());    
   }

   public void removeServiceInstance(String serviceName) {    
       for (ServiceInstance service : services) {    
           if (service.getName().equals(serviceName)) {    
               zk.delete(service.getPath(), -1);    
               return;    
           }    
       }    
       throw new IllegalArgumentException("Service " + serviceName + " not found.");    
   }    
}

在这个示例中,我们使用 Zookeeper 来存储服务实例。当需要注册服务实例时,我们遍历所有的服务实例,并使用服务名称来找到对应的服务实例。如果服务实例不存在,则添加一个新的服务实例。如果服务实例存在,则更新服务实例的状态。

最后,我们需要编写一个服务实例类,用于表示一个微服务实例。

import org.springframework.beans.factory.annotation.Value;    
import org.springframework.stereotype.Component;

@Component    
@Value("${service.name}")    
public class ServiceInstance {

   private String path;    
   private String name;    
   private boolean enabled;

   public ServiceInstance(String path, boolean enabled) {    
       this.path = path;    
       this.name = name;    
       this.enabled = enabled;    
   }

   public String getPath() {    
       return path;    
   }

   public String getName() {    
       return name;    
   }

   public boolean isEnabled() {    
       return enabled;    
   }

   public void setEnabled(boolean enabled) {    
       this.enabled = enabled;    
   }

   public static ServiceInstance fromZooObject(org.apache.zookeeper.ZooObject zobj) {    
       return new ServiceInstance(zobj.getData().get(0).getByteValue("path"),    
                   zobj.getData().get(0).getByteValue("state") == 1);    
   }

   public static ServiceInstance fromString(String zkPath) {    
       return ServiceInstance.fromZooObject(org.apache.zookeeper.Zoo 蛋类 zobj -> zobj.getData().get(0).get(zkPath).getByteValue());    
   }    
}

在上面的示例中,我们使用fromZooObjectfromString方法来从 Zookeeper 存储中加载和生成服务实例对象。

4.5.3 配置管理

在云原生下,微服务的配置管理是非常重要的。它负责管理微服务的各种配置,例如服务发现、负载均衡、容器编排等等。下面是一个简单的 Java 代码示例,展示了如何在云原生下使用配置管理来自动管理微服务的配置。

首先,我们需要创建一个配置管理容器,用于存储和管理所有的配置。在这个示例中,我们使用 Zookeeper 来存储配置。

import org.apache.zookeeper.*;    
import org.springframework.beans.factory.annotation.Value;    
import org.springframework.stereotype.Component;  

@Component    
@Value("${zk.address}")    
public class ConfigurationManager {    
    private ZooKeeper zk;    
    private String zkAddress;  

    public ConfigurationManager(String zkAddress) {    
        this.zkAddress = zkAddress;    
        try {    
            zk = new ZooKeeper(zkAddress, 5000, new Watcher() {    
                public void process(WatchedEvent event) {    
                    if (event.getState() == Watcher.Event.KeeperState.SyncConnected) {    
                        loadConfigurations();    
                    }    
                }    
            });    
        } catch (Exception e) {    
            e.printStackTrace();    
        }    
    }  

    private void loadConfigurations() {    
        try {    
            Configurations.loadFromZookeeper(zk);    
        } catch (Exception e) {    
            e.printStackTrace();    
        }    
    }  

    public Configurations getConfigurations() {    
        return Configurations.loadFromZookeeper(zk);    
    }  

    public void addConfiguration(Configuration configuration) {    
        Configurations.add(configuration);    
    }  

    public void removeConfiguration(String configurationName) {    
        Configurations.remove(configurationName);    
    }    
}    

在上面的示例中,我们使用Zookeeper来存储配置。当需要加载配置时,我们遍历所有的配置,并使用配置名称来找到对应的配置。如果配置不存在,则添加一个新的配置。如果配置存在,则更新配置。

最后,我们需要编写一个配置类,用于表示一个微服务的配置。

import org.springframework.beans.factory.annotation.Value;    
import org.springframework.stereotype.Component;  

@Component    
@Value("${service.name}")    
public class Configuration {    
    private String configurationName;    
    private String configurationValue;  

    public Configuration(String configurationName, String configurationValue) {    
        this.configurationName = configurationName;    
        this.configurationValue = configurationValue;    
    }  

    public String getConfigurationName() {    
        return configurationName;    
    }  

    public String getConfigurationValue() {    
        return configurationValue;    
    }    
}

在上面的示例中,我们使用一个配置类来表示一个微服务的配置。当需要加载配置时,我们可以调用ConfigurationManager类中的getConfigurations方法来获取最新的配置,并使用Configuration类来生成配置对象。文章来源地址https://www.toymoban.com/news/detail-496464.html

到了这里,关于【微服务架构设计和实现】4.5 服务发现、注册和配置管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Nacos:动态服务发现与配置管理的终极解决方案

    今天我想和大家分享一下Nacos,这是一个由阿里巴巴开源的动态服务发现、配置和服务管理平台。我将详细介绍Nacos的主要特性,并通过实例来演示如何使用它。同时,我还会指出Nacos的优点,希望这篇文章能够帮助大家更好地理解和使用Nacos。 Nacos(Dynamic Naming and Configuratio

    2024年02月06日
    浏览(38)
  • 微服务·架构组件之服务注册与发现-Nacos

    Nacos服务注册与发现流程 服务注册:Nacos 客户端会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、端口等信息。 Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。 服务心跳:在服务注册后,Nacos Client会维

    2024年02月02日
    浏览(44)
  • 【微服务】Nacos注册中心(3):配置管理

    给微服务配置namespace 给微服务配置namespace只能通过修改配置来实现。 重启order-service后,访问控制台,可以看到下面的结果 此时访问order-service,因为namespace不同,会导致找不到userservice,控制台会报错 Nacos的服务实例分为两种l类型: 临时实例:如果实例宕机超过一定时间,

    2024年02月05日
    浏览(47)
  • 微服务架构的服务注册和发现究竟采用Nacos还是Eureka ?

    微服务架构已经成为了构建分布式应用程序的主要方式之一,而服务注册与发现在微服务架构中扮演着至关重要的角色。在这个领域,有两个非常流行的工具,它们分别是Nacos和Eureka。我们来深入探讨这两者之间的区别,以帮助您在选择适合您项目的服务注册与发现工具时提

    2024年02月02日
    浏览(48)
  • 【SpringCloud】三、Nacos服务注册+配置管理+集群搭建

    官网:https://nacos.io/zh-cn/ 下载 解压 启动 启动成功 登录 在cloud-demo 父工程中添加 spring-cloud-alilbaba的管理依赖: 子模块下添加nacos的客户端依赖(此时user、order中的eureka可以注释掉了) 在order和user模块的application.yml文件中,注释eureka地址,添加nacos的地址 重启order服务,查看

    2024年02月06日
    浏览(54)
  • SpringCloud微服务注册中心:Nacos介绍,微服务注册,Ribbon通信,Ribbon负载均衡,Nacos配置管理详细介绍

    注册中心可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就这里找到服务的地址,进行调用。 服务注册中心(简称注册中心)是微服务框架的一个重要组件,在微服务架构里主要

    2024年02月22日
    浏览(63)
  • 容器化微服务架构实践: Docker 镜像打包方式, 服务编排, 服务发现与注册中心

    作者:禅与计算机程序设计艺术 容器化微服务架构是云计算领域最新的架构模式之一,通过容器技术和编排工具Kubernetes等实现了跨主机、跨平台的部署管理能力。微服务架构模式采用分布式、面向服务的方式将复杂的应用程序切分成一个个独立的模块,每个模块运行在自己

    2024年02月06日
    浏览(49)
  • 【微服务技术一】Eureka、Nacos、Ribbon(配置管理、注册中心、负载均衡)

    微服务完整的技术栈如图: 技术栈学习: 概念: 在Eureka架构中,微服务角色有两类EurekaServer: 服务端,注册中心 记录服务信息 心跳监控 EurekaClient:客户端 Provider:服务提供者,例如案例中的user-service注册自己的信息到EurekaServer;每隔30秒向EurekaServer发送心跳 consumer:服务消

    2024年02月12日
    浏览(46)
  • Nacos:服务的注册、发现和配置中心(注册篇)

    Nacos 是阿里巴巴推出来的一个新开源项目,这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 N

    2024年02月15日
    浏览(38)
  • 基于 Zookeeper 实现服务注册和服务发现

    无论是采用SOA还是微服务架构,都需要使用服务注册和服务发现组件。我刚开始接触 Dubbo 时一直对服务注册/发现以及 Zookeeper 的作用感到困惑,现在看来是因为对分布式系统的理解不够深入,对 Dubbo 和 Zookeeper 的工作原理不够清楚。 本文将基于 Zookeeper 实现服务注册和服务发

    2024年02月10日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包