Nacos 注册中心:微服务架构的不二选择

Nacos 注册中心:微服务架构的不二选择

今日目标

  • 掌握Nacos注册中心(重要)

1. Nacos介绍

随着微服务架构的流行,我们需要一个稳定可靠的注册中心来管理和协调各个微服务组件。Nacos(中文名“诺克斯”)作为一个开源的动态服务发现、配置管理和服务管理平台,正以其出色的功能和易用性成为构建现代化微服务架构的首选利器。

1.1. 什么是Nacos注册中心

Nacos是由阿里巴巴集团开源的一个云原生的服务发现、配置管理和服务管理平台。它提供了服务注册与发现、动态配置管理以及服务健康监测等核心功能,并支持多种部署模式,包括单机模式、集群模式和分布式模式。Nacos不仅能够满足小型项目的需求,还可以轻松应对大规模微服务架构的场景

1.2. Nacos的特点和优势

  • 动态服务发现和注册: Nacos提供了简单易用的服务注册和发现功能,能够自动感知服务的上线和下线,并及时更新服务列表。通过Nacos,我们可以轻松地实现服务之间的通信和协作,无需手动维护服务地址列表。

  • 动态配置管理: Nacos支持动态配置管理,可以实时推送配置变更。我们可以集中管理所有微服务的配置信息,并在需要时动态修改配置,避免了重启应用的麻烦。同时,Nacos还提供了配置版本管理、灰度发布等高级功能,方便我们进行配置管理和发布。

  • 服务健康监测: Nacos提供了丰富的健康检查机制,能够根据自定义的规则对微服务进行健康状态的监测和评估。当服务不可用或出现异常时,Nacos会及时发现并通知相关人员,保障微服务架构的稳定性和可靠性。

  • 多种部署模式: Nacos支持多种部署模式,包括单机模式、集群模式和分布式模式。我们可以根据实际需求选择适合的部署方式,并通过水平扩展和负载均衡来提高系统的吞吐量和可用性。

如果您觉得本文不错,欢迎关注,点赞,收藏支持,您的关注是我坚持的动力!



2.Nacos安装

2.1. Nacos下载和安装

Nacos官网提供了安装部署教程,其下载链接指向.github官网,选择合适版本即可。如访问受阻可直接使用以下最新稳定版压缩包.nacos-server-2.1.0.zip:,后续我们也可能会更改为其他版本做更多测试。

注意:公司一般会采用最新版落后几个版本的稳定版当做生产版本,避免一些新特性引发的未知问题。

2.2. Nacos启动

Nacos启动有单据模式和集群模式,我们自己在演示的时候,只使用单机模式即可

Windows启动Nacos

windows启动,直接在其bin目录下,打开cmd控制台,双击startup.cmd启动,或者使用命令启动

startup.cmd -m standalone
Nacos 注册中心:微服务架构的不二选择

2.3. Linux启动Nacos

linux或者mac机器上进入/nacos/bin目录下,输入命令进行启动

sh startup.sh -m standalone

如果您使用的是ubuntu系统,或者运行脚本报错提示符号找不到,可尝试如下运行:

bash startup.sh -m standalone

注意:启动的时候可能会存在端口冲突问题,如果存在可以在nacos/conf/application.properties文件中修改端口

Nacos 注册中心:微服务架构的不二选择

注意:记住只要是软件安装,保证路径不要有中文,保证路径不存在空格

2.4. 访问

启动成功后,输入地址http://localhost:8848/nacos,默认用户名/密码

  • 用户名: nacos
  • 密码: nacos
Nacos 注册中心:微服务架构的不二选择

3. 整合Nacos注册中心

3.1. Nacos依赖导入

父工程新增spring-cloud-alibaba依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2021.0.5.0</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

Nacos 注册中心:微服务架构的不二选择spring-cloud-alibabab依赖集成了多个alibaba的SpringCloud组件,所以我们只需要引入alibaba依赖管家就可以了

Nacos 注册中心:微服务架构的不二选择

子工程去除eureka-client依赖

注意:将order-service、user-service中eureka客户端依赖进行去除

Nacos 注册中心:微服务架构的不二选择

子工程添加nacos注册中心依赖

在order-service、user-service项目中分别添加nacos注册中心依赖


<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

