Dubbo 02: 直連式

直連式

  • 需要用到兩個相互獨立的maven的web項目

    項目1:o1-link-userservice-provider	作為服務的提供者
    項目2:o2-link-consumer	作為使用服務的消費者
    

項目1

  • 結構

    image

  • pom文件

    <project xmlns="//maven.apache.org/POM/4.0.0" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //maven.apache.org/maven-v4_0_0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.example.dubbo</groupId>
      <artifactId>o1-link-userservice-provider</artifactId>
      <packaging>war</packaging>
      <version>1.0.0</version>
    
      <dependencies>
        <!--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>
        <plugins>
          <!--JDK1.8編譯插件-->
          <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
              <source>1.8</source>
              <target>1.8</target>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </project>
    
  • 實體類:注意要實現序列化介面,數據需要通過socket網路傳輸

    package com.example.dubbo.model;
    
    import java.io.Serializable;
    
    public class User implements Serializable {
        private String id;
        private String name;
        private String age;
    
        @Override
        public String toString() {
            return "User{" +
                    "id='" + id + '\'' +
                    ", name='" + name + '\'' +
                    ", age='" + age + '\'' +
                    '}';
        }
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAge() {
            return age;
        }
    
        public void setAge(String age) {
            this.age = age;
        }
    
        public User(String id, String name, String age) {
            this.id = id;
            this.name = name;
            this.age = age;
        }
    
        public User() {
        }
    }
    
  • 服務介面

    package com.example.dubbo.service;
    
    import com.example.dubbo.model.User;
    
    public interface UserService {
        /**
         * 根據用戶id,獲取用資訊
         */
        User queryUserById(String id);
    }
    
  • 服務介面的實現類

    package com.example.dubbo.service.impl;
    
    import com.example.dubbo.model.User;
    import com.example.dubbo.service.UserService;
    
    public class UserServiceImpl implements UserService {
    
        /**
         * 根據用戶id,獲取用戶資訊
         */
        @Override
        public User queryUserById(String id) {
            User user = new User();
            user.setId(id);
            user.setName("橘子");
            user.setAge("21");
            return user;
        }
    }
    
  • dubbo框架里的服務提供者所對應的配置文件:dubbo-link-userservice-provider.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="//www.springframework.org/schema/beans"
           xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="//dubbo.apache.org/schema/dubbo"
           xsi:schemaLocation="//www.springframework.org/schema/beans //www.springframework.org/schema/beans/spring-beans.xsd //dubbo.apache.org/schema/dubbo //dubbo.apache.org/schema/dubbo/dubbo.xsd">
    
        <!-- 對外提供的服務的名稱,要具有唯一性-->
        <dubbo:application name="o1-link-userservice-provider"/>
        <!-- 服務使用的協議以及埠號 -->
        <dubbo:protocol name="dubbo" port="20880"/>
        <!-- 服務對外提供的介面 -->
        <dubbo:service interface="com.example.dubbo.service.UserService" ref="userService" registry="N/A"/>
        <!-- 對外提供的介面的實現類-->
        <bean id="userService" class="com.example.dubbo.service.impl.UserServiceImpl"/>
    
    </beans>
    
  • web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="//xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="//xmlns.jcp.org/xml/ns/javaee //xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
        <!-- 將dubbo框架交給spring框架管理 -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:dubbo-link-userservice-provider.xml</param-value>
        </context-param>
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    </web-app>
    

注意

  • 由於採用的是直連方式,要把項目1,打成jar包,後面項目2會引用這個jar包

  • 項目1打成jar包的步驟

    1.將項目1的pom文件中的<packaging>war</packaging>注釋掉,這樣打包的時候默認會打成jar包
    2.點擊maven項目管理中的項目1的Lifecycle里的install(操作見下圖)
    3.把注釋放開
    

    image

