前言
Nacos 是一个用于动态服务发现、配置管理和服务管理的平台,尤其适用于微服务架构和云原生应用。它的核心功能主要包括服务发现与注册、配置管理以及动态 DNS 服务。
一,介绍
1.1 主要功能
服务发现与注册
Nacos 允许服务注册自身并在需要时进行发现。这对于微服务架构中的服务间通信至关重要。服务实例可以动态地添加和删除,Nacos 会实时更新服务列表,确保服务发现的高可用性。
配置管理
Nacos 提供了一个集中式的配置管理解决方案,可以动态地管理应用的配置项。通过 Nacos,开发者可以在运行时更新配置而无需重启应用。此外,Nacos 支持配置的版本管理和回滚,方便配置的变更和追踪。
动态 DNS 服务
Nacos 提供动态 DNS 服务,可以用于构建服务网格或其他基于 DNS 的负载均衡策略。它使服务发现变得更加灵活,适应性更强。
1.2 特性
易于集成:
Nacos 提供了丰富的 SDK 和 RESTful API,支持多种编程语言和框架,便于集成到现有系统中。
高可用性:
Nacos 支持集群部署,保证了服务注册、发现和配置管理的高可用性。
灵活的配置:
支持动态配置、版本管理和回滚,方便配置的管理和变更。
多种服务健康检查方式:Nacos 支持多种健康检查方式,确保服务的可用性和稳定性。
二,启动nacos
1.下载安装包
https://github.com/alibaba/nacos/releases
2.创建数据库脚本
修改conf目录下的nacos-mysql.sql文件
在脚本开头加上创建数据库的脚本,比如
DROP DATABASE IF EXISTS `nacos_config`;
CREATE DATABASE `nacos_config` DEFAULT character set utf8mb4;
SET names utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
USE `nacos_config`;
如下图
然后进入数据库运行该脚本
3.修改conf目录下的application.properties文件
确保能够连接到刚刚创建的数据库
4.修改bin目录下文件
右键编辑:bin/startup.cmd
把MODE=“cluster” 改为 MODE=“standalone”
(即将nacos的启动模式从集群模式改为单机模式,记得点保存),
然后双击startup.cmd
5.运行测试
访问:http://localhost:8848/nacos/
账号密码:nacos/nacos
三,注册中心体验
3.1 添加相关依赖
<properties>
<java.version>8</java.version>
<spring-cloud.version>2021.0.7</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.1</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
3.2 更改yaml文件配置
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
application:
name: skr-hello
3.3 启动器添加注册服务的注解
@SpringBootApplication
@EnableDiscoveryClient //实现服务的注册
public class StudyApplication {
public static void main(String[] args) {
SpringApplication.run(StudyApplication.class, args);
}
}
启动开关类,可以看到nacos中可以找寻到指定服务
四,OpenFeign服务调用(核心)
OpenFeign 是一个用于发起 RESTful Web 服务调用的声明式 HTTP 客户端。它允许你定义一个接口并使用注解进行标注,然后自动生成调用 REST API 所需的实现。Feign 不做任何请求处理,通过处理注解相关信息生成 Request,并对调用返回的数据进行解码,从而实现 简化 HTTP API 的开发
4.1 添加依赖
<properties>
<java.version>8</java.version>
<spring-cloud.version>2021.0.7</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.1</version>
</dependency>
</dependencies>
4.2 定义需要被远程调用的接口,即生产者
@FeignClient("skr-hello")
public interface provider {
@GetMapping("/api/hello/hi")
R hi();
}
4.3 定义暴漏出去的接口,即消费者
@RestController
public class CloudController {
//生产者
@GetMapping("/api/hello/hi")
public R hi() {
return new R(0, "OK", "来玩不?");
}
//消费者
@Resource
private Provider provider;
@GetMapping("/api/hello/hi1")
public R hi1() {
return provider.hi();
}
}
然后我们请求消费者接口,可以知道生产者接口被调用了。
原理即是:当我们请求/api/hello/hi1,会调用Provider.hi()接口,然后openfeign会根据注解,生成请求,去调用生产者接口
五,openFign参数问题
如果通过OpenFeign调用提供者的接口有参数,那么必须使用对应的注解,否则报错:
1.参数形式-键值对
必须使用@RequestParam(“名”)
2.参数形式-Json(对象、集合)
必须使用@RequestBody 配合post请求
示例代码:
@FeignClient(value = "lx-testprovider")
public interface TestProvider {
/**
* 远程调用时:
* 1.请求方式一样
* 2.请求路径一样
* 3.返回值一样
* 4.参数一样(request、response不用写)*/
@GetMapping("/server/test/t1")
R t1();
/**
* 接口有参数,而且参数格式为键值对
* 必须加注解:@RequestParam("名称") */
@GetMapping("/server/test/t2")
R t2(@RequestParam("name") String name);
@PostMapping("/server/test/t3")
public R t3(@RequestParam("num1") int num1,@RequestParam("num2") int num2);
/**
* 接口有参数:而且参数的格式为json
* 使用注解:@RequestBody*/
@PostMapping("/server/test/t4")
R t4(@RequestBody UserBo bo);
}
总结:通过nacos将需要被调用的服务注册:
1.yaml文件指定服务名称,以及服务地址
2.开关类开启注册nacos,从而将服务注册到nacos
被暴漏在外的消费者接口使用openFeign调用nacos上已经注册的服务
1.@FeignClient注解,指定服务名
2.@GetMapping(“/api/hello/hi”) 请求地址注解表明该服务的具体哪一个接口
3.要和实际的生产者接口参数保持一致:@RequestParam(“name”) name 以及@RequestBody