您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

SpringBoot中使用dubbo实现RPC调用

时间:2020-08-10 13:06:57  来源:  作者:

Dubbo(来自于阿里巴巴)

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的PRC远程调用服务调用方案。

SpringBoot中使用dubbo实现RPC调用

 

Dubbo的的特点

  • 通过spring配置的方式即可完成服务化,对于应用无入侵。(SpringCloud有一定的入侵)
  • 通过maven的install &deploy命令把interface和Model层发布到仓库中,服务调用方只需要依赖interface和model层即可。
  • 通过zookeeper设置达到注册服务和心跳检测,通过gateWay前置网关(Clound使用Zuul实现负载均衡将请求转向Eureka服务器)隔绝外部直接调用原子服务的风险

SpringBoot中使用Dubbo

引入依赖

<!--dubbo依赖-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.6.6</version>
</dependency>

<dependency>
    <groupId>org.Apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>4.0.1</version>
    <exclusions>
        <exclusion>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.7</version>
</dependency>

dubbo常用配置及注意事项

1、启动时检查
缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成,以便上线时,能及早发现问题,默认check=true。

关闭所有服务的启动时检查:(没有提供者时报错)
<dubbo:consumer check="false" />

关闭某个服务的启动时检查:(没有提供者时报错)
<dubbo:reference interface="com.foo.BarService" check="false" />
其它的启动时检查还包括:注册中心

2、直连提供者
在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连,
点对点直联方式,将以服务接口为单位,忽略注册中心的提供者列表。
<dubbo:reference id="xxxService" interface="com.alibaba.xxx.XxxService" url="dubbo://localhost:20890" />  

3、服务分组
当一个接口有多种实现时,可以用group区分。
provider:
<dubbo:service group="feedback" interface="com.xxx.IndexService" ref="indexServiceFeedback" />
<dubbo:service group="member" interface="com.xxx.IndexService"   ref="indexServiceMember" />

cosumer:
<dubbo:reference id="feedbackIndexService" group="feedback" interface="com.xxx.IndexService" />
<dubbo:reference id="memberIndexService" group="member" interface="com.xxx.IndexService" />

4、多版本
当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。
一般处理步骤
1)在低压力时间段,先升级一半提供者为新版本
2)再将所有消费者升级为新版本
3)然后将剩下的一半提供者升级为新版本
<dubbo:service interface="com.foo.BarService" version="1.0.0" />
<dubbo:service interface="com.foo.BarService" version="2.0.0" />
5、异步调用
可完成并行调用多个远程服务。异步总是不等待返回。
<dubbo:reference id="fooService" interface="com.alibaba.foo.FooService">
    <dubbo:method name="findFoo" async="true" />
</dubbo:reference>

6、延迟暴露
如果你的服务需要Warmup时间,比如初始化缓存,等待相关资源就位等,可以使用delay进行延迟暴露。
<dubbo:provider delay="-1" />
当然,也可以配置到服务级别,但有些需要地方需要注意。

7、dubbo:protocol属性
threadpool:线程池类型,可选:fixed/cached ,默认fixed 。
threads :服务线程池大小(固定大小) ,默认为100

payload:请求及响应数据包大小限制,单位:字节,默认为88388608(=8M)
如:<dubbo:protocol name="dubbo" port="27001" threadpool="cached" threads="20"/>

ThreadPool
fixed 固定大小线程池,启动时建立线程,不关闭,一直持有。(缺省)
cached 缓存线程池,空闲一分钟自动删除,需要时重建。
limited可伸缩线程池,但池中的线程数只会增长不会收缩。(为避免收缩时突然来了大流量引起的性能问题)。

8、dubbo:Application
<dubbo:application name="xxx_service" />
name必填。当前应用名称,用于注册中心计算应用间依赖关系,注意:消费者和提供者应用名不要一样

dubbo生产者配置

dubbo-provider.xml :通过配置xml的方式来配置dubbo服务的提供者

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <dubbo:application name="usermanage" />
    <dubbo:registry id="zookeeper_service" protocol="zookeeper" address="127.0.0.1:2181" timeout="15"/>

    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo"  port="20880"  threads="1000" />

    <!-- dubbo监控配置 -->
    <dubbo:monitor protocol="registry" />

    <!-- dubbo管理平台接口 -->
    <bean id="UserService" class="com.luo.service.impl.UserServiceImpl" />
    <dubbo:service interface="com.luo.service.IUserService" ref="UserService"
                   registry="zookeeper_service" />

</beans>

在启动类引入配置类

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@ImportResource({"classpath:*dubbo-provider.xml"})
public class UsermanageAPP extends SpringBootServletInitializer {
    private static Logger logger= LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(UsermanageAPP.class);
    }

    /**
     * 项目的启动方法
     * @param args
     */
    public static void main(String[] args) {
        SpringApplication.run(UsermanageAPP.class, args);
        logger.info("======服务已经启动========");
    }
}

服务接口和服务实现类

服务接口

public interface IUserService {
    public String ceshi(String input);
}   

服务的实现类

public class UserServiceImpl implements IUserService {

    @Override
    public String ceshi(String input) {
        return "Hello World,"+input;
    }
}

dubbo生产者配置

