dubbo入门-helloworld

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

在dubbo中,服务被注册在注册中心中,我们把提供服务的server成为服务提供方,调用服务的server称为服务调用方,两者通过RPC进行调用,并使用了dubbo协议(使用的协议可以经过配置进行修改)协调工作。为了demo的方便,这里把服务接口以及相关的一些依赖类复制放在了两个不同的工程中,在实际的开发中,我们需要提取一个API的工程,发布到MAVEN仓库中,由服务调用方和服务提供方引用依赖。

准备工作

这里使用zookeeper作为注册中心,所以需要准备zookeeper的可用环境。dubbo官网中推荐zookeeper作为注册中心,但据官网所述,阿里内部没有使用zookeeper,而是使用自己实现的一套注册中心方案。zookeeper可以参考https://my.oschina.net/thinwonton/blog?catalog=5607452

1. 服务提供方

一般是服务的实现。往往在架构层面抽象成服务层。

1.1 工程结构


image


在这里,dubbo-parent是其它实例工程的父工程,为子工程提供统一的版本号管理。

DemoService.java

public interface DemoService {
    /**
     * 对两个数求和
     */
    public int sum(Integer x, Integer y);

    /**
     * 对两个数做乘法运算
     * 
     * @param x
     * @param y
     * @return
     */
    public int multi(Integer x, Integer y);
}

DemoServiceImpl.java 实现类

public class DemoServiceImpl implements DemoService {

    public int sum(Integer x, Integer y) {
        return x + y;
    }

    public int multi(Integer x, Integer y) {
        return x * y;
    }

}

applicationContext.xml
spring的配置文件,dubbo框架运行在spring 容器中。

<?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">

    <!-- 引入服务提供者配置文件 -->
    <import resource="classpath:dubbo.xml" />
</beans>

dubbo.xml
服务的配置,dubbo通过xml文件扫描,在spring的启动阶段把服务注册到注册中心。这里的demoService是服务的实现者。当服务提供方获取到消费方的rpc请求后,将会调用该实现类的对应的方法运行,并把结果通过PRC返回给调用方。 是指定协议类型,我们的提供者可以选择dubbo或者RMI作为底层通信协议,或者两者都选择,由调用方选择其中一种和服务方进行通信。

<?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">

    <!-- 配置Bean -->
    <bean id="demoService"
        class="com.github.thinwonton.dubbo.sample.helloworld.service.DemoServiceImpl" />

    <!-- 指定web服务名字 -->
    <dubbo:application name="helloworld-provider" />
    <!-- 声明服务注册中心 -->
    <!-- 使用zookeeper作为注册中心 -->
    <dubbo:registry protocol="zookeeper" address="192.168.88.15:2181" />
    <!-- 指定传输层通信协议 -->
    <dubbo:protocol name="dubbo" port="20880" />
    <!-- 暴露服务地址,该服务的实现类是demoService的引用 -->
    <dubbo:service ref="demoService"
        interface="com.github.thinwonton.dubbo.sample.helloworld.service.DemoService"
        protocol="dubbo" />
</beans>

主程序 ProviderMain.java

public class ProviderMain {
    public static void main(String[] args) throws IOException {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        System.out.println("服务启动...");
        System.in.read();
        System.out.println("服务结束...");
    }
}

当启动提供方应用成功后,通过日志可以看到服务已经在服务中心进行注册,并获取到如下信息:

  • 暴露的服务IP和端口是192.168.42.2:20880
  • 服务所在的应用名是helloworld-provider
  • 所暴露的服务的接口和方法是com.github.thinwonton.dubbo.sample.helloworld.service.DemoService,multi & sum
 INFO  13:42:53,738 com.alibaba.dubbo.registry.support.AbstractRegistry:  [DUBBO] Register: dubbo://192.168.42.2:20880/com.github.thinwonton.dubbo.sample.helloworld.service.DemoService?anyhost=true&application=helloworld-provider&dubbo=2.5.3&interface=com.github.thinwonton.dubbo.sample.helloworld.service.DemoService&methods=multi,sum&pid=8764&side=provider&timestamp=1488087764234, dubbo version: 2.5.3, current host: 127.0.0.1
 INFO  13:42:53,777 com.alibaba.dubbo.registry.support.AbstractRegistry:  [DUBBO] Subscribe: provider://192.168.42.2:20880/com.github.thinwonton.dubbo.sample.helloworld.service.DemoService?anyhost=true&application=helloworld-provider&category=configurators&check=false&dubbo=2.5.3&interface=com.github.thinwonton.dubbo.sample.helloworld.service.DemoService&methods=multi,sum&pid=8764&side=provider&timestamp=1488087764234, dubbo version: 2.5.3, current host: 127.0.0.1
 INFO  13:42:53,804 com.alibaba.dubbo.registry.support.AbstractRegistry:  [DUBBO] Notify urls for subscribe url provider://192.168.42.2:20880/com.github.thinwonton.dubbo.sample.helloworld.service.DemoService?anyhost=true&application=helloworld-provider&category=configurators&check=false&dubbo=2.5.3&interface=com.github.thinwonton.dubbo.sample.helloworld.service.DemoService&methods=multi,sum&pid=8764&side=provider&timestamp=1488087764234, urls: [empty://192.168.42.2:20880/com.github.thinwonton.dubbo.sample.helloworld.service.DemoService?anyhost=true&application=helloworld-provider&category=configurators&check=false&dubbo=2.5.3&interface=com.github.thinwonton.dubbo.sample.helloworld.service.DemoService&methods=multi,sum&pid=8764&side=provider&timestamp=1488087764234], dubbo version: 2.5.3, current host: 127.0.0.1

通过zookeeper的客户端连接ZK的服务,查看树的ZNode情况

