欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringCloud第二代实战系列:一文搞定Nacos实现服务注册与发现

程序员文章站 2022-05-19 08:09:14
一、背景:SpringCloud 生态圈 在正式开始本篇文章之前我们先岔开来讲一下SpringCloud的生态圈。 SpringCloud大家都比较熟悉了,它制定了分布式系统的标准规范,做了高度抽象和封装,然后将业界公司比较成熟以及经得起实际考验的框架整合起来。通过Spring Boot风格进行再封 ......

一、背景: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 仓库发布第一个正式版本。

SpringCloud第二代实战系列:一文搞定Nacos实现服务注册与发现

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 服务,服务及其元数据管理等等
SpringCloud第二代实战系列:一文搞定Nacos实现服务注册与发现

2.1 介绍

官方介绍:

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

SpringCloud第二代实战系列:一文搞定Nacos实现服务注册与发现

SpringCloud第二代实战系列:一文搞定Nacos实现服务注册与发现

2.2 nacos对比eureka

既然称之为第二代,那么nacos对比eureka,是否具有优势呢?我们来看一下对比
SpringCloud第二代实战系列:一文搞定Nacos实现服务注册与发现
更多关于naclos的介绍可参见官网:

三、nacos安装与配置


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

3.1 下载nacos

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

3.2 解压启动

编写本篇文字时,nocos1.2 处于beta1阶段,所以我下载的是1.1.4release版本。
我们将下载的安装包直接解压到本地,直接双击bin目录下的startup.cmd即可启动,非常地方便,
SpringCloud第二代实战系列:一文搞定Nacos实现服务注册与发现

nacos的默认端口是8848,访问地址: ,界面如下:

SpringCloud第二代实战系列:一文搞定Nacos实现服务注册与发现

用户名/密码: nacos/nacos,登录系统:
SpringCloud第二代实战系列:一文搞定Nacos实现服务注册与发现

3.3 配置调整

如果需要修改端口号,或者修改contextpath等,只需要修改conf/application.properties文件即可
SpringCloud第二代实战系列:一文搞定Nacos实现服务注册与发现

3.4 使用mysql数据库

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

3.4.1 初始化数据库

我们找到conf目录下的nacos-mysql.sql,并进行初始化
SpringCloud第二代实战系列:一文搞定Nacos实现服务注册与发现

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的方法可参考:

四、使用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 注册成功

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

SpringCloud第二代实战系列:一文搞定Nacos实现服务注册与发现

五、集群配置


产线实际使用时,为了确保服务的高可能,正常会配置至少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。
SpringCloud第二代实战系列:一文搞定Nacos实现服务注册与发现

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脚本中,默认是集群的方式)修改后重新启动:
SpringCloud第二代实战系列:一文搞定Nacos实现服务注册与发现

六、谁在使用


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

七、参考资料


  1. springcloudalibaba地址:
  2. nacos官方网站:
  3. nacos数据持久化 mysql8.0https://www.cnblogs.com/gyli20170901/p/11245270.html

微信公众号:码大叔 十年戎“码”,老“叔”开花
SpringCloud第二代实战系列:一文搞定Nacos实现服务注册与发现