dubbo-consumer.xml:通过配置xml的方式来配置dubbo服务的消费者对于核心的业务:

  • retries=“0”:关闭dubbo超时重试,即 超时不重试
  • 提高timeout(即超时时间),避免由于网络延迟导致业务流程超时

Dubbo的路由机制,会把超时的请求路由到其他机器上,而不是本机尝试,所以 dubbo的重试机器也能一定程度的保证服务的质量。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <dubbo:application name="nacos" />
    <dubbo:registry id="zookeeper_service" protocol="zookeeper" address="127.0.0.1:2181" timeout="15"/>

    <!-- 消息推送 -->
    <dubbo:reference id="user" interface="com.luo.service.IUserService" retries="0" timeout="50000" check="false"/>
</beans>

在启动类引入配置类

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, SentinelCircuitBreakerAutoConfiguration.class})
@ImportResource({"classpath:*dubbo-consumer.xml"})
public class NacosApp extends SpringBootServletInitializer {
    private static Logger logger= LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(NacosApp.class);
    }

    /**
     * 项目的启动方法
     * @param args
     */
    public static void main(String[] args) {
        SpringApplication.run(NacosApp.class, args);
        logger.info("======服务已经启动========");
    }
}

服务接口和Controller层

服务接口

public interface IUserService {
    public String ceshi(String input);
}

Controller层

@RestController
public class TestController {

    @Autowired
    IUserService userService;

    @RequestMapping("/ceshi")
    public String ceshi(){
        return userService.ceshi("luo");
    }

}

分别启动生产者和消费者,访问消费者接口进行验证:

SpringBoot中使用dubbo实现RPC调用


Tags:RPC调用   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
Dubbo(来自于阿里巴巴)Dubbo是一个分布式服务框架,致力于提供高性能和透明化的PRC远程调用服务调用方案。 Dubbo的的特点 通过spring配置的方式即可完成服务化,对于应用无入侵。...【详细内容】
2020-08-10  Tags: RPC调用  点击:(41)  评论:(0)  加入收藏
▌简易百科推荐
近日只是为了想尽办法为 Flask 实现 Swagger UI 文档功能,基本上要让 Flask 配合 Flasgger, 所以写了篇 Flask 应用集成 Swagger UI 。然而不断的 Google 过程中偶然间发现了...【详细内容】
2021-12-23  Python阿杰    Tags:FastAPI   点击:(6)  评论:(0)  加入收藏
文章目录1、Quartz1.1 引入依赖<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version></dependency>...【详细内容】
2021-12-22  java老人头    Tags:框架   点击:(11)  评论:(0)  加入收藏
今天来梳理下 Spring 的整体脉络啦,为后面的文章做个铺垫~后面几篇文章应该会讲讲这些内容啦 Spring AOP 插件 (了好久都忘了 ) 分享下 4ye 在项目中利用 AOP + MybatisPlus 对...【详细内容】
2021-12-07  Java4ye    Tags:Spring   点击:(14)  评论:(0)  加入收藏
&emsp;前面通过入门案例介绍,我们发现在SpringSecurity中如果我们没有使用自定义的登录界面,那么SpringSecurity会给我们提供一个系统登录界面。但真实项目中我们一般都会使用...【详细内容】
2021-12-06  波哥带你学Java    Tags:SpringSecurity   点击:(18)  评论:(0)  加入收藏
React 简介 React 基本使用<div id="test"></div><script type="text/javascript" src="../js/react.development.js"></script><script type="text/javascript" src="../js...【详细内容】
2021-11-30  清闲的帆船先生    Tags:框架   点击:(19)  评论:(0)  加入收藏
流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术。本文主要介绍了诞生于云原生时代的流水线框架 Argo。 什么是流水线?在计算机...【详细内容】
2021-11-30  叼着猫的鱼    Tags:框架   点击:(21)  评论:(0)  加入收藏
TKinterThinter 是标准的python包,你可以在linx,macos,windows上使用它,你不需要安装它,因为它是python自带的扩展包。 它采用TCL的控制接口,你可以非常方便地写出图形界面,如...【详细内容】
2021-11-30    梦回故里归来  Tags:框架   点击:(26)  评论:(0)  加入收藏
前言项目中的配置文件会有密码的存在,例如数据库的密码、邮箱的密码、FTP的密码等。配置的密码以明文的方式暴露,并不是一种安全的方式,特别是大型项目的生产环境中,因为配置文...【详细内容】
2021-11-17  充满元气的java爱好者  博客园  Tags:SpringBoot   点击:(25)  评论:(0)  加入收藏
一、搭建环境1、创建数据库表和表结构create table account(id INT identity(1,1) primary key,name varchar(20),[money] DECIMAL2、创建maven的工程SSM,在pom.xml文件引入...【详细内容】
2021-11-11  AT小白在线中  搜狐号  Tags:开发框架   点击:(29)  评论:(0)  加入收藏
SpringBoot开发的物联网通信平台系统项目功能模块 功能 说明 MQTT 1.SSL支持 2.集群化部署时暂不支持retain&will类型消 UDP ...【详细内容】
2021-11-05  小程序建站    Tags:SpringBoot   点击:(55)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条