SpringCloudAlibaba – 整合 Nacos 实现服务注册与发现
- 2021 年 9 月 21 日
- 筆記
- nacos, SpringCloud, springcloudalibaba
前言
记录下Nacos
的整合过程
环境
Win 10 + Spring Cloud 2020.0.1 + Spring Cloud Alibaba 2021.1 + Nacos 2.0.0
Nacos是什么?
Nacos
是一个服务发现组件,也是一个配置服务器,Nacos
解决的两个问题:
1、服务A怎么找到服务B
2、管理微服务的配置
Nacos
官方文档://nacos.io/zh-cn/docs/what-is-nacos.htmlNacos
简易架构图
服务发现原理
-
服务发现机制
服务发现机制就是服务消费者总能找到服务提供者的机制,举个例子:服务发现就像手机中的名片夹,记录一个人所有的联系方式,通过该名片可以联系到某个人,而当某个联系方式不存在时(服务DOWN)就将其从名片夹中删除。 -
用于生产的服务发现机制:
1、在微服务上做缓存,定时任务发送当前的地址,调用时取缓存中微服务的地址,该做法好处首先是压力小,不用每次都去实时取,其次是即使服务发现组件崩溃也可以取到缓存中的值,只是无法更新缓存中的值。
2、每个微服务实例都向服务发现组件发送心跳(即一次请求),告诉服务发现组件自己是活着的,如果服务发现组件发现某一个实例长时间未向自己发送心跳,即认为该实例已挂,将其健康状态标记为DOWN
,服务消费者即不再调用该实例。
搭建 Nacos Server
Nacos Server 下载地址
//github.com/alibaba/nacos/releases
Nacos Server 的版本选择
Nacos Server
的版本选择参照标准在spring-cloud-alibaba-dependencies-xxx.pom
中有记录,如我的Spring Cloud Alibaba
的版本是2021.1
,其推荐的版本是1.4.1
(生产环境优先选择)
由于我这里是开发环境,我选择的版本是2.0.0
运行 Nacos Server
- 官方文档://nacos.io/zh-cn/docs/quick-start.html
- 解压缩下载好的
Nacos
压缩包 cmd
运行启动命令
startup.cmd -m standalone
- 访问
//localhost:8848/nacos/#/login
(默认端口是8848)
- 默认登录账号/密码:
nacos/nacos
… Nacos Server 搭建完毕
Nacos Client 注册
user-center 用户中心微服务注册
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="//maven.apache.org/POM/4.0.0" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //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>2.4.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.coisini</groupId>
<artifactId>user-center</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>user-center</name>
<description>user-center project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2020.0.1</spring-cloud.version>
<spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--spring-cloud-starter-{spring cloud子项目的名称}-[{模块名称}]-->
<!-- nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!-- 整合spring cloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 整合spring cloud alibaba -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</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>
application.yml
spring:
application:
# 服务名称
name: user-center
cloud:
nacos:
discovery:
# 指定nacos server的地址
server-addr: localhost:8848
- 启动项目
- 访问
Nacos
content-center 内容中心微服务注册
pom.xml
依赖同上application.yml
spring:
application:
# 服务名称
name: content-center
cloud:
nacos:
discovery:
# 指定nacos server的地址
server-addr: localhost:8848
- 访问
Nacos
服务发现测试
- 内容中心编写测试代码
@RestController
public class TestController {
@Autowired
private DiscoveryClient discoveryClient;
/**
* 测试:服务发现,证明内容中心总能找到用户中心
* @return 用户中心所有实例的地址信息
*/
@GetMapping("test")
public List<ServiceInstance> getInstances() {
// 查询指定服务的所有实例的信息
return discoveryClient.getInstances("user-center");
}
}
- 如下所示,内容中心可以获取到用户中心所有实例的地址信息
