微服务实战-Nacos(2)

53 阅读5分钟

学而时习之,不亦说乎

前言

本章开始我们进入微服务的世界,在微服务需要的众多功能中,今天我们介绍注册中心和配置中心,这也是Nacos给我们提供的两大功能。

注册中心

注册中心即提供服务注册服务发现功能.

何为服务注册,即将服务信息注册到注册中心

何为服务发现,即从注册中心上获取服务信息

首先我们知道微服务有服务众多的特点,我们通过REST API调用某个服务,发起请求时需要知道服务的实例网络地址(IP地址和端口号),在基于云平台的微服务应用中,服务实例会动态分配网络地址,而且一些服务实例可能会因为自动扩展、失败或者升级发生动态变化,因此微服务的注册中心就粉墨登场了。

配置中心

随着业务的发展、微服务架构的升级,服务的数量、程序的配置日益增多(各种微服务、各种服务器地址、各种参数),传统的配置文件方式和数据库的方式已无法满足开发人员对配置管理的要求

  1. 安全性:配置跟随源代码保存在代码库中,容易造成配置泄漏
  2. 时效性:修改配置,需要重启服务才能生效
  3. 局限性:无法支持动态调整:例如日志开关、功能开关

因此我们需要配置中心来统一管理配置

Nacos介绍

Nacos 是阿里巴巴的开源的项目,全称 Naming Configuration Service ,专注于服务发现和配置管理领域。

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

Nacos实践

Nacos下载安装

在GitHub上获取一个window环境的安装版本,获取地址为:

github.com/alibaba/nac…

选择如下图示中的版本即可:20230208212034.png

Nacos数据持久化

Nacos默认把数据保存在本地磁盘文件中,需要将数据持久化到mysql数据库中。

  1. 打开Navicat for MySql,新建连接,连接到本地MySql数据库或者云数据库(根据自身MySql安装情况而定)
  2. 新建名为nacos的数据库,运行在nacos/conf/nacos-mysql.sql的数据库表生成脚本
  3. 修改nacos/conf/application.properties,加入mysql数据库相关连接
# db mysql
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root

进入到bin目录,通过记事本或者其他的文件打开工具打开 start.cmd 文件,将set MODE="cluster"改为set MODE=“standalone” 即单机模式

  1. 找到/nacos/bin/下双击startup.cmd,启动nacos,出现如下页面:
  2. 打开浏览器,访问http://localhost:8848/nacos/#/login,默认登录名和密码都是nacos,可以正常进入说明已安装成功。

微服务整合Nacos

  1. 上一篇中创建了mingx-user-web用户微服务,为了与nacos整合,需在其pom.xml中加入nacos相关依赖。调整如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>mingx-user</artifactId>
        <groupId>com.mingx</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>mingx-user-web</artifactId>
    <groupId>com.boc</groupId>
    <version>0.0.1-SNAPSHOT</version>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencies>
        <!-- SpringBoot web相关依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- nacos注册中心依赖  -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- nacos配置中心依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!-- bootstrap配置文件支持依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
              <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>
  1. 启动类Application.java中加入nacos服务发现的注解
package com.mingx.user;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @author zj
 * @version 1.0.0
 * @ClassName
 * @Description UserServiceApplication.java
 * @createTime 2023/1/24 10:21
 */
@SpringBootApplication(scanBasePackages = {"com.mingx.user"})
@EnableDiscoveryClient
public class UserServiceApplication {

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

}
  1. 配置文件application.yml改为bootstrap.yml,中去除之前端口号的配置,加入nacos相关配置,以指明nacos服务中心和配置中心的地址:
spring:
  application:
    name: mingx-user
  profiles:
    active: dev
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yml # 假如不配置,则nacos远程配置文件的后缀为.properties
      discovery:
        server-addr: 127.0.0.1:8848

增加bootstrap配置文件支持依赖,版本号为3.0.4,预先维护好在父项目中,子项目中直接引用。

    <!-- bootstrap配置文件支持依赖 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bootstrap</artifactId>
    </dependency>

注:之前使用的application.yml配置文件,发现启动后配置中心无法生效,查看相关文章后说跟加载顺序有关,bootstrap.xml加载先与application.yml,在集成nacos配置中心的场景下,需要替换成bootstrap.xml,再加上以上的依赖,这样才能正常读取到配置中心的配置信息。

另外如果nacos是docker方式启动的,需要开放9848、9849端口

  1. 浏览器中登录nacos控制台,在配置管理--》配置列表页面,点击右上角的加号,来添加mingx-user的服务配置。
  2. 为了验证能否从nacos的配置文件中读取到设定的param.config的值,对UserController.java做一定修改,如下代码:
package com.mingx.user.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author zj
 * @version 1.0.0
 * @ClassName
 * @Description
 * @createTime 2023/01/24 10:21
 */
@RestController
public class TestController {

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


    @GetMapping("/test")
    public String test(){
        return "我是用户子项目,从配置中心读取param.config的值为" + config;
    }
}

  1. 启动mingx-user微服务观察nacos控制台的服务管理--》服务列表中发现已经将该微服务注册上。

  2. 在浏览器中访问:http://127.0.0.1:20010/USER/test,如果可以正常响应如下内容,说明已经成功集成nacos了。

结束语

本篇文章是对Nacos两大功能的最基础的应用,Nacos其他更强大的功能有待更一步挖掘。

Nacos完全可以替代SpringClould Eureka以及SpringClould Config,使项目更简洁、瘦身。

关于Nacos在生产环境的高可用,集群,会另外开篇专门的文章记录。

下一篇会针对业务微服务,集成Mybatis-plus,基于mybatis-plus实现业务代码生成,实现对业务数据库的增删改查操作。

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情