SpringCloud Alibaba微服务之Nacos

1.简介

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

微服务网关 服务编排 微服务网关nacos_spring

从上图不难看出,一个Nacos干掉了Spring Cloud的三大组件,分别是注册中心Eureka服务配置Config服务总线Bus

2.Nacos服务端搭建

用过Nacos的开发者都说很爽,不用自己搭建服务,阿里给你准备好了服务,只需要启动即可;界面中英文都有,很适合初学者。

2.1 下载nacos

微服务网关 服务编排 微服务网关nacos_配置文件_02

下载并解压后可以看到以下目录结构:

tar --zxvf nacos-server-1.1.4.tar.gz

微服务网关 服务编排 微服务网关nacos_spring_03

2. 启动nacos

单机版

  • 启动命令:sh startup.sh -m standalone
  • 关闭命令:sh shutdown.sh

微服务网关 服务编排 微服务网关nacos_微服务_04

看到这个就表示nacos服务已经启动起来

集群版

  • 启动命令:sh startup.sh
  • 关闭命令:sh shutdown.sh

3.访问验证

输入ip地址+端口号8848/nacos就可以访问

微服务网关 服务编排 微服务网关nacos_微服务_05

默认用户名:nacos 密码:nacos

微服务网关 服务编排 微服务网关nacos_配置文件_06

到此nacos服务器端的搭建就完成了。

4.nacos配置文件

nacos的配置文件在文conf文件夹里面,包括对nacos的端口号、集群配置、配置数据库连接等信息。

微服务网关 服务编排 微服务网关nacos_spring_07

微服务网关 服务编排 微服务网关nacos_spring_08

5.nacos的数据持久化

Nacos使用的是内嵌数据库 Derby(Apache Derby),目前Nacos仅支持Mysql数据库,且版本要求:5.6.5+,也可通过修改配置文件把数据持久化到mysql数据库。

5.1 修改配置文件

在配置文件application.properties文件中添加mysql数据库连接配置信息

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000 &autoReconnect=true
db.user.0=root
db.password.0=root

微服务网关 服务编排 微服务网关nacos_配置文件_09

5.2 重启nacos服务

微服务网关 服务编排 微服务网关nacos_spring_10

5.3 重新打开nacos,新添加一个命名空间

微服务网关 服务编排 微服务网关nacos_微服务_11

5.4 数据库查询

新建的的命名空间存储在表tenant_info表中的,通过查询该表说明数据已经持久化到我们指定的mysql数据库中

微服务网关 服务编排 微服务网关nacos_spring_12

6. 集群化部署Nacos

方法一

集群部署步骤:

1、解压nacos安装包,执行命令将nacos的名字改成nacos-8848、nacos-8858、nacos-8868,作为三个服务方便区分。命令:mv nacos nacos8848。

微服务网关 服务编排 微服务网关nacos_spring_13

2、创建数据库,集群的nacos需要连接数据库保存配制信息,在nacos的解压包中有初始脚本,位置/usr/local/nacos8849/conf/nacos-mysql.sql ,在创建的数据库中直接执行。

3、配制数据源,位置/usr/local/nacos8849/conf/application.properties,配制内容如下。

server.contextPath=/nacos
server.servlet.contextPath=/nacos
server.port=8849

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user.0=root
db.password.0=XXXX

4、配制集群cluster,将原cluster.conf.example改为cluster.conf,位置/usr/local/nacos8849/conf。

#it is ip
#example
XX.XX.59.125:8848
XX.XX.59.125:8849

这里有一个坑,就是这个IP不能在阿里云配制为127.0.0.1,得采用它本地的IP。

docker部署可以参考:

方法二

方法一比较简单,但是需要复制多份nacos文件,而且需要修改每份nacos下面的配置文件,也比较麻烦。下面通过修改startup.sh脚本文件,通过使用参数-p xxxx来指定端口号来启动

  1. 修改startup.sh脚本文件
  • 添加参数-p
while getopts ":m:f:s:p:" opt
do
    case $opt in
        m)
            MODE=$OPTARG;;
        f)
            FUNCTION_MODE=$OPTARG;;
        s)
            SERVER=$OPTARG;;
		p)
			PORT=$OPTARG;;
        ?)
        echo "Unknown parameter"
        exit 1;;
    esac
done

修改后


微服务网关 服务编排 微服务网关nacos_微服务网关 服务编排_14

  • 添加启动参数 $Dserver.port=${PORT}
# start
echo "$JAVA ${JAVA_OPT}" > ${BASE_DIR}/logs/start.out 2>&1 &
nohup $JAVA $Dserver.port=${PORT} ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 &
echo "nacos is starting,you can check the ${BASE_DIR}/logs/start.out"

修改后

微服务网关 服务编排 微服务网关nacos_配置文件_15

  1. 启动验证
    使用命令sh ./startup.sh -p xxxx指定不同的端口号启动集群部署nacos

3.Nacos客户端搭建

3.1 Nacos服务注册中心

微服务的服务注册和发现相信都用过Eureka,要自己本地构建一个Eureka微服务,但是整合了Alibaba的Nacos则不用那么复杂,直接启动Alibaba提供的Nacos服务即可,这样让程序员把全部精力放在业务上,下面是一个简单的架构图:

微服务网关 服务编排 微服务网关nacos_配置文件_16

服务注册(服务提供者)

  1. 引入依赖
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>
  1. 修改配置文件
server:
  port: 8081
spring:
  application:
    name: nacos-producer
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.123.103:8848
        enabled: true #如果不想使用 Nacos 作为您的服务注册与发现,设置为false
