程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 使用dubbo分布式服務框架發布服務及消費服務,dubbo框架發布消費

使用dubbo分布式服務框架發布服務及消費服務,dubbo框架發布消費

編輯:JAVA綜合教程

使用dubbo分布式服務框架發布服務及消費服務,dubbo框架發布消費


什麼是DUBBO

DUBBO是一個分布式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案。

准備工作

安裝zookeeper

ZooKeeper是一個分布式的,開放源碼的分布式應用程序協調服務。

具體安裝步驟:略,請參考網上資源,很簡單。

安裝完後,配置一下zoo.cfg配置文件,裡面有個端口的配置,我配置的是2181端口,客戶端將使用該端口連接該服務。

我的zookeeper配置的服務器ip為10.0.10.51。

安裝dubbo-admin

dubbo-admin是dubbo管理控制台。

具體安裝步驟:略,請參考網上資源,其實就是一個war包,部署到tomcat即可。

部署完後,修改下dubbo.properties配置文件內容,將dubbo.registry.address的注冊地址配置為zookeeper服務的地址,同時可以配置控制台的訪問密碼,如下是我的配置。

dubbo.registry.address=zookeeper://10.0.10.51:2181?backup=127.0.0.1:2182,127.0.0.1:2183
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest

訪問http://10.0.10.51/dubbo-admin-2.5.3/,效果如下:

工程結構

我們將使用maven管理構建工程,工程結構如下:

首先,新建一個maven工程,包括四個模塊:

    <modules>
        <module>dubbo-demo-common</module>
        <module>dubbo-demo-api</module>
        <module>dubbo-demo-service</module>
        <module>dubbo-demo-web</module>
    </modules>

其中dubbo-demo-service即為我們的服務模塊;其它的common模塊主要放一些model、log、基類等;api模塊放service的接口;service的實現放在service模塊。web模塊為我們的服務消費模塊,是一個spring mvc工程,調用我們發布的服務;

服務提供

在dubbo-demo-service模塊裡,我們將使用spring+mybatis框架;

關於spring、mybatis的相關配置就不說了。

這裡主要關注service服務,跟平常一樣寫一個service,在service裡使用spring的注解@Autowired注入dao bean,然後使用dubbo的注解@Service將該service標記為dubbo服務,如下是一個UserServiceImpl例子:

package org.dubbo.demo.service.user.impl;

import java.util.List;
import java.util.Map;

import org.dubbo.demo.api.service.IUserService;
import org.dubbo.demo.common.model.User;
import org.dubbo.demo.dao.IUserDao;
import org.springframework.beans.factory.annotation.Autowired;

import com.alibaba.dubbo.config.annotation.Service;

@Service(interfaceClass = IUserService.class)
public class UserServiceImpl implements IUserService
{

    @Autowired
    private IUserDao userDao;

    @Override
    public List<User> queryAll(Map<String, Object> param) throws Exception
    {
        return userDao.queryAll(param);
    }

    @Override
    public void saveUser(Map<String, Object> param) throws Exception
    {
        userDao.saveUser(param);

    }

    @Override
    public void deleteUser(Map<String, Object> param) throws Exception
    {
        userDao.deleteUser(param);
    }

}

這樣我們的service服務就寫好了,是不是發現很簡單,接下來配置一下dubbo即可,如下:

<?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        
    https://git.oschina.net/pi.chen/wendang/raw/master/dubbo.xsd">
 
    <!-- 應用名,用於計算依賴關系,不是匹配條件,不要與提供方一樣 -->
    <dubbo:application name="dubbo-demo-service"  />
 
    <!-- 使用zookeeper廣播注冊中心暴露發現服務地址 -->
    <dubbo:registry protocol="zookeeper" address="10.0.10.51:2181" />
 
    <!-- 用dubbo協議在20880端口暴露服務 -->
    <dubbo:protocol name="dubbo" port="20880" />
    
    <!-- 掃描包 -->
    <dubbo:annotation package="org.dubbo.demo.service" />