項目2

  • 結構

    image

  • pom文件:其中要根據項目1的坐標將之前把項目1打成的jar包引入項目2中使用

    <project xmlns="//maven.apache.org/POM/4.0.0" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //maven.apache.org/maven-v4_0_0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.example.dubbo</groupId>
      <artifactId>o2-link-consumer</artifactId>
      <packaging>war</packaging>
      <version>1.0.0</version>
    
    <dependencies>
      <!--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>
    
      <!-- 對01-link-userservice-provider項目的依賴-->
      <dependency>
        <groupId>com.example.dubbo</groupId>
        <artifactId>o1-link-userservice-provider</artifactId>
        <version>1.0.0</version>
      </dependency>
    </dependencies>
    
      <build>
        <plugins>
          <!--JDK1.8編譯插件-->
          <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
              <source>1.8</source>
              <target>1.8</target>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </project>
    
  • dubbo框架里的消費者所對應的配置文件:dubbo-link-consumer.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="//www.springframework.org/schema/beans"
           xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="//dubbo.apache.org/schema/dubbo"
           xsi:schemaLocation="//www.springframework.org/schema/beans //www.springframework.org/schema/beans/spring-beans.xsd //dubbo.apache.org/schema/dubbo //dubbo.apache.org/schema/dubbo/dubbo.xsd">
    
    
        <!-- 消費者的唯一標識-->
        <dubbo:application name="o2-link-consumer"/>
        
        <!-- 引用的遠程服務的相關資訊 -->
        <dubbo:reference id="userService" interface="com.example.dubbo.service.UserService" url="dubbo://127.0.0.1:20880" registry="N/A"/>
    </beans>
    
  • spring核心配置文件:application.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="//www.springframework.org/schema/beans"
           xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
           xmlns:context="//www.springframework.org/schema/context"
           xmlns:mvc="//www.springframework.org/schema/mvc"
           xsi:schemaLocation="//www.springframework.org/schema/beans //www.springframework.org/schema/beans/spring-beans.xsd //www.springframework.org/schema/context //www.springframework.org/schema/context/spring-context.xsd //www.springframework.org/schema/mvc //www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        <!-- 掃描控制層 -->
        <context:component-scan base-package="com.example.dubbo.web.controller"/>
    
        <!-- 配置註解驅動 -->
        <mvc:annotation-driven/>
    
        <!-- 配置視圖解析器-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    </beans>
    
  • Controller層

    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class UserController {
        @Autowired
        UserService userService;
    
        /**
         * 接收前端請求,查詢數據並返回
         */
        @RequestMapping("/getUser.do")
        public String getUser(String id, Model model){
            //獲取數據
            User user = userService.queryUserById(id);
            //存放數據
            model.addAttribute("user", user);
            //返回到用戶詳情頁面
            return "userDetail";
        }
    }
    
  • web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="//xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="//xmlns.jcp.org/xml/ns/javaee //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:application.xml, classpath:dubbo-link-consumer.xml</param-value>
            </init-param>
        </servlet>
        <servlet-mapping>
            <servlet-name>dispatcherServlet</servlet-name>
            <url-pattern>*.do</url-pattern>
        </servlet-mapping>
    </web-app>
    
  • 返回給前端的用戶詳情頁面:userDetail.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>用戶詳情頁面</title>
    </head>
    <body>
    <div>用戶標識:${user.id}</div>
    <div>用戶名稱:${user.name}</div>
    <div>用戶年齡:${user.age}</div>
    </body>
    </html>
    

測試

  • 將項目1(服務提供者)和項目2(消費者),分別部署到tomcat伺服器上並啟動伺服器

    image

  • 從消費者端去訪問獲取服務

    image

直連缺點

  • 由於事先要把項目1打成jar包,項目2中依賴項目1的jar包,上述方式雖然實現了消費者對服務的訪問,但是上述直連方式並沒有實現服務提供者和消費者的真正分離,業務還是耦合在一個項目中(這裡是耦合在項目2里)