【Soul源码阅读】8. Spring Cloud 用户接入 Soul 网关流程解析

官网文档中有详细的接入流程,地址:https://dromara.org/zh-cn/docs/soul/user-springcloud.html

1.前置条件

2.引入网关对 Spring Cloud 的插件支持

2.1 公共依赖

在 soul-bootstrap 的 pom.xml 文件中,找到了被注释掉的3个依赖,打开注释:

<!--soul springCloud plugin start-->
<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-->

2.2 注册中心依赖及配置

以下两种配置,需要根据业务项目的实际情况选择。

2.2.1 Eureka 注册中心

引入 Eureka 注册中心的依赖:

<!-- springCloud if you config register center is eureka please dependency end-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    <version>2.2.0.RELEASE</version>
</dependency>

application-local.yml 文件中,把被注释的配置打开:

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true

 2.2.2 Nacos 注册中心

引入 Nacos 注册中心的依赖:

<!-- 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>

application-local.yml 文件中,把被注释的配置打开:

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

配置完成后,记得重启网关!

3.Spring Cloud 服务接入网关

这里以源码中的示例 soul-examples-eureka 和 soul-examples-springcloud 为例子。

其中 soul-examples-eureka 只是一个注册中心,只需要保证配置文件内容跟 soul-examples-springcloud 能够对应上即可。

3.1 maven 依赖

在业务系统中需要引入如下依赖(查看 soul-examples-springcloud 的 pom 文件中已经引入)

<dependency>
    <groupId>org.dromara</groupId>
    <artifactId>soul-spring-boot-starter-client-springcloud</artifactId>
    <version>${soul.version}</version>
</dependency>

3.2 yml 配置文件

soul:
  springcloud:
    admin-url: http://localhost:9095
    context-path: /springcloud
# adminUrl: 为你启动的soul-admin 项目的ip + 端口,注意要加http://
# contextPath: 为你的这个mvc项目在soul网关的路由前缀,这个你应该懂意思把? 比如/order ,/product 等等,网关会根据你的这个前缀来进行路由.
# full: 设置true 代表代理你的整个服务,false表示代理你其中某几个controller

这里配置的3个属性(full 字段没有配置,默认为 false),对应于 SoulSpringCloudConfig 这个 JavaBean。

@Data
public class SoulSpringCloudConfig {

    private String adminUrl;

    private String contextPath;

    /**
     * Set true means providing proxy for your entire service, or only a few controller.
     */
    private boolean full;
}

 这里联系前几天配置的不同协议,dubbo、sofa 是没有这个字段的(RPC 远程方法调用)。

只有 http 跟今天配置的 springcloud 有这个字段(使用 SpringMVC Controller 层暴露 http 请求)。

所以 full 字段才有意义,如果为 true,代表整个业务系统或微服务节点所有的 Controller 层暴露的接口,都被 soul 网关代理,方便了业务系统中如果有很多需要被代理的接口一个一个去增加注解的麻烦。

3.3 注解 @SoulSpringCloudClient

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface SoulSpringCloudClient {
    
    String path();
    
    String ruleName() default "";
    
    String desc() default "";
    
    String rpcType() default "springCloud";
    
    boolean enabled() default true;
}

通过找这个注解使用的地方,又找到了类似的代码,url 就是自动将 Spring Cloud 服务接口信息同步给 soul-admin 的注册地址。

// SpringCloudClientBeanPostProcessor.java
/**
 * Instantiates a new Soul client bean post processor.
 *
 * @param config the soul spring cloud config
 * @param env    the env
 */
public SpringCloudClientBeanPostProcessor(final SoulSpringCloudConfig config, final Environment env) {
    ValidateUtils.validate(config, env);
    this.config = config;
    this.env = env;
    this.url = config.getAdminUrl() + "/soul-client/springcloud-register";
    executorService = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
}

4.开启 Spring Cloud 插件

【Soul网关管理】【系统管理】【插件管理】【springCloud】【编辑】

5.启动项目

依次启动4个项目,正常启动后,如下图所示:

在 soul-examples-springcloud 控制台输出以下成功注册的日志(springCloud client register success):

2021-01-21 16:36:22.106  INFO 8348 --- [pool-1-thread-1] o.d.s.client.common.utils.RegisterUtils  : springCloud client register success: {"appName":"springCloud-test","context":"/springcloud","path":"/springcloud/order/save","pathDesc":"","rpcType":"springCloud","ruleName":"/springcloud/order/save","enabled":true} 
2021-01-21 16:36:22.136  INFO 8348 --- [pool-1-thread-1] o.d.s.client.common.utils.RegisterUtils  : springCloud client register success: {"appName":"springCloud-test","context":"/springcloud","path":"/springcloud/order/path/**","pathDesc":"","rpcType":"springCloud","ruleName":"/springcloud/order/path/**","enabled":true} 
2021-01-21 16:36:22.161  INFO 8348 --- [pool-1-thread-1] o.d.s.client.common.utils.RegisterUtils  : springCloud client register success: {"appName":"springCloud-test","context":"/springcloud","path":"/springcloud/order/path/**/name","pathDesc":"","rpcType":"springCloud","ruleName":"/springcloud/order/path/**/name","enabled":true} 
2021-01-21 16:36:22.182  INFO 8348 --- [pool-1-thread-1] o.d.s.client.common.utils.RegisterUtils  : springCloud client register success: {"appName":"springCloud-test","context":"/springcloud","path":"/springcloud/order/findById","pathDesc":"","rpcType":"springCloud","ruleName":"/springcloud/order/findById","enabled":true} 
2021-01-21 16:36:22.204  INFO 8348 --- [pool-1-thread-1] o.d.s.client.common.utils.RegisterUtils  : springCloud client register success: {"appName":"springCloud-test","context":"/springcloud","path":"/springcloud/test/**","pathDesc":"","rpcType":"springCloud","ruleName":"/springcloud/test/**","enabled":true} 

【Soul网关管理】【插件列表】【springCloud】

在 soul-admin web 页面可以看到 springCloud 接口注册进来了。

6.调用接口,测试

6.1有参 GET 方法

localhost:9195/springcloud/test/findByUserId?userId=95

6.2有参 POST 方法

localhost:9195/springcloud/test/save
{
    "userId": "95",
    "userName": "springcloud_name"
}

6.3多参 GET 方法

localhost:9195/springcloud/order/path/95/springcloud-name

猜你喜欢

转载自blog.csdn.net/hellboy0621/article/details/112958963
今日推荐