直连式

  • 需要用到两个相互独立的maven的web项目

    项目1:o1-link-userservice-provider	作为服务的提供者
    项目2:o2-link-consumer 作为使用服务的消费者

项目1

  • 结构

  • pom文件

    <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/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="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="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="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"> <!-- 将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.把注释放开

项目2

  • 结构

  • pom文件:其中要根据项目1的坐标将之前把项目1打成的jar包引入项目2中使用

    <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/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="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="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="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.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="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: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服务器上并启动服务器

  • 从消费者端去访问获取服务

直连缺点

  • 由于事先要把项目1打成jar包,项目2中依赖项目1的jar包,上述方式虽然实现了消费者对服务的访问,但是上述直连方式并没有实现服务提供者和消费者的真正分离,业务还是耦合在一个项目中(这里是耦合在项目2里)

Dubbo 02: 直连式的更多相关文章

  1. Dubbo 03: 直连式 + 接口工程

    进一步改正dubbo框架中简单的直连式的不足 需要用到3个相互独立的maven工程,项目1为maven的java工程作为接口工程,项目2,3为maven的web工程 工程1:o3-link-inter ...

  2. 开放系统的直连式存储(Direct-Attached Storage,简称DAS)

    开放系统的直连式存储(Direct-Attached Storage,简称DAS)已经有近四十年的使用历史,随着用户数据的不断增长,尤其是数百GB以上时,其在备份.恢复.扩展.灾备等方面的问题变得日益 ...

  3. Dubbo 02 微信开发

    Dubbo 02 微信开发 Dubbo Admin https://github.com/apache/dubbo-admin 原系统微服务改造 mvc层排除数据源检查 Application 入口程 ...

  4. dubbo之直连提供者

    在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连,点对点直联方式,将以服务接口为单位,忽略注册中心的提供者列表,A 接口配置点对点,不影响 B 接口从注册中心获 ...

  5. 02线性表链式存储_LinkList--(线性表)

    #include "stdio.h" #include "string.h" #include "ctype.h" #include &qu ...

  6. 遇到的问题之“Dubbo 直连 Invoke remote method timeout 问题!”

    Dubbo 直连 Invoke remote method timeout 问题!   在测试环境消费者直连服务端进行测试时, 其中一个RPC接口抛出一个错误, 如下: Caused by: com. ...

  7. 深入浅出微服务框架dubbo(一):基础篇

    一.基础篇 1.1 开篇说明 dubbo是一个分布式服务框架,致力于提供高性能透明化RPC远程调用方案,提供SOA服务治理解决方案.本文旨在将对dubbo的使用和学习总结起来,深入源码探究原理,以备今 ...

  8. Dubbo原理解析(非常透彻)

    一.概述 dubbo是一款经典的rpc框架,用来远程调用服务的. dubbo的作用: 面向接口的远程方法调用 智能容错和负载均衡 服务自动注册和发现. 自定义序列化协议 Dubbo 架构中的核心角色有 ...

  9. 基于dubbo的分布式项目实例应用

    本文主要学习dubbo服务的启动检查.集群容错.服务均衡.线程模型.直连提供者.只定阅.只注册等知识点,希望通过实例演示进一步理解和掌握这些知识点. 启动检查 Dubbo缺省会在启动消费者时检查依赖的 ...

随机推荐

  1. 基于Docker在Win10平台搭建Ruby on Rails 6.0框架开发环境

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_170 2020年,"非著名Web框架"–Ruby on Rails已经15岁了.在今年,Rails 6.0趋于 ...

  2. 查看 npm 的全局安装依赖包

    在控制台中输入以下指令可以直接查看 npm 全局安装的依赖包: npm list -g --depth 0

  3. C#基础_类的声明

    新建Clerk类. using System; using System.Collections.Generic; using System.Linq; using System.Text; usin ...

  4. 【c语言学习】1 基础环境安装调试

    1-1下载 vs2019 vs2019下载链接https://visualstudio.microsoft.com/zh-hans/vs/community/ 1-2安装配置环境 记得勾选上c++开发 ...

  5. MPI学习笔记(三):矩阵相乘的分块并行(行列划分法)

    mpi矩阵乘法:C=αAB+βC 一.主从模式的行列划分并行法 1.实现方法 将可用于计算的进程数comm_sz分解为a*b,然后将矩阵A全体行划分为a个部分,将矩阵B全体列划分为b个部分,从而将整个 ...

  6. 一 策略模式 来自CBF4LIFE 的设计模式

    刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,搞到后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的. 先说这个场景中 ...

  7. 第二十八篇:关于node.js连接数据库

    好家伙,这个不难,但是也不简单. $ cnpm install mysql 教程里是带美元符的,但是我打的时候加上美元符用不了,所以我就没用美元符了,一样能行. 还有,淘宝镜像,yyds, var m ...

  8. KingbaseESV8R6 snapshot too old的配置和测试

    背景 书接上文,我们很好的理解了xmin和xid的区别.我们继续上文<KingbaseESV8R6不同隔离级下xmin的区别>来讨论 snapshot too old 的功能. 当king ...

  9. B树-插入

    B树系列文章 1. B树-介绍 2. B树-查找 3. B树-插入 4. B树-删除 插入 根据B树的以下两个特性 每一个结点最多有m个子结点 有k个子结点的非叶子结点拥有 k − 1 个键 可以得出 ...

  10. Java 流处理之收集器

    Java 流(Stream)处理操作完成之后,我们可以收集这个流中的元素,使之汇聚成一个最终结果.这个结果可以是一个对象,也可以是一个集合,甚至可以是一个基本类型数据. 以记录 Record 为例: ...