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

SpringCloud微服务:基于Nacos组件,整合Dubbo框架

dubbo和fegin的差异

一、Feign与Dubbo概述
Feign是一个声明式的Web服务客户端,使得编写HTTP客户端变得更简单。通过简单的注解,Feign将自动生成HTTP请求,使得服务调用更加便捷。而Dubbo是一个高性能、轻量级的Java RPC框架,提供了丰富的服务治理功能。

二、性能对比
调用性能:在单次调用方面,Feign的性能表现略逊于Dubbo。由于Feign的自动生成HTTP请求机制,其性能相较于Dubbo的直接RPC调用会有一定的损失。然而,对于大多数应用而言,这种性能差异并不明显。
负载均衡:Feign和Dubbo都提供了负载均衡功能。Feign使用Ribbon作为其负载均衡组件,而Dubbo则内置了负载均衡机制。在负载均衡方面,Dubbo提供了更多的配置选项和策略,具有更强的灵活性。
服务发现:Feign依赖于Eureka、Consul、Nacos等注册中心实现服务发现,而Dubbo则提供了内置的服务发现机制。在服务发现的性能和稳定性方面,Dubbo具有一定的优势。


三、区别分析
架构差异:Feign基于SpringCloud体系,更适用于微服务架构。而Dubbo则独立于任何框架,具有更强的通用性。
适用场景:对于简单的服务调用场景,Feign更加简洁易用。而当需要复杂的服务治理功能时,Dubbo则更具优势。
扩展性:Feign提供了丰富的注解和配置选项,可以轻松地与SpringCloud的其他组件集成。而Dubbo则提供了丰富的SPI机制,使得扩展更加灵活。
社区活跃度:Feign的社区相对活跃,随着SpringCloud的发展,Feign也在不断迭代和完善。Dubbo的社区虽然活跃度不如Feign,但凭借其多年的积累和沉淀,依然拥有大量的用户和稳定的支持者。

项目代码

项目结构图:

整体结构比较简单,两个服务提供者、一个消费者、一个接口定义模块。

先看各个模块的maven配置:

父工程pom:

<?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>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.0.RELEASE</version>
    <relativePath/> 
  </parent>

  <groupId>com.zwm</groupId>
  <artifactId>dubbo-demo</artifactId>
  <packaging>pom</packaging>
  <version>1.0-SNAPSHOT</version>
  <modules>
    <module>common-api</module>
    <module>consumer</module>
    <module>provider1</module>
    <module>provider2</module>
  </modules>

  <properties>
    <java.version>8</java.version>
    <com.alibaba.cloud.version>2.2.3.RELEASE</com.alibaba.cloud.version>
    <org.spring.cloud.version>Hoxton.SR8</org.spring.cloud.version>
    <org.spring.boot.version>2.3.2.RELEASE</org.spring.boot.version>
  </properties>
  <dependencyManagement><!--使用management一次性依赖多个parent项目-->
    <dependencies>
      <!--springboot start依赖-->
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>${org.spring.boot.version}</version>
        <!--添加type和scope标签 并设置为pom和import 要不子模块引不到这些依赖-->
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <!--springCloudAlibaba 依赖-->
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>${com.alibaba.cloud.version}</version>
        <!--添加type和scope标签 并设置为pom和import 要不子模块引不到这些依赖-->
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <!--springCloud依赖-->
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${org.spring.cloud.version}</version>
        <!--添加type和scope标签 并设置为pom和import 要不子模块引不到这些依赖-->
        <type>pom</type>
        <scope>import</scope>
        <exclusions>
          <!--因为后续要用dubbo去做远程调用 所以这里就把openfeign的依赖给排除掉-->
          <exclusion>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
          </exclusion>
        </exclusions>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>

服务提供者pom:两个服务提供者配置一样,这样就只展示一个。

<?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">
    <parent>
        <artifactId>dubbo-demo</artifactId>
        <groupId>com.zwm</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>provider2</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--nacos配置中心-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--nacos注册中心-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>httpclient</artifactId>
                    <groupId>org.apache.httpcomponents</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--dubbo与springboot自动装配starter-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.8</version>
            <exclusions>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-context</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--dubbo - > nacos注册-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo-registry-nacos</artifactId>
            <version>2.7.7</version>
            <exclusions>
                <exclusion>
                    <artifactId>nacos-client</artifactId>
                    <groupId>com.alibaba.nacos</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.zwm</groupId>
            <artifactId>common-api</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</project>

消费者pom:

<?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">
    <parent>
        <artifactId>dubbo-demo</artifactId>
        <groupId>com.zwm</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>consumer</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--nacos配置中心-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--nacos注册中心-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>httpclient</artifactId>
                    <groupId>org.apache.httpcomponents</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--dubbo与springboot自动装配starter-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.8</version>
            <exclusions>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-context</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--dubbo - > nacos注册-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo-registry-nacos</artifactId>
            <version>2.7.7</version>
            <exclusions>
                <exclusion>
                    <artifactId>nacos-client</artifactId>
                    <groupId>com.alibaba.nacos</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.zwm</groupId>
            <artifactId>common-api</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</project>

common-api的pom里面就不需要特殊的配置了。

接下来看nacos、dubbo的属性配置。

服务提供者:application.yaml;

server:
  port: 8081
