SpringCloud第二代实战系列:使用Nacos实现服务注册与发现

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: Nacos 提供了一组简单易用的特性集,帮助您实现动态服务发现、服务配置管理、服务及流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。
云栖号: https://yqh.aliyun.com
第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策!

一、背景:SpringCloud 生态圈

在正式开始本篇文章之前我们先岔开来讲一下SpringCloud的生态圈。
SpringCloud大家都比较熟悉了,它制定了分布式系统的标准规范,做了高度抽象和封装,然后将业界公司比较成熟以及经得起实际考验的框架整合起来。通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。我们之前常用的一些SpringCloud组件大部分来自于Netflix公司,比如我们熟知的Eureka,Hystrix,Ribbon等等,然而随着Eureka不再维护且闭源,Hystrix不再开发新功能,Zuul的性能一般而2.0又迟迟出不来,Ribbon不支持webFlux的负载均衡等等 ,这些已经限制了SpringCloud的高速发展,于是大家开始把目光转向第二代组合——SpringCloud Alibaba。

1.1、Spring Cloud Alibaba概述

Spring Cloud Alibaba 于 2018年成为SpringCloud的孵化项目,2018年7月27日 在 Spring Cloud 孵化器仓库提交第一次代码,到 2019年8月1日 在 Alibaba 仓库发布第一个正式版本。

image

1.2、第一代和第二代部分常用组件对比

SringCloud 第一代 SringCloud 第二代
网关 Zuul(Netflix) Gateway(SpringCloud)
注册中心 Eureka(Netflix),Consul、ZK Nacos(阿里)
配置中心 SprigCloudConfig Nacos(阿里),Apollo(携程)等
负载均衡 Ribbon(Netflix) Loadbalancer(SpringCloud)
熔断器 Hystrix(Netflix) Resilience4J(spring-cloud-r4j),Sentinel (阿里)

二、Nacos介绍及与Eureka的对比


微服务项目,我们肯定绕不开服务注册接下来我们正式进入今天的正题,一起来认识一下Nacos。关键特性有:服务发现和服务健康监测,动态配置服务,动态 DNS 服务,服务及其元数据管理等等
image

2.1 介绍

官方介绍:

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您实现动态服务发现、服务配置管理、服务及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos 是构建以“服务”为中心的现代应用架构(例如微服务范式、云原生范式)的服务基础设施。

image.png

image.png

2.2 Nacos对比Eureka

既然称之为第二代,那么Nacos对比Eureka,是否具有优势呢?我们来看一下对比
image.png
更多关于Naclos的介绍可参见官网:https://nacos.io/

三、Nacos安装与配置


接下来我们来使用Nacos进行服务的注册与发现(Nacos还可以实现分布式配置管理,在后续章节再进行讲解)。开始之前需确保我们的环境符合要求:操作系统是64位,且本地已安装了JDK1.8+,Maven3.2.X。

3.1 下载Nacos

下载地址:https://github.com/alibaba/nacos/releases
由于众所周知的原因,有的时候github访问非常的慢,我们可以访问国内的镜像仓库:https://gitee.com/mirrors/Nacos,下载后自己手动镜像编译即可。

3.2 解压启动

编写本篇文字时,Nocos1.2 处于Beta1阶段,所以我下载的是1.1.4Release版本。
我们将下载的安装包直接解压到本地,直接双击bin目录下的startup.cmd即可启动,非常地方便,
image

Nacos的默认端口是8848,访问地址:http://127.0.0.1:8848/nacos/index.html#/login ,界面如下:

image

用户名/密码: nacos/nacos,登录系统:
image.png

3.3 配置调整

如果需要修改端口号,或者修改contextPath等,只需要修改conf/application.properties文件即可
image.png

3.4 使用Mysql数据库

Nacos默认内置了一个Mysql数据库,为了便于管理,我们可以改为外置的数据库(尤其是在使用Nacos的分布式配置中心功能时,一定要改为外置的数据库,分布式配置中心功能后续会进行讲解),目前只支持Mysql,不支持其他数据库,

3.4.1 初始化数据库

我们找到conf目录下的nacos-mysql.sql,并进行初始化
image.png

3.4.2 添加数据库配置

修改conf/application.properties文件,追加以下数据库信息。

db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=youdontknow

配置完后,直接启动即可。

3.4.3 踩坑记录

