当前位置: 首页 > news >正文

【Dubbo】入门搭建

文章目录

  • 快速入门
  • 配置Nacos注册中心
  • Dubbo-Spring-Cloud
    • 概述
    • 快速使用
    • dubbo-cloud-provider-api 依赖含义
  • 参考链接


快速入门

场景:提供provider,consumer,通过RPC远程调用使得consumer能够调用provider中的服务。
实现:创建三个模块:apache-dubbo-provider-api, apache-dubbo-provider-sample, apache-dubbo-consumer-sample
其中apache-dubbo-provider-api描述了对外提供的服务,需要provider进行实现,consumer进行订阅;

不使用注册中心的方式进行调用
在这里插入图片描述
使用原生spring XML文件形式进行配置,Maven项目导入dubbo依赖:

<dependency>
  <groupId>org.apache.dubbo</groupId>
  <artifactId>dubbo</artifactId>
  <version>2.7.16</version>
</dependency>

#apache-dubbo-provider-api

public interface ProviderService {

    String login(String username, String password);

    String sayHello(String username);
}

#apache-dubbo-provider-sample 具体方法实现

public class ProviderServiceImpl implements ProviderService{
    @Override
    public String login(String username, String password) {
        if ("admin".equals(username) && "admin".equals(password)) {
            return sayHello(username);
        }
        return "登录失败";
    }

    @Override
    public String sayHello(String username) {
        return username + " 您好!";
    }
}

编写application.xml文件,方便启动时加载,将文件放到 resources/META-INF 目录下

    <!--    定义协议和端口-->
    <dubbo:protocol name="dubbo" port="20880"/>
    <!--    对外暴露应用-->
    <dubbo:application name="dubbo-provider"/>
    <!--注册中心地址:N/A表示直连-->
    <dubbo:registry address="N/A"/>
    <!--    暴露服务-->
    <dubbo:service interface="com.righteye.service.ProviderService" ref="provider-login"/>
    <!--    暴露的实例对象-->
    <bean id="provider-login" class="com.righteye.service.ProviderServiceImpl"/>

可以使用dubbo中提供的启动类启动项目:

import org.apache.dubbo.container.Main;

public class ProviderApplication {

    public static void main(String[] args) {
        Main.main(args);
    }
}

项目启动后:
在这里插入图片描述
#apache-dubbo-provider-consumer

编写application.xml文件

<dubbo:application name="dubbo-consumer"/>
    <dubbo:registry address="N/A"/>
    <dubbo:reference id="serviceLogin" interface="com.righteye.service.ProviderService"
                     url="dubbo://192.168.220.1:20880/com.righteye.service.ProviderService"/>

这里的url写provier运行成功后的日志内容

测试内容:

@Test
public void testDubboRemoteCall() {
    ProviderService providerService = null;
    String config = "classpath:application.xml";
    ApplicationContext ac = new ClassPathXmlApplicationContext(config);
    providerService = (ProviderService) ac.getBean("serviceLogin");
    String res = providerService.login("admin", "admin");
    System.out.println(res);
}

配置Nacos注册中心

Dubbo可支持多种注册中心,如 Zookeeper, Eureka, Nacos
通过注册中心,provider将服务进行注册而consumer进行订阅,灵活性更高
引入Nacos依赖

<dependency>
  <groupId>com.alibaba.nacos</groupId>
  <artifactId>nacos-client</artifactId>
  <version>1.4.2</version>
</dependency>

修改provider和consumer的配置文件
#apache-dubbo-provider-sample

	<!--    定义协议和端口-->
    <dubbo:protocol name="dubbo" port="20880"/>
    <!--    对外暴露应用-->
    <dubbo:application name="dubbo-provider"/>
    <!--注册中心地址:修改注册中心地址成Nacos服务-->
    <dubbo:registry address="nacos://192.168.189.130:8848"/>
    <!--    暴露服务-->
    <dubbo:service interface="com.righteye.service.ProviderService" ref="provider-login"/>
    <!--    暴露的实例对象-->
    <bean id="provider-login" class="com.righteye.service.ProviderServiceImpl"/>

#apache-dubbo-consumer-sample

	<dubbo:application name="dubbo-consumer"/>
    <dubbo:registry address="nacos://192.168.189.130:8848"/>
    <!-- 引入Nacos后,不需要url进行指定服务 -->
    <dubbo:reference id="serviceLogin" interface="com.righteye.service.ProviderService"/>

除上述外其他代码不需要改变
Nacos中注册内容:
在这里插入图片描述

Dubbo-Spring-Cloud

概述

dubbo 重新更新后与SpringCloud结合的产物,继承了SpringCloud微服务环境的优势。
传统的SpringCloud中使用远程调用的组件时Feign,该组件基于Http,默认每次调用采用短链接,因此每一次请求都需要重新建立TCP,导致效率低下。而RPC是基于TCP,作用于传输层。
使用SpringCloud Dubbo的理想状态是对外采用RestFul(HTTP),内部远程调用使用RPC,提高性能。

快速使用

场景:搭建微服务环境 dubbo-cloud-provider-api, dubbo-cloud-provider-sample, dubbo-cloud-consumser-sample
环境: 微服务 - springboot 2.4.3 spring-cloud 2020.0.1 spring-cloud-alibaba 2021.0.1

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.2</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  
  <packaging>pom</packaging>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
    <spring.cloud.version>2020.0.1</spring.cloud.version>
    <spring.cloud.alibaba.version>2021.1</spring.cloud.alibaba.version>
  </properties>
  
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring.cloud.version}</version>
        <scope>import</scope>
        <type>pom</type>
      </dependency>

      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>${spring.cloud.alibaba.version}</version>
        <scope>import</scope>
        <type>pom</type>
      </dependency>
    </dependencies>
  </dependencyManagement>

