快速入手:Nacos融合SpringCloud成为注册配置中心

发布于:2025-03-24 ⋅ 阅读:(38) ⋅ 点赞:(0)

前言

  • Spring Cloud是一系列框架的集合,提供了微服务架构下的各种解决方案,如服务治理、配置管理、熔断器、网关等。它基于 Spring Boot,使得开发者能够快速构建微服务应用。
  • Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它可以作为服务注册中心,帮助微服务实例进行注册与发现,使各个微服务之间能够方便地进行通信。Nacos 服务器维护着一个服务注册表,记录着各个微服务的实例信息,如 IP 地址、端口号、服务名称等。当其他微服务需要调用某个服务时,只需从 Nacos 服务器获取服务实例列表,即可进行远程调用。此外,Nacos 还支持服务健康检查,能够实时监测服务实例的健康状态,将不健康的实例从服务列表中剔除,保证服务调用的可靠性。

当与 Nacos 集成时,Spring Cloud 应用可以从 Nacos 服务器获取配置信息。同时,Nacos 支持配置的动态更新,当配置信息发生变化时,微服务应用能够实时感知到变化,并自动更新本地的配置,无需重启应用。
搭建微服务.

安装Nacos

您需要先下载 Nacos 并启动 Nacos server

快速开始所生产出的Nacos服务为单机模式及未开启鉴权,建议仅在测试中使用,若在实际生产环境中部署,请部署集群模式并开启鉴权,以避免存在稳定性和安全性的风险。

您可以通过Nacos的版本下载页面Github找到每个版本支持的功能的介绍,当前推荐的稳定版本为2.5.1。

Nacos 依赖 Java 环境来运行,请确保是在以下版本环境中安装使用:

  • 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
  • 64 bit JDK 1.8+;下载 & 配置。

下载完成后解压Nacos压缩包,以Linux为例。

如果是.zip文件执行如下代码:

unzip nacos-server-$version.zip

如果是.gz文件执行如下代码:

tar -xvf nacos-server-$version.tar.gz

解压完成后,进入/bin目录:

cd nacos/bin

注:Nacos的运行建议至少在2C4G 60G的机器配置下运行。

解压后进入/bin目录,执行启动命令,如果是Linux则执行.sh脚本文件,Windows则执行.cmd脚本文件,示例代码如下:

# Linux
sh startup.sh -m standalone
# Windows
startup.cmd -m standalone

standalone代表着单机模式运行,非集群模式。

启动后,返回以下信息说明启动成功,如图所示:

在这里插入图片描述

打开任意浏览器,输入地址:http://127.0.0.1:8848/nacos,即可进入Nacos控制台页面(无需数用户名和密码)。

如果需要关闭服务器,执行对应文件与启动时文件后缀一致,示例代码如下:

# Linux
sh shutdown.sh
# Windows 或者双击
shutdown.cmd

项目搭建

参考官网最新版本说明,如图所示:

在这里插入图片描述

我们使用当前Nacos最新的版本,依赖文件如下:

Spring Boot Version Spring Cloud Alibaba Version Spring Cloud Version
3.3.9 2023.0.3.* 2023.0.3
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.9</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.sc.nacos.product</groupId>
    <artifactId>sc-nacos-product</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>sc-nacos-product</name>
    <description>sc-nacos-product</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- 用于配置管理 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!-- 服务发现 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2023.0.3.2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2023.0.3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

添加配置

bootstrap.propertiesbootstrap.yml 中配置应用名和文件名、 Nacos server 的地址,示例代码如下:

spring:
  application:
    name: sc-nacos-product
  # 设置外部配置源
  config:
    import: nacos:sc-nacos-product-dev.yml
  cloud:
    nacos:
      # 指定 Nacos 配置服务器的地址
      config:
        server-addr: 127.0.0.1:8848
      # 指定 Nacos 服务发现服务器的地址
      discovery:
        server-addr: 127.0.0.1:8848

Nacos上创建对应sc-nacos-product-dev.yml配置文件,如图所示:

在这里插入图片描述

启动类添加注解

启动类增加 @EnableDiscoveryClient开启服务注册发现功能,示例代码如下:

@SpringBootApplication
@EnableDiscoveryClient
public class ScNacosProductApplication {

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

}

运行项目

启动项目,检查配置文件是否连接正常,如图所示:
在这里插入图片描述

再检查服务在Nacos上是否注册成功,如图所示:

在这里插入图片描述

至此一个简单的SpringCloud整合Nacos项目已经完成。

服务调用

Spring Cloud提供了许多用于服务调用的功能。常见的服务调用方式RestTemplateFeignClientRibbonHystrix 等。

RestTemplate 模式

RestTemplateSpring 提供的用于发送 HTTP 请求和接收响应的类。它适用于多种场景,尤其是在没有声明式调用需求时。通过 RestTemplate,你可以直接发送 HTTP 请求并获取返回结果,通常与 Ribbon 结合使用进行负载均衡。

