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
相互学习、共同进步...
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/503077.html 如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!