我们在启动过程中,可能会遇到如下的错误:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'opsController' defined in URL [jar:file:/D:/Dev/nacos-server-1.1.4/target/nacos-server.jar!/BOOT-INF/lib/nacos-config-1.1.4.jar!/com/alibaba/nacos/config/server/controller/OpsController.class]: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dumpService': Invocation of init method failed; nested exception is java.lang.RuntimeException: Nacos Server did not start because dumpservice bean construction failure :
No DataSource set
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:769)
        at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:218)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1308)

参考了网上的部分资料,在Linux环境下可能是防火墙的问题,需要关闭防火墙,再进行启动。在我的环境中发现和防火墙没关系,是版本问题:Mysql当前不支持使用Mysql8,只支持Mysql5。如果需要使用Mysql8,稍微修改下代码即可。支持8.0的方法可参考:

https://www.cnblogs.com/gyli20170901/p/11245270.html

四、使用Nacos作为注册中心


4.1 创建工程

我们新建一个member-service的 Gradle工程(Maven工程一样设置),添加jar包依赖,Gradle配置如下:

implementation group: 'com.alibaba.cloud', name: 'spring-cloud-starter-alibaba-nacos-discovery', version: '2.1.1.RELEASE'

4.2 添加配置

在我们的项目中新建一个application.yml文件,配置如下:

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

注意:网上有的教程说只支持properties不支持yml,这个说明是错误的,是可以使用yml配置。还有的教程说需要新建一个bootstrap.properties文件,这个说法也是不准确的,在使用Nacos的配置中心功能时才需要。如果仅仅是作为服务注册中心,这个也是没有必要的。关于Nacos配置中心的用法,后续章节会进行讲解。

4.3 注册成功

项目启动后,我们访问【服务管理】-【服务列表】页面,可以看到我们的服务已经注册上去了,非常地方便。

image

五、集群配置


产线实际使用时,为了确保服务的高可能,正常会配置至少3台,所以我们需要进行集群的配置。

5.1 集群配置

在conf目录下,新建一个cluster.conf,配置集群机器的地址即可。建议至少配置三台

172.22.204.10:8848
172.22.204.10:8849
172.22.204.10:8850

5.2 依次启动

依次启动3台机器,访问【集群管理】-【节点列表】,我们发现已经配置成功。并且自动选举出了一台作为Leader。
image

Nacos使用的是Raft算法,将Server划分为3种状态或者也可以称作角色:

  • Leader:负责Client交互和log复制,同一时刻系统中最多存在1个。
  • Follower:被动响应请求RPC,从不主动发起请求RPC。
  • Candidate:一种临时的角色,只存在于leader的选举阶段,某个节点想要变成leader,那么就发起投票请求,同时自己变成candidate。如果选举成功,则变为candidate,否则退回为follower

5.3 踩坑记录

  • 坑1: 我们本地测试的时候,如果设置ip为127.0.0.1或者localhost会发现服务无法访问,一定要配置成我们本机的真实的IP。

这个对于我们本机做集群测试时非常地不方便,比如在公司配置了一个地址后,到家ip发生了变化,又得修改cluster配置文件。

  • 坑2: window环境下默认是单机模式启动,需要修改为集群模式

查看bin/startup.cmd

set MODE="standalone"
set FUNCTION_MODE="all"
set SERVER=nacos-server
set MODE_INDEX=-1
set FUNCTION_MODE_INDEX=-1
set SERVER_INDEX=-1

将Mode由standalone改为cluster即可(在startup.sh脚本中,默认是集群的方式)修改后重新启动:
image

六、谁在使用


按照官方的说法,1.0之后的版本大家完全可以放心大胆地在产线上使用。目前使用nacos的企业已经有很多,包括阿里自身,以及工商银行,平安、爱奇艺、虎牙直播、汽车之家等等。

七、参考资料


  1. SpringCloudAlibaba地址:https://github.com/alibaba/spring-cloud-alibaba
  2. Nacos官方网站:https://nacos.io/
  3. Nacos数据持久化 mysql8.0https://www.cnblogs.com/gyli20170901/p/11245270.html
  4. https://www.jianshu.com/p/afd7776a64c6
云栖号在线课堂,每天都有产品技术专家分享
立即加入圈子: https://c.tb.cn/F3.Z8gvnK
与专家面对面,及时了解课程最新动态!

