dubbo protocol port 消费者端_企业级 SpringBoot 与 Dubbo 的并用

点击上方“匠心零度”,选择“设为星标”

做积极的人,而不是积极废人

2df31b92df0856d8612be42127f9cb94.png

作者:SimpleWu

cnblogs.com/SimpleWu/p/10833555.html

SpringBoot 和 Dubbo 又能碰撞出什么火花呢?我们来看看企业级 SpringBoot 与 Dubbo 的并用。

版本:

  • Springboot2.x

  • Double2.6

  • Zk3.4.14

  • JDK8

这里就不介绍Dubbo了,不了解的可以看这里:

https://www.cnblogs.com/SimpleWu/p/9769797.html

zookeepr安装

下载去官网查找稳定的版本进行使用:

http://www.apache.org/dyn/closer.cgi/zookeeper/

先在服务器上安装zookeeper。

cd /usr/local/src/
#下载
sudo wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
#解压
tar -zxvf zookeeper-3.4.14.tar.gz
#修改配置文件名称
mv conf/zoo_sample.cfg zoo.cfg
#启动zk
./bin/zkServer.sh start
#出现以下字样代表启动成功,默认端口2181
Starting zookeeper ... STARTED

SpringBoot2.x整合Dubbo

父工程搭建(pom工程)

<groupId>com.simple.springbootgroupId>
    <artifactId>yun-doubleartifactId>
    <version>0.0.1-SNAPSHOTversion>
<packaging>pompackaging>
<name>yun-doublename>
<description>doubledescription>


<properties>
    <java.version>1.8java.version>
    <double.version>2.0.0double.version>
    <zkclient.version>0.10zkclient.version>
properties>


<parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.1.4.RELEASEversion>
        <relativePath/>
parent>


<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.spring.bootgroupId>
            <artifactId>dubbo-spring-boot-starterartifactId>
            <version>${double.version}version>
        dependency>
        <dependency>
            <groupId>com.101tecgroupId>
            <artifactId>zkclientartifactId>
            <version>${zkclient.version}version>
        dependency>
    dependencies>
dependencyManagement>

创建公共接口工程common

该工程用于存储服务层接口,以减少代码的冗余。

<modelVersion>4.0.0modelVersion>

<parent>
    <groupId>com.simple.springbootgroupId>
    <artifactId>yun-doubleartifactId>
    <version>0.0.1-SNAPSHOTversion>
parent>

<groupId>com.simple.springbootgroupId>
<artifactId>commonartifactId>
<version>0.0.1-SNAPSHOTversion>

<name>commonname>
<description>公共接口description>

创建公共接口

public interface UserService {

    String getUserById(int id);

}

创建服务提供者(provider)

Pom文件

<modelVersion>4.0.0modelVersion>

<groupId>com.simple.springbootgroupId>
<artifactId>providerartifactId>
<version>0.0.1-SNAPSHOTversion>
<packaging>jarpackaging>

<name>providername>
<description>生产者description>


<parent>
    <groupId>com.simple.springbootgroupId>
    <artifactId>yun-doubleartifactId>
    <version>0.0.1-SNAPSHOTversion>
parent>

<dependencies>
    
    <dependency>
        <groupId>com.alibaba.spring.bootgroupId>
        <artifactId>dubbo-spring-boot-starterartifactId>
    dependency>
    
    <dependency>
        <groupId>com.101tecgroupId>
        <artifactId>zkclientartifactId>
        
        <exclusions>
            <exclusion>
                <groupId>log4jgroupId>
                <artifactId>log4jartifactId>
            exclusion>

            <exclusion>
                <groupId>org.slf4jgroupId>
                <artifactId>slf4j-apiartifactId>
            exclusion>

            <exclusion>
                <groupId>org.slf4jgroupId>
                <artifactId>slf4j-log4j12artifactId>
            exclusion>
        exclusions>
    dependency>
    
    <dependency>
        <groupId>com.simple.springbootgroupId>
        <artifactId>commonartifactId>
        <version>0.0.1-SNAPSHOTversion>
    dependency>
dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-maven-pluginartifactId>
        plugin>
    plugins>
build>

在pom文件中我们需要引入Dubbo,Zk客户端并且引入公共接口工程

application.properties配置文件

#dubbo.application.name 应用名称
#dubbo.registry.address 注册中心地址
#dubbo.protocol.name 协议名称
#dubbo.protocol.port 协议端口
#dubbo.scan dubbo 服务类包目录
#server.port=8080
spring.application.name=user-pro
dubbo.application.name=user-provider1
dubbo.registry.address=zookeeper://192.168.197.133:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880

在这里dubbo.application.name应用名称一定不能重复

实现UserService

@Component
@Service(timeout = 10000,interfaceClass = UserService.class)
public class UserServiceImpl implements UserService {

