自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

5分鐘實現(xiàn)SpringBoot整合Dubbo構(gòu)建分布式服務(wù)

開發(fā) 架構(gòu) 分布式
Dubbo是Alibaba開源的分布式服務(wù)框架,它最大的特點是按照分層的方式來架構(gòu),使用這種方式可以使各個層之間解耦合。

概述:

Dubbo是Alibaba開源的分布式服務(wù)框架,它最大的特點是按照分層的方式來架構(gòu),使用這種方式可以使各個層之間解耦合(或者最大限度地松耦合)。從服務(wù)模型的角度來看,Dubbo采用的是一種非常簡單的模型,要么是提供方提供服務(wù),要么是消費方消費服務(wù),所以基于這一點可以抽象出服務(wù)提供方(Provider)和服務(wù)消費方(Consumer)兩個角色。

我們來看一下Dubbo 的RPC 調(diào)用流程,這里主要涉及到4個模塊:

  •  Registry:服務(wù)注冊,我們一般會采取Zookeeper 作為我們的注冊中心
  •  Provider:服務(wù)提供者(生產(chǎn)者),提供具體的服務(wù)實現(xiàn)
  •  Consumer:消費者,從注冊中心中訂閱服務(wù)
  •  Monitor:監(jiān)控中心,RPC調(diào)用次數(shù)和調(diào)用時間監(jiān)控

從上圖中我們可以了解到整個RPC 服務(wù)調(diào)用的過程主要為:

  •  生產(chǎn)者發(fā)布服務(wù)到服務(wù)注冊中心中
  •  消費者在服務(wù)注冊中心中訂閱服務(wù)
  •  消費者調(diào)用已經(jīng)注冊的服務(wù)

一、項目構(gòu)建

開發(fā)環(huán)境主要涉及以下幾個方面:

  •  Spring-boot
  •  JDK 8
  •  Dubbo
  •  Zookeeper

項目構(gòu)建通過: http://start.spring.io/ 快速構(gòu)建web 項目,具體操作可以參考

http://www.cnblogs.com/jaycekon/p/7562688.html

由于Dubbo 中需要使用到服務(wù)注冊中心,我們這里將使用Zookeeper 作為服務(wù)注冊中心,具體安裝配置,可以參考

http://www.cnblogs.com/jaycekon/p/7553909.html

在基礎(chǔ)環(huán)境確定好了之后,我們項目的目錄結(jié)構(gòu)如下:

上圖所示,我們項目主要分為了兩個模塊,一部分是生產(chǎn)者:spring-boot-dubbo ,一部分是:spring-boot-consumer。

整個項目的結(jié)構(gòu)非常簡單,這很符合Spring-Boot 的特性,簡單便捷,下面我們開始一步步的剖析整個項目的結(jié)構(gòu)

二、Productor

2.1、Pom.xml

項目依賴這一塊主要使用到了基本的Spring-Boot-Web 依賴,然后我們需要額外引入Dubbo 與Zookeeper的依賴(詳細依賴可參考源碼,博文底部會有項目Github 地址): 

  1. <dependency>  
  2.             <groupId>io.dubbo.springboot</groupId>  
  3.             <artifactId>spring-boot-starter-dubbo</artifactId>  
  4.             <version>1.0.0</version>  
  5.         </dependency>  
  6.         <dependency>  
  7.             <groupId>org.apache.zookeeper</groupId>  
  8.             <artifactId>zookeeper</artifactId>  
  9.             <version>3.4.6</version>  
  10.             <exclusions>  
  11.                 <exclusion>  
  12.                     <groupId>org.slf4j</groupId>  
  13.                     <artifactId>slf4j-log4j12</artifactId>  
  14.                 </exclusion>  
  15.                 <exclusion>  
  16.                     <groupId>log4j</groupId>  
  17.                     <artifactId>log4j</artifactId>  
  18.                 </exclusion>  
  19.             </exclusions>  
  20.         </dependency> 

2.2、配置文件

