SpringCloud Alibaba服务调用源码调试环境搭建
@[toc]
# 写在文章开头
近期因为个人需要,所以基于Spring Cloud Alibaba完成nacos服务提供者和服务消费者的源码搭建,遂以此文记录一下笔者的搭建过程,希望对你有帮助。
我是 SharkChili ,Java 开发者,Java Guide 开源项目维护者。欢迎关注我的公众号:写代码的SharkChili,也欢迎您了解我的开源项目 mini-redis:https://github.com/shark-ctrl/mini-redis (opens new window)。
为方便与读者交流,现已创建读者群。关注上方公众号获取我的联系方式,添加时备注加群即可加入。
# Spring Cloud Alibaba前置配置步骤
# 拉取指定版本
首先到GitHub上拉取指定版本的源码,以笔者为例需要下载2021.0.5.0版本,所以对应的指令就如下所示:
git clone --branch 2021.0.5.0 https://github.com/alibaba/spring-cloud-alibaba
等待克隆完成后我们就可以得到所需的版本:

# 配置并编译
在完成必要的maven和jdk配置之后,我们需要删除父pom文件中check-style插件,避免后续进行代码注释等导致格式检查报错导致项目无法启动的问题:

完成上述操作后点击编译等待SCA完成必要的代码生成和代码编译:

等待片刻后,如果输出显示成功,则说明我们的前置项目初始化工作完成了,后续就可以开始基于该项目添加服务生产者和消费者完成源码级的调试了:

# 服务提供者搭建
# 调测架构说明
本质上nacos是作为服务注册中心和服务配置中心,本系列文章将会针对服务注册和服务配置的工作原理展开探讨,所以我们需要搭建一套具备如下条件的调测环境:
- 一个单机模式的
nacos作为服务注册中心和配置中心(本系列更多强调是服务注册中心)。 - 两个服务提供者
nacos-provider分别对应9001和9002端口提供负载均衡的服务调用。 - 一个服务消费者
nacos-consumer对应8080端口通过nacos感知nacos-provider信息发起服务调用。
对应的逻辑架构图如下所示:

# 基于源码环境创建nacos-provider子模块
首先基于该项目创建一个nacos-provider子模块,然后注明必要的外部版本信息,以笔者为例,项目中需要用到spring boot和Lombok等基础依赖,所以就在properties注明这些配置版本方便复用:
<artifactId>nacos-provider</artifactId>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<lombok.version>1.18.30</lombok.version>
<spring-boot.version>2.7.6</spring-boot.version>
</properties>
2
3
4
5
6
7
8
# 引入核心依赖配置
如下图所示,SCA通过reversion等信息配置当前项目的版本号,所以在引入源码包中的组件时,我们也可以使用这个标签控制版本信息:

于是笔者的服务注册中心和配置中心的版本配置就如下所示可以看到笔者的配置有如下处理:
- 使用
spring loadbalancer作为负载均衡器,弃用已停止维护的ribbon。 nacos作为服务注册和配置中心。openfeign作为服务调用。
<!-- nacos服务注册 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<!-- 使用spring loadbalancer作为负载均衡器,弃用ribbon -->
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
<version>${revision}</version>
</dependency>
<!-- nacos配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--No spring.config.import set-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.1.5</version>
</dependency>
<!--负载均衡器 替换ribbon使用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
<version>3.1.5</version>
</dependency>
<!-- 服务调用 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>3.1.5</version>
</dependency>
<!--lombok 考虑弄成provided-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<!--工具类-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.24</version>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
<version>10.10.1</version>
</dependency>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# 启用服务发现
对应的我们在服务提供者的启动类上注明EnableDiscoveryClient开启服务发现:
@SpringBootApplication
@EnableDiscoveryClient//启用服务发现
public class NacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
}
}
2
3
4
5
6
7
8
9
# 指明注册中心
随后我们在application.properties然指明服务名称为nacos-provider,并通过spring.cloud.nacos.discovery.server-addr
# 指定服务名称为
spring.application.name=nacos-provider
# 指定nacos地址用于服务注册和服务发现
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
2
3
4
5
# 编写测试接口
作为服务提供者,我们可以先写一个简单的测试接口provide,返回当前服务提供者的服务名和端口号,便于服务消费者观测当前调用到哪个服务上:
@Autowired
private Environment env;
@GetMapping("/provide")
public String provide() {
Map<String, String> map = new HashMap<>();
//服务名称
map.put("provider", env.getProperty("spring.application.name"));
//服务端口号,用于后续调用时查看结果使用
map.put("port", env.getProperty("server.port"));
return JSONUtil.toJsonStr(map);
}
2
3
4
5
6
7
8
9
10
11
12
13
# 基于不同端口号启动服务提供者
完成基本服务配置之后,我们就要通过不同端口启动服务提供者,首先点击services启动服务配置项:

