soul源码学习(五)-springcloud示例

配置

  1. soul-admin需要开启springcloud插件
    在这里插入图片描述
  2. soul-bootstrap引入springcloud相关依赖
 <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>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>2.2.0.RELEASE</version>
        </dependency>
  1. 修改soul-boosrap配置文件(关键配置)
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true
  1. 修改soul-examples-springcloud配置文件(关键配置)
eureka:
  client:
    serviceUrl:
      defaultZone:  http://localhost:8761/eureka/
      
soul:
  springcloud:
    admin-url: http://localhost:9095
    context-path: /springcloud
  1. 在相应需要代理的类或方法加入soul注解
    在这里插入图片描述

  2. soul-examples-eureka配置文件保持不变

启动

  1. 启动soul-admin
  2. 启动soul-bootstrap
  3. 启动soul-examples-eureka
  4. 启动soul-examples-springcloud

访问

在这里插入图片描述

注意事项

  1. springcloud需要依赖注册中心eureka,如同dubbo与sofa依赖zookeeper一样,因此需要启动soul-examples-eureka
  2. 与sofa和dubbo不同是,sofa和dubbo的注册中心地址在soul-admin中插件中进行维护配置,而springcloud并没有,而是直接写在soul-bootstrap的相关配置配置文件中,如图
    在这里插入图片描述
    在这里插入图片描述
    springcloud以及sofa和dubbo都有自己的注册中心,正常情况下,当浏览器访问网关时,由网关去各自注册中心获取相关服务信息,网关代理访问相关服务并返回结果,流程基本一样,因此eureka的地址也可配置在插件中,目前尚不清楚为何没和dubbo一样都在soul-admin中的插件管理中进行配置

springcloud客户端注册源码分析

在soul-spring-boot-starter-client-springcloud包中,自动配置类SoulSpringCloudClientConfiguration有三个方法

  @Bean
    public SpringCloudClientBeanPostProcessor springCloudClientBeanPostProcessor(final SoulSpringCloudConfig soulSpringCloudConfig, final Environment env) {
        return new SpringCloudClientBeanPostProcessor(soulSpringCloudConfig, env);
    }
   @Bean
    public ContextRegisterListener contextRegisterListener(final SoulSpringCloudConfig soulSpringCloudConfig, final Environment env) {
        return new ContextRegisterListener(soulSpringCloudConfig, env);
    }
 @Bean
    @ConfigurationProperties(prefix = "soul.springcloud")
    public SoulSpringCloudConfig soulSpringCloudConfig() {
        return new SoulSpringCloudConfig();
    }

其中soulSpringCloudConfig 和springCloudClientBeanPostProcessor方法与上一篇中sofa客户端注册过程雷同,不在分析,目前着重分析下contextRegisterListener该方法的作用,跟踪进入到相关类:
@Slf4j
public class ContextRegisterListener implements ApplicationListener {

private final AtomicBoolean registered = new AtomicBoolean(false);
private final String url;
private final SoulSpringCloudConfig config;
private final Environment env;

public ContextRegisterListener(final SoulSpringCloudConfig config, final Environment env) {
    ValidateUtils.validate(config, env);
    this.config = config;
    this.env = env;
    this.url = config.getAdminUrl() + "/soul-client/springcloud-register";
}

@Override
public void onApplicationEvent(final ContextRefreshedEvent contextRefreshedEvent) {
    if (!registered.compareAndSet(false, true)) {//用来防止重复注册
        return;
    }
    if (config.isFull()) {//判断配置属性full是否为true 
        RegisterUtils.doRegister(buildJsonParams(), url, RpcTypeEnum.SPRING_CLOUD);
    }
}

private String buildJsonParams() {
    String contextPath = config.getContextPath();
    String appName = env.getProperty("spring.application.name");
    String path = contextPath + "/**"; //注册contextPath下的所有路径
    SpringCloudRegisterDTO registerDTO = SpringCloudRegisterDTO.builder()
            .context(contextPath)
            .appName(appName)
            .path(path)
            .rpcType(RpcTypeEnum.SPRING_CLOUD.getName())
            .enabled(true)
            .ruleName(path)
            .build();
    return OkHttpTools.getInstance().getGson().toJson(registerDTO);
}

}

在这里插入图片描述

可以看出contextRegisterListener的主要作用是在spring启动时,接收上下文刷新事件后,获取SoulSpringCloudConfig中full属性,如果为true的话,会自动注册contextPath下所有的url,也就是说开启了该属性,相关代理类或方法可以不用挨个添加soul的代理注解,一键全局生效

猜你喜欢

转载自blog.csdn.net/yilongzhetian/article/details/112855660