上一篇文章中我们给每个微服务都创建了一个DefaultInterceptor,如果这个默认拦截器的功能是相同的话,那我们需要每一个新服务都加一个默认拦截器吗?
答案是:No!
我们完全可以将这些相同的功能代码抽象成更高层级的通用模块,由每个服务依赖他们。
在工程根目录下创建common模块。如下图所示,截至目前,我们一共创建了eureka、gateway、microservices下的service1和service2,以及common共6个模块。
接下来我们把拦截器迁移到公共模块中。
common build.gradle
version = '1.0-SNAPSHOT'
dependencies {
compileOnly 'org.springframework.boot:spring-boot-starter-web'
}
在相同位置建目录,拷贝对应文件,并更改依赖路径。
注意:common是公共模块,不需要入口类CommonApplication。
在microservices的build.gradle中引入common模块,注意,不是service1也不是service2,而是与eureka和gateway同级的microservices。
引入成功后,在service1和service2的依赖列表中能看到project common的依赖。
最后不要忘了,如果要使用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的效果。
第一次访问localhost:9001/SERVICE1/rpc/invoke 的结果:
第二次访问的结果:
第三次访问的结果
每次sessionId都不一样,证明没存住。
接下来我们把服务停掉,把redis缓存清掉,把WebConfig的@Configuration打开,再看效果。
第一次访问
第二次访问
第三次访问实际上sessionid已经不变了,不过为了截图上能看到效果,我们访问service2的rpc: