专栏首页生如夏花的个人博客微服务系列(一)-服务发现

微服务系列(一)-服务发现

服务发现

什么是服务发现

在微服务架构中,整个系统会按职责能力划分为多个服务,通过服务之间协作来实现业务目标。这样在我们的代码 中免不了要进行服务间的远程调用,服务的消费方要调用服务的生产方,为了完成一次请求,消费方需要知道服务 生产方的网络位置(IP地址和端口号)。 我们的代码可以通过读取配置文件的方式读取服务生产方网络位置,如下:

我们通过Spring boot技术很容易实现: 创建一个spring-boot父工程 创建Service B(服务生产者) pom.xml如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.xu.nacos</groupId>
        <artifactId>nacos-discovery</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>nacos-restful-provider</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>


</project>

Service B是服务的生产方,暴露/service服务地址,实现代码如下: 1、创建Controller

@RestController
public class RestProviderController {

    //暴露一个Restful接口
    @GetMapping("/service")
    public String service(){

        return "provider invoke";
    }
}

创建application.yml,内容如下:

server:
	port:56010

创建Service A(服务消费者) pom.xml如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.xu.nacos</groupId>
        <artifactId>nacos-discovery</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>nacos-restful-consumer</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>


</project>

创建controller

@RestController
public class RestConsumerController {

    @Value("${provider.address}")
    private String provider;


    @GetMapping("service")
    public String service(){
        //远程调用
        RestTemplate restTemplate = new RestTemplate();
        String forObject = restTemplate.getForObject("http://" + provider + "service", String.class);
        return "消费成功"+forObject;
    }
}

配置文件

server:
  port: 56020

#配置服务提供方的ip和端口
provider:
  address: 127.0.0.1:56010

以上消费方找到服务方并进行远程调用就叫服务发现 那么该如何来发现这些服务呢?服务方实例的增加对服务的发现会产生哪些问题呢?

服务发现流程

上边的例子看上去很完美,但是,仔细考虑以下,此方案对于微服务应用而言行不通。首先,微服务可能是部署在 云环境的,服务实例的网络位置或许是动态分配的。另外,每一个服务一般会有多个实例来做负载均衡,由于宕机 或升级,服务实例网络地址会经常动态改变。再者,每一个服务也可能应对临时访问压力增加新的服务节点。正如 下图所示:

基于以上的问题,服务之间如何相互发现?服务如何管理?这就是服务发现的问题了。 服务发现就是服务消费方通过服务发现中心智能发现服务提供方,从而进行远程调用的过程。 如下图:

上图中服务实例本身并不记录服务生产方的网络地址,所有服务实例内部都会包含服务发现客户端。

(1)在每个服务启动时会向服务发现中心上报自己的网络位置。这样,在服务发现中心内部会形成一个服务注册 表,服务注册表是服务发现的核心部分,是包含所有服务实例的网络地址的数据库。 (2)服务发现客户端定期从服务发现中心同步服务注册表 ,并缓存在客户端。 (3)当需要对某服务进行请求时,服务实例通过该注册表,定位目标服务网络地址。若目标服务存在多个网络地 址,则使用负载均衡算法从多个服务实例中选择出一个,然后发出请求。

总结: 在微服务环境中,由于服务运行实例的网络地址是不断动态变化的,服务实例数量的动态变化 ,因此无法 使用固定的配置文件来记录服务提供方的网络地址,必须使用动态的服务发现机制用于实现微服务间的相互感知。 各服务实例会上报自己的网络地址,这样服务中心就形成了一个完整的服务注册表,各服务实例会通过服务发现中 心来获取访问目标服务的网络地址,从而实现服务发现的机制。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • springboot项目集成log4j2

    在开发环境中你可以不太注重日志,但是在生产环境中必须的收集好日志 开发环境下出现了问题你可以随意的debug,但是在生产环境下不可能停掉服务器来处理bug,有...

    许喜朝
  • 微服务系列(二)-nacos服务发现

    目前市面上用的比较多的服务发现中心有:Nacos、Eureka、Consul和Zookeeper。

    许喜朝
  • 微服务系列(四):服务发现模型

    命名空间(Namespace)用于进行租户粒度的隔离,Namespace 的常用场景之一是不同环境的隔离,例如开发测试 环境和生产环境的资源(如配置、服务)隔离...

    许喜朝
  • 关于ITIL V3 &amp; ITIL 2011,你需要知道这些!

    在 20 世纪 80 年代末期,英国商务部(OGC,Office Government Commerce)发布了 ITIL。OGC 最初的目标是通过应用 IT ...

    嘉为科技
  • 住手!!你不需要微服务!

    现在是2020年。如果你想要我介绍微服务是什么东东,本文可能不适合你,你还是把宝贵的几分钟花在别处吧。但如果你沉醉于微服务的种种成功故事,想靠这味“灵丹妙药”实...

    业余草
  • 漫谈何时从单体架构迁移到微服务?

    对于项目起步阶段,单体是最高效也是最节省成本的方式。因为初期阶段,由于人力,成本,业务熟悉程度,微服务技术积累等因素,如何过度设计可能工期和复杂度会急剧上升,造...

    纯洁的微笑
  • 创建一个微服务?首先回答这10个问题

    原文地址:https://articles.microservices.com/creating-a-microservice-answer-these-10-...

    双愚
  • 微服务布道师:详解微服务架构

    这两年,微服务这个概念火了,火到什么程度呢?2016年有一个统计说,两千家企业里,30%在使用微服务,15%在实验开发和测试微服务架构,24%在学习微服务准备转...

    技术zhai
  • 微服务的隐性收益

    微服务是一种构建分布式系统的方法,在微服务系统中,服务只能通过API来公开,这是一个API的世界(可以参考没有被了解的API?一个老码农眼中的API世界)。在微...

    半吊子全栈工匠
  • 程序员修神之路--要想做好微服务架构,并非易事!!

    微服务(Microservices Architecture)是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微...

    心莱科技雪雁

扫码关注云+社区

领取腾讯云代金券