天天看点

Spring Cloud Alibaba 服务治理---Nacos Discovery

在了解nacos之前我们需要知道什么是服务治理?
服务治理是微服务架构中最核心最基本的模块,用于各个模块的自动化注册和发现。
           
  • 服务注册: 在服务治理框架中,都会构建一个注册中心,每个服务单元向注册中心登记自己提供服务信息,并在注册中心形成一张服务的清单,服务注册中心需要以心跳的方式取检测清单中的服务是否可用,如果不可以用,需要在服务清单中删除不可用的服务。
  • 服务发现: 服务调用方向注册中心询问服务,并获取所以服务的实例清单,实现对具体实例的访问。
    Spring Cloud Alibaba 服务治理---Nacos Discovery
    通过上面关系图我们可以看出,除了微服务之外,我们还有一个注册中心它是微服务架构非常重要的一个组件,在微服务架构里主要起道了协调者作用,注册中心一般包含以下几个功能:

服务发现:

  • 服务注册:保存服务提供者和调用者的信息
  • 服务订阅:服务调用和订阅服务消息。注册中心向订阅者推送提供者的消息

服务配置:

  • 配置订阅:服务提供者和服务调用者订阅微服务相关配置
  • 配置下发:主动将配置推送给服务提供者和服务调用者

服务健康检查

  • 检查服务提供者的健康状况,如果发现异常,执行服务删除

常见的注册中心

  • Zookeeper

    zookeeper是一个分布式服务框架,是Apache Hadoop的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题。如:统一命名服务,集群管理,分布式应用配置项的管理。

  • Eureka

    Eureka是SpringCloud Netfilx中的重要组件,主要作用是做服务注册和发现,但是现在已经闭源(2.0版本以后)

  • Consul

    Consul是基于GO语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册,服务发现和配置管理的功能,Consul的功能都很实用,其中包括:服务注册/发现、健康检查、Key/Value的存储、多数据中心和分布式一致性等特性,Consul本身是一个二进制的可执行文件,所以安装和部署都非常简单,只需要重官网下载后,在执行对应的启动脚步即可。

  • Nacos

    Nacos是一个更易于构建原生态应用的动态服务发现,配置管理和服务管理平台,它是Spring Cloud Alibaba组件之一,负责服务注册与发现和服务配置,可以认为nacos=enueka+config

Nacos入门使用

nacos控制台搭架

  1. 安装nacos

    下载地址:https://github.com/alibaba/nacos/releases

  2. 启动nacos

    双击bin目录下的startup.cmd文件

  3. nacos控制台访问

    http://localhost:8848/nacos,默认密码nacos/nacos

项目集成Nacos组件

  1. pom.xml添加nacos客户端的依赖
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2.1.0.RELEASE</version>
    </dependency>
               
  2. 在启动类上添加 @EnableDiscoveryClient
  3. 配置文件添加nacos地址
    spring:
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848
               
通过以上方式项目中都已经集成好noacos了,如果服务都已经正常启动,在nacos控制台会发现服务消费以及注册信息,但是我们两个服务直接如何通信呢?

服务直接如何访问

如果A服务需要访问B服务,通过我们只需要通过只需要知道B服务的 ip+端口+接口路径是不是就可以访问了?这样当然是可以的,Nacos提供DiscoveryClient也可以通过该方式获得ip+端口

使用DiscoveryClient 客户端进行微服务接口访问

1. 注入客户端对象
   @Autowired
   private DiscoveryClient discoveryClient;
2. 获取实例信息,提供服务方端口以及ip
   List<ServiceInstance> instances = discoveryClient.getInstances("service-product");
   ServiceInstance serviceInstance = instances.get(0);
           

通过以上的的方式,也能进行访问,但是使用这个方式进行服务直接的通信是否可行呢?通过微服务的名称我们可以获得多个微服务实例,然后取出第一个获取ip+端口,然后在拼接上路径,这样就可以访问了,这会带来什么问题?

  1. 如果微服务有多个实例,我们一直都是获取第一个?那负载均衡如何实现?
  2. 每一个接口的调用,我们都需要写这么多与业务无关的代码,你不觉得烦吗?

    当然这些都一定会有解决办法的,这就是接下来要学习的Ribbon以及Feign

上一篇:Spring Cloud Alibaba入门概念

下一篇:Spring Cloud Alibaba 服务调用负载均衡—Ribbon