一、分离前后端
1、把user项目拆开web前端和service后端。
2、gmall-user-web和gmall-user-service
3、比如双11来的时候,高并发的时候,前端压力小,后端大,就可以合理的分配机器分担压力到哪一层。
4、把他们分开的原因,一可以合理分配资源。二灵活的调用各种服务
二、在项目当中引入dubbo服务框架
1、把他们都拆开后
在service里引入父依赖、api、service通用工具包
在web里引入父依赖、api、web通用工具包
在dubbo框架中,他们的流程就是:
先用service后端发布dubbo服务,然后用web前端去消费
2、dubbo框架要引入到common-util的通用工具包中,因为service和web层将来都要用dubbo进行通讯
依赖如下:
<dependency>
<!--dubbo框架-->
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<!--用了app线程直接去同步注册中心的信息-->
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<!--整合框架-->
<groupId>com.gitee.reger</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
</dependency>
三、在项目的服务端引入注解:
1、在service后端包含:service的impl实现包和mapper包,
注意:这里的service的注解要引用阿里的dubbo框架的。
远程过程调用,这里要包含dubbo的rpc的协议,所以要引入dubbo框架的service
2、还有这里要谨记,经常出错,之前有发表过文章提示了。
因为mapper接口继承了通用mapper(单表的增删改查),用到了mapper技术。
所以这里引入扫描mapper包注解@MapperScan
,记得用tk.mybatis下的注解。
3、Consumer和provider之间用的dubbo协议进行通讯
Consumer和provide通过zookeeper协议进行通讯,是一个小的app线程去同步他们的注册中心
四、配置dubbo的协议和zookeeper协议
1、在application下配置dubbo和zookeeper
#服务端口号
server.port=8070
#jdbc连接数据库
spring.datasource.password=123
spring.datasource.username=root
spring.datasource.url=jdbc:mysql://localhost:3306/gmall_study?characterEncoding=UTF-8
#mybatis配置
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
mybatis.configuration.map-underscore-to-camel-case=true
#日志级别
logging.level.root=debug
#dubbo的协议
#dubbo中的服务名称
spring.dubbo.application=user-service
#dubbo的通讯协议名称
spring.dubbo.protocol.name=dubbo
#zookeeper注册中心地址
spring.dubbo.registry.address=172.25.0.11:2181
#zookeeper的通讯协议名称
spring.dubbo.registry.protocol=zookeeper
#dubbo服务的扫描路径
spring.dubbo.base-package=com.atguigu.gmall
这里有一个坑,172.25.0.11:2181是我的虚拟机下的Linux系统的ip地址和端口。
因为我的系统没有开发这个2181端口,这里就会报错连接不上zookeeper。
姑且还要到Linux系统当中开放这个2181端口!具体开放端口方法看上边发表的文章。
2、全部配置好之后,用debug日志级别输出,运行之后就可以看到zookeeper.ClientCnxn 发过来的的同步信息心跳的ping了,每次都ping一下,每时每刻都在同步dubbo
3、选择应用—提供者,配置文件的dubbo协议里的服务名称user-service
就是这个提供者,也就是容器名。
#dubbo中的服务名称
spring.dubbo.application=user-service
4、点击这位提供者查看,他提供了这样的服务
五、Service提供了服务,那web就要去消费了。
运行客户端controller层
1、这里有controller包,注意,在这下面的类,之前用的注解@Autowired
,但这个是在同一个容器中(同一个模块中)才可以使用
2、现在是要跨模块连接service,要远程协议代理,要用dubbo的注解@Reference
3、dubbo在进行dubbo协议通讯时,需要实现序列化接口(封装的数据对象)
就是要在实体类中实现 implements Serializable
六、同时运行service后端8070Tomcat端口和web前端8080Tomcat端口
在页面上能正常获取数据。
在dubbo监控中心就可以看到消费者web了。!!!!!!
点击消费者web查看,这个web消费了service
七、延长dubbo监控中心的响应时间
1、dubbo的consumer在三秒内每隔一秒进行一次重新访问,默认一秒超时,三次访问之后会直接抛超时异常,所以我们在开发阶段,可以将consumer设置超时时间延长,这样才方便断点调试。
在application的配置文件加上这个延长超时时间:
#设置超时时间,1000毫秒为单位,600 000 ,600秒 , 10分钟
spring.dubbo.consumer.timeout=600000
2、设置检测服务端是否先启动了,再启动consumer客户端,这样才符合逻辑。
得先提供服务,你再有客户端去消费!!!故在application配置文件加入下面代码:
#设置检测服务是否存在
spring.dubbo.consumer.check=false