1. 程式人生 > >SpringBoot純使用註解整合Dubbo和zookeeper叢集不配置xml(基於yml)

SpringBoot純使用註解整合Dubbo和zookeeper叢集不配置xml(基於yml)

      因專案需要,搭建了一個新的springBoot專案,開發過程中,原定的基於http提供給其他專案的介面,必須使用dubbo服務提供rpc介面,無奈之下只能去網上找demo,發現現在使用最多的是通過配置xml和bean來整合,沒有通過簡單的註解和yml的配置來實現的,尋找之下,發現已經有dubbo-spring-boot-starter的jar,而且是2.0版本的,去官網檢視api後整理出一個demo,希望為後來的同學提供幫助。官網地址:https://github.com/alibaba/dubbo-spring-boot-starter/

    下面來說流程:

    首先建立5個專案,兩個專案是介面,兩個專案是介面的實現及服務提供者,最後一個是測試用的服務使用者

   

然後引入以下的pom配置

		<!-- Spring Boot Dubbo 依賴 -->
		<dependency>
			<groupId>com.alibaba.spring.boot</groupId>
			<artifactId>dubbo-spring-boot-starter</artifactId>
			<version>2.0.0</version>
		</dependency>
		<!--zookeeper依賴 -->
		<dependency>
			<groupId>org.apache.zookeeper</groupId>
			<artifactId>zookeeper</artifactId>
			<version>3.4.8</version>
		</dependency>
		<dependency>
			<groupId>com.101tec</groupId>
			<artifactId>zkclient</artifactId>
			<version>0.10</version>
		</dependency>

介面的實現類專案和服務使用者需要單獨引入api介面的pom配置

接下來配置yml檔案

服務提供者的配置,注意scan掃描的位置,凡是要配置介面實現類的包都要掃描到

#spring.application.name=dubbo-provider
server:
  port: 8100
#應用名稱
spring:
  dubbo: 
    application:
#註冊在註冊中心的名稱,唯一標識,請勿重複
      id: auth-branch
      name: auth-branch
#註冊中心地址,zookeeper叢集,啟動輸出可以看見連結了多個
#單zookeeper服務:zookeeper://127.0.0.1:2181
    registry: 
      address: zookeeper://127.0.0.1:2181?backup=127.0.0.1:2180,127.0.0.1:2182
#暴露服務方式
    protocol:
      id: dubbo
#預設名稱,勿修改
      name: dubbo
#暴露服務埠 (預設是20880,修改埠,不同的服務提供者埠不能重複) 
      port: 20881
      status : server
#呼叫dubbo組建掃描的專案路徑
    scan: com.demo.branch.impl

服務呼叫者的配置,一樣scan掃描的位置是需要呼叫服務類的位置

#spring.application.name=dubbo-consumer
server: 
  context-path: /auth
  port: 8102
#應用名稱
spring: 
  dubbo:
    application:
      name: auth-consumer
#註冊中心地址
    protocol:
      name: dubbo
    registry:
      address: zookeeper://127.0.0.1:2181?backup=127.0.0.1:2180,127.0.0.1:2182
#呼叫dubbo組建掃描的專案路徑
    scan: com.demo.controller
#telnet埠
    qos:
      port: 22223
#檢查服務是否可用預設為true,不可用時丟擲異常,阻止spring初始化,為方便部署,可以改成false
    consumer: 
      check: false 

服務呼叫者不需要配置埠,因為他會根據註解自動尋找對應的埠

接下來在所有的專案入口都加上dubbo的註解

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.CrossOrigin;

import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;

@CrossOrigin//允許跨越訪問
@SpringBootApplication//springBoot專案入口
@EnableDubboConfiguration
public class AuthConsumerApplication {

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

在auth-master-api和auth-branch-api專案中寫介面,供服務提供者和服務使用者引入,介面是普通的介面即可

public interface BranchService {

	public String branchTest(String count);
	
}

在auth-master和auth-branch專案中各自配置服務提供者介面的實現類

import org.springframework.stereotype.Component;

import com.alibaba.dubbo.config.annotation.Service;
import com.demo.branch.service.BranchService;
/**
 * rpc服務介面實現類
 */
@Service(interfaceClass = BranchService.class) //dubbo的service,注入介面
@Component //spring註解,掃描包
public class AuthBranchImpl implements BranchService {

	@Override
	public String branchTest(String count) {
		String re = "AuthBranch服務呼叫成功:"+count;
		System.out.println(re);
		return re;
	}

}

兩個服務提供者都按照這種方式注入,注意:service是引入dubbo的而不是spring的

阿里的service註解還提供了其他引數,包括版本號等:

  version = "1.0.0",
        application = "${dubbo.application.id}",
        protocol = "${dubbo.protocol.id}",
        registry = "${dubbo.registry.id}"

配置服務呼叫者/auth-consumer專案的Controller

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.dubbo.config.annotation.Reference;
import com.demo.branch.service.BranchService;
import com.demo.master.service.MasterService;

@RestController
@RequestMapping("/consumer")
public class ConsumerController {
	static final String branchUrl = "dubbo://127.0.0.1:20881";
	static final String masterUrl = "dubbo://127.0.0.1:20880";
	
	
	@Reference(url = branchUrl)
	BranchService branchService;
	
	@Reference(url = masterUrl)
	MasterService masterService;
	
    @RequestMapping("branch")
    public String branch() {
    	System.out.println("-----dubbo服務測試方法-----同時呼叫多個dubbo服務測試-----");
    	String re = branchService.branchTest("consumer 請求服務");
    	return re;
    }
    
    @RequestMapping("master")
    public String master() {
    	System.out.println("-----dubbo服務測試方法-----同時呼叫多個dubbo服務測試-----");
    	String re = masterService.masterTest("consumer 請求服務");
    	return re;
    }

}
@Reference的註解也包含了版本號及繫結的id
(version = "1.0.0",
            application = "${dubbo.application.id}",
            url = "dubbo://localhost:12345")

接下來在先啟動提供服務的專案,再啟動使用服務的專案


看到這個圖示 說明dubbo服務開始啟動,看控制檯列印的資訊

然後分別呼叫兩個介面

返回成功,基礎的專案搭建完畢。

專案git地址:https://gitee.com/xzxWord/SpringBootIntegrateDubbo.git

有問題的同學請留言,希望能一起跨過各種的坑,謝謝