dubbo入门(一)
1、简介
Dubbo由阿里巴巴开源,是一个分布式服务框架,致力于提供高性能和透明化的RPC(远程过程调用)远程服务调用方案,以及SOA服务治理方案。如果没有分布式的需求,Dbubbo是不需要的,其本质是远程服务调用的分布式框架,与之前的WebService不同。
电商系统的演变过程:
1、单一应用架构,所有的功能均部署在一起,即在一个发布包中;缺点:难以维护
2、垂直应用架构,将系统拆分成几个子系统,每个子系统完成特定的业务;缺点:相同逻辑的代码需要不断复制,无法复用
3、分布式应用架构,将核心业务抽取出来作为单独服务,形成稳定的服务中心,
4、流动计算框架(SOA)。随着服务越来越多,服务之间会产生相互调用会越来越复杂,诞生了面向服务的架构体系(SOA),因此衍生出了一系列相应的技术,如对服务提供、服务调用、连接处理、通信协议、序列化方式、服务发现、服务路由、日志输出等行为进行封装的服务框架。
Dubbo:
1、一款分布式服务框架
2、高性能和透明化的RPC远程服务调用方案;
3、SOA服务治理方案;
2、架构
Provider:服务提供方
Registry:服务注册与调用的注册中心
Consumer:服务消费方
Monitor:服务监控中心,统计服务调用时间及调用次数
服务过程:
0 服务容器启动、加载、运行服务提供者
1 服务提供者在启动时向注册中心注册自己的服务
2 服务消费方在服务启动时向注册中心订阅自己需要的服务
3 注册中心返回服务提供者服务列表给你服务消费方,如有变更,注册中心将基于长连接推送给服务消费方
4 服务消费方基于软负载均衡算法选择一台服务提供者进行调用,调用失败选择另外的一台
5 服务消费者和提供者在内存中累计调用次数和时间,定时每分钟发送给监控中心
3、Dubbo注册中心
Dubbo提供了一下集中注册中心的类型
1、Multicast注册中心 多播
2、Zookeeper注册中心,使用zookeeper
3、Redis注册中心,使用Redis
4、Simple注册中心,
4、Dbubbo优缺点
4.1、优点
1、透明化的远程方法调用
- 像调用本地方法一样调用远程方法;只需简单配置,没有任何API侵入。/2、软负载均衡及容错机制
可在内网替代nginx lvs等硬件负载均衡器。
3、服务注册中心自动注册 & 配置管理
-不需要写死服务提供者地址,注册中心基于接口名自动查询提供者ip。
使用类似zookeeper等分布式协调服务作为服务注册中心,可以将绝大部分项目配置移入zookeeper集群。
4、服务接口监控与治理
-Dubbo-admin与Dubbo-monitor提供了完善的服务接口管理与监控功能,针对不同应用的不同接口,可以进行 多版本,多协议,多注册中心管理。
4.2、缺点
仅支持JAVA语言
5、Demo
5.1、简介
注册中心使用zookeeper,安装使用可参见下面。
项目使用maven的构建方式,提供服务提供者和服务消费者,另外还需一个服务接口,共新建三个maven项目:dubbo-api、dubbo-provider、dubbo-consumer;
dubbo-api:服务接口,需单独打包,供服务提供者和消费者使用;
dubbo-provider:服务提供者,依赖dubbo-api,实现其接口;
dubbo-consumer:服务消费者,依赖dubbo-api,调用服务提供者的服务;
Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用spring加载Dubbo配置即可,基于spring的Schema扩展进行加载。
此demo需要用到spring、zookeeper、zkclient等jar包。使用spring-4.3.16.RELEASE、zookeeper.3.4.10、dubbo.2.5.2、zkclient.0.10
5.2、zookeeper安装
详见《zookeeper安装》
5.3、dubbo-api
新建maven项目,此项目中提供一个服务接口:UserService,另为了方便接口间数据的交互可使用javabean,这里提供一个User类,由于是网络间的传输,需实现Serializable。
UserService
package cn.com.dubbo_api.service; import java.util.List; import cn.com.dubbo_api.entity.User; /**
* *
*<p>Title: UserService</p>
* <p>Description: 用户服务API</p>
* <p>Company: </p>
* @author Administrator
* @date 2018年5月24日 上午10:30:59
*/
public interface UserService { //批量新增
public int addUsers(List<User> users);
//查询所有
public List<User> findUsers();
//删除
public int deleteUser(User user);
//单个新增
public int addUser(User user);
//更新
public int updateUser(User user);
//查询单个
public User findUser(User user);
}
User
package cn.com.dubbo_api.entity; import java.io.Serializable; /**
* *
*<p>Title: User</p>
* <p>Description:用户实体类 </p>
* <p>Company: </p>
* @author Administrator
* @date 2018年5月24日 上午10:30:43
*/
public class User implements Serializable{ private Long id;
private String name;
private String address;
private Integer age;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public User() {
// TODO Auto-generated constructor stub
}
public User(Long id,String name,String address,Integer age) {
// TODO Auto-generated constructor stub
this.id=id;
this.name=name;
this.address=address;
this.age=age;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", address=" + address + ", age=" + age + "]";
} }
5.4、dubbo-provider
新建maven项目,由于此为服务提供者故需引入spring、zookeeper等的jar包,还需引入dubbo-api,具体实现类为;
UserServiceImpl
package cn.com.dubbo_provider.serviceImpl; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set; import cn.com.dubbo_api.entity.User;
import cn.com.dubbo_api.service.UserService; public class UserServiceImpl implements UserService { private Map<Long,User> userMap=new HashMap<Long,User>(); public int addUsers(List<User> users) {
// TODO Auto-generated method stub
int num=0;
if(users!=null&&users.size()>0) {
for (User user : users) {
userMap.put(user.getId(), user);
}
num=users.size();
}
return num;
} public List<User> findUsers() {
// TODO Auto-generated method stub
if(isNull(userMap)) {
return null;
}
List<User> users=new ArrayList<User>();
Set<Long> keySet=userMap.keySet();
for (Long id : keySet) {
users.add(userMap.get(id));
}
return users;
} public int deleteUser(User user) {
// TODO Auto-generated method stub
if(isNull(userMap)) {
return 0;
}
User delUser=userMap.remove(user.getId());
if(delUser!=null) {
return 1;
}
return 0;
} public int addUser(User user) {
// TODO Auto-generated method stub
userMap.put(user.getId(), user);
return 1;
} public int updateUser(User user) {
// TODO Auto-generated method stub
if(userMap.containsKey(user.getId())) {
userMap.put(user.getId(), user);
}
return 1;
} public User findUser(User user) {
// TODO Auto-generated method stub
return userMap.get(user.getId());
} //判断Map是为空
public boolean isNull(Map map) {
boolean b=false;
if(map.isEmpty()) {
b= true;
}
return b;
}
}
Spring的配置:spring-privider.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://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 定义服务的实现接口 -->
<bean id="userService" class="cn.com.dubbo_provider.serviceImpl.UserServiceImpl"></bean>
<!--定义了提供方应用信息,用于计算依赖关系;在 dubbo-admin 或 dubbo-monitor 会显示这个名字,方便辨识-->
<dubbo:application name="demotest-provider" owner="programmer" organization="dubbox"/>
<!--使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper-->
<dubbo:registry address="zookeeper://192.168.199.128:2181"/>
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!--使用 dubbo 协议实现定义好的 api.PermissionService 接口-->
<dubbo:service interface="cn.com.dubbo_api.service.UserService" ref="userService" protocol="dubbo" />
</beans>
服务启动类:
package cn.com.dubbo_provider; import java.io.IOException; import org.springframework.context.support.ClassPathXmlApplicationContext; /**
* Hello world!
*
*/
public class App
{
public static void main( String[] args ) throws IOException
{
System.out.println( "Hello World!" ); ClassPathXmlApplicationContext cac=new ClassPathXmlApplicationContext("spring-provider.xml");
cac.start();
System.out.println("服务已经启动...");
System.in.read();
}
}
5.5、dubbo-consumer
新建maven项目,引入spring、zookeeper、dubbo-api的依赖。
由于是服务消费者则直接测试即可,下面看spring配置文件,
spring的配置文件: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://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <dubbo:application name="demotest-consumer" owner="programmer" organization="dubbox"/>
<!--向 zookeeper 订阅 provider 的地址,由 zookeeper 定时推送-->
<dubbo:registry address="zookeeper://192.168.199.128:2181"/>
<!--使用 dubbo 协议调用定义好的 api.PermissionService 接口-->
<dubbo:reference id="permissionService" interface="cn.com.dubbo_api.service.UserService"/>
</beans>
测试类:
package cn.com.dubbo_consumer; import java.util.List; import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.com.dubbo_api.entity.User;
import cn.com.dubbo_api.service.UserService; /**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
{
System.out.println( "Hello consumer!" ); ClassPathXmlApplicationContext cac=new ClassPathXmlApplicationContext("spring-consumer.xml");
cac.start(); UserService us=cac.getBean(UserService.class); User u=new User(1l,"tom1","uc",22);
int k=us.addUser(u);
System.out.println("k:"+k); List<User> list=us.findUsers();
System.out.println(list.size());
for (User user : list) {
System.out.println("user:"+user.toString());
}
System.out.println(us.findUser(new User(3l,null,null,0)));
}
}
以上的三个项目,dubbo-api作为服务接口,只提供接口的定义,作为服务提供者和服务消费者的接口,需单独打包。dubbo-provider和dubbo-consumer作为服务提供者和服务消费者分别打包、运行。
感谢,1046386199可交流!
dubbo入门(一)的更多相关文章
- 分布式学习系列【dubbo入门实践】
分布式学习系列[dubbo入门实践] dubbo架构 组成部分:provider,consumer,registry,monitor: provider,consumer注册,订阅类似于消息队列的注册 ...
- Dubbo入门—搭建一个最简单的Demo框架
一.Dubbo背景和简介 1.电商系统的演进 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. a.单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一 ...
- 基于MAVEN使用IDEA创建dubbo入门项目图文教程
花了很长时间没有找到一个很详细的图文教程来学习dubbo入门框架,故记录下来. 一: 项目工程目录 简单介绍项目目录结构: 二: 创建父工程 具体操作步骤: 1,打开IDEA,按下面步骤来 File- ...
- dubbo入门学习笔记之入门demo(基于普通maven项目)
注:本笔记接dubbo入门学习笔记之环境准备继续记录; (四)开发服务提供者和消费者并让他们在启动时分别向注册中心注册和订阅服务 需求:订单服务中初始化订单功能需要调用用户服务的获取用户信息的接口(订 ...
- Dubbo入门---搭建一个最简单的Demo框架(转)
Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本. ...
- dubbo入门之微服务客户端服务端配置
正常一个服务不会只做客户端或者只做服务端,一般的微服务都是服务与服务相互调用,那么,应该怎么配置呢?接着之前的dubbo入门之helloWorld,我们再改改配置,即可实现正常的微服务架构.与之前相比 ...
- Dubbo入门介绍---搭建一个最简单的Demo框架
Dubbo入门---搭建一个最简单的Demo框架 置顶 2017年04月17日 19:10:44 是Guava不是瓜娃 阅读数:320947 标签: dubbozookeeper 更多 个人分类: D ...
- 企业级应用,如何实现服务化三(dubbo入门案例)
今天是六一儿童节,从千里之外的广州,回到了贵州老家,真好!好山好水好心情,好了接着写点东西.这是企业级应用,如何实现服务化系列的第三篇.在上一篇:企业级应用,如何实现服务化二(dubbo架构)中,认识 ...
- 电商系统的演变可以看出架构演变 Dubbo入门 远程过程调用 需要解决的问题
Dubbo入门---搭建一个最简单的Demo框架 - CSDN博客 https://blog.csdn.net/noaman_wgs/article/details/70214612 Dubbo背景和 ...
- dubbo学习实践(2)之Dubbo入门Demo
开篇之前,先来了解下dubbo服务治理与技术架构,直接看图 dubbo技术架构图: 1. 新建dubbo项目,目录结构如下 代码说明: 1.代码分为Provider(服务提供方)与consumer(服 ...
随机推荐
- DVR_RDK编译报错
报错信息: abnormal termination of /opt/dm8168/dvr_rdk/../ti_tools/cgt_dsp/cgt6x_7_3_5//bin/cmp6x make[2] ...
- UVa 11582 - Colossal Fibonacci Numbers!(数论)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- PHP------数组的遍历
echo current($attr); //取当前元素的value值 echo key($attr); //取当前元素的key next($attr); //将数组里面的指针指向下一个(向下移)pr ...
- PHP基础系列(一) PHP字符串相关的函数分类整理
PHP提供了非常丰富的自带函数,有人说PHP是一个大的函数库,在某种程度上我是非常认同这种观点的,这个也是PHP非常容易上手的原因之一.在使用PHP编程的时候,需要实现某一功能的时候,如果说php自带 ...
- HDU 1166 【线段树 || 树状数组,单点修改 维护区间和】
题目链接 HDU 1166 大概题意: 第一行一个整数T,表示有T组数据.每组数据第一行一个正整数N(N<=50000),表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工 ...
- localStorage和cookie操作
localStorage和cookie操作代码: cookie: { isSupportCookie: function() { return navigator.cookieEnabled; }, ...
- 【nlogn LIS】 模板
总结:stl真好用 #include <cstdio> #include <cstring> #include <iostream> #include <al ...
- SignalR 教程二 服务端广播
转帖官方教程:Tutorial: Server Broadcast with SignalR 2 http://www.asp.net/signalr/overview/getting-started ...
- Parallel.ForEach使用示例
新建一个.NET Core控制台程序,代码如下: using System; using System.Collections.Generic; using System.Threading; usi ...
- OpenID Connect Core 1.0(二)ID Token
2.ID Token(ID Token) OpenID Connect主要是对OAuth 2.0 能够使得终端用户通过ID Token的数据结构进行验证.当客户端和潜在的其他请求声明,ID Token ...