天天看點

基于dubbo和zookeeper的微服務實作案例

一、注冊中心-zookeeper

1.zookeeper

         zookeeper可以在分布式項目中承擔以下幾個功能:

                   1)注冊中心

                   2)存儲資料: 分布式鎖

                   3)觀察者模式:做到多個分布式伺服器之間的資料同步

2.如何搭建zookeeper

         要麼使用docker搭建,要麼使用原生的方式搭建。

1)在虛拟機上安裝jdk

上傳jdk的壓縮包到虛拟機的 /usr/local/java檔案夾内

解壓縮

         tar -zxvf jdk.....tar.gz

配置環境變量

         vim /etc/profile

         複制以下内容到該檔案的末尾

export JAVA_HOME=/usr/local/java/jdk1.8.0_191

export JRE_HOME=/usr/local/java/jdk1.8.0_191/jre

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin

儲存并退出

                   :wq

讓配置生效

                   source /etc/profile

2)安裝Zookeeper

上傳壓縮包到linux

3)獲得zoo.cfg配置檔案

         在zookeeper/conf檔案夾内,修改zoo_sample.cfg中的内容後并重命名成zoo.cfg

4)如何使用zookeeper(做注冊中心)

         注意: 要使用linux中的指令,必須兩種方式: 要麼./zkServer.sh  要麼是完整路徑:

/usr/local/zookeeper/zookeeper-3.4.14/bin/zkServer.sh

如何啟動zk

         ./zkServer.sh start

如何檢視zk狀态

         ./zkServer.sh status

如何關閉zk

         ./zkServer.sh stop

二、使用Dubbo來實作服務間的調用

         相關概念:

                   1) 工程:  包含多個項目的一個統稱

      1.建立父工程

      2.在父工程中建立一個接口項目

接口項目取消父依賴

在項目中建立具體的接口

3.在父工程中建立服務的提供者

編寫實作類,實作接口,并重寫方法,注意要把api的項目依賴進來。

4.在服務提供者項目中使用dubbo

1)建立xml配置檔案

<?xml version="1.0" encoding="UTF-8"?>

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"

       xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xs

d">

2)編寫單元測試,引入配置檔案,并啟動dubbo

注意:前提是要啟動zk注冊中心

public class TestServiceProvider {

    @Test

    public void testService() throws IOException {

        ClassPathXmlApplicationContext context  =

                new ClassPathXmlApplicationContext(new String[]{"classpath:provider.xml"});

        //将服務送出給dubbo的container,然後注冊到注冊中心上

        context.start();

        System.out.println("商品服務開始提供服務");

        System.out.println("按任意鍵停止");

        //讓服務在收到任意輸入内容之前不會結束

        System.in.read();

    }

}

當看到這個結果,就表示服務釋出成功

5.建立服務消費者項目

1)引入依賴

  com.alibaba

  dubbo

  2.5.8

  com.github.sgroschupf

  zkclient

  0.1

  com.qf

  my-dubbo-product-api

  1.0.0-SNAPSHOT

2)編寫配置檔案

3)在單元測試中去調用service

@Test

public void testInvoke(){

    ClassPathXmlApplicationContext context =

            new ClassPathXmlApplicationContext(new String[]{"classpath:consumer.xml"});

    IProductService productService = (IProductService) context.getBean("productService");

    String s = productService.showProd();

    System.out.println(s);

小結:

三、在Springboot項目中使用dubbo

1.方式一: 基于XML的整合方式

1)建立springboot的服務提供者項目

(1)引入依賴

    com.alibaba.boot

    dubbo-spring-boot-starter

    0.2.0

(2)将xml配置檔案放進resources中

(3)在springboot的入口類上打上注解:@ImportResource("classpath:provider.xml")

2)建立springboot的服務消費者項目

(3)在springboot的入口類上打上注解:@ImportResource("classpath:consumer.xml")

(4)使用autowired将接口的實作類的對象自動注入進來,相當于是通過dubbo(zk)來提供服務的提供者的類。

@SpringBootTest

class MySpringBootProductConsumerApplicationTests {

    @Autowired

    private IProductService productService;

    void contextLoads() {

        System.out.println(productService.showProduct());

2.方式二:基于注解的整合方式

1)建立服務提供者項目

(2)編寫application.yml檔案,加入以下配置(本來在xml中的配置将寫在yml中)

server:

  port: 8081

dubbo:

  application:

    name: product-service-provider

  registry:

    address: zookeeper://10.31.163.100:2181

  protocol:

    port: 20884

(3)編寫服務提供者類并實作接口,并在接口上打上注解:

         @Component

         @Service <==import com.alibaba.dubbo.config.annotation.Service;

(4)在入口類上打上注解

         @EnableDubbo

2)建立服務消費者項目

  port: 8082

    name: product-consumer

(3)在需要用到服務提供者類的時候,使用@Reference注解

來自于com.alibaba.dubbo.config.annotation.Reference;

class MySpringBootAnnotationProductConsumerApplicationTests {

    @Reference