然后点击add service添加服务:

然后我们通过JVM参数-Dserver.port=9001指明服务1的端口号为9001:

完成后将服务启动键入curl 127.0.0.1:9001/provide进行连通性测试,如果输出结果如下则说明服务提供者的接口是可用的:
{"provider":"nacos-provider","port":"9001"}
同理服务2配置为9002启动:

# 服务消费者环境搭建
# 开启服务发现和Feign客户端功能
完成这些配置之后,我们不妨创建一个项目作为服务消费者,依赖和服务提供者一致,这里就不多做赘述,这里我们给出服务消费者需要强调的配置:
- 在服务消费者上添加
@EnableDiscoveryClient开启服务发现。 - 添加
EnableFeignClients在服务启动过程中扫描@FeignClient注解类并为其生成动态代理。
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class NacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}
}
2
3
4
5
6
7
8
9
10
# 针对nacos-provider声明feign接口
然后我们就可以编写一个feign接口调用服务提供者的服务了:
@FeignClient(name = "nacos-provider")//告知调用的服务名为nacos-provider
public interface NacosProvider {
/**
* 指明通过get请求调用/provide
* @return
*/
@GetMapping("/provide")
String provide();
}
2
3
4
5
6
7
8
9
10
11
# 测试接口
为了方便测试这里我们直接,我们直接创建一个test接口调用服务提供者的feign接口:
@RestController
public class TestController {
@Resource
private NacosProvider nacosProvider;
@GetMapping("/test")
public String test() {
//发起对服务提供者的远程调用
return nacosProvider.provide();
}
}
2
3
4
5
6
7
8
9
10
11
12
# 启动测试
此时我们就可以直接将4个服务启动,它们分别是:
- 服务注册中心
nacos - 两个服务提供者
nacos-provider分别对应9001和9002端口。 - 一个服务消费者
nacos-consumer采用默认的8080端口。
完成启动后,我们调用消费者的接口地址即127.0.0.1:8080/test,可以看到服务成功完成调用:

然后进行两次调用,可以发现服务消费者调用了不同的nacos-provider,自此我们的调测环境搭建完成:
C:\Users\sharkchili>curl 127.0.0.1:8080/test
{"provider":"nacos-provider","port":"9002"}
C:\Users\sharkchili>curl 127.0.0.1:8080/test
{"provider":"nacos-provider","port":"9001"}
2
3
4
5
# 小结
本文基于Spring Cloud Alibaba源码搭建一套可以本地自测的服务调用环境,方便读者进行后续一些服务调用细节源码的理解和调测,希望对你有帮助。
我是 SharkChili ,Java 开发者,Java Guide 开源项目维护者。欢迎关注我的公众号:写代码的SharkChili,也欢迎您了解我的开源项目 mini-redis:https://github.com/shark-ctrl/mini-redis (opens new window)。
为方便与读者交流,现已创建读者群。关注上方公众号获取我的联系方式,添加时备注加群即可加入。
# 参考
nacos源码分析-环境搭建 :https://blog.csdn.net/weixin_41314389/article/details/143571552 (opens new window)
如何使用nacos服务注册和发现 :https://www.cnblogs.com/zhumengke/articles/11845468.html (opens new window)
解决通过@FeignClient自动注入service失败的问题:https://blog.csdn.net/pk694046220/article/details/105060307 (opens new window)
idea实现同时启动两个相同服务但不同端口的项目,全图解:https://blog.csdn.net/qq_57581439/article/details/130037264 (opens new window)
checkstyle maven 插件使用 :https://blog.csdn.net/qq_34595352/article/details/117363833 (opens new window)