Nacos搭建记录

0. 前言

最近搭建了一套SpringCloud架构的微服务的系统,所用的组件包括:Nacos、Spring Cloud Gateway、Sentinel、ELK、Promethues。

这里算是最简单的框架了:Nacos既作为服务中心,又当配置中心,算是整个体系的中控基础;Spring Cloud Gateway做应用内流量的导向,通过Sentinel对流量进行限流控制,又通过Auth中心进行认证,算是整个体系的前线核心;ELK收集日志,Promethues监控资源,算是整个体系保障。

体系结构

下边分几篇文章将整个的搭建过程进行一个整理,本篇是第一章Nacos的搭建记录。

1. 简介

Nacos有两个主要功能:服务中心与配置中心。

服务示例在启动时,将数据注册到服务中心的注册表中,并在关闭的时候注销他们。服务的客户端查询服务注册表,以查找可用的示例。服务注册中心还有通过心跳信号来检测服务的健康情况。

配置管理是将原本在application.yml配置文件中的配置统一到配置中心来管理,这样能方便运维管理。 架构图如下:

nacos架构图

2. Nacos安装

nacos可以搭建standalone,也可以搭建成cluster,这方面官网说的比较详细了,本地搭建成standalone模式。

最简单的安装方式:

docker pull nacos/nacos-server
docker run --name nacos -d -p 8848:8848 -e MODE=standalone nacos/nacos-server

但这样数据都是在nacos-server容器中的,一旦容器删除,则造成了严重的损失,所以采用standalone的mysql方式。

先从官网git库中下载文档

git clone https://github.com/nacos-group/nacos-docker.git

然后根据自己的需要进行修改:

version: '3.4'

services:
  diego-nacos:
    image: nacos/nacos-server:v2.0.4
    hostname: diego-nacos
    env_file:
      - ./env/nacos-standlone-mysql.env
    ports:
      - "8848:8848"
      - "9848:9848"
      - "9555:9555"
    depends_on:
      - diego-nacos-mysql
    restart: on-failure
    networks:
      - diego-network
    deploy:
      replicas: 1

  diego-nacos-mysql:
    image: nacos/nacos-mysql:5.7
    hostname: diego-nacos-mysql
    env_file:
      - ./env/mysql.env
    volumes:
      - /home/sun/database/nacos_mysql_data:/var/lib/mysql
    ports:
      - "3307:3306"
    networks:
      - diego-network
    deploy:
      replicas: 1

networks:
  diego-network:
    external: true

在docker-compose.yml同层下创建env文件夹,存放mysql.env与nacos-standlone-mysql.env,这两个从官网移植过来,将nacos-standlone-mysql.env中MYSQL_SERVICE_HOST进行修改即可。

然后就可以通过http://127.0.0.1:8848/nacos进行访问,初始的账号、密码都是nacos。

ps:这里有篇裸机搭建nacos集群的文章

3. 业务服务

3.1 依赖

包括服务发现与配置:

 <dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

这要注意SpringCloud、SpringCloudAlibaba的版本对应

我用的版本是:

  • Spring Cloud Alibaba :2.2.6.RELEASE
  • Spring Cloud: Spring Cloud Hoxton.SR9
  • Spring Boot Version: 2.3.2.RELEASE

3.2 配置

  • 登录http://127.0.0.1:8848/nacos/

    创建命名空间cloud

    nacos命名空间
  • bootstrap.yml:

    spring:
      application:
        name: order-server
      cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848
            namespace: 553aff19-8cd6-4d4e-99a8-6671f51394b6
          config:
            enabled: true
            file-extension: yaml
            namespace: 553aff19-8cd6-4d4e-99a8-6671f51394b6
    

    制定namespace的id

3.3 使用

  • EnableDiscoveryClient

    @Slf4j
    @SpringBootApplication
    @EnableDiscoveryClient
    @MapperScan({"com.sun.order.mapper"})
    public class OrderApplication {
        public static void main(String[] args) {
            ConfigurableApplicationContext applicationContext = SpringApplication.run(OrderApplication.class, args);
            log.info("Order Server Started!");
            log.info(applicationContext.getEnvironment().getProperty("app.discount"));
        }
    }
    
  • 服务发现的使用

    完成上述配置后,启动服务,可以在Nacos页面的服务管理 -> 服务列表 中看到相应的服务了;

    这样已经注册到了Nacos,其他服务注册也注册之后,就可以通过服务名直接访问该服务了;

    如在Feign中使用:

    @FeignClient(name = "auth-server", contextId = "user", path="/user")
    public interface UserService {
    
        @GetMapping("/{id}")
        User getUser(@PathVariable Long id);
    }
    
  • 配置中心的直接使用

    在配置中心cloud下,创建服务名同名的配置(格式选择yml)

    Nacos服务配置

    然后就可以直接像使用普通property一样使用了,如:

    @ConfigurationProperties("app")
    @RefreshScope
    @Data
    @Component
    public class OrderConfig {
        private Integer discount = 100;
    }
    
  • 配置中心的监听使用

    还用一种动态配置方式:

    • 通过nacos创建配置项,格式可以是json
    • 业务服务中,监听该配置
    • 当Nacos中配置发生改变时,会进行回调,通过回调函数对配置进行解析与处理

    gateway中的动态路由以及熔断策略都是用的这种方式,具体的示例见下一节gateway

4. 结语

配置中心是整个体系的基础,它维护整个系统的服务名、ip等基本信息,为服务间的通信提供了基础。细想这个过程与DNS是挺接近的。它的具体实现需要单独拿来进行研究。

服务中心除了Nacos,还可以选择Consul,Consul的DNS功能很出色,还有就是Consul对Promethues的支持更好,这个我们在Promethues再去聊。

# 微服务 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×