本文是介紹springboot和dubbo架構的搭建,然後使用zookeeper作為注冊中心進行管理。
首先建立maven項目,并加入依賴,建立maven項目需要在pom中加入parent标簽指向springboot如下圖所示:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
其餘maven配置如下:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--spring-boot-starter-dubbo-->
<dependency>
<groupId>com.gitee.reger</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.9</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
下面是建立的目錄結構
由于父級pom中已經添加了所需的基本依賴是以在 consumers 和 providers 中不需要任何依賴了。但是需要由于這是一個springboot + dubbo + zookeeper的項目,需要啟動這兩個子產品,還需要配置zookeeper注冊中心的相關資訊,是以在consumers 和 providers 中加入配置檔案并配置相關資訊。
consumers 的配置檔案 application.yml 如下所示:
server:
port: 8080 #tomcat端口号
spring:
dubbo:
application:
name: service-consumers
base-package: com.myself # dubbo服務釋出者實作類注解所在的包
registry:
address: 192.168.1.133 # zookeeper注冊中心的位址
port: 2181 # zookeeper注冊中心的端口
protocol:
name: dubbo
serialization: hessian2
provider:
retries: 0 # 服務調用重試次數,服務釋出者不給重試,讓服務調用者自己重試
providers 的配置檔案 application.yml如下所示:
server:
port: 8081 #tomcat 啟動端口号
spring:
dubbo:
application:
name: service-provider
base-package: com.myself.service # dubbo服務釋出者實作類注解所在的包
registry:
address: 192.168.1.133 # zookeeper注冊中心的位址
port: 2181 # zookeeper注冊中心的端口
protocol:
name: dubbo
serialization: hessian2
provider:
retries: 0 # 服務調用重試次數,服務釋出者不給重試,讓服務調用者自己重試
下面我們先定義一個接口類,為了讓生産者和消費者都可以引用到這個類,我們把接口類單獨定義到一個子產品中(該子產品不需要任何配置,隻是為了解耦使用),讓兩者都引用該子產品就可以了。
package com.myself.service.book;
/**
* Created by hang on 2018/8/27.
*/
public interface BookService {
String getBook(String name);
}
下面是Controller類的寫法
package com.myself.controller;
import com.myself.service.book.BookService;
import com.reger.dubbo.annotation.Inject;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
/**
* Created by hang on 2018/8/29.
*/
@RestController
@Component//啟動時調用
public class BookController implements CommandLineRunner {
// 使用相容注入,可以使用dubbo原生注解@Reference注入
@Inject
public BookService service;
// 使用相容注入
@Inject
public BookService bidService;
@Override
public void run(String... args){
String name="system start";
System.out.println(service.getBook(name));
System.out.println("調用完成");
}
@RequestMapping(value = "/", method = RequestMethod.GET)
@ResponseBody
public String run(String name){
name= name==null?"system start":name;
return service.getBook(name);
}
}
我們還要再寫一個springboot的啟動類如下所示
package com.myself;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 實作CommandLineRunner這個接口是為了重寫它的run方法,
* 啟動完成以後會自動執行run方法的内容。
* Created by hang on 2018/8/29.
*/
@SpringBootApplication
public class ConsumerApplication implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
System.err.println("服務調用者------>>啟動完畢");
}
}
下面是providers 的寫法(由于這裡是測試搭建項目是以方法并沒有實際用處,隻是為了示範項目的搭建):
package com.myself.service.book;
import com.alibaba.dubbo.config.annotation.Service;
/**
* Created by hang on 2018/8/27.
*/
@Service()//注意:這裡的service是dubbo的注解com.alibaba.dubbo.config.annotation.Service
public class BookServiceImpl implements BookService {
@Override
public String getBook(String name) {
return "擷取到書名為《" + name + "》的資訊";
}
}
下面是該子產品的啟動類
package com.myself;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.util.concurrent.TimeUnit;
/**
* Created by hang on 2018/8/29.
*/
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) throws InterruptedException {
SpringApplication.run(ProviderApplication.class, args);
TimeUnit.MINUTES.sleep(10); //提供者main線程暫停10分鐘等待被調用
System.err.println("服務提供者------>>服務關閉");
}
// @Override
// public void run(String... strings) throws Exception {
// System.err.println("服務提供者------>>啟動完畢");
// }
}
這樣整個demo項目就搭建完成了,可以啟動我們之前搭建的注冊中心(之前有寫過zookeeper注冊中心的搭建方法,不會的可以看一下)和這兩個子產品測試一下我們的項目是否可以成功的使用。
下面是我連接配接我我再虛拟機中搭建的zookeeper注冊中心的測試結果。
首先啟動我們的注冊中心結構如下圖所示
我們這時發現提供者和消費者都是0。接下來我們啟動提供者也就是生産者providers子產品。
看到這些資訊表示我們啟動成功了。這時候看我們的zookeeper注冊中心會發現提供者已經變成了1,服務也變成了1。
接下啦是我們啟動消費者Controller。如下所示
這時候我們再重新重新整理zookeeper注冊中心會發現消費者也為1了
接下來我們可以通路下我們上面寫的接口這時候你會發現完全沒有問題,我們的Service 和 Controller部署到了兩台tomcat上面也完全可以通路。