使用Duboo远程连接
Spring连接使用步骤
- 导入依赖
- 服务提供者,向注册中心注册服务
- 服务消费者,向注册中心调用服务
- 可以使用监控进行查看服务
准备工作
首先Duboo是在多个服务之间建立联系,从而通过注册中心来进行远程调用
Duboo可以通过面向接口的形式进行远程调用
两方想要相互调用要存在共同的接口
(因为之后多个服务之间出现多个相同的接口,如果每次都写入,会显得特别繁琐,所以这里我们将会使用Maven的多模块开发)
查看项目结构
使用Maven的多模块开发,父工程来提供共同的jar文件,author子工程来提供公用的接口
在使用之前要打开Duboo的监控器便于之后的观察
开启zookeeper,开启监控
开启监控
导入依赖
<!-- 引入dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency>
<!-- 由于我们使用zookeeper作为注册中心,所以需要操作zookeeper
dubbo 2.6以前的版本引入zkclient操作zookeeper
dubbo 2.6及以后的版本引入curator操作zookeeper
下面两个zk客户端根据dubbo版本2选1即可
-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- curator-framework -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
我用的是(因为版本的缘故)
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.1</version>
</dependency>
编写服务提供者的代码
服务提供者的来完成接口的实现
package cn.Dao;
public class UserDaoImple implements UserDao {
// 这里因为Maven的多模块开发
// 所以集成接口,重写方法,这里的方法做一个返回值处理
public String show() {
return "实现在提供者中";
}
}
查看Spring的进行将提供者服务开启主程序类
public class Client {
public static void main(String[] args) {
// 加载配置文件
// 配置文件中配置了关于Duboo的服务
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("provider.xml");
context.start();
// 为了防止执行程序之后结束,这里写一个阻塞,程序运行到这里暂时不结束
// 这样就可以看到监控器中的展示服务提供者
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
}
看一看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://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://dubbo.apache.org/schema/dubbo
http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!--指定服务名,名字可以进行自定义-->
<dubbo:application name="gmall-user"></dubbo:application>
<!--指定注册中心的地址 这里指定zookeeper的位置和可以在cmd上看得到 -->
<dubbo:registry address="zookeeper://192.168.159.1:2181"/>
<!--使用dubbo协议,将服务暴露在20880端口 -->
<dubbo:protocol name="dubbo" port="20880" />
<!--下面的两个用来指定服务提供者提供的服务-->
<!-- 指定需要暴露的服务 -->
<!--这里的ref引入表示接口的实现类在哪里-->
<dubbo:service interface="cn.Dao.UserDao" ref="UserDaoImple" />
<bean id="UserDaoImple" class="cn.Dao.UserDaoImple"/>
</beans>
看一看运行结果
在监控器中可以看到服务提供者+1
编写服务消费者部分代码
- 首先编写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://dubbo.apache.org/schema/dubbo" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://dubbo.apache.org/schema/dubbo
http://dubbo.apache.org/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--Spring的包扫描-->
<context:component-scan base-package="cn"/>
<!--添加 自定义服务名-->
<dubbo:application name="consumerweb"></dubbo:application>
<!-- 指定注册中心地址 因为服务提供者提供了地址,服务消费者指定连接-->
<dubbo:registry address="zookeeper://192.168.159.1:2181" />
<!--引入接口作为连接-->
<!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
<dubbo:reference id="userService" interface="cn.Dao.UserDao"></dubbo:reference>
</beans>
编写服务调用者类
package cn.Dao;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
//这里使用SpringIOC进行处理
@Service("userdaocall")
public class UserDaoCall {
// 正常使用Spring注解进行引入接口
// 因为配置的原因,调用接口会调用服务提供者的代码
@Autowired
@Reference
private UserDao userService;
// 和以往一样正常的进行调用
public void Consumershow(){
System.out.println(userService.show());
}
}
主程序类
package cn.Dao;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;
public class Client {
public static void main(String[] args) {
// 加载Spring配置
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");
context.start();
// 通过IOC创建出调用者对象
UserDaoCall userdaocall = context.getBean("userdaocall", UserDaoCall.class);
userdaocall.Consumershow();
System.out.println("我是消费者");
// 使用阻塞,保持程序正常执行,才可以看得到监控器内容
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
}
观察结果
监控器
使用SpringBoot进行操作
- 引入依赖
- 编写配置
- 编写代码
- 运行主程序类
准备工作
创建共同的接口,SpringBoot本身就是Spring编写的,Spring的整体使用和搭建要比Spring简便很多
导入依赖
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
注意版本兼容问题
配置文件
- application.name就是服务名,不能跟别的dubbo提供端重复
- registry.protocol 是指定注册中心协议
- registry.address 是注册中心的地址加端口号
- protocol.name 是分布式固定是dubbo,不要改。
- base-package 注解方式要扫描的包
SpringBoot的配置一般写在Yml或properties中
这里的配置与Spring中配置基本上一致,只是换了一种形式
编写提供者
SpringBoot配置
#这里的配置与Spring中配置基本上一致,只是换了一种形式
#这里不存在暴露服务,因为实际中需要暴漏的服务很多,所以这里一般使用Duboo注解的形式
dubbo.application.name=SpringBootProvider
dubbo.registry.protocol=zookeeper
dubbo.registry.address=192.168.159.1:2181
dubbo.scan.base-package=cn
dubbo.protocol.name=dubbo
duboo.protocol.port=20880
#这里因为端口号被zookeeper等占用,所以改变一下端口号
server.port=8091
实现类
package cn.Dao;
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
//这里的Service使用的是Duboo的
//使用这个注解来暴漏服务
@Service
//因为Service注解避免冲突所以这里使用Spring的Componet注解
@Component
public class UserDaoImple implements UserDao {
// 这里因为Maven的多模块开发
// 所以集成接口,重写方法,这里的方法做一个返回值处理
public String show() {
return "实现在提供者中";
}
}
主程序类
package cn;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//使用该注解表示这个SpringBoot开启了Duboo注解及其功能
@EnableDubbo
@SpringBootApplication
public class ProviderMain {
public static void main(String[] args) {
SpringApplication.run(ProviderMain.class);
}
}
编写消费者
和上面基本上步骤是一样的
配置文件
server.port=8092
dubbo.application.name=SpringBootConsumer
dubbo.registry.protocol=zookeeper
dubbo.registry.address=192.168.159.1:2181
dubbo.scan.base-package=cn
dubbo.protocol.name=dubbo
如何写调用类
package cn.Dao;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
//这里使用SpringIOC进行处理
@Service("userdaocall")
public class UserDaoCall {
// 和以往不一样的是这里使用Duboo注解进行引入远程连接
@Reference
private UserDao userService;
// 和以往一样正常的进行调用
public void Consumershow(){
System.out.println(userService.show());
}
}
主程序类
package cn;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableDubbo
@SpringBootApplication
public class SpringBootConsumer {
public static void main(String[] args) {
SpringApplication.run(SpringBootConsumer.class);
}
}
查看结果
bbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;