快速入手:Nacos融合SpringCloud成为注册配置中心
- 前言
- 安装Nacos
- 项目搭建
- 添加配置
- 启动类添加注解
- 运行项目
- 服务调用
- RestTemplate 模式
- FeignClient 模式
- Gateway 网关
前言
- 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.ymlcloud: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@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}
在sc-nacos-consumer
服务定义一个Controller接口,调用sc-nacos-product
服务接口,示例代码如下:
@RestController
public class AppController {@Autowiredprivate 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 {@Autowiredprivate 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-consumeruri: lb://sc-nacos-consumerpredicates:- Path=/consumer/**- id: sc-nacos-producturi: lb://sc-nacos-productpredicates:- 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-gatewayconfig:import: nacos:sc-nacos-gateway.ymlcloud:nacos:config:server-addr: 127.0.0.1:8848discovery:server-addr: 127.0.0.1:8848gateway:routes:- id: sc-nacos-consumeruri: lb://sc-nacos-consumerpredicates:- Path=/consumer/**filters:- StripPrefix=1- id: sc-nacos-producturi: lb://sc-nacos-productpredicates:- Path=/product/**filters:- StripPrefix=1
使用Postman等工具,从网关请求sc-nacos-consumer
服务接口,确认响应无误,如图所示: