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 如果喜欢作者的文章,请关注“写代码的猿”订阅号以便第一时间获得最新内容。本文版权归作者所有,欢迎转载
- java 解析 XML实例
- Java 线程内异常处理
- Raphael path 拖动实现
- 黑猿大叔-译文 | TensorFlow实现Batch Normalization
- Java后端WebSocket的Tomcat实现
- jwplayer 隐藏属性方法记载
- TensorFlow从0到1丨开篇:Hello TensorFlow !
- JS原型继承和类式继承
- 在Servlet的init方法中创建线程
- TensorFlow从0到1丨第2篇:TensorFlow核心编程
- AngularJS中的按需加载ocLazyLoad
- AngularJS driective 封装 自动滚动插件
- java类过滤器,防止页面SQL注入
- Web项目添加Maven支持
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- ShardingJdbc分库分表实战案例解析(上)
- ShaderDesigner:OpenGL shader调试神器
- 手动实现Promise/A+
- GJK算法计算凸多边形之间的距离
- 通过实际案例摸清楚Spring事务传播的行为
- 如何通过容器搭建稳定可靠的私有网盘(NextCloud)
- 初识ABP vNext(1):开篇计划&基础知识
- 基于 HTML5 Canvas 的病毒模拟视觉试验台
- #云开发高阶实战任务总结# 投票系统的解析与设计
- K8S 环境下的使用 ConfigMap 进行远程配置
- 腾讯云语音识别python-sdk使用笔记
- TKE部署ES如何配置参数vm.max_map_count
- Jquery validate remote 验证数据唯一
- MySQL 案例:乱码,字符集与错入错出的 MySQL
- Jenkins常用插件Copy Artifact的使用