辽宁模板网站建设公司,网站推广工作好做吗,clef wordpress,网站建设计划书怎么写dubbo和fegin的差异
一、Feign与Dubbo概述 Feign是一个声明式的Web服务客户端#xff0c;使得编写HTTP客户端变得更简单。通过简单的注解#xff0c;Feign将自动生成HTTP请求#xff0c;使得服务调用更加便捷。而Dubbo是一个高性能、轻量级的Java RPC框架#xff0c;提供了…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 version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.3.0.RELEASE/versionrelativePath/ /parentgroupIdcom.zwm/groupIdartifactIddubbo-demo/artifactIdpackagingpom/packagingversion1.0-SNAPSHOT/versionmodulesmodulecommon-api/modulemoduleconsumer/modulemoduleprovider1/modulemoduleprovider2/module/modulespropertiesjava.version8/java.versioncom.alibaba.cloud.version2.2.3.RELEASE/com.alibaba.cloud.versionorg.spring.cloud.versionHoxton.SR8/org.spring.cloud.versionorg.spring.boot.version2.3.2.RELEASE/org.spring.boot.version/propertiesdependencyManagement!--使用management一次性依赖多个parent项目--dependencies!--springboot start依赖--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion${org.spring.boot.version}/version!--添加type和scope标签 并设置为pom和import 要不子模块引不到这些依赖--typepom/typescopeimport/scope/dependency!--springCloudAlibaba 依赖--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion${com.alibaba.cloud.version}/version!--添加type和scope标签 并设置为pom和import 要不子模块引不到这些依赖--typepom/typescopeimport/scope/dependency!--springCloud依赖--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion${org.spring.cloud.version}/version!--添加type和scope标签 并设置为pom和import 要不子模块引不到这些依赖--typepom/typescopeimport/scopeexclusions!--因为后续要用dubbo去做远程调用 所以这里就把openfeign的依赖给排除掉--exclusiongroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/exclusion/exclusions/dependency/dependencies/dependencyManagement
/project
服务提供者pom两个服务提供者配置一样这样就只展示一个。
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentartifactIddubbo-demo/artifactIdgroupIdcom.zwm/groupIdversion1.0-SNAPSHOT/version/parentmodelVersion4.0.0/modelVersionartifactIdprovider2/artifactIddependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!--nacos配置中心--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactId/dependency!--nacos注册中心--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactIdexclusionsexclusionartifactIdhttpclient/artifactIdgroupIdorg.apache.httpcomponents/groupId/exclusion/exclusions/dependency!--dubbo与springboot自动装配starter--dependencygroupIdorg.apache.dubbo/groupIdartifactIddubbo-spring-boot-starter/artifactIdversion2.7.8/versionexclusionsexclusiongroupIdlog4j/groupIdartifactIdlog4j/artifactId/exclusionexclusionartifactIdspring-context/artifactIdgroupIdorg.springframework/groupId/exclusion/exclusions/dependency!--dubbo - nacos注册--dependencygroupIdcom.alibaba/groupIdartifactIddubbo-registry-nacos/artifactIdversion2.7.7/versionexclusionsexclusionartifactIdnacos-client/artifactIdgroupIdcom.alibaba.nacos/groupId/exclusion/exclusions/dependencydependencygroupIdcom.zwm/groupIdartifactIdcommon-api/artifactIdversion1.0-SNAPSHOT/versionscopecompile/scope/dependency/dependencies
/project
消费者pom
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentartifactIddubbo-demo/artifactIdgroupIdcom.zwm/groupIdversion1.0-SNAPSHOT/version/parentmodelVersion4.0.0/modelVersionartifactIdconsumer/artifactIddependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!--nacos配置中心--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactId/dependency!--nacos注册中心--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactIdexclusionsexclusionartifactIdhttpclient/artifactIdgroupIdorg.apache.httpcomponents/groupId/exclusion/exclusions/dependency!--dubbo与springboot自动装配starter--dependencygroupIdorg.apache.dubbo/groupIdartifactIddubbo-spring-boot-starter/artifactIdversion2.7.8/versionexclusionsexclusiongroupIdlog4j/groupIdartifactIdlog4j/artifactId/exclusionexclusionartifactIdspring-context/artifactIdgroupIdorg.springframework/groupId/exclusion/exclusions/dependency!--dubbo - nacos注册--dependencygroupIdcom.alibaba/groupIdartifactIddubbo-registry-nacos/artifactIdversion2.7.7/versionexclusionsexclusionartifactIdnacos-client/artifactIdgroupIdcom.alibaba.nacos/groupId/exclusion/exclusions/dependencydependencygroupIdcom.zwm/groupIdartifactIdcommon-api/artifactIdversion1.0-SNAPSHOT/versionscopecompile/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:8848use-as-config-center: false #不使用配置中心 要不他会往配置中心注册一个当前application.name的配置protocol:name: dubboport: -1 #自动创建端口
两个服务提供者配置基本一样除了端口和应用名称外。
消费者application.yaml
server:port: 8082
spring:application:name: spring-boot-dubbo-consumercloud:nacos:discovery:enabled: false #设置false属性 不让nacos自己注册 让dubbo去注册server-addr: 127.0.0.1:8848group: DEFAULT_GROUP# dubbo configuration
dubbo:registry:address: nacos://127.0.0.1:8848use-as-config-center: false #不使用配置中心 要不他会往配置中心注册一个当前application.name的配置protocol:name: dubboport: -1cloud:subscribed-services: dubbo-provider1,dubbo-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 {Overridepublic String getString(String name) {return provider1 say: hello! name;}
}注意上面的DubboService注解这个很重要用于暴露服务。启动类上面需要添加EnableDubbo服务提供者才需要添加消费者启动类不需要开启dubboscanBasePackages 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 {DubboReferenceprivate 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.langALL-UNNAMED 再启动另一个服务提供者 这时候就会看到另一个服务提供者也上来了大家可能会发现名称有点不一样有一个实例数还是2那是因为其中一个服务提供者暴露了两个服务。 接下来启动消费者 这个时候消费者也上来了可以在浏览器输入地址进行访问测试http://localhost:8082/my?namezwm123 如果你也能看到这样的效果那么恭喜大家springcloud基于Nacos组件整合Dubbo框架就实现了。
如果大家觉得配置起来很麻烦也可以直接下载https://download.csdn.net/download/javaweiming/90265288
相互学习、共同进步...