本篇主要介紹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); } @Override public 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
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服務的入參、出參、執行時間等信息
出處: https://www.cnblogs.com/lc-chenlong
如果喜歡作者的文章,請關注“寫代碼的猿”訂閱號以便第一時間獲得最新內容。本文版權歸作者所有,歡迎轉載
