Dubbo的学习之路
1、开发所需工具的准备
JDK
- 使用jdk1.8(没有的需先行下载)
zookeeper
(1)、zookeeper下载链接(本项目使用的是windows版本的zookeeper-3.4.14)
(2)、zookeeper的安装步骤:
- 解压 zookeeper-3.4.14.tar.gz(本人下载在 E:\Java目录下)
- 进入到 E:\Java\zookeeper-3.4.14\conf 目录
- 复制一份zoo_sample.cfg文件,再将名字改为zoo.cfg
- 在E:\Java\zookeeper-3.4.14目录下创建 data文件夹和log文件夹
- 修改zoo.cfg文件中的配置
- 将dataDir对应的路径改为E:/Java/zookeeper-3.4.14/data
- 再新增 dataLogDir=E:/Java/zookeeper-3.4.14/log
- 启动zookeeper服务端
- 进入到E:\Java\zookeeper-3.4.14\bin目录下找到zkServer.cmd命令脚本点击即可
- 启动zookeeper客户端
- 进入到E:\Java\zookeeper-3.4.14\bin目录下找到zkCli.cmd命令脚本点击即可
- 验证是否启动成功
- 启动zkCli.cmd后能在命令窗口中看见Welcome to ZooKeeper!
- 或者通过 netstat -a 进行查看当前系统所有线程的端口,找到2181就说明启动成功。
2、项目创建
(1)通过maven创建provider项目
<1>在provider项目的pom文件中引入jar包
<dependencies>
<!--使用zookeeper当注册中心-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-zookeeper</artifactId>
<version>2.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-configcenter-zookeeper</artifactId>
<version>2.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-rpc-dubbo</artifactId>
<version>2.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-config-spring</artifactId>
<version>2.7.2</version>
</dependency>
<!--使用netty4作为容器-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-remoting-netty4</artifactId>
<version>2.7.2</version>
</dependency>
<!--使用hessian2作为远程序列化-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-serialization-hessian2</artifactId>
<version>2.7.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
</dependencies>
<2> 资源配置
新建dubbo.properties文件并配置以下
#应用名称
dubbo.application.name=myProvider
#注册地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#配置包的扫描
scan_base_packages=com.yanhj.provider
#协议类型
dubbo.protocol.name=dubbo
#协议端口
dubbo.protocol.port=20880
新建log4j.properties文件并配置以下
###set log levels###
log4j.rootLogger=info, stdout
###output to the console###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%d{dd/MM/yy HH:mm:ss:SSS z}] %t %5p %c{2}: %m%n
<3> java实现代码
创建DemoService接口
package com.yanhj.provider;
/*
* 对外接口
*/
public interface DemoService {
String sayHello(String name);
}
创建DemoServiceImpl类,并实现DemoService接口
package com.yanhj.provider;
import org.apache.dubbo.config.annotation.Service;
/**
* 具体实现
* 此处的@Service注解必须使用dubbo包中的
*/
@Service
public class DemoServiceImpl implements DemoService {
public String sayHello(String name) {
return "Hello " + name;
}
}
<4>创建启动类
package com.yanhj;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* 服务启动类
* @EnableDubbo激活Dubbo
*/
@EnableDubbo
public class APP {
public static void main(String[] args) throws Exception {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(APP.class);
context.start();
System.in.read();
}
}
<4>将该项目通过maven打成jar包,并install到maven库中,需要在comsumer项目pom中引入
(2)通过maven创建comsumer项目
<1>在comsumer项目的pom文件中引入jar包
<dependencies>
<!--该依赖是先前创建的Provider项目通过maven打成的jar,此处的groupId和artifactId根据实际的Provider项目而定-->
<dependency>
<groupId>myDubbo-HelloWorld-Provider</groupId>
<artifactId>com.yanhj</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--注册中心-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-zookeeper</artifactId>
<version>2.7.2</version>
</dependency>
</dependencies>
<2> 资源配置
新建dubbo.properties文件并配置以下
#应用名称
dubbo.application.name=myConsumer
#注册中心
dubbo.registry.address=zookeeper://127.0.0.1:2181
<3> java实现代码
创建DemoServiceComponent类
package com.yhj.consumer;
import com.yanhj.provider.DemoService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Component;
@Component("demoServiceComponent")
public class DemoServiceComponent {
@Reference
private DemoService demoService;
public String sayHello(String s) {
return demoService.sayHello(s);
}
}
<4>创建启动类
创建Consumer启动类
package com.yhj.consumer;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
/**
* @ComponentScan注解用于扫描带有@Component注解的类(DemoServiceComponent类)
* @EnableDubbo 激活Dubbo
*/
@ComponentScan(value = {"com.yhj.consumer"})
@EnableDubbo
public class Consumer {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Consumer.class);
context.start();
DemoServiceComponent service = (DemoServiceComponent)context.getBean("demoServiceComponent");
String hello = service.sayHello("world");
System.out.println("result :" + hello);
}
}
3、项目运行
1、启动provider项目
直接启动类即可。
2、启动Consumer项目
直接启动类即可。
4、最终效果
控制台中会数据 result :Hello world 数据
[09/12/19 22:33:28:238 CST] main INFO transport.AbstractClient: [DUBBO] Succeed connect to server /192.168.174.1:20880 from NettyClient 192.168.174.1 using dubbo version 2.7.2, channel is NettyChannel [channel=[id: 0xc06ee474, L:/192.168.174.1:55413 - R:/192.168.174.1:20880]], dubbo version: 2.7.2, current host: 192.168.174.1
[09/12/19 22:33:28:238 CST] main INFO transport.AbstractClient: [DUBBO] Start NettyClient yanhj/192.168.174.1 connect to the server /192.168.174.1:20880, dubbo version: 2.7.2, current host: 192.168.174.1
[09/12/19 22:33:28:323 CST] main INFO config.AbstractConfig: [DUBBO] Refer dubbo service com.yanhj.provider.DemoService from url zookeeper://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?anyhost=true&application=myConsumer&bean.name=ServiceBean:com.yanhj.provider.DemoService&check=false&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=com.yanhj.provider.DemoService&lazy=false&methods=sayHello&pid=8108®ister=true®ister.ip=192.168.174.1&release=2.7.2&remote.application=myProvider&revision=1.0-SNAPSHOT&side=consumer&sticky=false×tamp=1575902006426, dubbo version: 2.7.2, current host: 192.168.174.1
result :Hello world
[09/12/19 22:33:28:643 CST] Thread-0 INFO annotation.AnnotationConfigApplicationContext: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@1f95c5d: startup date [Mon Dec 09 22:33:25 CST 2019]; root of context hierarchy
[09/12/19 22:33:28:644 CST] Thread-0 INFO support.AbstractRegistryFactory: [DUBBO] Close all registries [zookeeper://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=myConsumer&dubbo=2.0.2&interface=org.apache.dubbo.registry.RegistryService&pid=8108&release=2.7.2×tamp=1575902006881], dubbo version: 2.7.2, current host: 192.168.174.1
[09/12/19 22:33:28:644 CST] Thread-0 INFO zookeeper.ZookeeperRegistry: [DUBBO] Destroy registry:zookeeper://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=myConsumer&dubbo=2.0.2&interface=org.apache.dubbo.registry.RegistryService&pid=8108&release=2.7.2×tamp=1575902006881, dubbo version: 2.7.2, current host: 192.168.174.1