management:
  endpoints:
    web:
      exposure:
        include: '*'
  1. 启动服务
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosProducerDemoApplication.class, args);
    }

    @RestController
    public class EchoController {
        @GetMapping(value = "/echo/{string}")
        public String echo(@PathVariable String string) {
            return "Hello Nacos Discovery " + string;
        }
    }
}
  1. 验证访问
    登录服务注册中心nacos的服务列表就可以找到刚才创建的服务提供者nacos-producer

服务消费

  1. 引入依赖
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>
  1. 修改配置文件application.yml
spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.123.103:8848
        enabled: true
server:
  port: 8201
management:
  endpoints:
    web:
      exposure:
        include: '*'
  1. RestTemplate配置
    在 Consumer 端需要去调用 Provider 端提供的REST 服务。我们使用最原始的一种方式, 即显示的使用 RestTemolate 的方式来访问
@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate()
    {
        return  new RestTemplate();
    }
}
  1. 调用服务提供者的接口
@RestController
public class ConsumerController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/echo/app-name")
    public String echoAppName(){
        String s = restTemplate.getForObject("http://nacos-provider-payment/echo/hello",String.class);
        return s;
    }

}
  1. 验证调用提供者接口

微服务网关 服务编排 微服务网关nacos_配置文件_17

到此,服务的注册与发现功能就完毕,服务提供者和消费者都已经注册到服务注册中心nacos中,Nacos的服务注册发现很简单,比Eureka简单多了,无需自己构建个注册中心。

额外补充

nacos与Eureka的对比

微服务网关 服务编排 微服务网关nacos_微服务_18

Nacos的配置项信息

配置项

Key

默认值

说明

服务端地址

spring.cloud.nacos.discovery.server-addr

Nacos Server 启动监听的ip地址和端口

服务名

spring.cloud.nacos.discovery.service

${spring.application.name}

给当前的服务命名

服务分组

spring.cloud.nacos.discovery.group

DEFAULT_GROUP

设置服务所处的分组

权重

spring.cloud.nacos.discovery.weight

1

取值范围 1 到 100,数值越大,权重越大

网卡名

spring.cloud.nacos.discovery.network-interface

当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址

注册的IP地址

spring.cloud.nacos.discovery.ip

优先级最高

注册的端口

spring.cloud.nacos.discovery.port

-1

默认情况下不用配置,会自动探测

命名空间

spring.cloud.nacos.discovery.namespace

常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

AccessKey

spring.cloud.nacos.discovery.access-key

当要上阿里云时,阿里云上面的一个云账号名

SecretKey

spring.cloud.nacos.discovery.secret-key

当要上阿里云时,阿里云上面的一个云账号密码

Metadata

spring.cloud.nacos.discovery.metadata

使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关的元数据信息

日志文件名

spring.cloud.nacos.discovery.log-name

集群

spring.cloud.nacos.discovery.cluster-name

DEFAULT

配置成Nacos集群名称

接入点

spring.cloud.nacos.discovery.enpoint

UTF-8

地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址

是否集成Ribbon

ribbon.nacos.enabled

true

一般都设置成true即可

是否开启Nacos Watch

spring.cloud.nacos.discovery.watch.enabled

true

可以设置成false来关闭 watch

Springcloud Alibaba各个组件的版本关系

微服务网关 服务编排 微服务网关nacos_微服务网关 服务编排_19

3.2 Nacos配置中心

1. 基础配置

  1. 添加依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  1. 添加配置文件 application.yml和bootstrap.yml

Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取之后,才能保证项目的正常启动。springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application

  • bootstrap.yml配置文件
server:
  port: 3377
spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #nacos作为服务注册中心地址
      config:
        server-addr: localhost:8848 #nacos作为配置中心地址
        file-extension: yaml #指定yaml格式的配置
        group: DEV_GROUP
        namespace: 3e1a6d2a-63dc-4e1a-9318-3bd41c7d16c8
  application:
    name: nacos-config-client
  • application.yml配置文件
spring:
  profiles:
    active: info
  1. 在nacos中添加配置文件

DataId的命名规则:

spring-cloud-starter-alibaba-nacos-config 在加载配置的时候,加载dataid为 ${spring.application.name}-${profile}.${file-extension:properties} 的基础配置。在日常开发中如果遇到多套环境下的不同配置,可以通过Spring 提供的 ${spring.profiles.active} 这个配置项来配置。

微服务网关 服务编排 微服务网关nacos_微服务网关 服务编排_20

  1. 创建controller访问接口,从配置中心获取配置信息
@RestController
@RefreshScope //支持Nacos动态刷新
public class ConfigClientController {

    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo()
    {
        return configInfo;
    }

}
  1. 访问接口,验证获取配置信息

微服务网关 服务编排 微服务网关nacos_微服务_21

Nacos配置中心配置如下

微服务网关 服务编排 微服务网关nacos_spring_22

2. 分类配置

类似java里面的package名和类名,最外层的namespace是可以用于区分部署环境的,Group和dataId逻辑上区分2个目标对象

比如我们现在有:开发、测试、生产环境,我们就可以创建3个nameSpace,不同的nameSpace之间是隔离的。Group默认是default_group,Group可以把不同的微服务划分到同一个分组里面去

微服务网关 服务编排 微服务网关nacos_微服务网关 服务编排_23

在bootstrap.yml配置中通过配置不同的namespace以及group来选择不同的配置文件

微服务网关 服务编排 微服务网关nacos_spring_24