配置好这些依赖以后,我们项目就不在需要依赖eureka项目了。

思考:为什么除了添加nacos注册中心依赖之外还有添加loadbalancer负载均衡依赖?

这是因为nacos注册中心依赖中没有,负载均衡依赖所以要手动添加依赖

3.2. 配置文件添加nacos注册中心配置

在order-service和user-service中的application.yml中添加nacos注册中心配置,并将eureka配置注释

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
Nacos 注册中心:微服务架构的不二选择

3.3. 启动工程验证

启动order-service和user-service,然后在nacos注册中心发现服务已经注册完成

Nacos 注册中心:微服务架构的不二选择

4. 服务分级存储模型

思考:我们公司是深圳,用户覆盖整个中国,那么我们服务难道只在深圳部署机房?

肯定不是这样的,如果只部署在深圳,那么可能东北用户网络体验就不会太好,所以我们可能会分机房部署,机房分布在不同的区域

例如我们的user-service,有多个实例,分别是:

  • 127.0.0.1:8088
  • 127.0.0.1:8089
  • 127.0.0.1:8099 可以假设这些实例分布在全国的各个不同机房:比如:
  • 127.0.0.1:8088 ,在深圳机房
  • 127.0.0.1:8089,在深圳机房
  • 127.0.0.1:8099,在上海机房

Nacos可以将同一个机房的实例,划分到一个集群下面也就是说,user-service是服务,一个服务可以包含多个集群,如北京、上海和深圳,每个集群下可以有多个实例,形成分级模型,如图:

Nacos 注册中心:微服务架构的不二选择

微服务互相访问时,应该尽可能访问同集群实例,因为本地访问速度更快。当本集群内不可用时,才访问其它集群。例如:

Nacos 注册中心:微服务架构的不二选择

深圳机房内的order-service优先访问同一个机房下的user-service

4.1. 给user-service配置集群

修改user-service的application.yml文件,添加集群配置:

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        cluster-name: SZ #集群名称
  • 1.重启user-service,端口分别是8088和8089的实例,启动后在nacos控制台查看结果:
Nacos 注册中心:微服务架构的不二选择
  • 2.复制一个user=service,在vm添加配置
-Dserver.port=8090
-Dspring.cloud.nacos.discovery.cluster-name=SH
Nacos 注册中心:微服务架构的不二选择
  • 3.启动UserBalancerApplication3后再次查看nacos控制台:
Nacos 注册中心:微服务架构的不二选择

4.2. 同集群优先负载均衡

新版SpringCloud使用的负载均衡依赖是loadbalancer,昨天我们介绍过,默认负载均衡算法是轮询算法(RoundRobinLoadBalancer),并不能实现根据同集群优先来实现负载均衡。

Nacos提供了一个NacosLoadBalancer(基于权重的策略),NacosLoadBalancer的权重策略默认是关闭的,如果要使用基于权重的负载策略要手动开启。

Nacos 注册中心:微服务架构的不二选择

如果未给服务器设置权重或者设置集群,建议不要使用基于权重的策略,因为如果微服务的权重都相同,相当于随机

4.3. 切换负载均衡策略到NacosLoadBalancer

切换负载均衡策略到NacosLoadBalancer有两种方式

  • 配置文件方式
  • 代码方式

4.3.1 配置文件方式切换负载均衡策略

当你在项目的配置文件中设置 spring.cloud.loadbalancer.nacos.enabled=true 后,Spring Cloud 将自动使用 Nacos Discovery 和 NacosLoadBalancer 进行服务发现和负载均衡。

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        cluster-name: SZ # 将order-service集群设置为SZ
    loadbalancer:
      nacos:
        enabled: true #表示启用了 NacosLoadBalancer

注意:4.3.1和4.3.2都是将负载均衡测试切换为NacosLoadBalancer,两者存一即可

4.3.2 注入负载均衡策略Bean

import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.cloud.nacos.loadbalancer.NacosLoadBalancer;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;

import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;
import java.util.Collections;

/*
*
 * @author springboot葵花宝典
 * @description: TODO
 */


@Configuration
@LoadBalancerClients(defaultConfiguration = {OrderConfig.class})
public class OrderConfig 
{


    @Resource
    private NacosDiscoveryProperties nacosDiscoveryProperties;

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


