本篇主要介绍dubbo-demo-api接口层和dubbo-demo-service层,以及如何通过dubbo把服务发布出去,介绍代码前,咱们先来回顾一下整个demo工程的结构,如下图所示:



1.dubbo-demo-api

这里面主要是定义所有的接口,这些接口是可以被其他工程引用的,demo工程里就定义了一个测试接口,接口里定义了三个方法,看一下该层的代码结构



DemoApi.java代码
sayHello:是测试方法
add:添加一条学生信息到数据库
getAll:获取所有学生信息   package com.example.dubbo.demo.api; import java.util.List;
import dubbo.demo.model.entity.Student;/** * Demo 接口定义 * @author * */ public
interface DemoApi { String sayHello(String name); void add(Student student);
List<Student> getAll(); }
2.dubbo-demo-service

该层主要实现api的接口,实现业务逻辑,访问数据库,并且把服务通过dubbo注册到zookeeper上,对外提供服务, pom文件的依赖如下
<dependency> <groupId>com.example.dubbo</groupId>
<artifactId>dubbo-demo-api</artifactId> <version>0.0.1-SNAPSHOT</version>
</dependency>
说明:需要在api层执行install的maven命令,把api的jar包生打包到本地.m2仓库,这样就可以引用到了。

该层代码结构如下:



*
aop包主要是记录每一个service方法调用时的入参,返回值,执行时间、接口的全名称等信息。

*
impl包实现api的接口逻辑

*
mapper包是mybatis与数据库交互的方法,与mapper.xml对应

*
mapping文件夹下保存所有mapper.xml文件

*
dubbo-config.xml 是dubbo暴露服务的配置文件

impl/DemoApiImpl.java代码

这里面实现了所有api的接口
package com.example.dubbo.demo.service.impl; import
com.example.dubbo.demo.api.DemoApi;import
com.example.dubbo.demo.service.mapper.StudentMapper;import
dubbo.demo.model.entity.Student;import java.util.List; import
org.apache.dubbo.config.annotation.Service;import
org.springframework.beans.factory.annotation.Autowired;/** * * @author
chenlong12 **/ @Service public class DemoApiImpl implements DemoApi { @Autowired
private StudentMapper studentMapper; /** * 实现 sayHello 接口 * * @param name *
@return */ @Override public String sayHello(String name) { return "Hello, " +
name + " (from Spring Boot with dubbo-2.7.1)"; } @Override public void
add(Student student) {// TODO Auto-generated method stub
studentMapper.add(student); } @Overridepublic List<Student> getAll() { // TODO
Auto-generated method stub return studentMapper.getAll(); } }
mapper/StudentMapper.java代码

这里面定义的接口方法名,与mapper.xml中的定义的SQL语句的Id对应,且mapper.xml文件中的namespace路径为该类的全路径
package com.example.dubbo.demo.service.mapper; import java.util.List; import
dubbo.demo.model.entity.Student;public interface StudentMapper { void
add(Student student); List<Student> getAll(); }
mapping/StudentMapper.xml代码

