• 第一个dubbo程序


    Dubbo是一个高性能服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案,使得应用可通过高性能RPC实现服务的输出和输入功能,和Spring框架可以无缝集成。

    作为一个分布式服务框架,以及SOA治理方案,Dubbo其功能主要包括:高性能NIO通讯及多协议集成,服务动态寻址与路由,软负载均衡与容错,依赖分析与服务降级等。Dubbo最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。

    Dubbo包含远程通讯、集群容错和自动发现三个核心部分。提供透明化的远程方法调用,实现像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。同时具备软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。可以实现服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

    下图来自Dubbo官网,描述了服务注册中心、服务提供方、服务消费方、服务监控中心之间的调用关系,具体如下图所示:

    今天的第一个dubbo程序主要就是实现Consumer对Provider的调用
    一、Provider(服务提供方)步骤

    1.pom.xml如下

    <!-- 这里是配置的编译JDK版本和编码方式 -->
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    
    <dependencies>
        <!-- spring引入 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.0.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.0.2.RELEASE</version>
        </dependency>
        <!-- zookeeper客户端 -->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.3</version>
        </dependency>
        <!-- zookeeper核心包 -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.5</version>
        </dependency>
        <!-- dubbo核心包引入 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.7</version>
            <scope>compile</scope>
            <exclusions>
                <exclusion>
                    <artifactId>spring</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    View Code

    2.dubbo.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: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://www.springframework.org/schema/context
                            http://www.springframework.org/schema/context/spring-context-3.1.xsd
         http://code.alibabatech.com/schema/dubbo
         http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    
        <context:component-scan base-package="cn.duanjt" />
    
        <!-- 提供方应用信息,用于计算依赖关系 -->
        <dubbo:application name="storeServer" />
    
        <!-- 使用zookeeper注册中心暴露服务地址 -->
        <dubbo:registry address="zookeeper://127.0.0.1:2181" />
    
        <!-- 用dubbo协议在20880端口暴露服务 -->
        <dubbo:protocol name="dubbo" port="20880" />
        <dubbo:protocol name="rmi" port="21880" />
    
        <!--和本地bean一样实现服务 -->
        <bean id="vipUserService" class="cn.duanjt.service.impl.VipUserService" />
    
        <dubbo:service interface="cn.duanjt.service.UserService" ref="vipUserService" protocol="dubbo" />
    </beans>
    View Code

    说明:

    • 我们需要在包cn.duanjt(可以是子包下面)下面创建一个接口UserService
    • 我们需要在包cn.duanjt(可以是子包下面)下面创建一个接口UserService的实现类VipUserService
    • 如上的xml配置就是根据接口和实现类暴露接口给zookeeper
    • protocol表示协议方式,可以是dubbo、rmi等。因为dubbo是支持多协议的

    3.主方法代码如下:

    public class SpringServer {
        public static void main(String[] args) throws IOException {
            ClassPathXmlApplicationContext ac=new ClassPathXmlApplicationContext("classpath:dubbo.xml");
            ac.start();
            System.out.println("服务端启动完成");
            System.in.read();
        }
    }

      

    二、Consumer(服务消费方)步骤

    其实消费方也是可以使用jar包的方式调用,但是为了实现不同的方式,消费方我们使用spring-mvc的方式进行实现。

    1.首先搭建一个普通的spring-mvc程序,不会的可以参考spring-mvc

    2.pom.xml如下:

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    
    <dependencies>
        <!-- servlet的引用 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <!-- spring引用 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.0.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.0.2.RELEASE</version>
        </dependency>
        <!-- zkclient引用 -->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.3</version>
        </dependency>
        <!-- zookeeper核心包的引用 -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.5</version>
        </dependency>
        <!-- dubbo核心包的引用 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.7</version>
            <scope>compile</scope>
            <exclusions>
                <exclusion>
                    <artifactId>spring</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    View Code

    3.在springmvc的配置文件(spring-mvc.xml)中引入dubbo配置

    4.dubbo.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://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.xsd">
    
        <!-- 就是注册到zookeeper的名字 -->
        <dubbo:application name="store_client"></dubbo:application>
        <!-- zookeeper地址 -->
        <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry>
    
        <dubbo:consumer check="false" />
        <!-- 从zookeeper引用 -->
        <dubbo:reference id="userService" interface="cn.duanjt.service.UserService"></dubbo:reference>
    </beans>
    View Code

    说明:

    • 需要创建一个接口UserService。该接口和服务方的接口完全一致。

    5.controller的代码如下:

    @Controller
    public class UserController {
        @Autowired
        UserService service;
    
        @RequestMapping("/index")
        public String index(HttpServletRequest request, HttpServletResponse response) {
            String res = service.getDetail("china");//远程rpc调用
            request.setAttribute("detail", res);//将结果设置到detail中
            return "index";
        }
    }

    6.前端jsp页面(index.jsp)如下: 

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
            <title>首页</title>
        </head>
        <body>
            你好,接收到的数据是: ${detail }
        </body>
    </html>

    前端请求的地址是:http://localhost:8080/index

    最后附一张图:

  • 相关阅读:
    HDU 2066 一个人的旅行 最短路问题
    HDU 2112 HDU Today 最短路
    HDU 2521 反素数 模拟题
    mac 安装 office
    selenium用法 (python)
    selenium遇到不可编辑input和隐藏input如何赋值
    mac 下bash命令
    ssh 自动登录
    linux常用命令
    json字符串调整
  • 原文地址:https://www.cnblogs.com/duanjt/p/9946426.html
Copyright © 2020-2023  润新知