[root@www zookeeper-3.4.9]# bin/zkCli.sh -server 192.168.88.15:2181
[zk: 192.168.88.15:2181(CONNECTED) 2] ls /     
[dubbo, zookeeper]
[zk: 192.168.88.15:2181(CONNECTED) 3] ls /dubbo
[com.github.thinwonton.dubbo.sample.helloworld.service.DemoService]
[zk: 192.168.88.15:2181(CONNECTED) 4] ls /dubbo/com.github.thinwonton.dubbo.sample.helloworld.service.DemoService
[consumers, routers, providers, configurators]
[zk: 192.168.88.15:2181(CONNECTED) 5] ls /dubbo/com.github.thinwonton.dubbo.sample.helloworld.service.DemoService/providers
[dubbo%3A%2F%2F192.168.42.2%3A20880%2Fcom.github.thinwonton.dubbo.sample.helloworld.service.DemoService%3Fanyhost%3Dtrue%26application%3Dhelloworld-provider%26dubbo%3D2.5.3%26interface%3Dcom.github.thinwonton.dubbo.sample.helloworld.service.DemoService%26methods%3Dmulti%2Csum%26pid%3D7968%26side%3Dprovider%26timestamp%3D1488095682955]

zk树中,为dubbo的服务com.github.thinwonton.dubbo.sample.helloworld.service.DemoService建立了一个节点,并分别建立consumers, routers, providers, configurators四个节点。这四个节点分别记录了消费方,服务路由信息,提供方,配置的一些信息。我们查看providers可以看到192.168.42.2:20880这台机器再为我们服务。

2. 服务调用方(消费方)

一般集成在WEB工程,即表现层工程。

2.1 工程结构


image

消费方 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">

    <!-- 指定web应用名字 -->
    <dubbo:application name="helloworld-consumer" />
    <!-- 声明服务注册中心 -->
    <dubbo:registry protocol="zookeeper" address="192.168.88.15:2181" />
    <!-- 引用服务,demoService仅用于根据接口生成动态代理,默认使用javassist生成代理对象 -->
    <dubbo:reference id="demoService"
        interface="com.github.thinwonton.dubbo.sample.helloworld.service.DemoService"
        protocol="dubbo" />
</beans>

ConsumerMain.java

public class ConsumerMain {
    public static void main(String[] args) throws IOException {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        DemoService demoService = (DemoService) applicationContext.getBean("demoService");
        int sumResult = demoService.sum(1, 2);
        System.out.println("加法服务的结果是:" + sumResult);
        int multiResult = demoService.multi(3, 4);
        System.out.println("减法服务的结果是:" + multiResult);
    }
}

运行主程序后,即可看到相应的结果

文章转载自 开源中国社区 [http://www.oschina.net]

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
18天前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
2月前
|
Dubbo Java 应用服务中间件
分布式-dubbo的入门
分布式-dubbo的入门
|
Dubbo Java 应用服务中间件
springboot + dubbo + zookeeper入门到实战超级详解
springboot + dubbo + zookeeper入门到实战超级详解
212 0
|
Dubbo Java 应用服务中间件
Netty入门到超神系列-手撸简单版RPC框架(仿Dubbo)
原理还是比较简单 : 代理 + 线程池 + Netty 下面做一些解释: 首先需要定义一个统一的API接口,例:UserApi , 服务端(provider)需要实现这个接口,提供相应的方法UserApiImpl#save,客户端通过远程来调用该接口。 然后需要约定一个协议,服务器如何才能识别到客户端要调用哪个接口?:我这里用 “接口权限定名#方法名#参数” ,的方式来,因为是一个简单版本的RPC。服务端解析该内容就能匹配对应的接口的实现类,然后调用该方法。并把方法的返回值通过Netty写回给客户端 使用的编解码器都是比价简单的String的编解码器
163 0
|
6月前
|
监控 负载均衡 Dubbo
分布式架构与Dubbo基础入门与实践
分布式架构与Dubbo基础入门与实践
58 1
|
6月前
|
Dubbo Java 应用服务中间件
分布式应用简单入门及SpringBoot整合Dubbo+Zookeeper
分布式应用简单入门及SpringBoot整合Dubbo+Zookeeper
168 1
|
Dubbo Java 应用服务中间件
微服务技术系列教程(29) - Dubbo-介绍&环境安装&入门案例
微服务技术系列教程(29) - Dubbo-介绍&环境安装&入门案例
89 0
|
SpringCloudAlibaba Dubbo 网络协议
十二.SpringCloudAlibaba极简入门-集成dubbo
在之前 《什么是 Spring Cloud Alibaba》一文中我们有介绍过Dubbo,除了SpringCloud以外,Dubbo它也是用来作为微服务架构落地的成熟解决方案,并且它在服务通信上比SpringCloud性能更高,这取决于它的底层实现是基于原生的TCP协议,它的定位就是一款高性能的RPC(远程过程调用)框架,所以在国内很多的企业都选择Dubbo作为微服务框架,本文章的目的是帮助同学们将Dubbo这款高性能的RPC框架集成到SpringCloud中,真正实现SpringCloud 和 Dubbo的混用。
|
缓存 负载均衡 监控
Dubbo-入门指南+实例
Dubbo-入门指南+实例
68 0
|
XML 负载均衡 监控
终于有人从入门到实战把Dubbo讲的这么清清楚楚了
很多时候,其实我们使用这个技术的时候,可能都是因为项目需要,所以,我们就用了,但是,至于为什么我们需要用到这个技术,可能自身并不是很了解的,但是,其实了解技术的来由及背景知识,对于理解一项技术还是有帮助的,那么,dubbo是怎么被提上日程的呢?