SpringBoot项目如何整合Nacos注册中心框架
Nacos作为阿里开源的注册中心和配置中心框架,以其活跃的社区和超高的性能吸引了很多开发者和公司的青睐,笔者目前了解到的注册中心框架有Eureka、Consul、Nacos和ZK,这几种框架都各具特色,可根据公司业务和成本来具体选型。
版本依赖关系
首先来看一下,Spring Cloud、Spring Cloud Alibaba和Spring Boot版本的依赖关系,好选择合适的版本
Spring Cloud Version | Spring Cloud Alibaba Version | Spring Boot Version |
Spring Cloud Greenwich | 2.1.0.RELEASE | 2.1.X.RELEASE |
Spring Cloud Finchley | 2.0.0.RELEASE | 2.0.X.RELEASE |
Spring Cloud Edgware | 1.5.0.RELEASE | 1.5.X.RELEASE |
项目搭建
创建一个聚合工程,父pom文件如下:
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.ambition</groupId>
<artifactId>spring-cloud-alibaba</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<dependencyManagement>
<dependencies>
<!-- 整合Spring Boot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 整合Spring Cloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 整合Spring Cloud Alibaba -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
然后新建order和stock两个子模块,pom文件为:
<parent>
<artifactId>demo</artifactId>
<groupId>com.ambition</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>stock</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>stock</name>
<description>Demo project for Spring Boot</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Nacos Discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
接着在启动类上加上@EnableDiscoveryClient注解
@EnableDiscoveryClient
@SpringBootApplication
public class StockApplication {
public static void main(String[] args) {
SpringApplication.run(StockApplication.class, args);
}
}
最后修改application.yml配置文件:
server:
port: 8082
spring:
application:
name: stock
main:
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
# 注册地址,不需要写协议
server-addr: 127.0.0.1:8848
# 命名空间,不同命名空间之间不能调用,用于环境隔离
# 开发环境
# namespace: acd952e0-7c60-4c6b-9854-6daa22d12d4c
# 生产环境
# namespace: 534c904d-7f24-4086-acbd-daf628cb1446
# 分组,不同分组之间不能调用,用于微服务之间的隔离
group: DEFAULT_GROUP
# 集群名称【有 BJ 和 NJ】,不同集群之间可以调用,但是在设计负载均衡策略的时候要避免跨机房集群调用
# cluster-name: BJ
# 元数据,让配置更加灵活
metadata:
# 比如灰度发布时,可以跨集群调用,但是不能跨版本调用
version: v1
management:
# 加载 actuator 所有的端点(默认只加载 info / health)
endpoints:
web:
exposure:
include: "*"
endpoint:
# 允许关闭端点
shutdown:
enabled: true
# 总是显示检查详细信息
health:
show-details: always
整个项目结构如下:
本地启动了一个Nacos服务,然后访问Nacos的控制台页面,可以看到服务都注册上了:
在order项目验证stock已经注册到注册中心,并获取stock的服务信息:
@RestController
public class ServiceController {
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping(value = "/getServiceList")
public List<ServiceInstance> getServiceList() {
List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("stock");
return serviceInstanceList;
}
}
去浏览器上访问一下:
可以看到在order项目中能拉取到注册中心上stock服务的信息,同样在stock项目中也能拉取到order服务的信息。
接下来打算写Nacos的源码专题,先搭建一个源码的解析环境,Nacos的源码可以去同性社区上克隆或者或者下载(https://github.com/alibaba/nacos),导入IDEA后,console项目就是它的控制台中心,如果想运行的话需要在VM options中加入如下参数:
-Dnacos.standalone=true -Dnacos.home=/XXX/nacos/distribution
控制台需要解析distribution项目里面的文件参数,需要在启动参数中指定这个项目的路径