#dubbo-cloud-provider-api
同样作为接口工厂,用来约束暴露/订阅的内容;同时管理maven项目中的依赖
pom.xml

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-dubbo</artifactId>
    </dependency>

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.12.0</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    <!-- 处理异常:Failed to instantiate [feign.jaxrs2.JAXRS2Contract]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: javax/ws/rs/Path -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        <version>2.2.5.RELEASE</version>
    </dependency>
</dependencies>

#dubbo-cloud-provider-sample

pom.xml

<!-- 导入 provider-api 项目 -->
<dependency>
    <groupId>com.righteye</groupId>
    <artifactId>dubbo-cloud-provider-api</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

接口实现类:

@DubboService
public class DubboCloudServiceImpl implements DubboCloudService{
    @Override
    public String sayHello() {
        return "hello dubbo-spring-cloud";
    }
}

配置文件 application.yaml

server:
  port: 10056

dubbo:
  # 服务名称
  application:
    name: dubbo-cloud-provider
  # 协议和端口
  protocol:
    port: 20880
    name: dubbo
  # 注册中心
  registry:
    address: spring-cloud://${righteye.addr}:8848
  # 需要扫描的基准包
  scan:
    base-packages: com.righteye.service
spring:
  application:
    name: dubbo-cloud-provider

  cloud:
    nacos:
      discovery:
        server-addr: ${righteye.addr}:8848

righteye:
  addr: 192.168.189.xxx

#dubbo-cloud-provider-sample

配置文件application.yaml

server:
  port: 10057

spring:
  application:
    name: dubbo-cloud-consumer
  cloud:
    nacos:
      discovery:
        server-addr: ${righteye.addr}:8848
dubbo:
  application:
    name: ${spring.application.name}
  registry:
    address: spring-cloud://${spring.cloud.nacos.discovery.server-addr}
  protocol:
    name: dubbo
    port: -1

righteye:
  addr: 192.168.189.xxx

测试类:

@RestController
public class TestController {
    @DubboReference
    private DubboCloudService dubboCloudService;

    @GetMapping("/hello")
    public String testSayHello() {
        return dubboCloudService.sayHello();
    }
}

dubbo-cloud-provider-api 依赖含义

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

启动带有内置tomcat容器的springboot项目,不添加该依赖后续即使启动成功也不存在web容器。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>

dubbo-spring-cloud的启动器,含spring-cloud与dubbo整合的相关依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

Nacos服务注册中心

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

如果不引入commons-lang3的话会报错: java.lang.ClassNotFoundException: org.apache.commons.lang3.StringUtils。但是在2018年的时候就提示已经移除了commons-lang3,详见[dubbo-1920] remove commons-lang3 dependency by beiwei30 · Pull Request #1921 · apache/dubbo · GitHub

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>

处理异常:Failed to instantiate [feign.jaxrs2.JAXRS2Contract]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: javax/ws/rs/Path

参考链接

dubbo文档:
dubbo3.x Java JDK入门

https://github.com/apache/dubbo-spring-boot-project

spring-cloud整合dubbo案例

解决方案:
SpringCloudAlibaba版本升级遇到的问题

解决升级 Spring Boot 2.6后,因循环引用导致启动时报错的问题

使用spring cloud,nacos,dubbo,gateway搭建微服务

相关文章:

  • 理解红黑树
  • 【精通内核】CPU控制并发原理CPU中断控制
  • 牛客 NC208246 胖胖的牛牛
  • 源码安装nginx及其配置
  • Vue element-ui表格嵌进度条
  • 前后数据传输协议规范
  • Unions
  • 基于springboot的地质灾害应急管理系统
  • Structures
  • 向量数据库入坑指南:聊聊来自元宇宙大厂 Meta 的相似度检索技术 Faiss
  • 电子邮件营销新趋势-自动化
  • ICT产业关联效应的国际比较——基于投入产出的分析
  • 【algorithm】算法学习----堆
  • Q_ENUM Q_ENUMS Q_ENUM_NS Q_FLAG Q_FLAGS Q_FLAG_NS
  • 国外5G行业应用产业政策分析及对我国的启示
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 11111111
  • conda常用的命令
  • HTML中设置input等文本框为不可操作
  • Js基础知识(四) - js运行原理与机制
  • Linux链接文件
  • mac修复ab及siege安装
  • Redis 懒删除(lazy free)简史
  • SQL 难点解决:记录的引用
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Vim Clutch | 面向脚踏板编程……
  • vuex 笔记整理
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 爱情 北京女病人
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 前端面试总结(at, md)
  • 写给高年级小学生看的《Bash 指南》
  • 学习Vue.js的五个小例子
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 运行时添加log4j2的appender
  • 容器镜像
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​Linux·i2c驱动架构​
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #Ubuntu(修改root信息)
  • (3)llvm ir转换过程
  • (AngularJS)Angular 控制器之间通信初探
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (阿里云万网)-域名注册购买实名流程
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (二)Eureka服务搭建,服务注册,服务发现
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (状压dp)uva 10817 Headmaster's Headache
  • *Django中的Ajax 纯js的书写样式1
  • .NET CORE 第一节 创建基本的 asp.net core