Dubbo内部服务调用

    • 一、Dubbo介绍
    • 二、Dubbo 与 SpringCloud 的通信 Openfeign的区别
      • 1、协议支持方面
      • 2、通信性能方面
    • 三、Nacos介绍
      • 1、Nacos 与 Eureka 的选择
    • 四、项目搭建
      • 1、创建父工程
        • 1)新建父工程项目gateway_nacos_dubbo_springcloud
        • 2)在build.gradle中配置项目依赖版本控制
      • 2、创建网关 gateway
        • 1)新建子工程项目demo-gateway
        • 2)在build.gradle中引入`启动器`以及依赖
        • 3)启动类
        • 4)配置文件 bootstrap.yaml
      • 3、创建接口
        • 1)新建子工程项目demo-interface
        • 2)创建接口
      • 4、创建提供者
        • 1)新建子工程项目demo-provider
        • 2)在build.gradle中引入**启动器**以及依赖
        • 3)配置文件 application.yaml
        • 4)启动类
        • 5)提供者service 需要实现接口
      • 5、创建消费者
        • 1)新建子工程项目demo-consumer
        • 2)在build.gradle中引入**启动器**以及依赖
        • 3)配置文件application.yaml
        • 4)启动类
        • 5)controller层
        • 6)service层
        • 7)需要配置**网关策略配置**
            • 7.1 在demo-gateway项目中引入依赖
            • 7.2 Nacos客户端添加配置
            • 7.3 在demo-gateway项目的bootstrap.yaml配置文件中添加
      • 6、发送请求测试
    • 五、项目结构
      • 1、父子项目结构
      • 2、网关demo-gateway结构
      • 3、接口 demo-interface 结构
      • 4、提供者结构
      • 5、消费者demo-consumer结构

一、Dubbo介绍

Apache Dubbo是一款微服务开发框架,它提供了 RPC通信 与 微服务治理 两大关键能力

二、Dubbo 与 SpringCloud 的通信 Openfeign的区别

1、协议支持方面

  • Feign更加优雅简单。Feign是通过REST API实现的远程调用,基于Http传输协议,服务提供者需要对外暴露Http接口供消费者调用,服务粒度是http接口级的。通过短连接的方式进行通信,不适合高并发的访问
  • Dubbo方式更灵活。Dubbo是通过RPC调用实现的远程调用,支持多传输协议(Dubbo、Rmi、http、redis等等),可以根据业务场景选择最佳的方式,非常灵活。默认的Dubbo协议:利用Netty,TCP传输,单一、异步、长连接,适合数据量小、高并发和服务提供者远远少于消费者的场景。Dubbo通过TCP长连接的方式进行通信,服务粒度是方法级的。

2、通信性能方面

  • Feign基于Http传输协议,底层实现是rest。在高并发场景下性能不够理想。
  • Dubbo框架的通信协议采用RPC协议,属于传输层协议,提升了交互的性能,保持了长连接,高性能。

三、Nacos介绍

Nacos致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

1、Nacos 与 Eureka 的选择

  • Eureka 是 springcloud最早的注册中心,目前已经进入停更维护
  • Nacos 除了服务的注册发现之外,还支持动态配置服务。动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷

四、项目搭建

1、创建父工程

1)新建父工程项目gateway_nacos_dubbo_springcloud

2)在build.gradle中配置项目依赖版本控制

plugins {id 'java'id 'org.springframework.boot' version '2.7.0'//springboot依赖版本id 'io.spring.dependency-management' version '1.0.11.RELEASE' //spring的依赖管理插件版本}//版本控制ext {set('springCloudVersion', "2021.0.3") //SpringCloud依赖版本set('springCloudAlibabaVersion', "2021.0.1.0") //SpringCloudAlibaba依赖版本set('springBootVersion', "2.7.0")}//全部模块通用配置allprojects{// 项目的默认名称和版本group ='com.threesides'version ='1.0.0-SNAPSHOT'// 指定JDK版本sourceCompatibility = '11'// 指定仓库地址repositories {// aliyun镜像maven { url 'https://maven.aliyun.com/repository/public' }maven { url 'https://maven.aliyun.com/repository/google' }maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }maven { url 'https://maven.aliyun.com/repository/spring' }maven { url 'https://maven.aliyun.com/repository/grails-core' }maven { url 'https://maven.aliyun.com/repository/apache-snapshots' }//本地仓库mavenLocal()// 中央️仓库mavenCentral()}}// 子模块配置subprojects {// 使用插件apply plugin: 'java'apply plugin: 'org.springframework.boot'apply plugin: 'io.spring.dependency-management'//子模块通用依赖dependencies {testImplementation "org.springframework.boot:spring-boot-starter-test:${springBootVersion}"testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:${springBootVersion}"}//子模块依赖管理dependencyManagement {dependencies {dependency "org.springframework.boot:spring-boot-starter:${springBootVersion}"}imports {mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"mavenBom "com.alibaba.cloud:spring-cloud-alibaba-dependencies:${springCloudAlibabaVersion}"}}}

2、创建网关 gateway

1)新建子工程项目demo-gateway

2)在build.gradle中引入启动器以及依赖

