springboot+mybatis+dubbo+aop日誌第二篇

本篇主要介紹dubbo-demo-api接口層和dubbo-demo-service層,以及如何經過dubbo把服務發佈出去,介紹代碼前,我們先來回顧一下整個demo工程的結構,以下圖所示:html

1.dubbo-demo-api

這裏面主要是定義全部的接口,這些接口是能夠被其餘工程引用的,demo工程裏就定義了一個測試接口,接口裏定義了三個方法,看一下該層的代碼結構java

DemoApi.java代碼mysql

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文件的依賴以下spring

<dependency>
            <groupId>com.example.dubbo</groupId>
            <artifactId>dubbo-demo-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

說明:須要在api層執行install的maven命令,把api的jar包生打包到本地.m2倉庫,這樣就能夠引用到了。sql

該層代碼結構以下:數據庫

  • aop包主要是記錄每個service方法調用時的入參,返回值,執行時間、接口的全名稱等信息。apache

  • impl包實現api的接口邏輯api

  • mapper包是mybatis與數據庫交互的方法,與mapper.xml對應tomcat

  • mapping文件夾下保存全部mapper.xml文件mybatis

  • 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服務的入參、出參、執行時間等信息

做者: Eric.Chen
出處: https://www.cnblogs.com/lc-chenlong
若是喜歡做者的文章,請關注「寫代碼的猿」訂閱號以便第一時間得到最新內容。本文版權歸做者全部,歡迎轉載
相關文章
相關標籤/搜索