1月19日作业
预期目标
- 运行examples下面的springcloud服务
- 学习文档,结合springcloud插件,发起http请求soul网关,体验springcloud代理
- 记录心得并总结
SpringCloud服务的发现,注册以及调用
Demo
首先启动soul-admin和soul-bootstrap项目,然后在soul-admin控制台插件管理
里没有看到和springcloud相关的插件
查看soulBootStrap
控制台日志,发现和springcloud
相关plugin并没有被加载
查看SoulBootStrapApplication
项目的pom.xml
文件,默认springcloud
相关依赖被注释掉,引入这些依赖以及nacos
相关依赖
<dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-plugin-springcloud</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-commons</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<!--soul springCloud plugin start end-->
<!-- springCloud if you config register center is nacos please dependency this-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
同时在SoulBootStrapApplication
项目的application-local.yml
文件中添加nacos
相关配置
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
启动本地nacos
服务, 并重新启动soul-admin和soul-bootstrap项目,将看到springCloud
相关插件。在示例项目soul-examples-springcloud
的application.yml
中引入nacos相关配置并启动。此时在nacos
dashboard上看到示例项目已经注册成功。
同时在soul-admin
dashboard也可以看到springCloud
相关selector已经rule都已经注册成功
那么springcloud服务是如何被soul-admin注册和发现呢?和http, dubbo, sofa服务的注册发现机制类似,我们可以在示例项目中看到@SoulSpringCloudClient
注解,该注解可以让我们自定义的springcloud controller被soul-admin发现和注册,同时我们通过打断点查看frames
进行源码追踪,发现在SpringCloudClientBeanPostProcessor
类中postProcessAfterInitialization
方法:
通过jdk 反射拿到@SoulSpringCloudClient
注解的方法并将其post到soul-admin
对应的/soul-client/springcloud-register
endpoint上,即可实现soul-admin的发现并注册服务。
测试网关
我们以findById这个方法为例,发送http://localhost:9195/springcloud/order/findById?id=1
请求
得到响应
{
"userId": "1",
"userName": "hello world spring cloud findBy user"
}
# 总结
今天把springcloud相关服务调通,明天着重追踪一下源码,看一下springcloud是如何被调用的。