SpringCloud采用Dubbo遠程調用(SpringCloud Alibaba)


系統架構:

  

  這里只演示以下組件,其他組件的使用和SpringCloud一樣

    application-1 :應用1,模擬應用,提供http接口服務。

    service-1 :微服務1,模擬微服務,提供dubbo接口服務。

    service-2 :微服務2,模擬微服務,提供dubbo接口服務。

  架構中 application與sevice的區別:

    service 提供了基礎服務功能;application組裝基礎服務功能,提供給用戶直接可用的業務。
    service 服務粒度小、功能基礎,不易發生改變;application提供上游業務功能,緊貼業務需求,容易發生改變。
    形成 service支撐application的整體架構,增加多變的application甚至不需要變動service。

工程結構:

  

 創建父工程:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
        <spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

創建子模塊application1:dubbo服務消費者

    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

  1.實現 application1 的功能

@RestController
public class Application1Controller {

    @GetMapping("/service")
    public String service() {
        return "test";
    }
}

  2.application1 的配置,定義bootstrap.yml

server:
  port: 56020
  servlet:
    context-path: /application1
spring:
  application:
    name: application1
  main:
    allow-bean-definition-overriding: true #Spring Boot 2.1 需要設定,允許覆蓋bean
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: b0818a15-92f4-438b-ab16-1b0d13c1d225 #開發環境
      config:
        server-addr: 127.0.0.1:8848 #配置中心地址,和服務注冊地址一樣,nacos集服務管理和配置管理於一身
        file-extension: yaml
        namespace: b0818a15-92f4-438b-ab16-1b0d13c1d225 #開發環境
        group: NACOS_MICROSERVICE_GROUP #xx業務組

  3.application1 啟動類

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

  4.啟動服務,訪問 http://localhost:56020/application1/service 進行測試

創建子模塊service1:

  1.定義service-1-api:方便其它服務調用dubbo服務,專門定義api工程,此工程將作為jar被其它工程依賴。

    定義服務接口

public interface ConsumerService {
    String service();
}

  2.定義service-1-server:實現 service-1-api 定義的服務接口

    <dependencies>
        <dependency>
            <groupId>pers.fgy.nacos</groupId>
            <artifactId>service‐1‐api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>
    </dependencies>

    實現 Dubbo 服務

      注意:使用 @org.apache.dubbo.config.annotation.Service 標記 dubbo 服務

@org.apache.dubbo.config.annotation.Service
public class ConsumerServiceImpl implements ConsumerService {
    @Override
    public String service() {
        return "Consumer invoke ";
    }
}

    配置 Dubbo 服務

server:
  port: 56030
spring:
  application:
    name: service1
  main:
    allow-bean-definition-overriding: true #Spring Boot 2.1 需要設定,允許覆蓋bean
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: b0818a15-92f4-438b-ab16-1b0d13c1d225 #開發環境
      config:
        server-addr: 127.0.0.1:8848 #配置中心地址,和服務注冊地址一樣,nacos集服務管理和配置管理於一身
        file-extension: yaml
        namespace: b0818a15-92f4-438b-ab16-1b0d13c1d225 #開發環境
        group: NACOS_MICROSERVICE_GROUP #xx業務組
dubbo:
  scan:
    # dubbo 服務掃描基准包
    base-packages: pers.fgy.nacos.service
  protocol:
    # dubbo 協議
    name: dubbo
    # dubbo 協議端口
    port: 20881
  registry:
    address: spring-cloud://localhost #相當於nacos的服務地址127.0.0.1:8848
  application:
    qos-enable: false #dubbo運維服務是否開啟
  consumer:
    check: false #啟動時是否檢查依賴的服務

    啟動服務消費方應用

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

      當 Service1Bootstrap 啟動后,應用 service1 將出現在 Nacos 控制台界面。

實現 application1調用Service1:

  在application1中引用service1

        <dependency>
            <groupId>pers.fgy.nacos</groupId>
            <artifactId>service‐1‐api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

  引入 spring-cloud-starter-dubbo 依賴,它會根據接口生成代理對象

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>

  實現遠程調用

@RestController
public class Application1Controller {
    
    @org.apache.dubbo.config.annotation.Reference
    private ConsumerService consumerService;

    @GetMapping("/service")
    public String service() {
        return "test" + consumerService.service();
    }
}

    注意:這里的 @Reference 注解是 org.apache.dubbo.config.annotation.Reference

  請求:http://localhost:56020/application1/service consumerService 正常生成代理對象,service1被調用。

創建子模塊service2:

  1.定義service-2-api:

    定義服務接口

public interface ProviderService {
    String service();
}

  2.定義service-2-server

    <dependencies>
        <dependency>
            <groupId>pers.fgy.nacos</groupId>
            <artifactId>service-2-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>
    </dependencies>

    實現 Dubbo 服務

@org.apache.dubbo.config.annotation.Service
public class ProviderServiceImpl implements ProviderService {
    @Override
    public String service() {
        return "Provider invoke";
    }
}

    配置 Dubbo 服務

server:
  port: 56040
spring:
  application:
    name: service2
  main:
    allow-bean-definition-overriding: true #Spring Boot 2.1 需要設定,允許覆蓋bean
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: b0818a15-92f4-438b-ab16-1b0d13c1d225 #開發環境
      config:
        server-addr: 127.0.0.1:8848 #配置中心地址,和服務注冊地址一樣,nacos集服務管理和配置管理於一身
        file-extension: yaml
        namespace: b0818a15-92f4-438b-ab16-1b0d13c1d225 #開發環境
        group: NACOS_MICROSERVICE_GROUP #xx業務組
dubbo:
  scan:
    # dubbo 服務掃描基准包
    base-packages: pers.fgy.nacos.service
  protocol:
    # dubbo 協議
    name: dubbo
    # dubbo 協議端口
    port: 20891
  registry:
    address: spring-cloud://localhost #相當於nacos的服務地址127.0.0.1:8848
  application:
    qos-enable: false #dubbo運維服務是否開啟
  consumer:
    check: false #啟動時是否檢查依賴的服務

    啟動服務提供方應用

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

實現service1調用service2:

  在service1中添加service2的依賴

        <dependency>
            <groupId>pers.fgy.nacos</groupId>
            <artifactId>service-2-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

  實現遠程調用

@org.apache.dubbo.config.annotation.Service
public class ConsumerServiceImpl implements ConsumerService {

    @org.apache.dubbo.config.annotation.Reference private ProviderService providerService;

    @Override
    public String service() {
        // return "Consumer invoke ";
        return "Consumer invoke | " + providerService.service();
    }
}

  服務啟動后立即請求:http://localhost:56020/application1/service 可能會出現錯誤,是因為服務還沒有注冊成功,過一會再訪問即可

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM