【2020-03-21】Dubbo本地环境搭建-实现服务注册和消费

前言

    本周主题:加班工作。本周内忙于CRUD不能自拔,基本每天都是九点半下班,下周上线,明天还要加班推进进度。今天是休息日,于是重拾起了dubbo,打算近期深入了解一下其使用和原理。之所以说是重拾,是因为去年自学过一次,但那次主要是针对源码的流程,在实战上欠缺,且对其理解未深入到架构层次,只能说是基本理解。现在的我跟去年比起来,对技术的理解上有了一些提升,经验也更丰富,故本次目标是做深入研究,且看能从中吸收多少要义。

    今天先记录一下dubbo本地服务的简易搭建流程。

一、环境准备

    本次搭建用zookeeper作为注册中心,故需要准备好zookeeper环境。博主是在自己购置的阿里云服务器上搭建的,操作比较简单,可参见【https://yq.aliyun.com/articles/83804?spm=5176.10695662.1996646101.searchclickresult.5d89d8499feXWX】一文,其中要注意的是需提前在云服务器上开通2181端口(即zk的端口),否则dubbo服务会连不上,博主今天就是在这里排查了好久,才想到原来是自己犯蠢了。

二、项目构建

    本地项目用的maven项目,一个消费模块一个服务模块,结构如下所示:

 

 1、服务端代码

pom文件依赖:

 1 <dependencies>
 2         <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo -->
 3         <dependency>
 4             <groupId>org.apache.dubbo</groupId>
 5             <artifactId>dubbo</artifactId>
 6             <version>2.7.5</version>
 7         </dependency>
 8         <dependency>
 9             <groupId>org.slf4j</groupId>
10             <artifactId>slf4j-api</artifactId>
11             <version>1.7.30</version>
12         </dependency>
13         <dependency>
14             <groupId>org.slf4j</groupId>
15             <artifactId>slf4j-log4j12</artifactId>
16             <version>1.7.25</version>
17         </dependency>
18         <dependency>
19             <groupId>log4j</groupId>
20             <artifactId>log4j</artifactId>
21             <version>1.2.17</version>
22         </dependency>
23         <dependency>
24             <groupId>org.apache.curator</groupId>
25             <artifactId>curator-recipes</artifactId>
26 <version>4.0.1</version> 27 </dependency> 28 </dependencies>

xml文件:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
 5        xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
 6 
 7     <!-- 应用名 -->
 8     <dubbo:application name="my-dubbo-provider"/>
 9 
10     <!-- 使用zookeeper注册中心暴露服务地址 -->
11     <dubbo:registry address="zookeeper://xxxx:2181" use-as-config-center="true" timeout="10000"/>
12 
13     <!-- 用dubbo协议在20880端口暴露服务 -->
14     <dubbo:protocol name="dubbo" port="20880" />
15 
16     <!-- 要暴露的服务接口 -->
17     <dubbo:service interface="com.dubbo.provider.DemoService" ref="demoServiceImpl" />
18 
19 </beans>

服务类:

 1 package com.dubbo.provider.impl;
 2 
 3 import com.dubbo.provider.DemoService;
 4 import org.springframework.stereotype.Service;
 5 
 6 @Service
 7 public class DemoServiceImpl implements DemoService {
 8 
 9     public String doSomething(String name) {
10         System.out.println("消费端传过来了:" + name);
11         return name + "做了XXOO!";
12     }
13 }

config类导入配置文件:

 1 package com.dubbo.client;
 2 
 3 import org.springframework.context.annotation.ComponentScan;
 4 import org.springframework.context.annotation.Configuration;
 5 import org.springframework.context.annotation.ImportResource;
 6 
 7 @Configuration
 8 @ImportResource("classpath:application-provider.xml")
 9 @ComponentScan("com.dubbo")
10 public class ProviderConfig {
11 }

服务端启动类:

 1 package com.dubbo.client;
 2 
 3 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 4 
 5 import java.io.IOException;
 6 
 7 public class ProviderClient {
 8     public static void main(String[] args) {
 9         AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ProviderConfig.class);
10         applicationContext.start();
11         try {
12             System.in.read(); // 任意输入即可退出
13         } catch (IOException e) {
14             e.printStackTrace();
15         }
16     }
17 }

启动后会一直提供服务,输入任意信息退出。

2、消费端代码

pom文件依赖:

 1 <dependencies>
 2         <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo -->
 3         <dependency>
 4             <groupId>org.apache.dubbo</groupId>
 5             <artifactId>dubbo</artifactId>
 6             <version>2.7.5</version>
 7         </dependency>
 8         <dependency>
 9             <groupId>my-dubbo-demo</groupId>
10             <artifactId>my-dubbo-demo-provider</artifactId>
11             <version>1.0-SNAPSHOT</version>
12         </dependency>
13     </dependencies>

 

xml文件:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
 5        xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
 6 
 7     <!-- 消费方应用名 -->
 8     <dubbo:application name="my-dubbo-consumer"  />
 9 
10     <!-- 使用zookeeper注册中心暴露发现服务地址 -->
11     <dubbo:registry address="zookeeper://xxxx:2181" />
12 
13     <!-- 引入服务 -->
14     <dubbo:reference id="demoService" interface="com.dubbo.provider.DemoService" />
15 </beans>

消费类:

 1 package com.dubbo.consumer;
 2 
 3 import com.dubbo.provider.DemoService;
 4 import org.springframework.beans.factory.annotation.Autowired;
 5 import org.springframework.stereotype.Service;
 6 
 7 @Service
 8 public class ConsumerDemo {
 9     @Autowired
10     private DemoService demoService;
11 
12     public String consumeDemoService (String name) {
13         String result = demoService.doSomething(name);
14         System.out.println(result);
15         return result;
16     }
17 }

消费端配置类:

 1 package com.dubbo.client;
 2 
 3 import org.springframework.context.annotation.ComponentScan;
 4 import org.springframework.context.annotation.Configuration;
 5 import org.springframework.context.annotation.ImportResource;
 6 
 7 @Configuration
 8 @ComponentScan("com.dubbo.consumer")
 9 @ImportResource("classpath:application-consumer.xml")
10 public class ConsumerConfig {
11 }

消费端启动类:

 1 package com.dubbo.client;
 2 
 3 import com.dubbo.consumer.ConsumerDemo;
 4 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 5 
 6 public class ConsumerClient {
 7     public static void main(String[] args) {
 8         AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ConsumerConfig.class);
 9         ConsumerDemo consumerDemo = applicationContext.getBean(ConsumerDemo.class);
10         consumerDemo.consumeDemoService("马甲哥");
11     }
12 }

3、启动调用

    先启动服务端,此时登入zookeeper的客户端,通过ls /dubbo命令即可看到注册到zk上的服务端节点。

    然后启动消费端main方法,发现服务调用成功。

消费端日志:

 

 服务端日志:

 

 

至此,一个简易版的本地dubbo框架便搭建好了,后面要做的就是debug调试整个的调用流程,我们未完待续!

 

posted on 2020-03-21 23:42  淡墨痕  阅读(668)  评论(0编辑  收藏  举报