springboot+mybatis+dubbo+aop日誌終結篇

以前的幾篇文章把dubbo服務層都介紹完畢,本篇文章我們主要寫web層如何調用服務層的方法。文章底部附帶源碼。java

啓動服務git

服務啓動時,會向zk註冊本身提供的服務,zk則會記錄服務提供者的IP地址以及暴露的接口名稱,經過zkCli.cmd 查看樹形結構,具體命令以下:github

一、ls / web

展現兩個目錄:dubbo、zookeeper,下面主要看一下dubbo目錄spring

二、ls /dubboapache

能夠看到註冊到dubbo目錄下的接口了api

三、ls /dubbo/com.example.dubbo.demo.api.DemoApi瀏覽器

服務提供者的具體信息就在providers目錄裏了springboot

服務消費者-web層app

該層依賴api、model層,調用服務提供者對外提供的服務,所以須要配置服務消費者的dubbo信息,主要使用到的dubbo標籤以下:

dubbo:application、dubbo:registry、dubbo:reference,具體配置信息以下:

<?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:monitor protocol="registry"/>
    

  <!-- 生成遠程服務代理,能夠和本地bean同樣使用demoService -->
    <dubbo:reference id="demoApi" interface="com.example.dubbo.demo.api.DemoApi" check="false" />
    
</beans>

dubbo:registry的配置須要跟服務提供者的配置是一致的。

dubbo:reference配置引用服務的接口名稱,詳細的屬性參考dubbo官方文檔。

maven依賴

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

 

服務調用

新建一個DemoService來調用服務提供者對外暴露的方法

package com.example.dubbo.demo.web.service;

import com.example.dubbo.demo.api.DemoApi;

import dubbo.demo.model.entity.Student;

import java.util.List;

import org.apache.dubbo.config.annotation.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 消費者服務層
 *
 * @author chenlong
 * @date 2019-03-24 00:49
 * @since 1.0.0
 */
@Service
public class DemoService {
  private static final Logger LOGGER = LoggerFactory.getLogger(DemoService.class);

  @Autowired
  private DemoApi demoApi;

  public String sayHello(String name) {
    return demoApi.sayHello(name);
  }
  
  public List<Student> getAll(){
    return demoApi.getAll();
  }
  
  public void add(Student student){
    demoApi.add(student);
  }
}

新建一個DemoController來進行測試

package com.example.dubbo.demo.web.controller;

import com.example.dubbo.demo.web.service.DemoService;

import dubbo.demo.model.entity.Student;

import java.util.List;
import java.util.Random;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * demo 控制器
 *
 * @author chenlong
 * @date 2019-03-24 00:51
 * @since 1.0.0
 */
@RestController
@RequestMapping("/demo")
public class DemoController {
  private static Logger logger = LoggerFactory.getLogger(DemoController.class);

  @Autowired
  private DemoService demoService;

  /**
   * 測試方法,瀏覽器訪問 /demo/index 能夠看到響應結果了
   *
   * @return
   */
  @RequestMapping(value = "/index", method = RequestMethod.GET)
  @ResponseBody
  public String index() {
    return demoService.sayHello("dubbo");
  }
  
  @GetMapping("all")
  @ResponseBody
  public List<Student> getAll(){
    return demoService.getAll();
  }
  
  @GetMapping("add")
  @ResponseBody
  public Student add(){
    Student student = new Student();
    student.setNum("2019"+ new Random().nextInt());
    student.setName("喬治"+new Random().nextInt(100));
    student.setAge(new Random().nextInt(10));
    student.setSex("m");
      demoService.add(student);
      return student;
  }
}

啓動web層,web層會以長鏈接的方式監聽zk,同時會把zk上的服務提供者的信息拿到本地,這樣當zk掛掉後不影響消費者的調用,當新的服務註冊到zk上時,消費者會同時拿到新的服務信息。

咱們在瀏覽器中輸入地址,發現調用成功

代碼地址:https://github.com/lcchenlong/springbootdubbo

 

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