上一篇文章中我们给每个微服务都创建了一个DefaultInterceptor,如果这个默认拦截器的功能是相同的话,那我们需要每一个新服务都加一个默认拦截器吗?

答案是:No!

我们完全可以将这些相同的功能代码抽象成更高层级的通用模块,由每个服务依赖他们。

在工程根目录下创建common模块。如下图所示,截至目前,我们一共创建了eureka、gateway、microservices下的service1和service2,以及common共6个模块。

Spring Cloud 8: 依赖公共模块_spring cloud

接下来我们把拦截器迁移到公共模块中。

common build.gradle

version = '1.0-SNAPSHOT'

dependencies {
    compileOnly 'org.springframework.boot:spring-boot-starter-web'
}

在相同位置建目录,拷贝对应文件,并更改依赖路径。

Spring Cloud 8: 依赖公共模块_gradle_02

注意:common是公共模块,不需要入口类CommonApplication。

在microservices的build.gradle中引入common模块,注意,不是service1也不是service2,而是与eureka和gateway同级的microservices。

Spring Cloud 8: 依赖公共模块_spring cloud_03

引入成功后,在service1和service2的依赖列表中能看到project common的依赖。

Spring Cloud 8: 依赖公共模块_gradle_04

最后不要忘了,如果要使用common中的配置或者bean,则我们需要告诉spring去扫描指定的包,需要用到@ComponentScan注解,加到启动类上,两个service都要加。

原本不需要加是因为spring默认扫描application类所在目录,所以我们要加上common中的路径像这样:

@ComponentScan(basePackages = {"com.hao1st.service2", "com.hao1st.common"})

把它加到启动类上,像这样:

@ComponentScan(basePackages = {"com.hao1st.service2", "com.hao1st.common"})
@EnableFeignClients
@SpringBootApplication
public class Service2Application {

    public static void main(String[] args) {
       SpringApplication.run(Service2Application.class, args);
    }

}

这些都做好后,我们把service1和service2的WebConfig和DefaultInterceptor删掉,然后注释掉common中WebConfig的@Configuration注解,让拦截器失效,看一下feign的效果。

Spring Cloud 8: 依赖公共模块_spring cloud_05

第一次访问localhost:9001/SERVICE1/rpc/invoke 的结果:

Spring Cloud 8: 依赖公共模块_gradle_06

第二次访问的结果:

Spring Cloud 8: 依赖公共模块_gradle_07

第三次访问的结果

Spring Cloud 8: 依赖公共模块_spring cloud_08

每次sessionId都不一样,证明没存住。

接下来我们把服务停掉,把redis缓存清掉,把WebConfig的@Configuration打开,再看效果。

第一次访问

Spring Cloud 8: 依赖公共模块_spring cloud_09

第二次访问

Spring Cloud 8: 依赖公共模块_spring cloud_10

第三次访问实际上sessionid已经不变了,不过为了截图上能看到效果,我们访问service2的rpc:

Spring Cloud 8: 依赖公共模块_spring cloud_11