    @Override
    public String getUserById(int id) {
        if(id == 1) {
            return "SimpleWu";
        }else {
            return "Apache Dubbo";
        }
    }
}

@Service 这个注解使用的不是Spring里面的,而是com.alibaba.dubbo.config.annotation.Service

  • timeout 配置超时时间

  • interfaceClass 接口类

  • version 服务版本,如果配置了服务版本在消费端引用也必须一样,具体等会说

创建启动类

在该工程中我们不需要引入Web模块浪费端口号,只需要这样写启动类

@EnableDubbo
@EnableDubboConfiguration
@DubboComponentScan("com.simple.springboot.provider.common.impl")
public class ProviderApplication {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(ProviderApplication.class);
        app.run(args);
        //dubbo Main独立运行,脱离web容器
        Main.main(args);
    }

}
  • @EnableDubbo 启动Dubbo功能

  • @EnableDubboConfiguration 启动Duubbo配置

  • @DubboComponentScan 扫描提供者实现类

创建服务消费者(consumer)

POM文件

<modelVersion>4.0.0modelVersion>


<groupId>com.simple.springbootgroupId>
<artifactId>consumerartifactId>
<version>0.0.1-SNAPSHOTversion>


<name>consumername>
<description>消费者description>

<parent>
    <groupId>com.simple.springbootgroupId>
    <artifactId>yun-doubleartifactId>
    <version>0.0.1-SNAPSHOTversion>
parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-webartifactId>
    dependency>

    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-testartifactId>
    dependency>
    
    <dependency>
        <groupId>com.alibaba.spring.bootgroupId>
        <artifactId>dubbo-spring-boot-starterartifactId>
    dependency>
    
    <dependency>
        <groupId>com.101tecgroupId>
        <artifactId>zkclientartifactId>
        
        <exclusions>
            <exclusion>
                <groupId>log4jgroupId>
                <artifactId>log4jartifactId>
            exclusion>

            <exclusion>
                <groupId>org.slf4jgroupId>
                <artifactId>slf4j-apiartifactId>
            exclusion>

            <exclusion>
                <groupId>org.slf4jgroupId>
                <artifactId>slf4j-log4j12artifactId>
            exclusion>
        exclusions>
    dependency>
    
    <dependency>
        <groupId>com.simple.springbootgroupId>
        <artifactId>commonartifactId>
        <version>0.0.1-SNAPSHOTversion>
    dependency>
dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-maven-pluginartifactId>
        plugin>
    plugins>
build>

在这个工程中我们是需要依赖Web的,不然咋访问呢

编写Application.properties配置文件

spring.application.name=user-con
server.port=8080
dubbo.application.name=user-consumer
dubbo.registry.address=zookeeper://192.168.197.133:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
#dubbo.scan=com.simple.springboot.provider.common.impl

在这里dubbo.application.name应用名称一定不能重复,dubbo.scan 该配置指向应该是要和服务提供方一致

编写Controller

@RestController
public class UserController {

    //timeout 可以不指定,如果提供则有填写但是version一定要指定 不然会找不到服务 直连需要加url="dubbo://localhost:20880"
    @Reference
    private UserService userService;

    @GetMapping("/dubbo/user/{id}")
    public String getUserById(@PathVariable int id){
        return userService.getUserById(id);
    }
}

在这里是使用@Reference去发现服务而不是@Autowired去注入Bean,@Reference 里面可以配置version,timeout超时时间

如果需要Dubbo直连url="dubbo://localhost:20880"

dubbo提供了四种负载均衡策略,分别是:

1、Random LoadBalance 按权重的随机负载均衡,也是dubbo默认的负载均衡策略

2、RoundRobin LoadBalance 按权重的轮询负载均衡,即在轮询的基础上添加了权重的策略

3、LeastActive LoadBalance 最少活跃调用数,相同活跃数的随机访问,活跃数指调用前后的计数差即响应时间的长短;这种策略可以使响应慢的提供者收到的请求较少,大大提供系统性能

4、ConsistentHash LoadBalance 一致性哈希;相同参数的请求总是发到同一提供者

负载均衡的配置:@Reference(loadbalance = "roundrobin"),loadbalance 的值即为四种负载均衡的名称,全部小写

在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。下面列举dubbo支持的容错策略:

1、Failover Cluster:失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。可通过 retries="XXX" 来设置重试次数(不含第一次)。

2、Failfast Cluster:快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。

3、Failsafe Cluster:失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。

4、Failback Cluster:失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。

5、Forking Cluster:并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。

6、Broadcast Cluster:广播调用所有提供者,逐个调用,任意一台报错则报错 [2]。通常用于通知所有提供者更新缓存或日志等本地资源信息。

配置如下:@Reference(cluster = "failsafe")这里表示使用失败安全的容错策略

编写启动类

