在公司闲暇时间把公司的项目拆分,准备尝试用dubbo的拆分方式来:让controller层做消费者,service层大包为jar添加依赖,实现和数据库层做生产者,eureka做服务注册,其他的rcsssCloud-security、rcsssCloud-utils、rcsssCloud-model、rcsssCloud-config、打包为jar作为服务依赖。
经过一天的拆分过后,生产者能够正常的启动,但是消费者,@autowired注解的接口怎么都注入不进来,生产者能起动,为什么消费者不行?
后来想了想,在spring mvc 的配置文件里面有这个配置 就是扫描包下的注解用的
<!-- 扫描该路径所有注解 -->
<context:component-scan base-package="com.ambition.rcp" /> 在看看spring boot 的yml配置文件中没有这种配置,spring boot 其实是扫描“application”所在包及其子包,
生产者里面是有service、dao这些组件的所以能够扫描到,而消费者是只有controller,而接口都是被打成jar包依赖过来的,为了让spring boot能够注入例如这样配置的
@Autowired
private EhCacheService ehCacheService;
需要手动添加 @ComponentScan(basePackages = { "com.ambition.rcsss.service" })
@SpringBootApplication
@EnableDiscoveryClient
@ComponentScan(basePackages = { "com.ambition.rcsss.service" })
public class ApplicationClient extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(ApplicationClient.class);
}
public static void main(String[] args) {
SpringApplication.run(ApplicationClient.class, args);
}
然后启动项目,解决了
拆分过后,发现spring cloud不像dubbo那样把service接口暴露到zookeeper中,提供给消费者,而是每个子项目都是独立的项目,通过restful api调用,所有上面说的让controller层做消费者是有问题的,每一个应用应该能完成一个独立的功能。
这次拆分让我明白,动手才会发现问题。