springboot與dubbo結合

轉:http://www.cnblogs.com/Alandre/p/6490142.html

 寫的很好!
本文提綱
1、爲啥整合 Dubbo 實現 SOA
2、運行 springboot-dubbo-server 和 springboot-dubbo-client 工程
3、springboot-dubbo-server 和 springboot-dubbo-client 工程配置詳解
 

1、爲啥整合 Dubbo 實現 SOA

Dubbo 不僅僅只是高性能的 RPC 調用框架,更是 SOA 服務治理的一種方案。
核心
1. 遠程通訊,向本地調用同樣調用遠程方法。
2. 集羣容錯
3. 服務自動發現和註冊,可平滑添加或者刪除服務提供者。
 
咱們經常使用 Springboot 暴露 HTTP 服務,並走 JSON 模式。但慢慢量大了,一種 SOA 的治理方案。這樣能夠暴露出 Dubbo 服務接口,提供給 Dubbo 消費者進行 RPC 調用。下面咱們詳解下如何集成 Dubbo。
 

2、運行 springboot-dubbo-server 和 springboot-dubbo-client 工程

運行環境:JDK 7 或 8,Maven 3.0+
技術棧:SpringBoot 1.5+、Dubbo 2.5+、ZooKeeper 3.3+
 
1.ZooKeeper 服務註冊中心
ZooKeeper 是一個分佈式的,開放源碼的分佈式應用程序協調服務。它是一個爲分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分佈式同步、組服務等。
下載 ZooKeeper ,地址 http://www.apache.org/dyn/closer.cgi/zookeeper
 
解壓 ZooKeeper
 
1
tar  zxvf zookeeper-3.4.8. tar .gz
 
在 conf 目錄新建 zoo.cfg ,照着該目錄的 zoo_sample.cfg 配置以下。
 
1
2
cd  zookeeper-3.3.6 /conf
vim zoo.cfg
 
zoo.cfg 代碼以下(本身指定 log 文件目錄):
 
1
2
3
4
tickTime=2000
dataDir= /javaee/zookeeper/data 
dataLogDir= /javaee/zookeeper/log
clientPort=2181
 
在 bin 目錄下,啓動 ZooKeeper:
 
1
2
cd  zookeeper-3.3.6 /bin
. /zkServer .sh start
 
2. git clone 下載工程 springboot-learning-example
git clone git@github.com:JeffLi1993/springboot-learning-example.git
 
而後,Maven 編譯安裝這個工程:

 

1
2
cd  springboot-learning-example
mvn clean install
 
 
3.運行 springboot-dubbo-server Dubbo 服務提供者工程
右鍵運行 springboot-dubbo-server 工程 ServerApplication 應用啓動類的 main 函數。Console 中出現以下表示項目啓動成功:
這裏表示 Dubbo 服務已經啓動成功,並註冊到 ZK (ZooKeeper)中。
 
 
4.運行 springboot-dubbo-client Dubbo 服務消費者工程
右鍵運行 springboot-dubbo-client 工程 ClientApplication 應用啓動類的 main 函數。Console 中出現以下:

 

1
2
3
4
5
...
2017-03-01 16:31:38.473  INFO 9896 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for  JMX exposure on startup
2017-03-01 16:31:38.538  INFO 9896 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8081 (http)
2017-03-01 16:31:38.547  INFO 9896 --- [           main] org.spring.springboot.ClientApplication  : Started ClientApplication in  6.055 seconds (JVM running for  7.026)
City{ id =1, provinceId=2, cityName= '溫嶺' , description= '是個人故鄉' }
 
最後打印的城市信息,就是經過 Dubbo 服務接口調用獲取的。順利運行成功,下面詳解下各個代碼及配置。
 
 

3、springboot-dubbo-server 和 springboot-dubbo-client 工程配置詳解

 
1.詳解 springboot-dubbo-server Dubbo 服務提供者工程
springboot-dubbo-server 工程目錄結構
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
├── pom.xml
└── src
    └── main
        ├── java
        │   └── org
        │       └── spring
        │           └── springboot
        │               ├── ServerApplication.java
        │               ├── domain
        │               │   └── City.java
        │               └── dubbo
        │                   ├── CityDubboService.java
        │                   └── impl
        │                       └── CityDubboServiceImpl.java
        └── resources
            └── application.properties
 
 