/**
 * @author:SimpleWu
 * @date: 2019-05-08
 */
@EnableDubbo
@SpringBootApplication
@EnableDubboConfiguration
@DubboComponentScan("com.simple.springboot.provider.common.impl")
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class,args);
    }
}

然后直接就可以访问成功了。

如果不想使用注解扫描可以使用properties进行配置

#dubbo.scan=com.simple.springboot.provider.common.impl

参考代码:

https://gitlab.com/450255266/code/tree/master/SpringBoot/dubbo/yun-double

注意事项:

Dubbo是一个二进制的Rpc框架在传输数据过程中,实体类必须经过序列化。

在使用poi导出功能时一定不能把response传到Service层,否则传输到Service是导出不了文件而报错,至于文件下载也一样但是相信一般都会有单独的文件服务器。

END

如果读完觉得有收获的话,欢迎点【好看】,关注【匠心零度】,查阅更多精彩历史!!!

db01f4be45d758989e77b7fa633d91d5.gif

让我“好看” 9b3640d65799d214ed5426b6856eaa87.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

心理学博士vs计算机博士,零基础跨专业考心理学博士,可以给我一些建议吗?...

5星优质答主关注有用62020-12-19回答了&#xff1a;关于跨专业考心理学博士的问题&#xff0c;我曾经也有探索过&#xff0c;说一些我的经历&#xff0c;希望能给你带来一些些帮助。我知道的跨专业考心理学博士最知名的例子就是岳晓东教授&#xff0c;他的经历你可以参考一下&a…

在react项目中编写css,更好的在react项目中写css代码--emotion

简介&#xff1a;emotion是一个JavaScript库&#xff0c;使用emotion可以用写js的方式写css代码。在react中安装emotion后&#xff0c;可以很方便进行css的封装&#xff0c;复用。使用emotion后&#xff0c;浏览器渲染出来的标签是会加上一个css开头的标识。如下&#xff1a;截…

mysql 5.7 差异备份_MySQL 5.7 新备份工具mysqlpump 使用说明 - 运维小结

之前详细介绍了Mysqldump备份工具使用&#xff0c;下面说下MySQL5.7之后新添加的备份工具mysqlpump。mysqlpump是mysqldump的一个衍生&#xff0c;mysqldump备份功能这里就不多说了&#xff0c;现在看看mysqlpump到底有了哪些提升&#xff0c;详细可以查看官网文档。mysqlpump和…

腾达路由器dns服务器未响应,腾达路由器的设置方法

腾达路由器的设置方法许多刚买了tenda路由器的新手朋友们&#xff0c;还不知道腾达tenda路由器的设置方法&#xff0c;下面将通过图文并茂的方式&#xff0c;为你详细的介绍tenda路由器的具体设置步骤&#xff0c;希望能够帮助到你!步骤一&#xff1a;连接好线路电话线入户的用…

mysql8审计_审计对存储在MySQL 8.0中的分类数据的更改

作者&#xff1a;Mike Frank 译&#xff1a;徐轶韬面临的挑战使用敏感信息时您需要拥有审计日志。通常&#xff0c;此类数据将包含一个分类级别作为行的一部分&#xff0c;定义如何处理、审计等策略。在之前的博客中&#xff0c;我讨论了如何审计分类数据查询。本篇将介绍如何…

mysql订单详情的设计_订单功能模块设计与实现

在商城项目中&#xff0c;之前我们介绍了购物车功能模块的实现&#xff0c;商品加入到购物车之后&#xff0c;就是到购物车结算&#xff0c;然后显示购物车的商品列表&#xff0c;点击去结算&#xff0c;然后到了未提交前的订单列表&#xff0c;点击提交订单后&#xff0c;生成…

mysql乱码问题_mysql乱码问题

mysql乱码问题出现乱码的原因&#xff1a;因为当前的CMD客户端窗口与数据库本身及库&#xff0c;表的编码格式不一致导致的。所以当出现乱码的时候&#xff0c;请排查&#xff1a;* sql文件的编码格式* 当前CMD客户端窗口的编码格式* 数据库服务本身的编码格式* 数据库的编码格…

mysql的纵向扩展方案_SQL Server横向扩展方案-SODA

SQL Server横向扩展方案-SODA每次在提到SQL Server扩展性问题的时候&#xff0c;似乎很多的SQL Server DBA或者使用微软技术开发的朋友心里总是一整痛&#xff1a;SQL Server只能纵向的扩展(Scaling-Up)&#xff0c;无法横向的扩展(Scaling-Out)。每次有人提到Oracle和SQL Serv…

mysql8.0.11启动不了_8.0.11版本Mysql遇到MySQL 服务无法启动的解决方法

