基於dubbo的項目開發

dubbo是什麼: dubbo是一個阿里巴巴開發的開源分佈式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,是阿里巴巴集團的各成員站點的核心框架,天天爲2,000+個服務提供3,000,000,000+次訪問量支持。dubbo是對一個系統中應用層上的優化,後面我會在對系統中數據庫層面的優化進行分享,這裏咱們只針對dubbo進行學習java

dubbo能解決什麼問題: 當網站變大後,不可避免的須要拆分應用進行服務化,以提升系統性能,開發效率等。而且要求拆分出去的每一個服務能夠根據須要靈活的配置它的集羣數量和控制服務的粒度(服務的粒度就是說我運行的服務系統中對外發布的服務數量)mysql

dubbo的優勢: 一、使用簡單 二、部署輕盈 三、方便二次開發 噹噹網:dubboX 京東:jd-hydra 這些都是基於dubbo二次開發的框架web

在學習dubbo以前咱們先來了解一下分佈式應用

分佈式應用.png

分佈式應用:應用程序分佈在不一樣計算機上,經過網絡來共同完成一項任務。一般爲服務端/客戶端模式。 服務器/客戶端又分爲二端(server/client)、三端(server/middleware/client)、N端(multiple server/multiple minddle/multiple client)。也就是說分佈式應用須要把服務(service)拆分出來,單獨部署在一個web服務器中,controller調用service就經過網絡來調用,這就造成了客戶端和服務端的模式,客戶端只負責運行controller代碼,處理數據請求和響應;服務端只負責業務處理,數據運算等。又由於本來一個系統既須要處理用戶的請求和響應,又須要處理業務流程,運行壓力會比較大,從而影響整個系統的性能。如今把系統一分爲二了,這就大大的提升整個系統的性能了spring

三端分佈式應用.png

N端分佈式應用.png

上面說到了分佈式的應用分紅客戶端和服務端,它們各自運行在本身的服務器中,客戶端的controller調用服務端的service就不是在一個應用內調用了,而是經過網絡傳輸來調用。 這種經過網絡來使controller調用遠程的service的技術叫作RPC技術sql

RPC原理.png

RPC技術是什麼: RPC(Remote Procedure Call Protocol)——遠程過程調用協議,它是一種經過網絡從遠程計算機程序上請求服務 RPC的原理: 就是對象的序列化、反序列化以及序列化後數據的傳輸,dubbo(使用二進制文件,TCP) java領域常見的RPC框架: Java領域裏的分佈式技術或者說分佈式框架叫作RPC框架有:Dubbo,ZeroICE數據庫

使用分佈式的模式的優勢? 1.在開發上,分紅了多個系統,有利於開發任務的分配,各自負責各自的系統開發。 2.在運行上,把負載壓力分配到多臺服務器上,提升整個系統的運行性能。 3.因爲分佈式開發模式是把業務或者功能以服務的形式對外發布,這樣的話能夠提升服務重用率apache

用了dubbo的優勢? 拆分應用進行服務化,提升系統性能,開發效率,而且能夠靈活配置服務集羣數和控制服務api

註冊中心的做用: 一、服務端服務的註冊和客戶端服務的調用 二、提升系統的可用性 三、提升系統的可伸縮性 四、集中管理服務tomcat

註冊中心有什麼: zookeeper: zooKeeper是一個分佈式的,開放源碼的分佈式應用程序協調服務,是Hadoop和Hbase的重要組件。它是一個爲分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分佈式同步、組服務等。springboot

zookeeper的使用 雖然能提供給dubbo應用作註冊中心的技術有不少,可是咱們用的是zookeeper,由於它是dubbo官方推薦的技術,在springboot-dubbo中,也是默認整合了zookeeper。並且zookeeper它是Hadoop和HBase的重要組件,若是後期項目須要發展大數據業務,那麼就能夠無縫的接入大數據的技術。因此咱們使用zookeeper做爲基於dubbo框架的分佈式系統的註冊中心。

1,下載zookeeper運行程序 進入zookeeper官網:zookeeper.apache.org/下載 2,修改配置文件 zoo_sample.cfg修改爲zoo.cfg(能夠copy一份再修改) # 內存數據的備份地址 dataDir=F://zookeeper-3.4.5//data

