Dubbo直連方式

1、dubbo概述

Apache Dubbo 是一款高性能、輕量級的開源 Java RPC 框架,它提供了三大核心能力:html

  • 面向接口的遠程方法調用,
  • 智能容錯和負載均衡,
  • 服務自動註冊和發現。

Dubbo 是一個分佈式服務框架,致力於提供高性能和透明化的 RPC 遠程服務調用方案、 服務治理方案。java

官網:http://dubbo.apache.org/zh-cn/web

特性:redis

面向接口代理:算法

調用接口的方法,在 A 服務器調用 B 服務器的方法,由 dubbo 實現對 B 的調用,無需關心實現的細節,就像 MyBatis 訪問 Dao 的接口,能夠操做數據庫同樣。不用關心 Dao 接口方法的實現spring

1. 基本架構

服務提供者(Provider):暴露服務的服務提供方,服務提供者在啓動時,向註冊中心註冊本身提供的服務。
服務消費者(Consumer ): 調用遠程服務的服務消費方,服務消費者在啓動時,向註冊中心訂閱本身所需的服務,服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,若是調用失敗,再選另外一臺調用。
註冊中心(Registry) :註冊中心返回服務提供者地址列表給消費者,若是有變動,註冊中心將基於長鏈接推送變動數據給消費者
監控中心(Monitor) :服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心數據庫

調用關係說明apache

  1. 服務容器負責啓動,加載,運行服務提供者
  2. 服務提供者在啓動時,向註冊中心註冊本身提供的服務
  3. 服務消費者在啓動時,向註冊中心訂閱本身所需的服務
  4. 註冊中心返回服務提供者地址列表給消費者,若是有變動,註冊中心將基於長鏈接推送變動數據給消費者
  5. 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,若是調用失敗,再選另外一臺調用
  6. 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心

2. dubbo 支持的協議

支持多種協議:dubbo , hessian , rmi , http, webservice , thrift , memcached , redis。dubbo 官方推薦使用 dubbo 協議。dubbo 協議默認端口 20880
使用 dubbo 協議,spring 配置文件加入:
<dubbo:protocol name="dubbo" port="20880" />spring-mvc

2、直連方法

點對點的直連項目:消費者直接訪問服務提供者,沒有註冊中心。消費者必須指定服務提供者的訪問地址(url)tomcat

消費者直接經過 url 地址訪問固定的服務提供者。這個 url 地址是不變的。

3、建立服務提供者

1. 思路

  1. 建立一個maven web工程:服務的提供者
  2. 建立一個實體bean查詢的結果,實現Serializable接口
  3. 提供一個服務接口:xxxx
  4. 實現這個服務接口:xxxxImpl
  5. 配置dubbo服務提供者的核心配置文件
    • 聲明dubbo服務提供者的名稱:保證惟一
    • 聲明dubbo使用的協議和端口號
    • 暴露服務,使用直連方式
  6. 添加監聽器

1. 建立maven web

並添加對應的目錄

2. pom.xml

添加了dubbo依賴

<?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>com.md</groupId>
  <artifactId>01-link-userservice-provider</artifactId>
  <version>1.0.0</version>
  <packaging>war</packaging>



  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>


    <!--spring依賴-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.3.16.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.3.16.RELEASE</version>
    </dependency>


    <!--dubbo依賴-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>dubbo</artifactId>
      <version>2.6.2</version>
    </dependency>

  </dependencies>

  <build>
    <resources>
      <resource>
        <directory>src/main/java</directory><!--所在的目錄-->
        <includes><!--包括目錄下的.properties,.xml 文件都會掃描到-->
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
    </resources>
  </build>
</project>

3. 建立實體

package com.md.dubbo.model;

import java.io.Serializable;

/**
 * @author MD
 * @create 2020-08-16 21:30
 */
// model實現序列化
public class User implements Serializable {

    private Integer id;

    private String username;

    private Integer age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

4. 建立服務接口並實現

package com.md.dubbo.service;

import com.md.dubbo.model.User;

/**
 * @author MD
 * @create 2020-08-16 21:35
 */
public interface UserService {

    /**
     * 根據用戶標識獲取用戶信息
     * @param id
     * @return
     */
    User queryUserById(Integer id);
}
//---------------------------------------
package com.md.dubbo.service.impl;

import com.md.dubbo.model.User;
import com.md.dubbo.service.UserService;

/**
 * @author MD
 * @create 2020-08-16 21:38
 */

public class UserServiceImpl implements UserService {
    @Override
    public User queryUserById(Integer id) {

        // 模擬
        User user = new User();
        user.setId(id);
        user.setUsername("pony");
        user.setAge(20);
        return user;
    }
}

5. 配置服務提供者的核心配置文件

在resources目錄下創建dubbo-userservice-provider.xml文件

這裏注意:選擇apache的這個

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!--服務提供者聲明名稱:必須保證服務名稱惟一,他的名稱是dubbo內部使用的惟一標識,用項目名就行-->
    <dubbo:application name="01-link-userservice-provider"/>

