使用Dubbo分布式框架,结合SpringBoot框架+Zookeeper,实现生产者消费者的maven父子级结构项目。
1.首先创建maven项目,删除src文件夹
2.pom.xml文件中加入标签,声明打包类型,管理项目依赖关系,不作为项目使用
<packaging>pom</packaging>
3.创建dubbo生产者,选择Spring Init...
选择你要的服务,我选择自己的MySql数据库
4.shop_my项目pom.xml文件引入依赖关系,父项目和子项目产生关系
<modules>
<module>dubbo_provider</module>
</modules>
5.provider项目pom.xml引入核心jar包
<!--zookeeper 包-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!--dubbo 和 springboot 整合包-->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
6.provider创建包结构,生产者不需要controller层,实体Bean需要序列化,并且@Service注意导阿里巴巴的包
7.service层写一个根据id查询信息的方法连接数据库创建mapper.xml写入Sql查询
/**
* 根据Id查询图书信息
* @param id
* @return
*/
BookBean queryBookById(Integer id);
serviceImpl层
package com.jk.service;
import com.alibaba.dubbo.config.annotation.Service;
import com.jk.mapper.BookMapper;
import com.jk.model.BookBean;
import org.springframework.beans.factory.annotation.Autowired;
@Service(interfaceClass = BookService.class) //导alibaba的包,对外开放dubbo接口
@Component //替代原有service注解 注入Service bean 防止与dubbo的@Service注解冲突
public class BookServiceImpl implements BookService{
@Autowired
private BookMapper bookMapper;
@Override
public BookBean queryBookById(Integer id) {
return bookMapper.queryBookById(id);
}
}
mapper层
BookBean queryBookById(Integer id);
xml sql:
<!--根据id查询图书信息-->
<select id="queryBookById" parameterType="int" resultType="com.jk.model.BookBean">
select id,name,anthor,context from a_book where id = #{value}
</select>
8.application.properties配置需要配置
#配置dubbo服务提供者
#服务名称 服务名称不能重复 用来标明不同的业务模块
spring.dubbo.application.name=bookprovider
#是否为服务提供端
spring.dubbo.server=true
#注册中心地址 zookeeper默认端口号
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
#dubbo 协议 dubbo的使用协议 默认 dubbo协议
spring.dubbo.protocol.name=dubbo
#dubbo接口端口号 默认20880 同一台电脑端口号不能重复
spring.dubbo.protocol.port=20880
# server.servlet.application-display-name=
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/math?serverTimezone=Hongkong&useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=root
#设置页面编码为UTF-8
spring.thymeleaf.encoding=UTF-8
#设置转换格式为HTML格式
spring.thymeleaf.servlet.content-type=text/html
mybatis.mapper-locations=classpath:mapper/*.xml
9.DubboProviderApplication配置类需要启动dubbo注解
@SpringBootApplication
@EnableDubboConfiguration//启用dubbo注解
@MapperScan("com.jk.mapper") //扫描mapper层
public class DubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProviderApplication.class, args);
}
}
10.启动zookeeper
11.启动项目,启动成功如下图
方法名已经打印出来了
12.在shop_my下新建消费者项目,dubbo_consumer
13.同样pom.xml文件引入核心jar包
<!--zookeeper 包-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!--dubbo 和 springboot 整合包-->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
14.shop_my项目下pom.xml文件下加入依赖
<modules>
<module>dubbo_provider</module>
<module>dubbo_consumer</module>
</modules>
15.在consumer项目下的application配置类配置
server.port=8082
#配置dubbo服务提供者
#服务名称 服务名称不能重复 用来标明不同的业务模块
spring.dubbo.application.name=bookconsumer
#注册中心地址 zookeeper默认端口号
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
#消费者启动检测生产者是否已启动,当值为true时才会检测,默认为true
spring.dubbo.consumer.check=false
#roundrobin轮询机制
#random #随机机制
#leastactive #最少活跃调用数机制 dubbo负载均衡策略
spring.dubbo.reference.loadbalance=roundrobin
16.创建包结构
17.与生产者不同的是,多一个controller层来调用接口
controller层,注意注入注解!阿里巴巴包
package com.jk.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.jk.model.BookBean;
import com.jk.service.BookService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("book")
public class BookController {
@Reference
private BookService bookService;
@RequestMapping("queryBookById")
@ResponseBody
public BookBean queryBookById(Integer id){
return bookService.queryBookById(id);
}
}
17.实体bean和生产者的实体bean一致,注意都需要序列化!
18.创建service接口与生产者一致,注意!没有实现类
19.同样的在消费者项目的DubboConsumerApplication配置类同样加入@EnableDubboConfiguration//启用dubbo注解
@SpringBootApplication
@EnableDubboConfiguration//启用dubbo注解
public class DubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboConsumerApplication.class, args);
}
}
完成接口调用!
20.启动消费者项目,浏览器访问方法
访问成功!
我的Mysql数据库
Dubbo分布式框架,结合SpringBoot框架,实现生产者消费者的maven父子级结构项目搭建完成