快速入手:Nacos融合SpringCloud成为注册配置中心
前言
- 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.properties
或bootstrap.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提供了许多用于服务调用的功能。常见的服务调用方式RestTemplate 和 FeignClient 、Ribbon、Hystrix 等。
RestTemplate 模式
RestTemplate 是 Spring 提供的用于发送 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 模式
FeignClient 是 Spring 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 Gateway 是 Spring 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
服务接口,确认响应无误,如图所示: