直连式

  • 需要用到两个相互独立的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. linux-0.11分析:init文件 main.c的第一个初始化函数mem_int 第四篇随笔

    init文件夹 mian.c 参考 [github这个博主的 厉害][ https://github.com/sunym1993/flash-linux0.11-talk ] 首先先看看这个mian. ...

  2. 清理忽略springboot控制台启动的banner和启动日志

    清理忽略springboot控制台启动的banner和启动日志 1.springboot的banner spring: main: banner-mode: off 2.mybatis-plus的ba ...

  3. (WebFlux)002、如何打印日志与链路ID

    一.背景 最近在持续改造项目,想通过日志查看用户所有的接口链路日志.在原来基于SpirngMVC的时候,那是比较好处理的,通过ThreadLocal,放入TraceId,就可以把一个TraceId传到 ...

  4. Luogu4111 [HEOI2015]小Z的房间 (矩阵树,辗转相除高斯消元)

    除法不能用于同余系,要辗转相除.注意不能加入柱子到矩阵. #include <iostream> #include <cstdio> #include <cstring& ...

  5. C# 创建标签PDF文件

    Q1:关于"标签PDF文件(Tagged PDF)" 标签PDF文件包含描述文档结构和各种文档元素顺序的元数据,是一种包含后端提供的可访问标记,管理阅读顺序和文档内容表示的逻辑结构 ...

  6. linux之间上传下载--SCP

    1.远程拷贝文件 [root@rhel8-client01 yum.repos.d]# scp root@192.168.72.149:/etc/yum.repos.d/* . (.表示拷贝到当前文件 ...

  7. [BZOJ3625][CF438E]小朋友和二叉树 (多项式开根,求逆)

    题面 题解 设多项式的第a项为权值和为a的二叉树个数,多项式的第a项表示是否为真,即 则,所以F是三个多项式的卷积,其中包括自己: ,1是F的常数项,即. 我们发现这是一个一元二次方程,可以求出,因为 ...

  8. R数据分析:用R建立预测模型

    预测模型在各个领域都越来越火,今天的分享和之前的临床预测模型背景上有些不同,但方法思路上都是一样的,多了解各个领域的方法应用,视野才不会被局限. 今天试图再用一个实例给到大家一个统一的预测模型的做法框 ...

  9. Linux之如何配置IPV6网络

    配置IPV6地址小笔记 #例题: 1)为server添加一个IPv6地址fd00:ba5e:ba11:10::10/64: 2)为client添加一个IPv6地址fd00:ba5e:ba11:10:: ...

  10. 【读书笔记】C#高级编程 第十一章 LINQ

    (一)LINQ概述 语言集成查询(Language Integrated Query,LINQ)在C#编程语言中继承了查询语法,可以用相同的语法访问不同的数据源. 1.LINQ查询 var query ...