    @Bean
    ReactorLoadBalancer<ServiceInstance> nacosLoadBalancer(Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory)
 
{
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);

        return new NacosLoadBalancer(loadBalancerClientFactory
                .getLazyProvider(name, ServiceInstanceListSupplier.class),
                name,nacosDiscoveryProperties)
;
    }
}

5. 权重配置

基于上一章节的负载均衡算法,我们可以了解到:存在部分机器性能更优,此时该机器理应得到更多的流量分配,nacos通过设置服务权重解决这一问题,权重越大访问评率越高,配置页面如下

  • 1.在nacos控制台,找到user-service的实例列表,点击编辑,即可修改权重:
Nacos 注册中心:微服务架构的不二选择
  • 2.在弹出的编辑窗口,修改权重:
Nacos 注册中心:微服务架构的不二选择

注意:如果权重修改为0,则该实例永远不会被访问

6. Nacos环境隔离

Nacos提供了namespace来实现环境隔离功能。

  • nacos中可以有多个namespace
  • namespace下可以有group、service等
  • 不同namespace之间相互隔离,例如不同namespace的服务互相不可见
Nacos 注册中心:微服务架构的不二选择

6.1. 创建namespace

默认情况下,所有service、data、group都在同一个namespace,名为public:

Nacos 注册中心:微服务架构的不二选择

日常开发过程中,我们一般会有dev、test、poc、prod等多个环境,同一个服务不同环境之间因存在代码不一致问题肯定需要做隔离调度,Nacos通过namespace解决此问题

创建namespace步骤如下:

  • 1.我们可以点击页面新增按钮,添加一个namespace:
Nacos 注册中心:微服务架构的不二选择
  • 2.然后,填写表单:
Nacos 注册中心:微服务架构的不二选择
  • 3.就能在页面看到一个新的namespace:
Nacos 注册中心:微服务架构的不二选择

6.2 给微服务配置namespace

尝试在order-service中增加namespace,并重启服务再次访问,注意:namespace后字符串为上图ID

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        cluster-name: SZ
        namespace: 3acf0a05-9d97-48a3-bba6-dda8bc211338

Nacos 注册中心:微服务架构的不二选择

注意: 此时会因不在同一命名空间导致无法访问(因userservice暴露服务时未声明namespace,默认public)

Nacos 注册中心:微服务架构的不二选择

我们修改user-service的配置文件,增加namespace,并重启服务再次访问会发现服务恢复正常

Nacos 注册中心:微服务架构的不二选择

Nacos临时实例与持久化实例

Nacos在定义上区分临时实例和持久化实例,其主要区分关键是健康检查的方式。

  • 临时实例:客户端上报模型,能够自动摘除不健康实例,无需持久化实例存储
  • 持久实例:服务端反省探测模式,客户端因不上报心跳故不会自动摘除下线实例

在大中型公司,两种类型一般都会使用,基础的组件如数据库、缓存等往往不能上报心跳,这种类型的服务在注册时就需要作为持计划实例注册。而上层的业务服务,如微服务或Dubbo服务,服务的Provider端支持添加心跳,此时就可以使用临时实例的注册方式。

其配置文件配置如下

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        cluster-name: SZ #集群名称
        namespace: 3acf0a05-9d97-48a3-bba6-dda8bc211338
        ephemeral: false # 设置为非临时实例

总结

我们从Nacos安装、运行到具体规则配置,带领小伙伴深度参与了Nacos日常使用场景,Nacos作为注册中心可以优雅替换Eureka也离不开SpringCloud Alibaba的开源贡献。作为国内主流的配置、注册中心,Nacos在国内多数微服务公司都有使用。Nacos除了能够实现服务注册发现(AP),此外还有个重要特性:配置管理(CP),我们将在下一篇文章展开介绍。

思考问题

  • Nacos是什么?解决了什么问题?
  • Nacos是如何优雅替换Eureka的?
  • Nacos实现的是客户端,还是服务端负载均衡?
  • Nacos如何实现注册中心?

如果您觉得本文不错,欢迎关注,点赞,收藏支持,您的关注是我坚持的动力!

原创不易,转载请注明出处,感谢支持!如果本文对您有用,欢迎转发分享!



原文始发于微信公众号(springboot葵花宝典):Nacos 注册中心:微服务架构的不二选择

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/183226.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!