dubbo
架构演变
Rpc概念
概念:
Remote Procedure Call 远程过程调用,是一种不同进程之间的通信方式,他允许程序调用另一个地址空间的过程或者是函数,不用程序员显式的编写代码实现调用的细节(底层使用的是Socket)
搭建dubbo环境
下载Zookeeper安装包
Zookeeper是一个分布式开源框架,交给了Apache进行管理,实现服务的地址分配.
提供功能:配置维护,域名维护,分布式同步,组服务
他的目标是将封装好的 复杂易出错的关键服务,将简单易用的接口和性能高效,功能稳定的系统提供给用户使用
它包含了一个简单的 原语集,提供java和C使用的接口
还提供了分布式独享锁,选举,队列等
解压zookeeper安装包
进入到zookeeper中的conf目录
复制粘贴zoo.sample.cfg文件
修改 zkEnv.cmd 没有JAVA_HOME会报错
127.0.0.1 localhost ::1 localhost |
安装dubbo
进入到:D:\java8\incubator-dubbo-ops-master\dubbo-admin\src\main\resources修改application.properties文件
dubbo.registry.address=zookeeper://127.0.0.1:2181
进入到dubbo-admin项目的根目录中
mvc clean pakage -Dmaven.test.skip=true
启动dubbo-admin管理平台
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
启动成功后在浏览器url中输入 localhost:7001方可进入管理界面用户名密码为root root
创建服务的消费者和服务的提供者
用户模块消费者
角色模块提供者
在用户服务中去调用角色服务中的selectRole(userId)
角色服务中需要暴露接口 RoleService
用户服务中需要消费或者引用角色服务中的暴露的RoleService服务
配置服务提供者
引入dubbo依赖 zookeeper注册中心客户端 提供者和消费者公用的API
<dependencies> <!--引入dubbo坐标依赖--> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.2</version> </dependency>
<!--引入zookeeper注册中心的客户端--> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.12.0</version> </dependency>
<!--引入service-API坐标依赖--> <dependency> <groupId>com.zhiyou100</groupId> <artifactId>service-API</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> |
定义服务接口:
RoleService.java
import com.zhiyou100.pojo.Role;
import java.util.List;
//提供者 角色服务 public interface RoleService { List<Role> selectRoleByUserId(Integer uId); } |
在服务提供方实现接口
RoleServiceImpl
import com.zhiyou100.pojo.Role; import com.zhiyou100.service.RoleService; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.List; @Service //交给Spring管理 public class RoleServiceImpl implements RoleService { //属性注入 mapper //@AutoWired
@Override public List<Role> selectRoleByUserId(Integer uId) { ArrayList<Role> roles = new ArrayList<>(); roles.add(new Role(1,"CEO", "高级打工者")); roles.add(new Role(2,"CTO", "高级代码搬运工")); roles.add(new Role(3,"Programmer", "cv工程师")); return roles; } } |
pojo类
Role.java
import java.io.Serializable;
//JavaBean 角色 public class Role implements Serializable { private Integer rId; private String rName; private String rDesc; } |
用Spring配置生命暴露服务
provide.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://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-4.3.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">
<!--组件扫描--> <!--<context:component-scan base-package="com.zhiyou100.service.impl"/>-->
<!-- 1.指定当前应用名称 区分不同的应用服务的 服务名称不能重复 --> <dubbo:application name="service-provider" />
<!-- 2.指定注册中心的位置 zookeeper 使用哪个注册中心 127.0.0.1:2181 ip地址+端口号 --> <dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!-- 3.指定服务之间的通信规则 用dubbo协议在20880端口暴露服务 dubbo服务之间通信的协议 20880 dubbo的端口号 --> <dubbo:protocol name="dubbo" port="20880" />
<!--4.指定服务提供者暴露的接口 声明需要暴露的服务接口 --> <dubbo:service interface="com.zhiyou100.service.RoleService" ref="roleService" />
<!-- 和本地bean一样实现服务 --> <bean id="roleService" class="com.zhiyou100.service.impl.RoleServiceImpl" /> </beans> |
加载Spring配置
Provider.java
import org.springframework.context.support.ClasspathXmlApplicationContext;
import java.io.IOException;
//服务提供者 public class Provider { public static void main(String[] args) throws IOException { //创建ClasspathXmlApplicationContext spring容器 classpath 类路径下 ClasspathXmlApplicationContext context = new ClasspathXmlApplicationContext(new String[]{"classpath:provider.xml"}); //启动spring容器 context.start(); //从输入流中读取字节 读到系统内存中 //信息 阻塞 } } |
配置服务消费者
导入依赖
<dependencies> <!--引入dubbo坐标依赖--> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.2</version> </dependency>
<!--引入zookeeper注册中心的客户端--> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.12.0</version> </dependency>
<!--引入service-API坐标依赖--> <dependency> <groupId>com.zhiyou100</groupId> <artifactId>service-API</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
</dependencies> |
通过Spring配置引用远程服务
consumer.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://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-4.3.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">
<!--组件扫描--> <context:component-scan base-package="com.zhiyou100.service.impl"/>
<!-- 1.指定服务消费者应用名称 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --> <dubbo:application name="service-consumer" />
<!-- 2.指定注册中心 使用zookeeper暴露发现服务地址 --> <dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!-- 生成远程服务代理,可以和本地bean一样使用demoService --> <dubbo:reference id="roleService" interface="com.zhiyou100.service.RoleService" /> </beans> |
加载Spring配置 并调用远程服务
Consumer.java
package com.zhiyou100.starter;
import com.zhiyou100.pojo.Role; import com.zhiyou100.service.RoleService; import org.springframework.context.support.ClasspathXmlApplicationContext;
import java.util.List;
//服务消费者 启动类 public class Consumer { public static void main(String[] args) throws Exception { ClasspathXmlApplicationContext context = new ClasspathXmlApplicationContext(new String[] {"classpath:consumer.xml"}); context.start(); RoleService roleService = (RoleService)context.getBean("roleService"); // 获取远程服务代理 List<Role> roles = roleService.selectRoleByUserId(1);// 执行远程方法 for (Role role : roles) { System.out.println( role.getrName() ); // 显示调用结果 }
//信息阻塞 System.in.read(); } } |
定义消费接口的
UserService
import com.zhiyou100.pojo.Role;
import java.util.List;
public interface UserService {
//传输userId值 调用role服务 获取所有的角色信息 List<Role> listRoles(Integer userId);
} |
定义消费接口的实现类
import com.zhiyou100.pojo.Role; import com.zhiyou100.service.RoleService; import com.zhiyou100.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;
import java.util.List; @Service public class UserServiceImpl implements UserService {
//注入RoleService属性 @Autowired private RoleService roleService;
@Override public List<Role> listRoles(Integer userId) { return roleService.selectRoleByUserId(userId); } } |
配置service-API
把提供者和消费者需要共同使用的接口或者类提取出来返点高service-API中
这个Demo中涉及到的公用的类和接口有Role RoleService UserService
注意提取出来把service-API导入到本地仓库 然后通过maven导入就可以使用里面的接口和类
dubbo
架构演变
Rpc概念
概念:
Remote Procedure Call 远程过程调用,是一种不同进程之间的通信方式,他允许程序调用另一个地址空间的过程或者是函数,不用程序员显式的编写代码实现调用的细节(底层使用的是Socket)
搭建dubbo环境
下载Zookeeper安装包
Zookeeper是一个分布式开源框架,交给了Apache进行管理,实现服务的地址分配.
提供功能:配置维护,域名维护,分布式同步,组服务
他的目标是将封装好的 复杂易出错的关键服务,将简单易用的接口和性能高效,功能稳定的系统提供给用户使用
它包含了一个简单的 原语集,提供java和C使用的接口
还提供了分布式独享锁,选举,队列等
解压zookeeper安装包
进入到zookeeper中的conf目录
复制粘贴zoo.sample.cfg文件
修改 zkEnv.cmd 没有JAVA_HOME会报错
127.0.0.1 localhost ::1 localhost |
安装dubbo
进入到:D:\java8\incubator-dubbo-ops-master\dubbo-admin\src\main\resources修改application.properties文件
dubbo.registry.address=zookeeper://127.0.0.1:2181
进入到dubbo-admin项目的根目录中
mvc clean pakage -Dmaven.test.skip=true
启动dubbo-admin管理平台
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
启动成功后在浏览器url中输入 localhost:7001方可进入管理界面用户名密码为root root
创建服务的消费者和服务的提供者
用户模块消费者
角色模块提供者
在用户服务中去调用角色服务中的selectRole(userId)
角色服务中需要暴露接口 RoleService
用户服务中需要消费或者引用角色服务中的暴露的RoleService服务
配置服务提供者
引入dubbo依赖 zookeeper注册中心客户端 提供者和消费者公用的API
<dependencies> <!--引入dubbo坐标依赖--> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.2</version> </dependency>
<!--引入zookeeper注册中心的客户端--> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.12.0</version> </dependency>
<!--引入service-API坐标依赖--> <dependency> <groupId>com.zhiyou100</groupId> <artifactId>service-API</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> |
定义服务接口:
RoleService.java
import com.zhiyou100.pojo.Role;
import java.util.List;
//提供者 角色服务 public interface RoleService { List<Role> selectRoleByUserId(Integer uId); } |
在服务提供方实现接口
RoleServiceImpl
import com.zhiyou100.pojo.Role; import com.zhiyou100.service.RoleService; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.List; @Service //交给Spring管理 public class RoleServiceImpl implements RoleService { //属性注入 mapper //@AutoWired
@Override public List<Role> selectRoleByUserId(Integer uId) { ArrayList<Role> roles = new ArrayList<>(); roles.add(new Role(1,"CEO", "高级打工者")); roles.add(new Role(2,"CTO", "高级代码搬运工")); roles.add(new Role(3,"Programmer", "cv工程师")); return roles; } } |
pojo类
Role.java
import java.io.Serializable;
//JavaBean 角色 public class Role implements Serializable { private Integer rId; private String rName; private String rDesc; } |
用Spring配置生命暴露服务
provide.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://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-4.3.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">
<!--组件扫描--> <!--<context:component-scan base-package="com.zhiyou100.service.impl"/>-->
<!-- 1.指定当前应用名称 区分不同的应用服务的 服务名称不能重复 --> <dubbo:application name="service-provider" />
<!-- 2.指定注册中心的位置 zookeeper 使用哪个注册中心 127.0.0.1:2181 ip地址+端口号 --> <dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!-- 3.指定服务之间的通信规则 用dubbo协议在20880端口暴露服务 dubbo服务之间通信的协议 20880 dubbo的端口号 --> <dubbo:protocol name="dubbo" port="20880" />
<!--4.指定服务提供者暴露的接口 声明需要暴露的服务接口 --> <dubbo:service interface="com.zhiyou100.service.RoleService" ref="roleService" />
<!-- 和本地bean一样实现服务 --> <bean id="roleService" class="com.zhiyou100.service.impl.RoleServiceImpl" /> </beans> |
加载Spring配置
Provider.java
import org.springframework.context.support.ClasspathXmlApplicationContext;
import java.io.IOException;
//服务提供者 public class Provider { public static void main(String[] args) throws IOException { //创建ClasspathXmlApplicationContext spring容器 classpath 类路径下 ClasspathXmlApplicationContext context = new ClasspathXmlApplicationContext(new String[]{"classpath:provider.xml"}); //启动spring容器 context.start(); //从输入流中读取字节 读到系统内存中 //信息 阻塞 } } |
配置服务消费者
导入依赖
<dependencies> <!--引入dubbo坐标依赖--> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.2</version> </dependency>
<!--引入zookeeper注册中心的客户端--> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.12.0</version> </dependency>
<!--引入service-API坐标依赖--> <dependency> <groupId>com.zhiyou100</groupId> <artifactId>service-API</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
</dependencies> |
通过Spring配置引用远程服务
consumer.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://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-4.3.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">
<!--组件扫描--> <context:component-scan base-package="com.zhiyou100.service.impl"/>
<!-- 1.指定服务消费者应用名称 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --> <dubbo:application name="service-consumer" />
<!-- 2.指定注册中心 使用zookeeper暴露发现服务地址 --> <dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!-- 生成远程服务代理,可以和本地bean一样使用demoService --> <dubbo:reference id="roleService" interface="com.zhiyou100.service.RoleService" /> </beans> |
加载Spring配置 并调用远程服务
Consumer.java
package com.zhiyou100.starter;
import com.zhiyou100.pojo.Role; import com.zhiyou100.service.RoleService; import org.springframework.context.support.ClasspathXmlApplicationContext;
import java.util.List;
//服务消费者 启动类 public class Consumer { public static void main(String[] args) throws Exception { ClasspathXmlApplicationContext context = new ClasspathXmlApplicationContext(new String[] {"classpath:consumer.xml"}); context.start(); RoleService roleService = (RoleService)context.getBean("roleService"); // 获取远程服务代理 List<Role> roles = roleService.selectRoleByUserId(1);// 执行远程方法 for (Role role : roles) { System.out.println( role.getrName() ); // 显示调用结果 }
//信息阻塞 System.in.read(); } } |
定义消费接口的
UserService
import com.zhiyou100.pojo.Role;
import java.util.List;
public interface UserService {
//传输userId值 调用role服务 获取所有的角色信息 List<Role> listRoles(Integer userId);
} |
定义消费接口的实现类
import com.zhiyou100.pojo.Role; import com.zhiyou100.service.RoleService; import com.zhiyou100.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;
import java.util.List; @Service public class UserServiceImpl implements UserService {
//注入RoleService属性 @Autowired private RoleService roleService;
@Override public List<Role> listRoles(Integer userId) { return roleService.selectRoleByUserId(userId); } } |
配置service-API
把提供者和消费者需要共同使用的接口或者类提取出来返点高service-API中
这个Demo中涉及到的公用的类和接口有Role RoleService UserService
注意提取出来把service-API导入到本地仓库 然后通过maven导入就可以使用里面的接口和类
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。