    <!--訪問服務協議的名稱及端口號
        name:指定協議名稱
        port:指定協議端口號(默認20880)
    -->
    <dubbo:protocol name="dubbo" port="20880"/>

    <!--
        暴露服務接口
        interface:暴露服務接口的全限定類名
        ref:接口引用的實現類在spring容器中的標識
        registry:若是不使用註冊中心,則值爲N/A,直連
    -->
    <dubbo:service interface="com.md.dubbo.service.UserService" ref="userService" registry="N/A"/>

    <!--將接口的實現類加載到Spring容器中-->
    <bean id="userService" class="com.md.dubbo.service.impl.UserServiceImpl"/>

</beans>

6. 添加監聽器

在web.xml中

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

<!--默認的版本低的話換成這個版本的,直接複製便可-->

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:dubbo-userservice-provider.xml</param-value>
  </context-param>

  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

</web-app>

7. 配置Tomcat

端口號注意修改一下:

HTTP port :8081

JMX port:1098

8. 安裝本地jar到maven倉庫

服務接口中的方法要給消費者使用,消費者項目須要知道接口名稱和接口中的方法名稱、參數等。這些信息服務提供者才知道。須要把接口的 class 文件打包爲 jar .
服務接口項目的類文件打包爲 jar, 安裝到 maven 倉庫,倉庫中的提供者 jar 能夠被消費者使用。
使用 idea 的 maven 窗口執行 install

4、建立服務消費者

1. 思路

  1. 建立一個maven web工程:服務的消費者
  2. 配置pom文件:添加須要的依賴(spring,dubbo)
  3. 設置dubbo的核心配置文件
  4. 編寫controller
  5. 配置中央調度器(就是一個servlet:DispatcherServlet)

基本和服務提供者同樣,這裏就說一些主要的

1. pom.xml

仍是maven web項目

注意:添加了服務提供者的依賴

<?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>com.md</groupId>
  <artifactId>02-link-consumer</artifactId>
  <version>1.0.0</version>
  <packaging>war</packaging>



  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <!--spring依賴-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.3.16.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.3.16.RELEASE</version>
    </dependency>

    <!--dubbo依賴-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>dubbo</artifactId>
      <version>2.6.2</version>
    </dependency>

    <!--依賴服務提供者-->
    <dependency>
      <groupId>com.md</groupId>
      <artifactId>01-link-userservice-provider</artifactId>
      <version>1.0.0</version>
    </dependency>


  </dependencies>

  <build>
    <resources>
      <resource>
        <directory>src/main/java</directory><!--所在的目錄-->
        <includes><!--包括目錄下的.properties,.xml 文件都會掃描到-->
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
    </resources>
  </build>
</project>

2. 配置服務消費者的核心配置文件

在resources目錄下創建dubbo-consumer.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!--聲明服務消費者名稱:保證惟一性-->
    <dubbo:application name="02-link-consumer"/>


    <!--
        引用遠程服務接口:
        id:遠程服務接口對象名稱
        interface:調用遠程接口的全限定類名
        url:訪問服務接口的地址
        registry:不使用註冊中心,值爲:N/A
    -->
    <dubbo:reference id="userService" interface="com.md.dubbo.service.UserService"
                     url="dubbo://localhost:20880" registry="N/A"/>


</beans>

3. controller

package com.md.dubbo.web;

import com.md.dubbo.model.User;
import com.md.dubbo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author MD
 * @create 2020-08-19 9:00
 */

@Controller
public class UserController {

    // 自動注入
    @Autowired
    private UserService userService;

    @RequestMapping(value = "/user")
    public String userDetail(Model model , Integer id){
        User user = userService.queryUserById(id);
        model.addAttribute("user",user);
        return "userDetail";

    }
}

4. applicationContext.xml

在resources目錄下建立spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--掃描組件-->
    <context:component-scan base-package="com.md.dubbo.web"/>

    <!--配置註解驅動-->
    <mvc:annotation-driven/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp"/>

    </bean>

</beans>

5. 配置中央調度器

在web.xml中

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
  <!--中央調度器-->


  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:applicationContext.xml,classpath:dubbo-consumer.xml</param-value>
    </init-param>

  </servlet>


  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>


</web-app>

6. 配置Tomcat

和上面同樣,只不過不用修改端口號了

7. 配置測試頁面

在webapp下 創建userDetail.jsp

<%--
  Created by IntelliJ IDEA.
  User: MD
  Date: 2020/8/19
  Time: 9:06
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用戶詳情</title>
</head>
<body>
<h1>用戶詳情</h1>
<div>用戶標識:${user.id}</div>
<div>用戶名稱:${user.username}</div>
<div>用戶年齡:${user.age}</div>
</body>
</html>

8. 測試

  1. 首先開服務提供者的Tomcat
  2. 而後開服務消費者的Tomcat
  3. 而後在地址欄輸入,就能夠看到了

相關文章
相關標籤/搜索