使用dubbo分布式服务框架发布服务及消费服务

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介:

什么是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的管理页面,看到消费者应用:


本文转自风一样的码农博客园博客,原文链接:http://www.cnblogs.com/chenpi/p/5999707.html,如需转载请自行联系原作者

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
1月前
|
Java 数据库
在Java中使用Seata框架实现分布式事务的详细步骤
通过以上步骤,利用 Seata 框架可以实现较为简单的分布式事务处理。在实际应用中,还需要根据具体业务需求进行更详细的配置和处理。同时,要注意处理各种异常情况,以确保分布式事务的正确执行。
|
1月前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
2月前
|
存储 缓存 算法
分布式锁服务深度解析:以Apache Flink的Checkpointing机制为例
【10月更文挑战第7天】在分布式系统中,多个进程或节点可能需要同时访问和操作共享资源。为了确保数据的一致性和系统的稳定性,我们需要一种机制来协调这些进程或节点的访问,避免并发冲突和竞态条件。分布式锁服务正是为此而生的一种解决方案。它通过在网络环境中实现锁机制,确保同一时间只有一个进程或节点能够访问和操作共享资源。
94 3
|
8天前
|
消息中间件 存储 安全
分布式系统架构3:服务容错
分布式系统因其复杂性,故障几乎是必然的。那么如何让系统在不可避免的故障中依然保持稳定?本文详细介绍了分布式架构中7种核心的服务容错策略,包括故障转移、快速失败、安全失败等,以及它们在实际业务场景中的应用。无论是支付场景的快速失败,还是日志采集的安全失败,每种策略都有自己的适用领域和优缺点。此外,文章还为技术面试提供了解题思路,助你在关键时刻脱颖而出。掌握这些策略,不仅能提升系统健壮性,还能让你的技术栈更上一层楼!快来深入学习,走向架构师之路吧!
43 11
|
7天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
35 2
|
1月前
|
存储 Java 关系型数据库
在Spring Boot中整合Seata框架实现分布式事务
可以在 Spring Boot 中成功整合 Seata 框架,实现分布式事务的管理和处理。在实际应用中,还需要根据具体的业务需求和技术架构进行进一步的优化和调整。同时,要注意处理各种可能出现的问题,以保障分布式事务的顺利执行。
53 6
|
1月前
|
数据库
如何在Seata框架中配置分布式事务的隔离级别?
总的来说,配置分布式事务的隔离级别是实现分布式事务管理的重要环节之一,需要认真对待和仔细调整,以满足业务的需求和性能要求。你还可以进一步深入研究和实践 Seata 框架的配置和使用,以更好地应对各种分布式事务场景的挑战。
29 6
|
28天前
|
消息中间件 运维 数据库
Seata框架和其他分布式事务框架有什么区别
Seata框架和其他分布式事务框架有什么区别
27 1
|
1月前
|
机器学习/深度学习 自然语言处理 并行计算
DeepSpeed分布式训练框架深度学习指南
【11月更文挑战第6天】随着深度学习模型规模的日益增大,训练这些模型所需的计算资源和时间成本也随之增加。传统的单机训练方式已难以应对大规模模型的训练需求。
147 3
|
1月前
|
机器学习/深度学习 并行计算 Java
谈谈分布式训练框架DeepSpeed与Megatron
【11月更文挑战第3天】随着深度学习技术的不断发展,大规模模型的训练需求日益增长。为了应对这种需求,分布式训练框架应运而生,其中DeepSpeed和Megatron是两个备受瞩目的框架。本文将深入探讨这两个框架的背景、业务场景、优缺点、主要功能及底层实现逻辑,并提供一个基于Java语言的简单demo例子,帮助读者更好地理解这些技术。
101 2

热门文章

最新文章