由于我們底層使用的是Spring-Boot 進行開發(fā),那么我們就應(yīng)該善于利用Spring-Boot 給我們帶來的優(yōu)勢,因此我們可以直接在Application.properties 文件中配置Dubbo 服務(wù): 

  1. ## Dubbo 服務(wù)提供者配置  
  2. spring.dubbo.application.name=provider    --服務(wù)名稱  
  3. spring.dubbo.registry.address=zookeeper://127.0.0.1:2181   -- 注冊中心地址  
  4. spring.dubbo.protocol.name=dubbo     -- dubbo 協(xié)議  
  5. spring.dubbo.protocol.port=20880  
  6. spring.dubbo.scan=com.jaycekon.dubbo.service     --聲明需要暴露的服務(wù)接口 

如果不采用Spring-Boot 進行自動配置,大家可以參考一下的配置xml 配置: 

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.        xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  
  5.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  
  6.        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">  
  7.     <!-- 提供方應(yīng)用信息 -->  
  8.     <dubbo:application name="provider"  />  
  9.     <!-- 注冊中心服務(wù)地址 -->  
  10.     <dubbo:registry  protocol="zookeeper" address="127.0.0.1"  check="false" />  
  11.     <!-- 用dubbo協(xié)議-->  
  12.     <dubbo:protocol name="dubbo" port="-1" dispather="all" check="false" />  
  13.     <dubbo:provider timeout="10000"  threads="10" threadpool="fixed"   loadbalance="roundrobin"/>  
  14.     <!-- 聲明需要暴露的服務(wù)接口 -->  
  15.     <dubbo:service interface="com.jaycekon.dubbo.service" ref="userService"/> </beans> 

2.3、服務(wù)提供

在服務(wù)提供主要包括兩部分,一個是暴露服務(wù),一個是服務(wù)實現(xiàn)

