分布式项目把所有的模块都拆分成了独立的项目,分为业务层、服务层。
而业务层和服务层没有在一个项目中,无法直接连接,而其他的项目可以项目依赖,直接导入依赖即可,这就出现了一个问题,业务层访问service层时,因为没有相互依赖,找不到对应的类,这是我们就需要使用Dubbo作为中间件。
首先在服务层配置dubbo,把service实现类和interface绑定一起,放入dubbo设置好的广播中,而web访问时,也需要配置dubbo,通过interface,获取广播中的实现类对象,并取一个id名,这个id要和web层引入的service的接口名保持一致,就可以获取到了
com.alibaba
dubbo
${dubbo-version}
org.springframework
spring
dubbo默认依赖spring,会与我们导入的spring依赖产生冲突,所以需要排除掉。
package com.ceh.back.service;
public interface TestService {
/**
* 测试dubbo
* @return
*/
String getNow();
}
在搭建项目结构时,需要把接口单独的提出来,形成单独的项目,dubbo官网中提出希望这样做,因为不管是web层还是服务层,都需要通过这个接口来绑定。
@Service
public class TestServiceImpl implements TestService {
@Autowired
private TestDao testDao;
@Override
public String getNow() {
Date date = testDao.getNow();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String now = sdf.format(date);
return now;
}
}
最后一行配置,就是把服务层实现类和接口绑定一起,放入dubbo中,注册,这样dubbo就存在了这个服务。
@RestController
public class TestController {
@Autowired
private TestService testService;
@RequestMapping("/getNow")
public String getNow(){
String now = testService.getNow();
return now;
}
}
在使用@Autowired注解的时候,因为service和web分开了,导致这个地方注入不进去,就需要使用dubbo。
springmvc.xml文件配置
做种通过最后一行配置,把dubbo中存在的服务,赋值给id,此时id要和web层引入service接口名保持一致,这是web就接收到了服务层对象。
在applicationContext-service.xml和springmvc.xml文件配置dubbo时,因为没有头文件,会报错,idea可以直接生成对应的头文件,但是如果只声明了xmlns:dubbo=“http://code.alibabatech.com/schema/dubbo”
就会出现“找不到dubbo:application的声明”的错误,从新删掉上面的头文件,再从新生成,看看是否最后会出现这样http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd,的声明文件,声明出来报错解决。(不知道为什么idea第一次不会自动的生成下面的地址)
applicationContext-service.xml
springmvc.xml