spring:
  application:
    name: dubbo-provider2 #应用名称
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 #nacos服务与发现地址
        enabled: false #设置false 关闭nacos服务注册与发现 让dubbo自己往nacos进行注册
# dubbo configuration
dubbo:
  registry:
    address: nacos://127.0.0.1:8848
    use-as-config-center: false #不使用配置中心 要不他会往配置中心注册一个当前application.name的配置
  protocol:
    name: dubbo
    port: -1 #自动创建端口

两个服务提供者配置基本一样,除了端口和应用名称外。

消费者:application.yaml

server:
  port: 8082
spring:
  application:
    name: spring-boot-dubbo-consumer
  cloud:
    nacos:
      discovery:
        enabled: false #设置false属性 不让nacos自己注册 让dubbo去注册
        server-addr: 127.0.0.1:8848
        group: DEFAULT_GROUP

# dubbo configuration
dubbo:
  registry:
    address: nacos://127.0.0.1:8848
    use-as-config-center: false #不使用配置中心 要不他会往配置中心注册一个当前application.name的配置
  protocol:
    name: dubbo
    port: -1
    cloud:
      subscribed-services: 'provider1,provider2' #配置订阅服务多个服务用,隔开,不配置默认订阅注册中心所有服务

项目需要的相关配置基本就配置完成了,下面简单看下代码:

common-api里面就是简单的定义了接口:

package com.zwm.api;

public interface DemoService {

    String getString(String name);
}

服务提供者,两个服务基本一样,就是实现了上面的接口:

先看服务提供者的启动类:

package com.zwm;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * Hello world!
 */
@SpringBootApplication
@EnableDubbo(scanBasePackages = "com.zwm.service")
public class Provider1Application {
    public static void main(String[] args) {
        SpringApplication.run(Provider1Application.class, args);
    }
}
package com.zwm.service.impl;

import com.zwm.api.DemoService;
import org.apache.dubbo.config.annotation.DubboService;

@DubboService
public class ProviderServiceTest implements DemoService {
    @Override
    public String getString(String name) {
        return "provider1 say: hello!" + name;
    }
}

注意上面的@DubboService注解,这个很重要!!!用于暴露服务。启动类上面需要添加:@EnableDubbo(服务提供者才需要添加,消费者启动类不需要!!!),开启dubbo,(scanBasePackages = "com.zwm.service")这个如果配置文件里面配置了扫包的路径这里可以不需要。

消费者:去调用暴露的服务:

package com.zwm.controller;

import com.zwm.api.DemoService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.websocket.server.PathParam;

@RestController
public class ConsumerDemoController {
    @DubboReference
    private DemoService demoService;

    @GetMapping("/demo")
    public String hello(@PathParam("name") String name) {
        return demoService.getString(name);
    }
}

注意添加:@DubboReference注解!!!

服务启动要先启动服务提供者,启动后可以在nacos上看到注册的服务:

点开详情,可以查看详细的信息:端口号、应用名称、接口方法定义等等。

如果在启动的过程中出现了: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass。

那么这个时候需要在启动的时候添加如下参数:--add-opens java.base/java.lang=ALL-UNNAMED

再启动另一个服务提供者:

这时候就会看到另一个服务提供者也上来了,大家可能会发现名称有点不一样,有一个实例数还是2,那是因为其中一个服务提供者暴露了两个服务。

接下来启动消费者:
 

这个时候消费者也上来了,可以在浏览器输入地址进行访问测试:http://localhost:8082/my?name=zwm123

如果你也能看到这样的效果,那么恭喜大家springcloud基于Nacos组件,整合Dubbo框架就实现了。

如果大家觉得配置起来很麻烦,也可以直接下载:https://download.csdn.net/download/javaweiming/90265288

相互学习、共同进步...

原文地址:https://blog.csdn.net/javaweiming/article/details/145125423
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/503077.html

相关文章:

  • 蓝桥杯3525 公因数匹配 | 枚举+数学
  • [JavaScript] 运算符详解
  • 考前64天 学习笔记 - 形成“习惯体系”进行最小启动
  • 【大数据2025】Hadoop 万字讲解
  • Typora + PowerShell 在终端打开文件
  • OpenAI函数调用迎来重大升级:引入「最小惊讶原则」等软件工程实践,开发体验更上一层楼!
  • 《零基础Go语言算法实战》【题目 2-22】Go 调度器优先调度问题
  • 【Git】提交规范
  • 一个简单的html5导航页面
  • maven 项目怎么指定打包后名字
  • Http 响应状态码 前后端联调
  • 盲盒摆摊交友系统架构与功能分析
  • 网络学习记录6
  • opencv的NLM去噪算法
  • flask_sqlalchemy relationship 子表排序
  • 【实现案例】应用层面基于 MyBatis-Plus 实现数据表记录创建和修改时间自动同步
  • java项目之网上点餐系统源码(springboot+mysql+vue)
  • Git 的引用规格(refspec)语法
  • 调用Kimi的API接口使用,对话,json化,产品化
  • 3D扫描建模有哪些优势和劣势?
  • 开发指南090-使用python做微服务
  • centos systemd方式配置jar开机自启
  • 数据结构:栈(Stack)和队列(Queue)—面试题(二)
  • ssh2-sftp-client和ssh2配合使用js脚本快速部署项目到服务器
  • 力扣264. 丑数 II
  • 后端接口获取的对象包含图片,渲染后端图片,拼接地址渲染,循环列表,vue+uniapp