转&#xff1a;https://blog.csdn.net/iyayaqiqi/article/details/80536110系统环境&#xff1a;win10(1803),64位MySQL版本&#xff1a;8.0.11免安装版MySQL下载地址&#xff1a;https://dev.mysql.com/downloads/mysql&#xff0c;在下载页面往下拉&#xff0c;选择自己的操作…

python爬虫数据可视化软件_python爬虫及数据可视化分析

1.前言本篇文章主要介绍python爬虫及对爬取的数据进行可视化分析&#xff0c;本次介绍所用的网站是(https://www.duanwenxue.com/jingdian/zheli/)2.数据爬取2.1定位到爬取数据打开我们要爬取的网页&#xff0c;右键选择检查&#xff0c;在窗口中单击左上角箭头&#xff0c;即可…

java趣事_【趣事】Java程序员最年轻,C++程序员最年老

原标题&#xff1a;【趣事】Java程序员最年轻&#xff0c;C程序员最年老说起我们对编程世界现有的刻板印象&#xff0c;你一定听说过类似于没有人喜欢用Java编码或者使用C 都是老人家&#xff0c;等等这样的话。为了分析这些刻板印象背后的真相&#xff0c;Trestle Technology的…

koa2 mysql 中间件_Koa2 和 Express 中间件对比

koa2 中间件koa2的中间件是通过 async await 实现的&#xff0c;中间件执行顺序是“洋葱圈”模型。中间件之间通过next函数联系,当一个中间件调用 next() 后&#xff0c;会将控制权交给下一个中间件, 直到下一个中间件不再执行 next() 后, 将会沿路折返,将控制权依次交换给前一…

qt 飞扬青云_Qt编写带频谱的音乐播放器

之前有个项目需要将音频文件的频谱显示出来&#xff0c;想了很多办法&#xff0c;后面发现fmod这个好东西&#xff0c;还是跨平台的&#xff0c;就一个头文件一个库文件就行&#xff0c;简单小巧功能强大&#xff0c;人家做的真牛逼。为了不卡住界面&#xff0c;采用了多线程处…

java什么是工作流程_springmvc工作流程是什么

springmvc工作流程是什么&#xff1a;1、springmvc工作原理图2、springmvc工作流程1、 用户向服务端发送一次请求&#xff0c;这个请求会先到前端控制器DispatcherServlet(也叫中央控制器)。2、DispatcherServlet接收到请求后会调用HandlerMapping处理器映射器。由此得知&#…

java se入门_java SE 入门之运算符(第三篇)

在 java 中主要有以上运算符&#xff0c;分为 赋值运算符 &#xff0c;算术运算符、关系运算符(比较运算符),逻辑运算符和三目运算符(三元运算符).我们一起来学习下吧&#xff01;一、赋值运算符赋值运算符主要有五个、分别是 (赋值)、(加上一个在赋值)、-(减去一个在赋值)、*…

java7最后战线_我的世界最后战线2.0整合包

我的世界1.7.2最后战线The end battle line正式V2修复版是我的世界最后战线2.0整合包。游戏信息地图名字: The End Battle Line「正式版」地图分类: 其他地图类型: 存档地图版本: 后期Anvil格式(1.3)游戏介绍>>前言<<经过了半学期加整整大半个暑假的努力&#xff0…

java敏感异常是什么_java中的异常是什么?

Throwable(所有error和exception的父类:超类)Java将错误变成对象交给异常处理机制Error(仅靠程序本身无法恢复的严重错误)一般是环境的问题&#xff0c;JVM的问题&#xff0c;并非程序的问题&#xff1b;最典型的就是虚拟机中运行的程序过多&#xff0c;造成的虚拟机内存溢出&a…

java为什么不推荐使用stack_栈和队列的面试题Java实现,Stack类继承于Vector这两个类都不推荐使用...

在 thinking in java中看到过说Stack类继承于Vector&#xff0c;而这两个类都不推荐使用了&#xff0c;但是在做一到OJ题时&#xff0c;我用LinkedList来模拟栈和直接用Stack&#xff0c;发现在进行入栈出栈操作时Stack的速度竟然还快一点然而需要多线程的时候有Collections.sy…

reducebykeyandwindow java_Spark Streaming笔记整理(三):DS的transformation与output操作

[TOC]DStream的各种transformationTransformation Meaningmap(func) 对DStream中的各个元素进行func函数操作&#xff0c;然后返回一个新的DStream.flatMap(func) 与map方法类似&#xff0c;只不过各个输入项可以被输出为零个或多个输出项filter(func) 过滤出所有函数func返回值…

php学好要多久,零基础php自学要多久

万事开头难&#xff0c;自学编程也是一样&#xff0c;只要能入门&#xff0c;在学起来就容易多了&#xff0c;那么零基础自学编程多久才可以入门呢&#xff0c;如何才能找到自学编程的门道呢&#xff1f; (推荐学习&#xff1a;PHP视频教程)零基础自学编程也可以&#xff0c;关…