存放日誌地址

dataLogDir=F://zookeeper-3.4.5//log
複製代碼

3,雙擊bin目錄下的zkServer.cmd,運行zookeeper(若是是Mac路徑就不說了,啓動須要到bin目錄下在終端使用命令 sh zkServer.sh start)

先使用xml方式來寫一個hello world程序

這裏我使用的工具是idea 先建立一個父項目(dubbo_parent),而後再建立三個模塊

1,建立三個項目

一個用於服務端,一個用於客戶端,一個用於接口 服務端:server 客戶端:client 接口:api 而後咱們來修改pom.xml配置,這了api項目只是提供接口不須要繼承dubbo_parent的依賴因此在api的pom.xml裏取消繼承的配置. 同時咱們在server和client須要api的接口,因此咱們須要在server,client兩個項目中導入api的依賴

<dependencies>
  <dependency>
     <groupId>com.jd.dubbo</groupId>
     <artifactId>api</artifactId>
  </dependency>
</dependencies>
複製代碼

項目關係.png

二、添加springboot相關依賴和導入dubbo相關依賴(在dubbo_parent父項目的pom.xml中添加)

springboot父項目:spring-boot-starter-parent springbootweb相關項目spring-boot-starter-web

<!--Spring Boot項目-->
 <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.1.RELEASE</version>
</parent>
<dependencies>
<!--spring-boot-web依賴-->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
<!-- dubbo相關依賴 -->
 <dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>dubbo</artifactId>
  <version>2.5.3</version>
<exclusions>
  <exclusion>
    <groupId>org.springframework</groupId>
    <artifactId>spring</artifactId>
  </exclusion>
</exclusions>
  </dependency>
 <!--zookeeper-->
 <dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.2</version>
 </dependency>
 <dependency>
   <groupId>org.apache.zookeeper</groupId>
   <artifactId>zookeeper</artifactId>
   <version>3.4.5</version>
 </dependency>
 </dependencies>
複製代碼
三、編寫接口程序

3.1 首先咱們在domain包裏建立一個HelloWorld的實體類,定義一個屬性 name,提供setter,getter方法 實現Serializable接口 3.2 其次咱們在service包裏建立一個接口定義一個抽象方法

四、編寫服務端程序(接口實現類)和建立啓動類

建立服務端的啓動類

@SpringBootApplication
@ImportResource("classpath:dubbo-server.xml")
public class StartApp {
    public static void main(String[] args) {
        SpringApplication.run(StartApp.class,args);
    }
}
複製代碼
五、編寫服務端xml配置(dubbo-service.xml)
<!--把具體的服務實現類交給spring容器管理-->
    <bean id="helloWorld" class="com.jd.dubbo.service.impl.HelloWorldServiceImpl"/>
    <!--設置應用名-->
    <dubbo:application name="dubbo-server"/>
    <!--設置RPC協議-->
    <dubbo:protocol name="dubbo" port="20880"/>

    <!--設置註冊中心地址zookeeper,register屬性,默認是true,若是爲true的化,就須要把發佈的服務的服務地址註冊到zookeeper
        若是爲false,就不須要把服務的地址註冊到zookeeper中
    -->
    <!--<dubbo:registry address="zookeeper://127.0.0.1:2181" register="false"/>-->

    <dubbo:registry address="zookeeper://127.0.0.1:2181" register="true" file="${user.home}/dubbo.cache"/>
    <!--發佈服務-->
    <dubbo:service interface="com.jd.dubbo.service.IHelloWorldService" ref="helloWorld"/>
複製代碼

六、編寫客戶端xml配置
<!--設置應用名-->
    <dubbo:application name="dubbo-client"/>
    <!--設置註冊中心地址zookeeper-->
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
    <!--引用服務-->
    <dubbo:reference interface="com.jd.dubbo.service.IHelloWorldService" id="helloWorldService"/>
複製代碼

七、編寫客戶端程序(啓動類)
@SpringBootApplication
@ImportResource("classpath:dubbo-client.xml")
@Controller
public class StartApp {

