• springboot+mybatis+dubbo+aop日志终结篇


    之前的几篇文章把dubbo服务层都介绍完毕,本篇文章咱们主要写web层如何调用服务层的方法。文章底部附带源码。

    启动服务

    服务启动时,会向zk注册自己提供的服务,zk则会记录服务提供者的IP地址以及暴露的接口名称,通过zkCli.cmd 查看树形结构,具体命令如下:

    1、ls / 

    展示两个目录:dubbo、zookeeper,下面主要看一下dubbo目录

    2、ls /dubbo

    可以看到注册到dubbo目录下的接口了

    3、ls /dubbo/com.example.dubbo.demo.api.DemoApi

    服务提供者的具体信息就在providers目录里了

    服务消费者-web层

    该层依赖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
    如果喜欢作者的文章,请关注“写代码的猿”订阅号以便第一时间获得最新内容。本文版权归作者所有,欢迎转载
  • 相关阅读:
    Android应用程序与SurfaceFlinger服务的关系概述和学习计划【转】
    Linux内核的LED设备驱动框架【转】
    电源管理-4种休眠方式状态
    linux 管道,输出重定向,后端执行
    find 和grep的区别
    linux启动脚本
    linux启动介绍
    sudo的使用
    ps aux|grep *** 解释
    php图片防盗链
  • 原文地址:https://www.cnblogs.com/lc-chenlong/p/10696896.html
Copyright © 2020-2023  润新知