在springBoot下的dubbo框架理解
首先,dubbo是一个微服务框架(RPC),RPC是指远程调用。
在项目A中调用项目B的方法,使用dubbo可以实现两个不同项目之间(或者部署在不同服务器上的两个项目)的方法调用
给微服务Docker打下基础,实现一个服务器中不同区域间的调用
生产者和消费者概念:
例如两个不同的项目A和B,可以使用dubbo去实现A项目调用B项目方法,此时,A项目就是消费者,B项目就是生产者,可以理解为B项目 ‘生产’ 方法,A项目去 ‘消费’ B项目的方法
注册中心:
注册中心是实现项目间互相调用的核心,它的作用是什么呢
同上例子,B项目作为生产者会将自己 ‘生产’ 的方法存入注册中心,换句话也就是将需要给消费者提供的方法放在注册中心,这样当消费者需要 ‘消费’ 时会去注册中心找生产者 ‘生产’ 的方法,从而实现调用,大致就是这么一个概念
在项目中实现dubbo的步骤:
一,pom文件导入dubbo的jar包
<!--dubbo设置,服务提供者-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<!---->
二,配置生产者项目B,application.yml文件中添加配置
1.同上例子,在生产者B项目中的application.yml文件配置如下
dubbo:
application:
name: boot-user #生产者项目名
registry:
protocol: zookeeper #注册中心类型
address: 127.0.0.1:2181 #注册中心地址
scan:
base-package: com.bdqn.serviceImpl #扫描dubbo注解
protocol:
name: dubbo #协议
port: 20883 #端口号
2.在项目启动类中添加dubbo的 @EnableDubbo注解
/**
* 项目启动类
*/
@SpringBootApplication
@MapperScan("com.bdqn.dao")
@EnableDubbo //dubbo
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class,args);
}
}
3.此时B项目已经为生产者,接下来就用 alibaba(阿里巴巴) 的 @Service注解 将需要给消费者提供的接口或类存入注册中心
//导包不是原来ssm框架的spring jar包
import com.alibaba.dubbo.config.annotation.Service;
@Service //声明此实现类为生产者‘生产’的,可以供消费者调用
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public List<User> selAll() {
return userDao.selAll();
}
}
生产者项目B基本完事,接下来是消费者项目A的配置
三,配置消费者项目A,application.yml文件中添加配置
1.与配置生产者大致相同,少了protocol
dubbo:
application:
name: boot-order #消费者项目名
registry:
protocol: zookeeper #注册中心类型
address: 127.0.0.1:2181 #注册中心地址
scan:
base-package: com.bdqn.serviceImpl #扫描dubbo注解
2.同上,在项目A的启动类中添加dubbo的 @EnableDubbo 注解
3.接下来是在项目A(消费者)的controller层实现调用项目B的方法
使用alibaba(阿里巴巴) 的 @Reference注解 实现在项目A的controller层中对项目B的service层实现类的实例化,接着通过对象调用项目B的方法
import com.alibaba.dubbo.config.annotation.Reference;
@RestController
public class OrderController {
@Autowired
private OrderService orderService;
//声明此实例化是去注册中心找生产者项目B ‘生产’ 的实现类,与上文中项目B配置@Service处对应
@Reference
private UserService userService; //项目B的实现类
//user方法实现了在项目A中对项目B的方法调用
@GetMapping("gtUser")
public Dto user(){
return DtoUtil.returnSuccessData(
userService.selAll() //调用了项目B中service层的selAll方法
);
}
}
四,启动注册中心zookeeper 下 bin目录中的 zkServer.cmd
注意,启动时黑窗口时报错说明JAVA_HOME环境变量没配置好,重新配置一下即可
运行项目,注意顺序应该是先运行注册中心,再运行生产者项目,后运行消费者项目,合乎逻辑,否则没有生产,何来消费,换句话说就是。想消费的话必须先有生产,但是生产了不一定消费。