    @Autowired
    private IHelloWorldService helloWorldService;
    public static  void main (String[] args){
        SpringApplication.run(StartApp.class,args);
    }

    @RequestMapping("/sayHello")
    @ResponseBody
    public String sayHello(){
        HelloWorld helloWorld =helloWorldService.sayHello(new HelloWorld());
            return  helloWorld.getName();
        }
    }
複製代碼

到這裏咱們經過xml的配置方式已經完成了,咱們先啓動服務端server再啓動客服端client

搭建電商架構(基於springboot全註解的方式構建)

基於springboot全註解的方式構建的好處 一、Springboot給咱們提供了一整套開發包,導入一個依賴就能使用它給咱們提供的對應的功能,提升咱們的開發效率 二、減小了咱們應用本身導入依賴包的數量 三、省去了繁瑣的xml配置文件 四、內嵌web服務器:如tomcat,jetty,部署應用變得方便 五、用springboot整合dubbo能夠很方便的開發分佈式的微服務

開發步驟:

1、建立各個工程項目

shop_parent shop_api_goods(商品系統的api) shop_api_order(訂單系統的api) shop_server_goods(商品系統) shop_server_order(訂單系統) shop_client_mgrsite(後臺管理系統) shop_clinet_website(移動端接口)

先建立一個父項目而後再建立其餘模塊,在shop_parent的pom.xml添加如下依賴

<!--Spring Boot項目-->
<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>1.5.1.RELEASE</version>
</parent>
<dependencies>
<!--spring-boot-web依賴-->
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
<!-- Spring Boot Dubbo 依賴 -->
<dependency>
    <groupId>io.dubbo.springboot</groupId>
    <artifactId>spring-boot-starter-dubbo</artifactId>
    <version>1.0.0</version>
  <!--剔除Dubbo內的netty,由於zookeeper中有一個-->
  <exclusions>
    <exclusion>
      <artifactId>netty</artifactId>
      <groupId>org.jboss.netty</groupId>
      </exclusion>
      </exclusions>
      </dependency>
</dependencies>
<!--管理商品之間的依賴-->
<dependencyManagement>
    <dependencies>
       <dependency>
       <groupId>com.jd.shop</groupId>
        <artifactId>shop_api_goods</artifactId>
       <version>1.0</version>
      </dependency>
      <dependency>
     <groupId>com.jd.shop</groupId>
    <artifactId>shop_api_order</artifactId>
    <version>1.0</version>
   </dependency>
 <!--阿里巴巴的druid-->
 <dependency>
   <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.0.25</version>
  </dependency>
 <!--spring-boot的mybatis依賴-->
<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>1.2.0</version>
  </dependency>
 <dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.16.18</version>
  </dependency>
</dependencies>
</dependencyManagement>
<build>
 <plugins>
     <!--用於打包和啓動springBoot應用的插件-->
     <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
     </plugin>
</plugins>
</build>
複製代碼

2、添加項目相關依賴 一、添加springboot項目 二、添加咱們須要用到的服務系統api包 三、添加springboot-web依賴 四、添加鏈接數據庫的相關依賴 五、添加dubbo依賴 六、建立springboot應用的啓動類

修改pom.xml

