微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java Dubbo

 

dubbo

 

架构演变

 

 

 

 

 

 

 

 

Rpc概念

 

 

概念:

 

Remote Procedure Call 远程过程调用,是一种不同进程之间的通信方式,他允许程序调用一个地址空间的过程或者是函数,不用程序员显式的编写代码实现调用的细节(底层使用的是Socket)

 

搭建dubbo环境

 

下载Zookeeper安装包

 

Zookeeper是一个分布式开源框架,交给了Apache进行管理,实现服务的地址分配.

 

提供功能:配置维护,域名维护,分布式同步,组服务

 

他的目标是将封装好的 复杂易出错的关键服务,将简单易用的接口和性能高效,功能稳定的系统提供给用户使用

 

它包含了一个简单的 原语集,提供java和C使用的接口

 

还提供了分布式独享锁,选举,队列等

 

 

 

解压zookeeper安装包

 

进入到zookeeper中的conf目录

 

复制粘贴zoo.sample.cfg文件

 

修改文件名为zoo.cfg 并作出相应的修改

 

修改 zkEnv.cmd 没有JAVA_HOME会报错

 

修改本地中的hosts文件,放开这两个注解

 

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

 

 

 

创建服务的消费者和服务的提供者

 

根据用户的id值查询用户所含有的角色信息

 

用户模块消费者

 

角色模块提供者

 

用户服务中去调用角色服务中的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 自动注册与发现

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();

//从输入流中读取字节 读到系统内存中

//信息  阻塞

System.in.read(); // 按任意键退出

}

}

 

 

 

 

 

配置服务消费者

 

导入依赖

 

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

 

<!--

3.声明需要远程调用的远程的服务接口  生成远程服务代理

生成远程服务代理,可以和本地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文件

修改文件名为zoo.cfg 并作出相应的修改

修改 zkEnv.cmd 没有JAVA_HOME会报错

修改本地中的hosts文件,放开这两个注解

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

 

创建服务的消费者和服务的提供者

根据用户的id值查询用户所含有的角色信息

用户模块消费者

角色模块提供者

用户服务中去调用角色服务中的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 自动注册与发现

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();

//从输入流中读取字节 读到系统内存中

//信息  阻塞

System.in.read(); // 按任意键退出

}

}

 

 

配置服务消费者

导入依赖

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

 

<!--

3.声明需要远程调用的远程的服务接口  生成远程服务代理

生成远程服务代理,可以和本地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 举报,一经查实,本站将立刻删除。

相关推荐