一、前言

在讲服务发现之前需要先普及两个名词的概念:
服务提供者:服务的被调用方
有部分人更习惯将服务提供者称为服务端,服务消费者为客户端。

二、原始的服务发现解决方案

在没有服务发现组件之前,我们在项目中是怎么实现服务发现的呢?
下面用MySQL做一下类比:现在我们有两个微服务,一个内容中心(服务消费者),一个用户中心(服务提供者),在服务启动时向数据库插入当前服务的服务名称、ip、端口、将状态设置为在线以及心跳时间。
作为服务提供者的用户中心需要间隔一定周期向数据库插入心跳,以此来证明当前服务仍然处于活跃状态,如果用户中心在指定时间内没有发送心跳信息了(通过last_hearbeat判断),则认为该服务down了。
当作为服务消费者的内容中心调用用户中心服务之前需要先查询registry表的用户中心服务状态是否为up,为up则正常调用,如为down这不再调用该服务。
在这里插入图片描述

三、什么是Nacos?

官网文档:https://nacos.io/zh-cn/docs/what-is-nacos.html
什么是Nacos?官网文档已经解释的很清楚了,简单来讲,Nacos是一个服务发现组件,也是配置服务器,主要是帮我们解决了两个问题

  1. 服务发现:解决Service A怎么发现Service B的问题;
  2. 管理服务器的配置:

在这里插入图片描述

四、架构演进

加入Nacos后,我们的架构就演进为下图的结构。
微服务使用nacos client将自己加入到Nacos Server的管理中,由Nasoc Server来管理所有的微服务。
其实现逻辑与前面用Mysql做的类比非常类似的,只是原本我们手动在服务启动向数据库插入数据,服务关闭删除数据,以及上报心跳监控服务运行状态的工作,在我们加入nacos client后,全部由Nacos Server帮我们完成了。

在这里插入图片描述

五、整合Nacos

5.1 安装Nacos

官方文档:https://nacos.io/zh-cn/docs/quick-start.html

5.2加依赖

<dependencyManagement>
    <dependencies>
        <!--整合spring cloud-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Greenwich.SR1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--整合spring cloud alibaba-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>0.9.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<!--整合spring cloud alibaba nacos (版本号是跟着上面的spring cloud alibaba走的)-->
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>

5.3写配置

spring:
  cloud:
    nacos:
      discovery:
        # 指定nacos server的地址
        server-addr: localhost:8848
  application:
    # 指定服务名称:尽量用-,不要用_更不要用特殊字符
    name: user-center

5.4Nacos控制台查看服务的列表

在这里插入图片描述

5.5查询服务实例

package com.itmuch.contentcenter;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("")
public class TestController {

    /**
     *  DiscoveryClient是Spring cloud提供的一个接口,可以用它来查询服务注册信息
     */
    @Autowired
    private DiscoveryClient discoveryClient;

    /**
     * 测试:内容中心总能找到用户新增的实例
     * @return 用户中心的所有实例
     */
    @GetMapping("getInstances")
    public List<ServiceInstance> getInstances(){
        return this.discoveryClient.getInstances("user-center");
    }
}

console->

[
  {
    "serviceId": "user-center",
    "host": "192.168.9.56",
    "port": 8040,
    "secure": false,
    "metadata": {
      "nacos.instanceId": "192.168.9.56#8040#DEFAULT#DEFAULT_GROUP@@user-center",
      "nacos.weight": "1.0",
      "nacos.cluster": "DEFAULT",
      "nacos.healthy": "true",
      "preserved.register.source": "SPRING_CLOUD"
    },
    "uri": "http://192.168.9.56:8040",
    "scheme": null,
    "instanceId": null
  },
  {
    "serviceId": "user-center",
    "host": "192.168.9.56",
    "port": 8050,
    "secure": false,
    "metadata": {
      "nacos.instanceId": "192.168.9.56#8050#DEFAULT#DEFAULT_GROUP@@user-center",
      "nacos.weight": "1.0",
      "nacos.cluster": "DEFAULT",
      "nacos.healthy": "true",
      "preserved.register.source": "SPRING_CLOUD"
    },
    "uri": "http://192.168.9.56:8050",
    "scheme": null,
    "instanceId": null
  }
]
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