springboot下使用dubbo的简单demo
1.一些话
现在java后端开发大多用springboot来简化环境搭建,现在一直使用的是springcloud和k8s有关的东西,以前用过dubbo,但那会儿的开发环境搭建流程较为繁琐,而且不支持rest调用。现在简化了不少搭了一下之后发现确实比以前要方便很多了。dubbo由于是rpc调用的,速度上来说是肯定比springcloud要快一些的,不过现在也支持rest调用了,案例中两种方式都会有。不过springcloud感觉各方面的支持来说要更友好一些,所以各有千秋吧。
2.环境准备
2.1 搭建nacos注册中心
教程连接 https://nacos.io/zh-cn/docs/quick-start.html
根据连接中的地址教程搭建即可,然后访问对应的地址http://localhost:8848/nacos/index.html#/login
将地址端口换为设置的即可,如果出现如下界面代表成功,账号密码默认为nacos/nacos
2.2ide直接新建maven项目 dubbo-service
点击finish即可完成创建
2.3 创建common-api provider consumer三个模块分别为公用api接口,服务提供方,服务调用方
点击新建module即可完成创建 具体创建过程略。。可到文末的源码地址下载查看具体项目,创建完的项目如下即可
3.引入依赖
只需要在dubbo-service中引入依赖即可,下面的module模块会继承依赖,即dubbo-service的pom.xml文件如下所示
记住不能使用springboot太高的版本,因为目前是不支持tomcat9的。高版本的springboot会嵌入tomcat9进去
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
<modules>
<module>common-api</module>
<module>provider</module>
<module>consumer</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.dubbo</groupId>
<artifactId>dubbo-service</artifactId>
<version>1.0-SNAPSHOT</version> <properties>
<java.version>1.8</java.version>
<nacos-config-spring-boot.version>0.2.1</nacos-config-spring-boot.version>
<netty-all.version>4.0.35.Final</netty-all.version>
</properties> <dependencies>
<!--springboot有关-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <!--dubbo有关-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>2.6.6</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>0.6.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo-common</artifactId>
<version>2.6.6</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo-registry-api</artifactId>
<version>2.6.6</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.6</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-autoconfigure</artifactId>
<version>0.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>${netty-all.version}</version>
</dependency>
<!--公用api-->
<dependency>
<groupId>com.dubbo</groupId>
<artifactId>common-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- rest有关 -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>jaxrs-api</artifactId>
<version>3.0.12.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>3.0.12.Final</version>
</dependency> </dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>
这儿注意在dubbo-service中引入了自己创建的common-api 这样的话provider和consumer项目都可以直接调用
4. common-api添加公用接口
UserDTO为测试传输类
public class UserDTO implements Serializable { private String username; private String password; public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} @Override
public String toString() {
return "UserDTO{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
UserService为公用api接口
public interface UserService { UserDTO getUserById( String id);
}
5.provider模块
该模块为服务提供方,因此需要实现公用api中的类,服务结构如下
application.yml配置文件如下 注册中心地址根据自己配置的进行配置(使用zookeeper的同学不要直接copy着用。。) 这儿配置的支持dubbo协议与rest协议两种主流的用法
dubbo:
application:
name: user-provider
id: user-provider
registry:
address: nacos://127.0.0.1:8848
protocols:
dubbo:
name: dubbo
port: -1
server: tomcat
rest:
name: rest
port: 8888
server: tomcat
spring:
application:
name: provider-demo
main:
allow-bean-definition-overriding: true
server:
port: 8085
springboot的启动类 ProviderApplication.java类代码如下 @EnableDubbo记得开启
@SpringBootApplication
@EnableDubbo
public class ProviderApplication { public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class,args);
}
}
服务实现类UserServicImpl 此处实现的是公用api里面的接口 (仔细看好每个注解在哪个包下 不要瞎引 尤其是@Service)
package com.dubbo.provider.service.impl; import com.alibaba.dubbo.config.annotation.Service;
import dubbo.api.UserService;
import dubbo.entity.UserDTO; import javax.ws.rs.*;
import javax.ws.rs.core.MediaType; /**
* @Description:
* @author: zhoum
* @Date: 2019-06-26
* @Time: 9:50
*/
@Path("/user")
@Service(protocol = {"rest","dubbo"})
public class UserServiceImpl implements UserService {
@Path("{id}")
@Produces(MediaType.APPLICATION_JSON)
@GET
@Override
public UserDTO getUserById(@PathParam("id") String id) {
UserDTO u= new UserDTO();
u.setUsername("用户名:"+id);
u.setPassword("12346");
return u;
}
}
然后启动服务 ,即可在注册中心看到对应的服务已提供
点击详情查看即可看到分别提供了dubbo协议和rest协议的服务,到此服务发布成功
6.服务消费模块 consumer
项目结构如下
application.yml配置如下 记住端口不要与provider重复
dubbo:
application:
name: user-consumer
id: user-consumer
registry:
address: nacos://127.0.0.1:8848
protocols:
dubbo:
name: dubbo
port: -2
server: tomcat
rest:
name: rest
port: 8889
server: tomcat
spring:
application:
name: consumer-demo
main:
allow-bean-definition-overriding: true
server:
port: 8090
ConsumerApplication.java为springboot的启动类 也记得要加@EnableDubbo注解
@SpringBootApplication
@EnableDubbo
public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class,args);
}
}
WebConfig则用来增加配置下RestTemplate 方便等会儿的rest调用
@Configuration
public class WebConfig { @Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
ConsumerContrller则是测试调用服务的类 UserService是引用的common-api里面的接口
package com.dubbo.consumer.controller; import com.alibaba.dubbo.config.annotation.Reference;
import dubbo.api.UserService;
import dubbo.entity.UserDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate; import java.util.HashMap; /**
* @Description:
* @author: zhoum
* @Date: 2019-06-26
* @Time: 9:55
*/
@RestController
@RequestMapping("/consumer")
public class ConsumerContoller { @Autowired
private RestTemplate restTemplate; @Reference
private UserService userService; @GetMapping("/user")
public UserDTO getUser(){
//rest方式调用
UserDTO user = restTemplate.getForObject("http://localhost:8888/user/123" , UserDTO.class , new HashMap<>());
System.out.println(user);
//传统方式调用
UserDTO wo = userService.getUserById("wo");
return wo;
}
}
启动consumer模块后,在注册中心查看
到此服务提供者与消费者均正常发布
7.启动测试
上面步骤中 两个模块都启动后调用consumer中的ConsumerController中的接口
在浏览器中访问 http://localhost:8090/consumer/user
同时控制台也打印出了
到此,服务正常注册与发现,通过dubbo协议进行调用和rest调用都已经成功
最后项目的github地址为: https://github.com/hetutu5238/zmc-dubbo
springboot下使用dubbo的简单demo的更多相关文章
- SpringBoot下的Dubbo和Zookeeper整合
最近一直在学各种分布式的内容,学到了dubbo分布式服务框架就想写个小demo使用一下,但是由于我要整合在SpringBoot框架中,SpringBoot框架毕竟提倡的是java注解配置,XML文件不 ...
- windows下 zookeeper dubbo 安装+配置+demo 详细图文教程
Java集群优化——dubbo+zookeeper构建 互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这 ...
- Springboot下事务管理的简单使用
关于事务管理的概念这里就不多介绍了,在我的博客“JDBC事务之理论篇”中也有介绍. 关于Spring的事务管理,主要是通过事务管理器来进行的.这里看个Spring事务管理的接口图:(来自博客https ...
- ## springboot 下策略模式的简单使用
1.灵魂三问 接手前人(已跑路)项目快乐否? 前人项目不写注释懵逼否? 一个方法中一堆if/else,且业务判断条件用简单数字(或英文字母),不带注释,想打人否? 所以,对于上述三个问题,我写 ...
- 基于IDEA采用springboot+Mybatis搭建ssm框架简单demo项目的搭建配置流程
一.通过对比可以原始SSM搭建流程,spring boot省去了大量的配置,极大提高了开发者的效率.原始SSM框架搭建流程见博客: https://www.cnblogs.com/No2-explor ...
- SpringBoot 封装异步执行任务简单demo
ThreadPoolConfig.java import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.concurrent.B ...
- 基于springboot构建dubbo的入门demo
之前记录了构建dubbo入门demo所需的环境以及基于普通maven项目构建dubbo的入门案例,今天记录在这些的基础上基于springboot来构建dubbo的入门demo:众所周知,springb ...
- SpringBoot分布式:Dubbo+zookeeper
西部开源-秦疆老师:SpringBoot + Dubbo + zookeeper 秦老师交流Q群号: 664386224 未授权禁止转载!编辑不易 , 转发请注明出处!防君子不防小人,共勉! 基础知识 ...
- 利用SpringBoot+Logback手写一个简单的链路追踪
目录 一.实现原理 二.代码实战 三.测试 最近线上排查问题时候,发现请求太多导致日志错综复杂,没办法把用户在一次或多次请求的日志关联在一起,所以就利用SpringBoot+Logback手写了一个简 ...
随机推荐
- Linux运维工作总结教训
Linux运维一定要知道的六类好习惯和23个教训,避免入坑!从事运维三年半,遇到过各式各样的问题,数据丢失,网站挂马,误删数据库文件,黑客攻击等各类问题. 今天简单整理一下,分享给各位小伙伴. 一.线 ...
- Echarts字体和线条颜色设置操作笔记
在网上偶然看到的一篇文章 感觉不错 下面是原著地址 原著地址:https://blog.csdn.net/eastmount/article/details/52823548
- go语言下载及安装
go语言下载地址:https://studygolang.com/dl 在cmd输入go 如果显示这样,说明安装成功 go env -w GOPROXY=https://goproxy.cn,dire ...
- 【PAT甲级】1073 Scientific Notation (20 分)
题意: 输入科学计数法输出它表示的数字. AAAAAccepted code: #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> u ...
- 如何在Windows中使用Eclipse访问虚拟机Linux系统中的hadoop(伪分布式)
因为计算机配置过低,在虚拟机里几乎无法使用Eclipse,效率极低! 所以现在尝试使用Windows下Eclipse操作虚拟机中Hadoop,步骤如下: 开发环境:Hadoop2.7.1,Ubuntu ...
- 【Android】网络通信
https://www.bilibili.com/video/av78497129?p=4 本文为此视频笔记 1.一些标准设定 (读头部和内容) --->运行,出现权限警告: --->运行 ...
- C++基础之迭代器iterator
C++基础之迭代器iterator 我们已经知道可以使用下标运算符来访问string对象的字符或vector对象的元素,还有另一种更通用的机制也可以实现同样的目的,这就是迭代器(iterator). ...
- Java连载65-自定义手动抛出异常、子类的异常范围、数组初探
一.手动抛出异常1.自定义无效名字异常: (1)编译时异常,直接继承Exception (2)运行时异常,直接继承RuntimeException 举例子:注意点:throws会向上抛出异常,跑到最上 ...
- A Kill Cord for your Laptop
前言 昨晚在朋友圈看到国外一篇文章利用U盘锁笔记本电脑,刚好有一个坏的金士顿U盘,所以就折腾了一下. 准备 USB设备*1 Arch系统*1 走过的坑 因为systemd-udevd带起来的进程是ro ...
- 记录我对'我们有成熟的时间复杂度为O(n)的算法得到数组中任意第k大的数'的误解
这篇博客记录我对剑指offer第2版"面试题39:数组中出现次数超过一半的数字"题解1的一句话的一个小误解,以及汇总一下涉及partition算法的相关题目. 在剑指offer第2 ...