soul源码阅读(五)Spring Cloud应用示例运行

目录

架构认识

了解Eureka

Eureka入门使用

启动Spring Cloud示例


架构认识

一个http请求到soul网关,soul网关请求转发到Spring Cloud。

Spring Cloud提供服务应用启动后会将配置和元数据写入到soul admin,同时将服务注册到注册中心Nacos,注册中心可以使用Eureka、Nacos都是可以的。

了解Eureka

本篇文章我们将使用Eureka 作为 Spring Cloud 应用注册中心,首先我们先来了解下它。

Eureka 是 Netflix 开源的注册中心组件,分成 Eureka Client 和 Eureka Server 两个角色。整体架构如下图所示:

  • Eureka-Server :通过 REST 协议暴露服务,提供应用服务的注册和发现的功能。
  • Application Server :应用服务提供者,内嵌 Eureka-Client ,通过它向 Eureka-Server 注册自身服务。
  • Application Client :应用服务消费者,内嵌 Eureka-Client ,通过它从 Eureka-Server 获取服务列表。

友情提示下:application server和application client其实本质一样,只是为了好分辨当前应用的角色,所以添加不同角色名称上去,但有时候应用在实际场景中就会同时扮演两种角色。

Eureka入门使用

  • 首先,需要使用 spring-cloud-netflix-eureka-server 依赖,来搭建一个 Eureka 注册中心
  • 然后,搭建一个服务提供者,注册服务到 Eureka 中。
  • 最后,搭建一个服务消费者,从 Eureka 获取到  服务的实例列表,选择其中一个示例,进行 HTTP 远程调用。

(1)注册中心服务介绍:

pom文件文件引入spring-cloud-starter-netflix-eureka-server,如下图所示:

配置如下,可以看到 register-with-eureka 和 fetch-registry 配置项为 false,那么什么意思呢?register-with-eureka: false代表不注册到 Eureka-Server,默认为 true;fetch-registry: false代表不从 Eureka-Server 获取注册表,默认为 true。默认服务url的defaultZone配置为http://localhost:8761/eureka

添加EnableEurekaServer注解,表示为server启动

(2)应用服务端介绍

pox.xml引入spring-cloud-starter-netflix-eureka-client包

soul配置连接我们admin的url:localhost:9095,eureka.client.serviceUrl.defaultZone配置我们刚刚的eureka的服务URL:http://localhost:8761/eureka/,server启动端口配置为8884

启动application,添加@EnableDiscoveryClient,开启 Spring Cloud 的注册发现功能

(3)soul网关发现服务配置如下,引入client包和serverUrl的配置即可:

启动Spring Cloud示例

(1)启动EurekaServerApplication,运行结果如下:

访问localhost:8761,可以访问它的控制台,可以看到一些系统基本信息和注册的基本信息。

(2)启动SoulTestSpringCloudApplication,查看日志服务已正常注册到admin,并连接上eureka注册中心

(3)启动网关,run SoulBootstrapApplication,查看服务启动正常

(4)rest client发送http请求测试,没有请求成功哈,截图错误信息如下:

别慌,问题来了,咱们就不妨根据错误信息,解读下源码,做下错误问题的定位,首先根据Can not find selector, please check your configuration做下全文搜索,看下源码位置先,debug看下,进入到该方法后,识别到pluginName为divide,if条件判断匹配成功后,就抛出错误了

再往上看这段代码被谁调用了,做了什么事情?往回两层,我们看到入口如下图所示,再debug看下

发现以下代码段没有获取到值,导致抛异常了

继续,一层一层往里跟,发现org.dromara.soul.plugin.base.condition.judge.MatchOperatorJudge#judge方法一直匹配不成功,查看传进来的参数是我们请求的url和divide插件的/http/**匹配不上导致,那么为什么和divide插件匹配不上后就直接返回{"code":-107,"message":"Can not find selector, please check your configuration!","data":null},不应该是跳过,然后匹配spring cloud插件吗?由于时间问题,今天先留这么个疑问在,我们明天继续。