</beans>

最後,寫一個啟動類,啟動spring容器即可,如下示例:

package org.dubbo.demo;

import org.dubbo.demo.common.log.Logger;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class StartDubboService
{

    private static Logger logger = Logger.getLogger(StartDubboService.class);

    public static void main(String[] args)
    {
        try
        {
            @SuppressWarnings("resource")
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/spring.xml");
            context.start();
            logger.info("context start success.");
        }
        catch (Exception e)
        {
            logger.error("context start error.", e);
        }
        synchronized (StartDubboService.class)
        {
            while (true)
            {
                try
                {
                    StartDubboService.class.wait();
                }
                catch (InterruptedException e)
                {
                    logger.error("synchronized error.", e);
                }
            }
        }
    }

}

將該main方法綁定到maven的test階段,

然後我們執行clean test -f service-pom.xml命令即可啟動服務(這裡指定了service-pom.xml,表示只構建該文件裡定義的模塊);

發布完服務後,可以在dubbo控制台中看到我們的服務提供者,如下圖:

服務消費

提供者發布完服務後,消費者就可以開始調用服務了,消費者這邊將用一個Java web工程模擬,使用spring-mvc框架,也就是之前提到的dubbo-demo-web模塊,這個模塊很簡單,就配置一下spring-mvc和dubbo,然後controller中使用的service用“com.alibaba.dubbo.config.annotation.Reference”注解注入即可,如下是一個UserController:

package org.dubbo.demo.controller.user;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.dubbo.demo.api.service.IUserService;
import org.dubbo.demo.common.base.BaseController;
import org.dubbo.demo.common.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.alibaba.dubbo.config.annotation.Reference;
import com.google.gson.Gson;

@Controller
@RequestMapping(value = "/user")
public class UserController extends BaseController
{
    @Reference
    private IUserService userService;

    @RequestMapping(value = "/getUserList", produces = "application/json; charset=utf-8")
    @ResponseBody
    public String getUserList(int pageNo, int pageSize)
    {
        Gson gson = new Gson();
        Map<String, Object> map = new HashMap<String, Object>();
        try
        {
            Map<String, Object> param = new HashMap<String, Object>();

            param.put("pageNo", pageNo);
            param.put("pageSize", pageSize);
            List<User> userList = userService.queryAll(param);
            map.put("userList", userList);
            return gson.toJson(map);
        }
        catch (Exception e)
        {
            logger.error(e.toString(), e);
        }
        return gson.toJson("faild");
    }

    @RequestMapping(value = "/deleteUser", produces = "application/json; charset=utf-8")
    @ResponseBody
    public String deleteUser(int userId)
    {
        Gson gson = new Gson();
        try
        {
            Map<String, Object> param = new HashMap<String, Object>();

            param.put("userId", userId);
            userService.deleteUser(param);
            return gson.toJson("success");
        }
        catch (Exception e)
        {
            logger.error(e.toString(), e);
        }
        return gson.toJson("faild");
    }

    @RequestMapping(value = "/saveUserTest", produces = "application/json; charset=utf-8")
    @ResponseBody
    public String saveUserTest(String userName, String address)
    {
        Gson gson = new Gson();

        try
        {
            Map<String, Object> param = new HashMap<String, Object>();

            param.put("name", userName);
            param.put("address", address);
            userService.saveUser(param);

        }
        catch (Exception e)
        {
            logger.error(e.toString(), e);
            return gson.toJson("fail");
        }
        return gson.toJson("success");
    }
}

工程配置完後,啟動我們的web工程,輸入”clean tomcat:run -f web-pom.xml“命令,

然後,開始嘗試調用controller,浏覽器輸入http://localhost:8080/dubbo-demo-web/user/getUserList.do?pageNo=0&pageSize=5

成功調用服務,並得到正確結果:

同樣,可以在dubbo的管理頁面,看到消費者應用:

工程源碼

 https://github.com/peterchenhdu/Demos/tree/master/dubbo-demo

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved