现在有一段代码再前台,后台系统中都存在,都需要这段代码,存在这种情况,我们可以选择将这段代码提取出来作为一个服务,让前台和后台系统作为消费者远程调用这段代码,提高了代码的复用性。
springboot集成dubbo
dubbo框架总结
因此我们需要使用dubbo,也就是rpc协议。
创建rpc系统项目
项目结构
第一步引入依赖
<!--dubbo 依赖-->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<!-- zkClient 依赖 -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
开启dubbo
使用@EnableDubbo
开启Dubbo
@EnableDubbo 是一个复合注解
他里面的@DubboComponentScan,同Component组件能力相同。
@EnableDubbo做了两件事,一个是初始化Dubbo核心组件,加载Dubbo配置到内存。另一个是注册BeanPostProcessor,用来扫描@Service和@Reference注解。
创建yml配置文件
server:
port: 9092 # 项目访问端口,默认 8080
servlet: # 项目访问路径,默认 /
context-path: /shop-rpc
# Spring
spring:
# 数据源
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/shop?
username: root
password: 123123
# 指定 druid 连接池以及 druid 连接池配置
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 1 # 初始连接数
max-active: 20 # 最大连接数
max-idle: 20 # 最大空闲
min-idle: 1 # 最小空闲
max-wait: 60000 # 最长等待时间
# redis 缓存
redis:
timeout: 10000 # 连接超时时间
host: 192.168.186.128 # Redis服务器地址
port: 6379 # Redis服务器端口
database: 0 # 选择哪个库,默认0库
lettuce:
pool:
max-active: 1024 # 最大连接数,默认 8
max-wait: 10000 # 最大连接阻塞等待时间,单位毫秒,默认 -1
max-idle: 200 # 最大空闲连接,默认 8
min-idle: 5 # 最小空闲连接,默认 0
password: 123123
#允许循环依赖
main:
allow-circular-references: true
# Dubbo
dubbo:
#开启dubbo服务,表示该应用是一个服务提供者
server: true
# 提供方应用信息,用于计算依赖关系
application:
name: rpc-provider
# 使用 zookeeper 配置注册中心地址,后面的backup为备用地址,注册中心地址不是随便的,是需要查找的
registry:
address: zookeeper://192.168.186.128:2181
# 用 dubbo 协议在 20880 端口暴露服务
protocol:
name: dubbo
port: 20880
# 扫描需要暴露的服务接口包,如果有多个包,可以使用逗号隔开
scan:
base-packages: com.wll.shoprpc.service
# MyBatis
mybatis:
# 配置 MyBatis数据返回类型别名(默认别名是类名)
type-aliases-package: com.wll.shoprpc.pojo
# 配置 MyBatis Mapper 映射文件
mapper-locations: classpath:mapper/*.xml
# Mybatis SQL 打印(方法接口所在的包,不是 Mapper.xml 所在的包)
logging:
level:
com.wll.shoprpc.mapper: debug
# Redis Key
# 商品分类列表 Key
goods.category.list.key: goods:category:list:goodsCategoryList
#用户购物车key
user.cart: userCart
zppkeeper的ip地址就是运行zookeeper的虚拟机或主机地址,这里需要暴露服务接口用dubbo.scan.base-packages
zookeeper的端口号看zoo.conf中设置的端口号,需要一一对应。
写服务接口,服务实现类,mapper,mapper.xml
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
@Component
@Service(interfaceClass = GoodsCategoryService.class,version="1.0.0",timeout = 5000)
public class GoodsCategoryServiceImpl implements GoodsCategoryService {
在Service实现类上需要加上alibaba.dubbo的@Service注解!!!!千万不能导错包!!!!
还需要加上@Component注解,把该实现类放入到spring容器中管理。
修改消费者前台系统
第一步导入依赖
同上
第二步开启dubbo
同上
第三步修改yml
server:
port: 9091 # 项目访问端口,默认 8080
servlet: # 项目访问路径,默认 /
context-path: /shop-portal
# Spring
spring:
# 数据源
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/
username: root
password: 123123
# 指定 druid 连接池以及 druid 连接池配置
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 1 # 初始连接数
max-active: 20 # 最大连接数
max-idle: 20 # 最大空闲
min-idle: 1 # 最小空闲
max-wait: 60000 # 最长等待时间
# freemarker 模板引擎
freemarker:
cache: false
charset: UTF-8
content-type: text/html;charset=UTF-8
enabled: true
suffix: .ftlh
template-loader-path: classpath:/views/
# 配置模板里是否可以直接取request的属性 request是别名
request-context-attribute: request
# 配置将request和session中的键值添加到
# AbstractTemplateView类的renderMergedOutputModel方法中的model这个Map参数中
expose-request-attributes: true
expose-spring-macro-helpers: true
# 配置模板里是否可以直接取session的属性 true 是允许
expose-session-attributes: true
settings:
tag_syntax: auto_detect # 配置标签语法为自动,页面可以将 <> 改为 [],为了区别 html 标签
template_update_delay: 0 # 模板更新时间,单位秒
default_encoding: UTF-8 # 默认编码字符集
output_encoding: UTF-8 # 模板输出编码字符集
locale: zh_CN # 本地化配置
date_format: yyyy-MM-dd # 日期格式化
time_format: HH:mm:ss # 时间格式化
datetime_format: yyyy-MM-dd HH:mm:ss # 日期时间格式化
number_format: #.## # 数字格式化
boolean_format: true,false # boolean格式化
# ignore,debug,html_debug,rethrow
# 1.TemplateExceptionHandler.IGNORE_HANDLER简单地压制所有异常
# 它对处理异常没有任何作用,也不会重新抛出异常,页面可以正常渲染,后台抛异常
# 2.TemplateExceptionHandler.DEBUG_HANDLER打印堆栈信息和重新抛出异常。这是默认的异常控制器
# 3.TemplateExceptionHandler.HTML_DEBUG_HANDLER和DEBUG_HANDLER相同
# 但是可以格式化堆栈跟踪信息,HTML页面,建议使用它而不是DEBUG_HANDLER
# 4.TemplateExceptionHandler.RETHROW_HANDLER简单重新抛出所有异常而不会做其他的事情
# 5.使用自定义异常类实现TemplateExceptionHandler重写handleTemplateException方法
template_exception_handler: html_debug
# 文件上传
servlet:
multipart:
max-file-size: 100MB # 设置单个上传文件的大小
max-request-size: 1000MB # 设置一次请求上传文件的总容量
# redis 缓存
redis:
timeout: 10000ms # 连接超时时间
host: 192.168.186.128 # Redis服务器地址
port: 6379 # Redis服务器端口
database: 0 # 选择哪个库,默认0库
lettuce:
pool:
max-active: 1024 # 最大连接数,默认 8
max-wait: 10000ms # 最大连接阻塞等待时间,单位毫秒,默认 -1
max-idle: 200 # 最大空闲连接,默认 8
min-idle: 5 # 最小空闲连接,默认 0
password: 123123
main:
allow-circular-references: true
# Dubbo
dubbo:
#开启dubbo服务
server: true
# 消费方应用信息,用于计算依赖关系
application:
name: rpc-consumer-portal
# 使用 zookeeper 注册中心暴露服务地址
registry:
address: zookeeper://192.168.186.128:2181
# MyBatis
mybatis:
# 配置 MyBatis数据返回类型别名(默认别名是类名)
type-aliases-package: com.wll.shopportal.pojo
# 配置 MyBatis Mapper 映射文件
mapper-locations: classpath:mapper/*.xml
# Mybatis SQL 打印(方法接口所在的包,不是 Mapper.xml 所在的包)
logging:
level:
com.wll.shopportal.mapper: debug
#用户票据key
user.ticket: user:userTicket
第四步从注册中心拿服务者提供的服务
import com.alibaba.dubbo.config.annotation.Reference;
import com.wll.shoprpc.service.GoodsCategoryService;
import com.wll.shoprpc.vo.GoodsCategoryVo;
@Controller
public class GoodsController {
@Reference(interfaceClass = GoodsCategoryService.class,version="1.0.0",timeout = 5000)
GoodsCategoryService goodsCategoryService;
@RequestMapping("/goodsCategory/list")
@ResponseBody
public List<GoodsCategoryVo> queryGoodsCategoryList(){
return goodsCategoryService.selectCategoryListForView();
}
}
使用@Reference
注解拿取服务