原文发布时间:2020-03-18
本文作者:qiaojs
本文来自:“阿里云云栖社区”,了解相关信息可以关注“阿里云云栖社区

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
存储 Java Nacos
Spring Cloud+Nacos+KMS 动态配置最佳实践
本文讲述了 Spring Cloud 应用中结合 Nacos 实现了运行期配置动态更新的功能,以及在此基础上结合 KMS 在不改动代码的情况下对应用使用的敏感配置进行保护,解决将配置迁移到 Nacos 中可能存在的数据安全顾虑,并对其底层工作原理做了简单介绍。
457 12
|
25天前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
83 5
|
1月前
|
Java 网络安全 Nacos
Nacos作为流行的微服务注册与配置中心,其稳定性与易用性广受好评
Nacos作为流行的微服务注册与配置中心,其稳定性与易用性广受好评。然而,“客户端不发送心跳检测”是使用中常见的问题之一。本文详细探讨了该问题的原因及解决方法,包括检查客户端配置、网络连接、日志、版本兼容性、心跳检测策略、服务实例注册状态、重启应用及环境变量等步骤,旨在帮助开发者快速定位并解决问题,确保服务正常运行。
45 5
|
1月前
|
Dubbo Cloud Native 应用服务中间件
阿里云的 Dubbo 和 Nacos 深度整合,提供了高效的服务注册与发现、配置管理等关键功能,简化了微服务治理,提升了系统的灵活性和可靠性。
在云原生时代,微服务架构成为主流。阿里云的 Dubbo 和 Nacos 深度整合,提供了高效的服务注册与发现、配置管理等关键功能,简化了微服务治理,提升了系统的灵活性和可靠性。示例代码展示了如何在项目中实现两者的整合,通过 Nacos 动态调整服务状态和配置,适应多变的业务需求。
43 2
|
1月前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
65 3
|
1月前
|
网络安全 Nacos 开发者
Nacos作为流行的微服务注册与配置中心,“节点提示暂时不可用”是常见的问题之一
Nacos作为流行的微服务注册与配置中心,其稳定性和易用性备受青睐。然而,“节点提示暂时不可用”是常见的问题之一。本文将探讨该问题的原因及解决方案,帮助开发者快速定位并解决问题,确保服务的正常运行。通过检查服务实例状态、网络连接、Nacos配置、调整健康检查策略等步骤,可以有效解决这一问题。
37 4
|
1月前
|
Java 网络安全 Nacos
Nacos作为流行的微服务注册与配置中心,其稳定性和易用性备受青睐。
Nacos作为流行的微服务注册与配置中心,其稳定性和易用性备受青睐。然而,实际使用中常遇到“客户端不发送心跳检测”的问题。本文深入探讨该问题的原因及解决方案,帮助开发者快速定位并解决问题,确保服务正常运行。通过检查客户端配置、网络连接、日志、版本兼容性、心跳策略、注册状态、重启应用和环境变量等步骤,系统地排查和解决这一问题。
53 3
|
1月前
|
安全 Nacos 数据库
Nacos是一款流行的微服务注册与配置中心,但直接暴露在公网中可能导致非法访问和数据库篡改
Nacos是一款流行的微服务注册与配置中心,但直接暴露在公网中可能导致非法访问和数据库篡改。本文详细探讨了这一问题的原因及解决方案,包括限制公网访问、使用HTTPS、强化数据库安全、启用访问控制、监控和审计等步骤,帮助开发者确保服务的安全运行。
49 3
|
2月前
|
JSON SpringCloudAlibaba Java
Springcloud Alibaba + jdk17+nacos 项目实践
本文基于 `Springcloud Alibaba + JDK17 + Nacos2.x` 介绍了一个微服务项目的搭建过程,包括项目依赖、配置文件、开发实践中的新特性(如文本块、NPE增强、模式匹配)以及常见的问题和解决方案。通过本文,读者可以了解如何高效地搭建和开发微服务项目,并解决一些常见的开发难题。项目代码已上传至 Gitee,欢迎交流学习。
178 1
Springcloud Alibaba + jdk17+nacos 项目实践
|
2月前
|
自然语言处理 Java API
Spring Boot 接入大模型实战:通义千问赋能智能应用快速构建
【10月更文挑战第23天】在人工智能(AI)技术飞速发展的今天,大模型如通义千问(阿里云推出的生成式对话引擎)等已成为推动智能应用创新的重要力量。然而,对于许多开发者而言,如何高效、便捷地接入这些大模型并构建出功能丰富的智能应用仍是一个挑战。
269 6