SpringCloudAlibaba(五):SpringCloudAlibaba+Dubbo實踐


SpringCloud與Dubbo兩個框架一直以來都被用來作爲兩種框架進行比較,其實對於兩者之間進行比較是不公平的。SpringCloud可以說是一套完整的解決方案而Dubbo其實只是一種RPC和服務治理的實現方案。

Dubbo一直以來在國內有較多的使用,雖然阿里中間有一段時間沒有進行維護,但是受衆羣體還是比較多的。同時在阿里不再維護的那段時期也由噹噹維護的DubboX推出。但是Dubbo的相關周邊組件也依然不是那麼的完善。

SpringCloud與Dubbo的整合方案不是那麼的完善,相對來說整合的都比較‘醜’。Dubbo的註冊中心是Zookeeper而SpringCloud一開始是不支持Zookeeper作爲註冊中心的。所以在大部分的公司架構中都是二者之間取其一。

SpringCloudAlibaba的出現解決了這樣的問題,SpringCloudAlibaba與Dubbo都選用Nacos作爲服務的註冊中心,並且可以類似於傳統項目的SpringCloud項目一樣使用Feign進行消費。今天就嘗試一下使用Dubbo連接Nacos註冊中心。

開始之前

可能之前寫過Dubbo的同學比較瞭解,Dubbo的服務提供方基本需要支持兩個項目,「api」「provider」「api」負責定義服務所提供的相關接口,以供消費方進行依賴。「provider」則提供相關接口的具體實現。
例如:

以上的結構是遵守了幾年的一個規範,提供的相關接口由api項目負責定義,provider負責進行實現,consumer則依賴相關api進行服務的調用。下面進行分步驟的實現。

api 定義服務接口

「IHelloService.java」

public interface IHelloService {

    String hello(String name);

}

privider構建服務提供方

  • 第一步:構建SpringBoot項目,引入SpringCloudAlibaba Nacos Dubbo相關依賴。同時也需要引入剛纔的api項目。
<dependencies>
    <dependency>
        <groupId>top.anydata.products.web</groupId>
        <artifactId>nacos-discovery-dubbo-api</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>
    <!--com.alibaba.cloud爲畢業版本,org.springfremework.cloud爲孵化版本-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-dubbo</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--必須包含,否則會報錯-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>
  • 第二步:實現api項目中定義的接口 「HelloServiceImpl.java」
@Service
public class HelloServiceImpl implements IHelloService {

    @Override
    public String hello(String name) {
        return "Hello:"+name;
    }

}

「WARN: 這裏的@Service註解不是springframework的而是org.apache.dubbo.config.annotation.Service註解」

  • 第三步:配置文件
server:
  port: 8080
spring:
  application:
    name: nacos-dubbo-provider
  main:
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      discovery:
        enabled: true
        register-enabled: true
        server-addr: localhost:8848
  profiles:
    active: true
dubbo:
  scan:
    base-packages: top.anydata.products.web.example.nacos_discovery_dubbo_provider.service
  protocol:
    name: dubbo
    port: -1
  registry:
    address: spring-cloud://localhost
  application:
    qos-enable: true
  cloud:
    subscribed-services: /

配置nacos註冊中心相關,同時增加dubbo相關的配置信息。其中 「scan」 表示要掃描的dubbo基礎包。

  • 創建SpringBootApplication啓動類與啓動驗證 「NacosDubboProviderApplication.java」
@SpringBootApplication
@EnableDiscoveryClient
public class NacosDubboProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosDubboProviderApplication.class,args);
    }

}

「啓動」

啓動成功後在Nacos服務列表中即可看到如上服務。

consumer服務消費方

第一步:構建服務消費調用項目,pom.xml 所需的依賴與 provider一致。

第二步:創建Controller進行服務消費

「HelloController.java」

@RestController
public class HelloController {

    @Reference
    IHelloService helloService;

    @RequestMapping(value = "hello")
    public String hello(String name){
        return helloService.hello(name);
    }

}

「WARN: @Reference 是org.apache.dubbo.config.annotation.Reference 有較多的參數配置可選,例如check=true校驗服務是否健康等」

第三步:Dubbo相關配置

server:
  port: 8081
  application:
    name: nacos-dubbo-consumer
  main:
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      discovery:
        enabled: true
        register-enabled: true
        server-addr: localhost:8848
spring:
  application:
    name: nacos-dubbo-consumer
dubbo:
  registry:
    address: spring-cloud://localhost
  cloud:
    subscribed-services: nacos-dubbo-provider
  application:
    qos-enable: false

「WARN:此處 dubbo.cloud.subscribed-services爲調用的服務,配置爲服務的註冊名稱。可以在Nacos中查看」

第四步:創建「NacosDubboConsumerApplication」類並啓動消費

「NacosDubboConsumerApplication.java」

@SpringBootApplication
@EnableDiscoveryClient
public class NacosDubboConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosDubboConsumerApplication.class,args);
    }

}

啓動成功後仍然使用postman進行測試。

結論

通過以上的測試,可以看到SpringCloud與Dubbo使用Nacos註冊中心來實現還是非常簡單的,Dubbo 的RPC性能優勢還是非常重要的。同時仍可以享受SpringCloud的各種便利。SpringCloudAlibaba提供的整合方案能夠融合SpringCloud與Dubbo的各種優勢,同時也便於原有SpringCloud與Dubbo用戶的遷移。

「本篇源碼示例:」

https://github.com/CainGao/SpringCloudAlibabaExample

本文分享自微信公衆號 - 指尖數蟲(zhijianshuchong)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章