栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring Cloud Alibaba:Nacos服务注册与发现

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring Cloud Alibaba:Nacos服务注册与发现

Spring Cloud Alibaba:Nacos服务注册与发现

动态服务发现对以服务为中心的(例如微服务和云原生)应用架构方式非常关键。Nacos支持DNS-based和RPC-based(Dubbo、gRPC)模式的服务发现。Nacos也提供实时健康检查,以防止将请求发往不健康的服务实例。

服务(Service)是Nacos世界的一等公民。Nacos支持几乎所有主流类型的服务的发现、配置和管理:

  • Kubernetes Service
  • gRPC & Dubbo RPC Service
  • Spring Cloud RESTful Service

Nacos的配置特性将在下一篇博客中进行介绍,并且先以Spring Cloud RESTful Service为例子,Kubernetes Service和gRPC & Dubbo RPC Service在以后介绍Kubernetes和Dubbo时再进行补充。

Eureka也有服务注册与发现的功能,博主在下面这几篇博客中进行了介绍:

  • Spring Cloud 之Eureka初使用
  • Spring Cloud 之Eureka高可用
  • Spring Cloud 之使用RestTemplate实现微服务之间相互请求的三种方式
  • Spring Cloud 之Feign实现微服务之间相互请求

但由于Eureka2.0闭源,以及Nacos本身的优势(服务在线管理、配置动态刷新等),并且Nacos久经双十一的考验。

功能NacosEureka说明
注册中心服务治理基本功能,负责服务中心化注册
配置中心Eureka需要Config的配合来实现配置中心,且不提供管理界面
配置动态刷新Eureka需要Config、MQ以及Webhook的配合来实现配置动态刷新,而Nacos采用Netty保持TCP长连接实时推送
可用区AZ对服务集群划分不同区域,实现区域隔离,并提供容灾自动切换
分组Nacos可以根据业务和环境进行分组管理
元数据提供服务标签数据,例如环境或服务标识
权重Nacos默认提供权重设置功能,调整承载流量压力
健康检查Nacos支持由客户端或服务端发起的健康检查,Eureka是由客户端发起心跳
负载均衡均提供负责均衡策略,Eureka采用Ribbon
管理界面Nacos支持对服务在线管理,Eureka只是预览服务状态

Spring Cloud Alibaba版本关系:

  • Spring Cloud Alibaba 版本关系
下载与运行Nacos
  • Nacos 下载地址(Github)

Windows下载

直接下载zip后缀的nacos-server压缩包。

解压后的目录如下图所示:

运行Nacos:

startup.cmd -m standalone


可以访问管理界面。

Linux下载

复制链接地址,用于使用wget命令进行下载。

wget https://github.com/alibaba/nacos/releases/download/1.4.2/nacos-server-1.4.2.tar.gz


解压:

tar -zxvf nacos-server-1.4.2.tar.gz


解压后的目录如下图所示:

运行Nacos:

./startup.sh -m standalone


用户名和密码都是nacos。

创建服务

创建AlibabaBlog maven工程作为父module,再创建nacos和consumer两个子module。

AlibabaBlog module

pom.xml:



    4.0.0

    com.kaven
    AlibabaBlog
    pom
    1.0-SNAPSHOT

    Spring Cloud Alibaba
    
        nacos
        consumer
    

    
        org.springframework.boot
        spring-boot-starter-parent
        2.3.2.RELEASE
    

    
        11
        11
        Hoxton.SR9
        2.2.6.RELEASE
    

    
        
            org.springframework.boot
            spring-boot-starter-web
        
    

    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                ${spring-cloud-version}
                pom
                import
            
            
                com.alibaba.cloud
                spring-cloud-alibaba-dependencies
                ${spring-cloud-alibaba-version}
                pom
                import
            
        
    

nacos module

结构如下图所示:

pom.xml:



    
        AlibabaBlog
        com.kaven
        1.0-SNAPSHOT
    
    4.0.0

    nacos

    
        11
        11
    

    
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        
    

application.yml:

server:
  port: 8080

spring:
  application:
    name: nacos
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

NacosController接口类:

package com.kaven.alibaba.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;



@RestController
public class NacosController {

    @GetMapping("/nacos")
    public String getMessage() {
        System.out.println("被请求了!");
        return "spring cloud alibaba nacos";
    }
}

NacosApplication启动类:

package com.kaven.alibaba;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;



@SpringBootApplication
@EnableDiscoveryClient
public class NacosApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosApplication.class);
    }
}

@EnableDiscoveryClient注解要加上。

consumer module

结构如下图所示:

pom.xml:



    
        AlibabaBlog
        com.kaven
        1.0-SNAPSHOT
    
    4.0.0

    consumer

    
        11
        11
    

    
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        
    

application.yml:

server:
  port: 8090

spring:
  application:
    name: consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

ConsumerController接口类:

package com.kaven.alibaba.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;



@RestController
public class ConsumerController {

    @Resource
    private RestTemplate restTemplate;

    @GetMapping("/nacos")
    public String getNacos() {
        return restTemplate.getForObject("http://nacos/nacos", String.class);
    }
}

ConsumerApplication启动类:

package com.kaven.alibaba;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;



@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class);
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

@EnableDiscoveryClient注解要加上。

启动两个子module。

服务注册成功了。

consumer module使用RestTemplate成功调用注册在Nacos上的服务。

多服务负载均衡

启动3个nacos服务,首先要修改NacosApplication的运行配置,操作如下所示:


依次修改端口启动服务(修改一次端口,启动一次服务)。

3个nacos服务启动成功。


多次请求http://localhost:8090/nacos/:



这里很显然是轮询的负载均衡策略,而Nacos的负载均衡策略默认是轮询。但这里并没有使用到Nacos的负载均衡策略,而是使用了Spring Cloud中的负载均衡策略,因为在控制台上修改服务的权重是无效的,仍然是轮询;要想使用自定义的负载均衡策略,就需要实现自定义的IRule实现类,这在下面这篇博客中有介绍:

  • Spring Cloud 之Ribbon负载均衡

而Nacos已经实现了自定义的IRule实现类NacosRule,有兴趣可以去探索一下NacosRule类的源码。因此需要将NacosRule实例变成bean,便于Spring容器管理,修改ConsumerApplication类如下:

package com.kaven.alibaba;

import com.alibaba.cloud.nacos.ribbon.NacosRule;
import com.netflix.loadbalancer.IRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;
import org.springframework.web.client.RestTemplate;



@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class);
    }

    @Bean
    @Scope(value = "prototype")
    public IRule loadBalanceRule() {
        return new NacosRule();
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

重复上面的请求操作,结果是一样的,大家可以去测试一下,因为Nacos的负载均衡策略默认也是轮询。

服务在线管理

修改第一个nacos服务的权重为100(默认为1)。

修改服务权重成功。

使用Postman来批量调用consumer服务的接口。

第一个nacos服务被调用了98次。

另外两个nacos服务都是被调用了1次。

Nacos的源码分析博主以后再进行介绍,博主目前还在看Spring的源码,等有时间再分享其他框架的源码分析。Nacos服务注册与发现就介绍到这里,之后会介绍Nacos的其他特性以及高可用。

如果博主有说错的地方或者大家有不同的见解,欢迎大家评论补充。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/444790.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号