前言
记录下Nacos 的整合过程
环境
Win 10 + Spring Cloud 2020.0.1 + Spring Cloud Alibaba 2021.1 + Nacos 2.0.0
Nacos是什么?
Nacos 是一个服务发现组件,也是一个配置服务器,Nacos 解决的两个问题:
1、服务A怎么找到服务B
2、管理微服务的配置
服务发现原理
-
服务发现机制 服务发现机制就是服务消费者总能找到服务提供者的机制,举个例子:服务发现就像手机中的名片夹,记录一个人所有的联系方式,通过该名片可以联系到某个人,而当某个联系方式不存在时(服务DOWN)就将其从名片夹中删除。 -
用于生产的服务发现机制: 1、在微服务上做缓存,定时任务发送当前的地址,调用时取缓存中微服务的地址,该做法好处首先是压力小,不用每次都去实时取,其次是即使服务发现组件崩溃也可以取到缓存中的值,只是无法更新缓存中的值。 2、每个微服务实例都向服务发现组件发送心跳(即一次请求),告诉服务发现组件自己是活着的,如果服务发现组件发现某一个实例长时间未向自己发送心跳,即认为该实例已挂,将其健康状态标记为DOWN ,服务消费者即不再调用该实例。
搭建 Nacos Server
Nacos Server 下载地址
https://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
startup.cmd -m standalone
- 访问
http://localhost:8848/nacos/#/login (默认端口是8848)
... Nacos Server 搭建完毕
Nacos Client 注册
user-center 用户中心微服务注册
<?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>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>
spring:
application:
# 服务名称
name: user-center
cloud:
nacos:
discovery:
# 指定nacos server的地址
server-addr: localhost:8848
content-center 内容中心微服务注册
pom.xml 依赖同上application.yml
spring:
application:
# 服务名称
name: content-center
cloud:
nacos:
discovery:
# 指定nacos server的地址
server-addr: localhost:8848
服务发现测试
@RestController
public class TestController {
@Autowired
private DiscoveryClient discoveryClient;
/**
* 测试:服务发现,证明内容中心总能找到用户中心
* @return 用户中心所有实例的地址信息
*/
@GetMapping("test")
public List<ServiceInstance> getInstances() {
// 查询指定服务的所有实例的信息
return discoveryClient.getInstances("user-center");
}
}
- 如下所示,内容中心可以获取到用户中心所有实例的地址信息
测试用例
内容中心调用用户中心的实例
user-center
@RestController
public class TestController {
@GetMapping("/test/{name}")
public String test(@PathVariable String name) {
return "hello " + name;
}
}
content-center
@RestController
@Slf4j
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class TestController {
private final DiscoveryClient discoveryClient;
private final RestTemplate restTemplate;
@GetMapping("test1")
public String test1() {
// 用户中心所有实例信息
List<ServiceInstance> instances = discoveryClient.getInstances("user-center");
String targetUrl = instances.stream()
.map(instance -> instance.getUri().toString() + "/test/{name}")
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("当前没有实例"));
log.info("目标地址:{}", targetUrl);
// 调用用户微服务获取用户信息
return restTemplate.getForObject(
targetUrl,
String.class,
"Coisini"
);
}
}
测试结果
- End -
﹀
﹀
﹀
白嫖有风险
点赞加收藏
|