引入依赖:

        <!-- 负载均衡 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

sc-nacos-product服务中定义一个Controller接口,示例代码如下:

@RestController
public class AppController {

    @GetMapping("/echo/{str}")
    public String rest(@PathVariable String str){
        return "hello "+ str;
    }
}

按照之前的步骤,创建一个调用方项目(比如项目名:sc-nacos-consumer)。

添加 @LoadBlanced 注解,使得 RestTemplate 接入服务发现与负载均衡:

@Configuration
public class AppConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

sc-nacos-consumer服务定义一个Controller接口,调用sc-nacos-product服务接口,示例代码如下:

@RestController
public class AppController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/rest/{str}")
    public String rest(@PathVariable String str){
        return restTemplate.getForObject("htt://sc-nacos-product/echo/"+ str, String.class);
    }
}

使用Postman等工具,请求sc-nacos-consumer服务接口,确认响应无误,如图所示:

在这里插入图片描述

FeignClient 模式

FeignClientSpring Cloud 提供的一个声明式 HTTP 客户端,可以让你通过注解方式自动化服务调用。Feign 会根据接口定义自动实现 HTTP 请求,简化了服务调用的代码,并集成了负载均衡和错误处理功能。

引入依赖:

        <!-- 远程调用 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

启动类增加@EnableFeignClients注解,用于启用 Feign 客户端,示例代码如下:

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ScNacosProductApplication {

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

}

使用 @FeignClient 注解将sc-nacos-product服务提供的Controller接口,包装成一个 FeignClient,属性 name 对应对端应用名,示例代码如下:

@FeignClient(name = "sc-nacos-product")
public interface EchoService {
    @GetMapping(value = "/echo/{str}")
    String echo(@PathVariable(value = "str") String str);
}

EchoService 作为标准bean 注入sc-nacos-consumer服务,即可对远端服务发起请求了,示例代码如下:

@RestController
public class AppController {

    @Autowired
    private EchoService echoService;
    
    @GetMapping("/client/{str}")
    public String client(@PathVariable(value = "str") String str){
        return echoService.echo(str);
    }
}

需要注意再sc-nacos-consumer服务,使用@EnableFeignClients注解并指定扫描路径,示例代码如下:

@SpringBootApplication
@EnableFeignClients(basePackages = "com.sc.nacos.product.client")
@EnableDiscoveryClient
public class ScNacosConsumerApplication {

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

}

使用Postman等工具,请求sc-nacos-consumer服务接口,确认响应无误,如图所示:

在这里插入图片描述

Gateway 网关

Spring Cloud GatewaySpring Cloud 生态系统中的一个 API 网关,用于路由请求、过滤请求和响应。

引入依赖:

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

按照之前的步骤,创建一个网关项目(比如项目名:sc-nacos-gateway)。

启动类添加注解,示例代码如下:

@SpringBootApplication
@EnableDiscoveryClient
public class ScNacosGatewayApplication {

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

application.yml 中配置路由规则:

spring:
  cloud:
    gateway:
      routes:
        - id: sc-nacos-consumer
          uri: lb://sc-nacos-consumer
          predicates:
            - Path=/consumer/**
        - id: sc-nacos-product
          uri: lb://sc-nacos-product
          predicates:
            - Path=/product/**
          filters:
            - StripPrefix=1

每个路由规则使用 - 来表示一个独立的路由。

  • id为当前的路由规则唯一标识符。

  • uri是一个关键配置项,它代表着请求被路由后要前往的目标地址或者服务发现中的服务名。 lb:// 是负载均衡的前缀,当请求/consumer开头的地址,就会被路由到sc-nacos-consumer服务,并且会通过负载均衡算法选择合适的实例来处理请求。

  • predicates 是路由的匹配条件部分,用于判断什么样的请求会被这个路由规则所处理。它表示当请求的路径以任意地址开头时,该请求就会匹配这个路由规则。** 是通配符,可以跟任意的路径信息。

  • filters 是路由的过滤部分,用于在请求被路由前后对请求和响应进行修改或处理。StripPrefix 过滤器的作用是在请求被路由之前,从请求的路径中移除指定数量的路径前缀部分。这里的 1 表示移除路径中的第一个路径段。比如:请求/product/user在经过 StripPrefix=1 过滤器处理后,实际被路由的路径会变成 /user

完整的配置文件如下:

spring:
  application:
    name: sc-nacos-gateway
  config:
    import: nacos:sc-nacos-gateway.yml
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
      discovery:
        server-addr: 127.0.0.1:8848
    gateway:
      routes:
        - id: sc-nacos-consumer
          uri: lb://sc-nacos-consumer
          predicates:
            - Path=/consumer/**
          filters:
            - StripPrefix=1
        - id: sc-nacos-product
          uri: lb://sc-nacos-product
          predicates:
            - Path=/product/**
          filters:
            - StripPrefix=1

使用Postman等工具,从网关请求sc-nacos-consumer服务接口,确认响应无误,如图所示:

在这里插入图片描述