Dubbo初次使用
分布式项目把所有的模块都拆分成了独立的项目,分为业务层、服务层。
而业务层和服务层没有在一个项目中,无法直接连接,而其他的项目可以项目依赖,直接导入依赖即可,这就出现了一个问题,业务层访问service层时,因为没有相互依赖,找不到对应的类,这是我们就需要使用Dubbo作为中间件。
自己理解:
首先在服务层配置dubbo,把service实现类和interface绑定一起,放入dubbo设置好的广播中,而web访问时,也需要配置dubbo,通过interface,获取广播中的实现类对象,并取一个id名,这个id要和web层引入的service的接口名保持一致,就可以获取到了
使用步骤
1.导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo-version}</version>
<!--dubbo默认依赖spring2.5.6,有依赖冲突-->
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
dubbo默认依赖spring,会与我们导入的spring依赖产生冲突,所以需要排除掉。
2.配置服务层接口
package com.ceh.back.service;
public interface TestService {
/**
* 测试dubbo
* @return
*/
String getNow();
}
在搭建项目结构时,需要把接口单独的提出来,形成单独的项目,dubbo官网中提出希望这样做,因为不管是web层还是服务层,都需要通过这个接口来绑定。
3.声明服务(service实现类)
@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;
}
}
4.配置服务到dubbo
<!--配置dubbo:广播的形式(把所有的服务全部暴露在一个地方,需要使用服务就去这里找)-->
<!--配置服务方名称(随便写,但是要保持唯一)-->
<dubbo:application name="taotao-back-service"/>
<!--广播的地址,所有的服务会暴露在这里-->
<dubbo:registry address="multicast://224.5.6.7:1234"/>
<!--dubbo的端口号-->
<dubbo:protocol name="dubbo" port="20880"/>
<!--配置服务的提供方(service的实现类,已经使用了注解,就不需要再声明了)-->
<!--<bean id="demoService" class="org.apache.dubbo.demo.provider.DemoServiceImpl"/>-->
<!--注册服务
interface:注册的接口,因为web层也引入了interface的依赖,这里直接声明,web就可以直接注入
ref:引入你服务的类(service的实现类)-->
<dubbo:service interface="com.ceh.back.service.TestService" ref="testServiceImpl"/>
最后一行配置,就是把服务层实现类和接口绑定一起,放入dubbo中,注册,这样dubbo就存在了这个服务。
5.配置web层
@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-->
<!--配置消费方名称(随便写,但唯一)-->
<dubbo:application name="taotao-back-web"/>
<!--广播服务存放地址-->
<dubbo:registry address="multicast://224.5.6.7:1234"/>
<!--消费
id:对应web引入service服务的名称(autowired)
interface:你在web层需要引入的接口
这样dubbo就会把广播中对应的接口实现类给消费者-->
<dubbo:reference id="testService" interface="com.ceh.back.service.TestService"/>
做种通过最后一行配置,把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
<!--配置dubbo:广播的形式(把所有的服务全部暴露在一个地方,需要使用服务就去这里找)-->
<!--配置服务方名称(随便写,但是要保持唯一)-->
<dubbo:application name="taotao-back-service"/>
<!--dubbo的端口号-->
<dubbo:registry address="N/A"/>
<dubbo:protocol name="dubbo" port="20880"/>
<!--注册服务
interface:注册的接口,因为web层也引入了interface的依赖,这里直接声明,web就可以直接注入
ref:引入你服务的类(service的实现类)-->
<dubbo:service interface="com.ceh.back.service.TestService" ref="testServiceImpl"/>
springmvc.xml
<!--配置dubbo-->
<!--配置消费方名称(随便写,但唯一)-->
<dubbo:application name="taotao-back-web"/>
<!--消费
id:对应web引入service服务的名称(autowired)
interface:你在web层需要引入的接口
这样dubbo就会把广播中对应的接口实现类给消费者-->
<dubbo:reference url="dubbo://127.0.0.1:20880" id="testService" interface="com.ceh.back.service.TestService"/>