group 'com.threesides'version '1.0.0-SNAPSHOT'jar.enabled = truebootJar.enabled = truedependencies {testImplementation 'org.springframework.boot:spring-boot-starter-test'//测试环境testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'implementation group: 'com.alibaba.cloud', name: 'spring-cloud-starter-alibaba-nacos-discovery' //注册中心,这里使用的是alibaba-nacos,其他注册中心也可implementation group: 'com.alibaba.cloud', name: 'spring-cloud-starter-alibaba-nacos-config' //配置中心,这里使用的是alibaba-nacosimplementation 'org.springframework.cloud:spring-cloud-starter-gateway'//网关 gateway 项目不能同时依赖spring-boot-starter-webimplementation 'org.springframework.cloud:spring-cloud-loadbalancer'// 负载均衡 SpringCloud 版本在 2021.0.x以上必须引依赖implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap'}test {useJUnitPlatform()}

3)启动类

@SpringBootApplication@EnableDiscoveryClientpublic class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);}}

4)配置文件 bootstrap.yaml

server:port: 1101spring:application:name: demo-gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848 

3、创建接口

1)新建子工程项目demo-interface

2)创建接口

public interface DemoInterface {public String demo(String message);}

4、创建提供者

1)新建子工程项目demo-provider

2)在build.gradle中引入启动器以及依赖

group 'com.threesides'version '1.0.0-SNAPSHOT'archivesBaseName = "demo-provider"jar.enabled = truebootJar.enabled = truedependencies {// 引入本地的xxxx模块implementation project(':demo-interface')// 引入 spring-cloud 依赖// 注册中心,这里使用的是alibaba-nacos,其他注册中心也可。implementation group: 'com.alibaba.cloud', name: 'spring-cloud-starter-alibaba-nacos-discovery'implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web'//dubboimplementation 'org.apache.dubbo:dubbo-spring-boot-starter:3.0.8'implementation 'com.alibaba.nacos:nacos-client:2.1.0' // 由于我使用的客户端是2.1.0  //由于报错java.lang.ClassNotFoundException: com.google.common.collect.Maps//引入guavaimplementation 'com.google.guava:guava:31.1-jre'testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'}test {useJUnitPlatform()}

3)配置文件 application.yaml

server:port: 8010#dubbo的配置dubbo:application:name: demo-providerregistry:address: nacos://127.0.0.1:8848

4)启动类

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;@EnableDubbo@SpringBootApplicationpublic class ProviderApplication {public static void main(String[] args) {SpringApplication.run(ProviderApplication.class, args);}}

5)提供者service 需要实现接口

import org.apache.dubbo.config.annotation.DubboService;@DubboServicepublic class DemoProviderImpl implements DemoInterface {@Overridepublic String demo(String message) {System.out.println(message);return message+"成功了";}}

5、创建消费者

1)新建子工程项目demo-consumer

2)在build.gradle中引入启动器以及依赖

group 'com.threesides'version '1.0.0-SNAPSHOT'archivesBaseName = "demo-consumer"jar.enabled = truebootJar.enabled = truedependencies {// 引入本地的xxxx模块implementation project(':demo-interface')// 引入 spring-cloud 依赖// 注册中心,这里使用的是alibaba-nacos,其他注册中心也可。implementation group: 'com.alibaba.cloud', name: 'spring-cloud-starter-alibaba-nacos-discovery'implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web'//dubboimplementation 'org.apache.dubbo:dubbo-spring-boot-starter:3.0.8'implementation 'com.alibaba.nacos:nacos-client:2.1.0' // 由于我使用的客户端是2.1.0  //由于报错java.lang.ClassNotFoundException: com.google.common.collect.Maps//引入guavaimplementation 'com.google.guava:guava:31.1-jre'testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'}test {useJUnitPlatform()}

3)配置文件application.yaml

server:port: 8011spring:application:name: demo-consumercloud:nacos:discovery:server-addr: http://127.0.0.1:8848 # 注册中心http://ip:端口号dubbo:registry:address: nacos://127.0.0.1:8848register: false

4)启动类

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;@EnableDubbo@SpringBootApplicationpublic class ComsumerApplication {public static void main(String[] args) {SpringApplication.run(ComsumerApplication.class, args);}}

5)controller层

@RestController@RequestMapping("/demo")public class DemoConsumerController {@Autowiredprivate DemoConsumerService demoConsumerService;@GetMapping("/getProviderService")public String getProviderService() {return demoConsumerService.getProviderService();}}

6)service层

import org.apache.dubbo.config.annotation.DubboReference;@Servicepublic class DemoConsumerService {@DubboReferenceprivate DemoInterface demoInterface;public String getProviderService() {return demoInterface.demo("使用Dubbo调用");}}

7)需要配置网关策略配置

这里引入Nacos的配置中心的使用

7.1 在demo-gateway项目中引入依赖

implementation group: 'com.alibaba.cloud', name: 'spring-cloud-starter-alibaba-nacos-config'

7.2 Nacos客户端添加配置


spring:cloud:gateway:discovery:locator:enabled: true #开启网关拉取nacos的服务routes:- id: demo-consumeruri: lb://demo-consumerpredicates:- Path=/demo/**
7.3 在demo-gateway项目的bootstrap.yaml配置文件中添加
spring:cloud:nacos:config:server-addr: 127.0.0.1:8848file-extension: yamlrefresh-enabled: true # 是否动态刷新,默认为false# 支持多个共享dataId的配置,优先级小于extension-configs,shared-configs是一个集合shared-configs[0]:# 网关 通用配置可以定义在这个里面dataId: demo-gateway.yaml # 配置文件名dataIdgroup: DEFAULT_GROUP# 默认为DEFAULT_GROUP 

6、发送请求测试

这里使用的Restful Fast Request插件测试
http://localhost:1101/demo/getProviderService

五、项目结构

1、父子项目结构

2、网关demo-gateway结构

3、接口 demo-interface 结构

4、提供者结构

5、消费者demo-consumer结构