这里面定义所有与数据库交互的SQL语句,SQL语句中的 #{}代表是占位符,可以防止sql注入
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC
"-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper
namespace="com.example.dubbo.demo.service.mapper.StudentMapper"> <resultMap
id="StudentResultMap" type="dubbo.demo.model.entity.Student"> <result
column="id" jdbcType="INTEGER" property="id" /> <result column="num"
jdbcType="VARCHAR" property="num" /> <result column="name" jdbcType="VARCHAR"
property="name" /> <result column="age" jdbcType="INTEGER" property="age" />
<result column="sex" jdbcType="VARCHAR" property="sex" /> </resultMap> <insert
id="add" parameterType="dubbo.demo.model.entity.Student"> insert into student
(num, name, age,sex) values (#{num},#{name},#{age},#{sex})</insert>
<!--我自己加的方法--> <select id="getAll" resultType="dubbo.demo.model.entity.Student">
select* from student </select> </mapper>
 

application.properties

dubbo-config.xml会引用该配置文件里的内容
spring.config.name=application # spring 的环境配置 spring.profiles.active=dev #
服务启动端口,即内置 tomcat 启动时占用的端口 server.port=8087 spring.aop.auto=true
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/school?useSSL=false&useUnicode=true&characterEncoding=UTF-8
spring.datasource.username= spring.datasource.password=
mybatis.mapper-locations=classpath:mapping/*.xml
mybatis.type-aliases-package=dubbo.demo.model.entity # dubbo config #
应用定义了提供方应用信息,用于计算依赖关系;在 dubbo-admin 或 dubbo-monitor 会显示这个名字,方便辨识
my.dubbo.application.name=dubbo-demo-service # 应用所属者
my.dubbo.application.owner=ll # 应用所属组织 my.dubbo.application.organization=ll #
使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper # 注册中心id
my.dubbo.registry.id=zookeeper-registry # 注册中心协议
my.dubbo.registry.protocol=zookeeper # 注册中心地址
my.dubbo.registry.address=127.0.0.1:2181 # dubbo协议在20880端口暴露服务 # 协议名称
my.dubbo.protocol.name=dubbo # 协议端口 my.dubbo.protocol.port=20880 # 协议访问log
my.dubbo.protocol.accesslog=dubbo-access.log # 重试次数 my.dubbo.provider.retries=0
# 超时时间 my.dubbo.provider.timeout=3000 # 注册监控中心
my.dubbo.monitor.protocol=registry
dubbo-config.xml


这dubbo的配置文件,所有的服务都是通过这个配置文件发布出去,定义了dubbo的服务,端口,注册中心,以及需要发布出去的服务等,该demo使用的是dubbo协议,zookeeper注册中心,官方推荐使用xml配置文件定义dubbo服务
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns
="http://www.springframework.org/schema/beans" xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo
="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!--
定义了提供方应用信息,用于计算依赖关系;在 dubbo-admin 或 dubbo-monitor 会显示这个名字--> <dubbo:application
name="${my.dubbo.application.name}" owner="ll" organization="ll" /> <!-- 使用
zookeeper 注册中心暴露服务,注意要先开启 zookeeper--> <dubbo:registry id="zookeeper-registry"
protocol="${my.dubbo.registry.protocol}" address="${my.dubbo.registry.address}"
/> <!-- dubbo协议在20880端口暴露服务 --> <dubbo:protocol name="${my.dubbo.protocol.name}"
port="${my.dubbo.protocol.port}" accesslog="dubbo-access.log"/> <dubbo:provider
retries="0" timeout="30000"/> <dubbo:monitor protocol="registry"/> <bean id
="demoApiImpl" class="com.example.dubbo.demo.service.impl.DemoApiImpl"></bean>
<!-- 使用 dubbo 协议实现定义好的 Service Api 接口--> <dubbo:service interface
="com.example.dubbo.demo.api.DemoApi" ref="demoApiImpl" retries="0" timeout
="60000"> <dubbo:method name="add" timeout="10000" retries="0" loadbalance
="leastactive" actives="5" /> </dubbo:service> </beans>
详细的配置说明请参见dubbo官方文档

http://dubbo.apache.org/zh-cn/docs/user/references/xml/dubbo-service.html
<http://dubbo.apache.org/zh-cn/docs/user/references/xml/dubbo-service.html>

 

DubboDemoServiceApplication.java


项目启动main方法,项目启动前需要先把zookeeper启动,通过@ImportResource把dubbo的配置文件加载进来,MapperScan扫描所有的mapp接口
package com.example.dubbo.demo.service; import
org.apache.dubbo.config.spring.context.annotation.DubboComponentScan;import
org.apache.dubbo.config.spring.context.annotation.EnableDubboConfig;import
org.mybatis.spring.annotation.MapperScan;import
org.springframework.boot.SpringApplication;import
org.springframework.boot.autoconfigure.SpringBootApplication;import
org.springframework.context.annotation.ImportResource;//@EnableDubboConfig //
@DubboComponentScan("com.example.dubbo.demo.service.impl")
@MapperScan("com.example.dubbo.demo.service.mapper") @SpringBootApplication
@ImportResource(locations="classpath:dubbo-config.xml") public class
DubboDemoServiceApplication {public static void main(String[] args) {
SpringApplication.run(DubboDemoServiceApplication.class, args); } }
下一篇咱们介绍怎么用aop获取每一个service服务的入参、出参、执行时间等信息
作者:Eric.Chen <https://www.cnblogs.com/lc-chenlong/>
出处:https://www.cnblogs.com/lc-chenlong <https://www.cnblogs.com/lc-chenlong/>
如果喜欢作者的文章,请关注“写代码的猿”订阅号以便第一时间获得最新内容。本文版权归作者所有,欢迎转载

 

友情链接
ioDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信