【Dubbo】入门搭建


快速入门

场景:提供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搭建微服务

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值