暴露服務(wù):即我們平常開發(fā)中所使用的的接口,這里我們創(chuàng)建一個 UserService 的接口,主要包括一個保存用戶的方法。 

  1. import com.jaycekon.dubbo.domain.User;  
  2. /**  
  3.  * Created by Jaycekon on 2017/9/19.  
  4.  */  
  5. public interface UserService {  
  6.     User saveUser(User user);  

服務(wù)實現(xiàn):服務(wù)實現(xiàn),與我們平常的服務(wù)一樣,對接口進行實現(xiàn),比較特別的是,我們這里需要使用到Dubbo 的 @Service 注解。更多springboot實戰(zhàn)內(nèi)容,Java知音公眾號內(nèi)回復(fù)“springboot聚合” 

  1. import com.alibaba.dubbo.config.annotation.Service;  
  2. import com.jaycekon.dubbo.domain.User;  
  3. import com.jaycekon.dubbo.service.UserService;  
  4. /**  
  5.  * Created by Jaycekon on 2017/9/19.  
  6.  */  
  7. @Service  
  8. public class UserServiceImpl implements UserService {  
  9.     @Override  
  10.     public User saveUser(User user) {  
  11.         user.setId(1);  
  12.         System.out.println(user.toString());  
  13.         return user;  
  14.     }  

2.4、總體結(jié)構(gòu)

Dubbo 的服務(wù)提供端,已經(jīng)總體開發(fā)完成,非常簡單,總體的目錄結(jié)構(gòu)如下:

三、Consumer

3.1、pom.xml

消費者的相關(guān)依賴,與生產(chǎn)者的依賴一致。 

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  4.     <modelVersion>4.0.0</modelVersion>  
  5.     <groupId>com.jaycekon</groupId>  
  6.     <artifactId>spring-boot-consumer</artifactId>  
  7.     <version>0.0.1-SNAPSHOT</version>  
  8.     <packaging>jar</packaging>  
  9.     <name>spring-boot-consumer</name>  
  10.     <description>Demo project for Spring Boot</description>  
  11.     <parent>  
  12.         <groupId>org.springframework.boot</groupId>  
  13.         <artifactId>spring-boot-starter-parent</artifactId>  
  14.         <version>1.5.7.RELEASE</version>  
  15.         <relativePath/> <!-- lookup parent from repository -->  
  16.     </parent>  
  17.     <properties>  
  18.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
  19.         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>  
  20.         <java.version>1.8</java.version>  
  21.     </properties>  
  22.     <dependencies>  
  23.         <dependency>  
  24.             <groupId>org.springframework.boot</groupId>  
  25.             <artifactId>spring-boot-starter-web</artifactId>  
  26.         </dependency>  
  27.         <dependency>  
  28.             <groupId>org.springframework.boot</groupId>  
  29.             <artifactId>spring-boot-starter-test</artifactId>  
  30.             <scope>test</scope>  
  31.         </dependency>  
  32.         <!-- Spring Boot Dubbo 依賴 -->  
  33.         <dependency>  
  34.             <groupId>io.dubbo.springboot</groupId>  
  35.             <artifactId>spring-boot-starter-dubbo</artifactId>  
  36.             <version>1.0.0</version>  
  37.         </dependency>  
  38.         <dependency>  
  39.             <groupId>org.apache.zookeeper</groupId>  
  40.             <artifactId>zookeeper</artifactId>  
  41.             <version>3.4.6</version>  
  42.             <exclusions>  
  43.                 <exclusion>  
  44.                     <groupId>org.slf4j</groupId>  
  45.                     <artifactId>slf4j-log4j12</artifactId>  
  46.                 </exclusion>  
  47.                 <exclusion>  
  48.                     <groupId>log4j</groupId>  
  49.                     <artifactId>log4j</artifactId>  
  50.                 </exclusion>  
  51.             </exclusions>  
  52.         </dependency>  
  53.         <!-- mvn spring-boot:run 熱部署啟動 -->  
  54.         <dependency>  
  55.             <groupId>org.springframework</groupId>  
  56.             <artifactId>springloaded</artifactId>  
  57.             <version>1.2.3.RELEASE</version>  
  58.         </dependency>  
  59.         <dependency>  
  60.             <groupId>org.projectlombok</groupId>  
  61.             <artifactId>lombok</artifactId>  
  62.             <version>1.16.18</version>  
  63.             <scope>provided</scope>  
  64.         </dependency>  
  65.     </dependencies>  
  66.     <build>  
  67.         <plugins>  
  68.             <plugin>  
  69.                 <groupId>org.springframework.boot</groupId>  
  70.                 <artifactId>spring-boot-maven-plugin</artifactId>  
  71.             </plugin>  
  72.         </plugins>  
  73.     </build>  
  74. </project> 

3.2、配置文件

配置文件與生產(chǎn)者稍有區(qū)別: 

  1. ## 避免和 server 工程端口沖突  
  2. server.port=8081 
  3. ## Dubbo 服務(wù)消費者配置  
  4. spring.dubbo.application.name=consumer  
  5. spring.dubbo.registry.address=zookeeper://127.0.0.1:2181  
  6. spring.dubbo.scan=com.jaycekon.dubbo.service 

基于Xml 的配置: 

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.        xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  
  5.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  
  6.        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">  
  7.     <!-- 提供方應(yīng)用信息 -->  
  8.     <dubbo:application name="provider"  />  
  9.     <!-- 注冊中心服務(wù)地址 -->  
  10.     <dubbo:registry  protocol="zookeeper" address="${dubbo.registry.address}"  check="false" />  
  11.     <!-- 用dubbo協(xié)議-->  
  12.     <dubbo:protocol name="dubbo" port="-1" dispather="all" check="false" />  
  13.     <dubbo:provider timeout="10000"  threads="10" threadpool="fixed"   loadbalance="roundrobin"/>  
  14.     <!-- 聲明需要暴露的服務(wù)接口 -->  
  15.     <dubbo:service interface="com.jaycekon.dubbo.service" ref="userService"/>  
  16. </beans> 

3.3、服務(wù)實現(xiàn)

在這里,如果我們需要調(diào)用注冊服務(wù)中的相關(guān)服務(wù),則需要實現(xiàn)相關(guān)的接口。 

  1. import com.jaycekon.dubbo.domain.User;  
  2. /**  
  3.  * Created by Jaycekon on 2017/9/19.  
  4.  */  
  5. public interface UserService {  
  6.     User saveUser(User user);  

例如,在這里我們需要使用到生產(chǎn)者中的 saveUser(User user) 方法,則需要創(chuàng)建一個接口,然后再調(diào)用時,使用 @Reference 注解進行引用: 

  1. import com.alibaba.dubbo.config.annotation.Reference;  
  2. import com.jaycekon.dubbo.domain.City;  
  3. import com.jaycekon.dubbo.domain.User; 
  4. import org.springframework.stereotype.Component;  
  5. /**  
  6.  * 城市 Dubbo 服務(wù)消費者  
  7.  * <p>  
  8.  * Created by Jaycekon on 20/09/2017.  
  9.  */  
  10. @Component  
  11. public class CityDubboConsumerService {  
  12.     @Reference  
  13.     CityDubboService cityDubboService;  
  14.     @Reference  
  15.     UserService userService;  
  16.     public void printCity() {  
  17.         String cityName = "廣州" 
  18.         City city = cityDubboService.findCityByName(cityName);  
  19.         System.out.println(city.toString());  
  20.     }  
  21.     public User saveUser() {  
  22.         User user = new User();  
  23.         user.setUsername("jaycekon")  
  24.                 .setPassword("jaycekong824");  
  25.         return userService.saveUser(user);  
  26.     }  

3.4、服務(wù)調(diào)用

最后,我們需要實現(xiàn)一個RESTful 接口,提供給用戶調(diào)用: 

  1. import com.jaycekon.dubbo.service.CityDubboConsumerService;  
  2. import org.springframework.beans.factory.annotation.Autowired;  
  3. import org.springframework.web.bind.annotation.RequestMapping;  
  4. import org.springframework.web.bind.annotation.RestController;  
  5. /**  
  6.  * Created by Jaycekon on 2017/9/19.  
  7.  */  
  8. @RestController  
  9. public class UserController {  
  10.     @Autowired  
  11.     private CityDubboConsumerService service;  
  12.     @RequestMapping("/save")  
  13.     public Object saveUser() { 
  14.         return service.saveUser();  
  15.     }  

3.5、目錄結(jié)構(gòu)

四、總結(jié)

本篇博客主要是博主在學(xué)習(xí)Spring-boot 的時候,總結(jié)下來的。在經(jīng)過一些列的對比后,感覺Dubbo 與Spring-Cloud 還是有點差距的,不管是從服務(wù)提供,還是社區(qū)活躍來說,Spring-Cloud 還是會強一點。但是由于公司內(nèi)部使用的是Dubbo,因此還是需要學(xué)習(xí)一下,后續(xù)的話,會對Spring-Cloud 進行學(xué)習(xí)以及分項。

GitHub地址

https://github.com/jaycekon/SpringBoot 

 

責(zé)任編輯:龐桂玉 來源: Java知音
相關(guān)推薦

2016-12-16 11:05:00

分布式互斥線程

2017-11-08 09:57:00

分布式微服務(wù)集群

2024-04-29 07:57:46

分布式流控算法

2022-05-23 09:10:00

分布式工具算法

2023-01-13 07:39:07

2018-06-28 14:00:01

分布式集群架構(gòu)

2019-06-21 10:00:42

微服務(wù)分布式架構(gòu)

2022-06-27 08:21:05

Seata分布式事務(wù)微服務(wù)

2025-03-11 08:50:00

CASID分布式

2022-01-10 11:58:51

SpringBootPulsar分布式

2018-04-09 13:56:13

微服務(wù)架構(gòu)分布式

2018-04-02 15:01:31

微服務(wù)架構(gòu)分布式服務(wù)

2019-11-25 09:32:26

軟件程序員數(shù)據(jù)結(jié)構(gòu)

2020-02-24 16:04:55

架構(gòu)運維技術(shù)

2021-08-16 15:40:04

分布式架構(gòu)系統(tǒng)

2021-03-18 09:18:39

分布式事務(wù)Saga

2020-05-19 08:15:16

互聯(lián)網(wǎng)分布式微服務(wù)

2022-08-24 08:42:59

Minio存儲Golang

2024-10-31 13:51:58

點贊
收藏

51CTO技術(shù)棧公眾號