1.在shop_api_goods(商品系統的api)shop_server_goods(商品系統)這兩個模塊中不須要繼承shop_parent因此在他們的pom.xml中須要修改一下. 2.分別在在shop_server_goods(商品系統和shop_server_order(訂單系統)中添加依賴,

<!--shop_server_goods-->
<dependency>
   <groupId>com.jd.shop</groupId>
   <artifactId>shop_api_goods</artifactId>
 </dependency>
複製代碼
<!--shop_server_order-->
<dependency>
   <groupId>com.jd.shop</groupId>
   <artifactId>shop_api_order</artifactId>
 </dependency>
複製代碼
<!--shop_server_order-->
 <!--shop_server_order-->
<dependencies>
  <!--mysql驅動-->
  <dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
 </dependency>
    <!--阿里巴巴的druid-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
   </dependency>
 <!--spring-boot的mybatis依賴-->
  <dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
  </dependency>
   <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
  </dependency>
</dependencies>
 <build>
   <plugins>
      <plugin>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>1.3.2</version>
        <configuration>
        <verbose>true</verbose>
        <overwrite>false</overwrite>
        </configuration>
 <dependencies>
   <dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>5.1.21</version>
     </dependency>
  </dependencies>
  </plugin>
</plugins>
</build>
複製代碼

建立兩個服務端啓動類 StartApp shop_server_goods和shop_server_order的啓動類

@SpringBootApplication
@EnableTransactionManagement
@MapperScan("com.jd.server.goods.mapper")
public class StartApp {
    public static void main(String[] args) {
        SpringApplication.run(StartApp.class,args);
    }
}

複製代碼

3、各個服務系統整合mybatis

一、在application.properties配置文件中添加以下配置信息:(兩個服務須要作部分修改,須要修改的地方下面在()裏標註了)

server.port=9090(server.port=9091)
#數據庫鏈接地址
spring.datasource.url=jdbc:mysql://localhost:3306/jd_shop
#MySQL驅動
spring.datasource.driverClassName=com.mysql.jdbc.Driver
#數據庫帳號
spring.datasource.username=root
#數據庫密碼
spring.datasource.password=123456
#阿里巴巴Druid鏈接池
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource 
#mybatis的mapper.xml配置文件路徑
mybatis.mapperLocations=classpath:mapper/*.xml
#mybatis的mapper.xml配置文件domain對象別名掃描路徑
mybatis.typeAliasesPackage=com.jd.api.goods.domain    
(mybatis.typeAliasesPackage=com.jd.api.order.domain   )
複製代碼

二、在啓動類添加以下註解:(上面的啓動類代碼已經添加了)

//掃描mybatis接口的註解
@MapperScan("com.jd.server.goods.mapper")
//開啓事務管理
@EnableTransactionManagement
複製代碼

4、各個服務系統整合mybatis-generator插件

一、在各個服務系統的pom文件中添加mybatis-generator插件(在pom.xml已經添加) 二、在resources目錄下添加generatorConfig.xml文件(兩個服務系統須要適當的修改)

5、各個服務系統整合dubbo發佈服務程序

一、在application.properties配置文件中添加以下配置信息:

#整合dubbo
#設置應用的服務名
spring.dubbo.application.name=shop-server-goods
(spring.dubbo.application.name=shop-server-order)
#設置RPC協議
spring.dubbo.protocol.name=dubbo
#設置RPC端口號
spring.dubbo.protocol.port=20880
#設置註冊中心的地址
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
#設置發佈服務註解掃描的路徑
spring.dubbo.scan=com.jd.server.goods.service.impl
(spring.dubbo.scan=com.jd.server.order.service.impl)

複製代碼

6、發佈一個服務(以發佈商品服務爲例)

一、使用mybatis-genenrator插件生成domain類、mapper接口、mapper.xml文件 二、每一個domain類應該在對應的api項目中 三、在對應的api項目中建立一個服務接口

四、建立服務實現類 在該實現類上貼上@Service註解,貼上了該註解就表明了該類須要發佈服務

注意: 一、該註解是com.alibaba.dubbo.config.annotation包下的註解不是spring的註解 二、貼上該註解的服務實現類必需要在上面的配置項spring.dubbo.scan=xxx可以掃描到的路徑下

五、啓動springboot應用

7、各個客戶端整合dubbo引用服務程序

一、在application.properties配置文件中添加以下配置信息:

#dubbo應用名
spring.dubbo.application.name=shop-client-mgrsite
#鏈接的註冊中心地址 
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
#引用服務掃描的路徑 
spring.dubbo.scan=com.jd.client.mgrsite.controller
複製代碼

8、引用服務(以商品controller爲例)

一、建立商品的controller調用商品的服務 在該controller須要注入服務的依賴上貼上@Refrence註解,貼上該註解就能夠自動的把須要引用的服務注入進來 注意:貼上該註解的服務依賴必需要在上面的配置項spring.dubbo.scan=xxx可以掃描到的路徑下

@Controller
public class ProductController {

    @Reference
    IProductService productService;
    @RequestMapping("/getAllProduct")
    @ResponseBody
    public List<Product> getAllProduct() {
        return productService.getAllProduct();
    }
}
複製代碼

相關文章
相關標籤/搜索