a.pom.xml 配置
pom.xml 中依賴了 spring-boot-starter-dubbo 工程,該項目地址是  https://github.com/teaey/spring-boot-starter-dubbo。pom.xml 配置以下

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?xml version= "1.0"  encoding= "UTF-8" ?>
<project xmlns= "http://maven.apache.org/POM/4.0.0"  xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" >
     <modelVersion>4.0.0< /modelVersion >
 
     <groupId>springboot< /groupId >
     <artifactId>springboot-dubbo-server< /artifactId >
     <version>0.0.1-SNAPSHOT< /version >
     <name>springboot-dubbo 服務端:: 整合 Dubbo /ZooKeeper  詳解 SOA 案例< /name >
 
     <!-- Spring Boot 啓動父依賴 -->
     <parent>
         <groupId>org.springframework.boot< /groupId >
         <artifactId>spring-boot-starter-parent< /artifactId >
         <version>1.5.1.RELEASE< /version >
     < /parent >
 
     <properties>
         <dubbo-spring-boot>1.0.0< /dubbo-spring-boot >
     < /properties >
 
     <dependencies>
 
         <!-- Spring Boot Dubbo 依賴 -->
         <dependency>
             <groupId>io.dubbo.springboot< /groupId >
             <artifactId>spring-boot-starter-dubbo< /artifactId >
             <version>${dubbo-spring-boot}< /version >
         < /dependency >
 
         <!-- Spring Boot Web 依賴 -->
         <dependency>
             <groupId>org.springframework.boot< /groupId >
             <artifactId>spring-boot-starter-web< /artifactId >
         < /dependency >
 
         <!-- Spring Boot Test 依賴 -->
         <dependency>
             <groupId>org.springframework.boot< /groupId >
             <artifactId>spring-boot-starter- test < /artifactId >
             <scope> test < /scope >
         < /dependency >
 
         <!-- Junit -->
         <dependency>
             <groupId>junit< /groupId >
             <artifactId>junit< /artifactId >
             <version>4.12< /version >
         < /dependency >
     < /dependencies >
< /project >
 
 
b.application.properties 配置

 

1
2
3
4
5
6
## Dubbo 服務提供者配置
spring.dubbo.application.name=provider
spring.dubbo.registry.address=zookeeper: //127 .0.0.1:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
spring.dubbo.scan=org.spring.springboot.dubbo
 
 
這裏 ZK 配置的地址和端口,就是上面本機搭建的 ZK 。若是有本身的 ZK 能夠修改下面的配置。配置解釋以下:
spring.dubbo.application.name 應用名稱
spring.dubbo.registry.address 註冊中心地址
spring.dubbo.protocol.name 協議名稱
spring.dubbo.protocol.port 協議端口
spring.dubbo.scan dubbo 服務類包目錄
 
c.CityDubboServiceImpl.java 城市業務 Dubbo 服務層實現層類
 
1
2
3
4
5
6
7
8
// 註冊爲 Dubbo 服務
@Service (version = "1.0.0" )
public  class  CityDubboServiceImpl implements  CityDubboService {
 
    public  City findCityByName(String cityName) {
        return  new  City(1L,2L, "溫嶺" , "是個人故鄉" );
    }
}
 
@Service 註解標識爲 Dubbo 服務,並經過 version 指定了版本號。
 
d.City.java 城市實體類
實體類經過 Dubbo 服務之間 RPC 調用,則須要實現序列化接口。最好指定下 serialVersionUID 值。
 
2.詳解 springboot-dubbo-client Dubbo 服務消費者工程
springboot-dubbo-client 工程目錄結構
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
├── pom.xml
└── src
    └── main
        ├── java
        │   └── org
        │       └── spring
        │           └── springboot
        │               ├── ClientApplication.java
        │               ├── domain
        │               │   └── City.java
        │               └── dubbo
        │                   ├── CityDubboConsumerService.java
        │                   └── CityDubboService.java
        └── resources
            └── application.properties
 
pom.xml 、 CityDubboService.java、City.java 沒有改動。Dubbo 消費者經過引入接口實現 Dubbo 接口的調用。
 
a.application.properties 配置
 
1
2
3
4
5
6
7
## 避免和 server 工程端口衝突
server.port=8081
 
## Dubbo 服務消費者配置
spring.dubbo.application.name=consumer
spring.dubbo.registry.address=zookeeper: //127 .0.0.1:2181
spring.dubbo.scan=org.spring.springboot.dubbo
 
由於 springboot-dubbo-server 工程啓動佔用了 8080 端口,因此這邊設置端口爲 8081。
 
b.CityDubboConsumerService.java 城市 Dubbo 服務消費者
 
1
2
3
4
5
6
7
8
9
10
11
12
@Component
public  class  CityDubboConsumerService {
 
    @Reference (version = "1.0.0" )
    CityDubboService cityDubboService;
 
    public  void  printCity() {
        String cityName= "溫嶺" ;
        City city = cityDubboService.findCityByName(cityName);
        System.out.println(city.toString());
    }
}
@Reference(version = 「1.0.0」) 經過該註解,訂閱該接口版本爲 1.0.0 的 Dubbo 服務。
這裏將 CityDubboConsumerService 注入 Spring 容器,是爲了更方便的獲取該 Bean,而後驗證這個 Dubbo 調用是否成功。
 
c.ClientApplication.java 客戶端啓動類
 
1
2
3
4
5
6
7
8
9
10
11
@SpringBootApplication
public  class  ClientApplication {
 
    public  static  void  main(String[] args) {
        // 程序啓動入口
        // 啓動嵌入式的 Tomcat 並初始化 Spring 環境及其各 Spring 組件
        ConfigurableApplicationContext run = SpringApplication.run(ClientApplication. class , args);
        CityDubboConsumerService cityService = run.getBean(CityDubboConsumerService. class );
        cityService.printCity();
    }
}
解釋下這段邏輯,就是啓動後從 Bean 容器中獲取城市 Dubbo 服務消費者 Bean。而後調用該 Bean 方法去驗證 Dubbo 調用是否成功。
相關文章
相關標籤/搜索