文章目录

  • 一、分布式基本理论
    • 1.1、分布式基本定义
    • 1.2 架构发展演变
    • 1.3、RPC简介
  • 二、Dubbo理论简介
  • 三、Dubbo环境搭建
    • 3.1 Zookeeper搭建
    • 3.2 Dubbo管理页面搭建
  • 四、Dubbo服务注册发现例子
    • 4.1、业务场景
    • 4.2、api工程创建
    • 4.3、服务提供者工程
    • 4.4、服务消费者工程

一、分布式基本理论

1.1、分布式基本定义

《分布式系统原理与范型》定义:
“分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统”
分布式系统(distributed system)是建立在网络之上的软件系统。

1.2 架构发展演变

架构的发展是由最初的单一应用架构构建的,一般就是ORM框架方便数据库操作。

不过随着系统越来越复杂,单一应用架构会变得难以维护,所以架构逐渐演变出了垂直应用架构,所谓垂直应用架构其实就是安装业务模板进行拆分,比如可以安装业务将一个电商系统分为订单模块,用户信息管理模块,商品管理模块等等,这时候MVC框架就派上用场,MVC框架可以协助系统更好的按业务拆分,不过业务拆分后虽然是比单一应用架构更好维护了。

不过随着系统越来约复杂,发现很多共用的模块很难复用起来,这时候分布式服务架构登场了,分布式架构是将一些核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,当应用需要时,就去服务中心调服务就可以,而实现这种服务注册的肯定是RPC框架了。

当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率,这时候就需要流动计算架构(SOA)[ Service Oriented Architecture],用于提高机器利用率的资源调度,SOA是一个治理中心,综上所述,到目前,软件系统架构演变经历了:单一应用架构->垂直应用架构->分布式应用架构->流动计算架构,下面Dubbo官网的图片可以很好的描述

1.3、RPC简介

RPC概念
RPC【Remote Procedure Call】是指远程过程调用,是一种进程间通信方式,他是一种技术的思想,而不是规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。

RPC核心模块
RPC有两个核心模块:通信和序列化

二、Dubbo理论简介

Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

官网:
http://dubbo.apache.org/


Dubbo的服务治理:

Dubbo原理图片,图片来自Dubbo官网:

Dubbo角色:

  • Provider:暴露服务的服务提供者

  • Container:服务运行的容器

  • Consumer:调用远程服务的消费者

  • Registry:服务注册和发现的注册中心

  • Minitor:统计服务调用次数和时间的监控中心

调用过程:

下面根据我的理解说明一下

  • 0:服务器容器负责启动、加载、运行服务提供者

  • 1:服务提供者在启动后就可以向注册中心暴露服务

  • 2:服务消费者在启动后就可以向注册中心订阅想要的服务

  • 3:注册中心向服务消费者返回服务调用列表

  • 4:服务消费者基于软负载均衡算法调用服务提供者的服务,这个服务提供者有可能是一个服务提供者列表,调用那个服务提供者就是根据负载均衡来调用了

  • 5:服务提供者和服务消费者定时将保存在内存中的服务调用次数和服务调用时间推送给监控中心

三、Dubbo环境搭建

3.1 Zookeeper搭建

搭建Zookeeper,首先是搭建分布式架构的注册中心Zookeeper,当然也可以用Redis等等来做服务注册中心,不过本博客只介绍Zookeeper的,因为没有linux服务器,所以只介绍window版的搭建

  • 1、下载Zookeeper:
    网址 https://archive.apache.org/dist/zookeeper/zookeeper-3.4.13/

  • 2、解压Zookeeper
    解压Zookeeper之后,运行bin目录里的zkServer.cmd,发现报错了,提示找不到配置文件,所以需要继续步骤3

  • 3、配置Zookeeper
    因为Zookeeper的conf文件夹下面只提供zoo_sample.cfg文件,需要自己修改命名为zoo.cfg

对于配置文件需要注意:

dataDir=./ 临时数据存储的目录(可写相对路径)

clientPort=2181 zookeeper的端口号

  • 4、使用zkCli.cmd测试
    修改配置文件后,重新启动zkServer.cmd,启动bin目录下面的zkCli.cmd,很显然这是个客户端程序,注意zkServer.cmd是服务端程序,必须启动

ok,简单在zkCli.cmd敲几个命令测试一下:
ls /:列出zookeeper根下保存的所有节点
create –e /testNode 12345678:创建一个testNode节点,值为12345678
get /testNode:获取/testNode节点的值

3.2 Dubbo管理页面搭建

搭建了服务注册中心后,就需要搭建Dubbo-admin了,最近看了一下,dubbo的Github项目已经进行了更新,管理平台已经做了比较大的改动,而我学习的时候,平台是比较简单的,所以本dubbo-admin搭建是以旧版master的为准,不过以学习为目的的,只需要知道具体原理和操作技巧就可以

  • 下载dubbo-admin
    去下载一下dubbo-admin,可以找主干master分支的,找到dubbo-admin,git clone到本地
    https://github.com/apache/incubator-dubbo-ops

因为我搭建时候(ps:不是博客写作时间),dubbo还没做比较大改动,所以我以比较旧的版本为例子,现在新的具体参考dubbo官方的教程,本博客只是做记录

  • 修改dubbo-admin

修改 src\main\resources\application.properties 指定zookeeper地址

  • Maven package dubbo-admin
mvn clean package -Dmaven.test.skip=true
  • 运行dubbo-admin的jar

maven打包之后,就去target里找到jar,然后cmd运行

java -jar dubbo-admin-0.0.1-SNAPSHOT.jar

运行成功之后,访问: http://127.0.0.1:7001,输入默认的账号密码root/root,登录成功

四、Dubbo服务注册发现例子

经典例子:

4.1、业务场景

某个电商系统,订单服务需要调用用户服务获取某个用户的所有地址;
我们现在 需要创建两个服务模块进行测试

模块 功能
订单服务模块 创建订单等
用户服务模块 查询用户地址等
  • 测试预期结果:
    订单服务web模块在A服务器,用户服务模块在B服务器,A可以远程调用B的功能

4.2、api工程创建

创建工程:
建议将服务接口,服务模型,服务异常等均放在 API 包中,因为服务模型及异常也是 API 的一部分,同时,这样做也符合分包原则:重用发布等价原则(REP),共同重用原则(CRP)。

创建一个API工程,将实体类和接口都放在api工程

maven新建一个shop-api-common工程:

用户地址DTO类:

package com.test.dubbo.bean;
import java.io.Serializable;
public class UserAddress implements Serializable {private Integer id;private String userAddress; //用户地址private String userId; //用户idprivate String consignee; //收货人private String phoneNum; //电话号码private String isDefault; //是否为默认地址    Y-是     N-否public UserAddress() {super();}public UserAddress(Integer id, String userAddress, String userId, String consignee, String phoneNum,String isDefault) {super();this.id = id;this.userAddress = userAddress;this.userId = userId;this.consignee = consignee;this.phoneNum = phoneNum;this.isDefault = isDefault;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUserAddress() {return userAddress;}public void setUserAddress(String userAddress) {this.userAddress = userAddress;}public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}public String getConsignee() {return consignee;}public void setConsignee(String consignee) {this.consignee = consignee;}public String getPhoneNum() {return phoneNum;}public void setPhoneNum(String phoneNum) {this.phoneNum = phoneNum;}public String getIsDefault() {return isDefault;}public void setIsDefault(String isDefault) {this.isDefault = isDefault;}
}

用户信息服务接口:

package com.test.dubbo.service;import java.util.List;import com.test.dubbo.bean.UserAddress;/*** 用户服务*/
public interface UserService {/*** 按照用户id返回所有的收货地址* @param userId* @return*/public List<UserAddress> getUserAddressList(String userId);}

订单信息服务接口:

package com.test.dubbo.service;import java.util.List;import com.test.dubbo.bean.UserAddress;public interface OrderService {/*** 初始化订单* @param userId*/public List<UserAddress> initOrder(String userId);}

ok,创建好api工程

4.3、服务提供者工程

要实现服务提供,配置文件主要需要配置如下:

Dubbo提供者加载过程(Dubbo容器的启动):

Spring加载xml配置之后暴露服务的过程:

Exporter方法主要是打开socket的监听,接收客户的请求

ok,理解了上面的理论知识后,继续创建一个user-service-provider工程:

  • maven配置:
<!-- 引入dubbo --><!-- https://mvnrepository.com/artifact/com.alibaba/dubbo --><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.6.2</version></dependency><!-- 注册中心使用的是zookeeper,引入操作zookeeper的客户端端 --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>2.12.0</version></dependency>
  • resources加一个提供者的配置文件provider.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.xsdhttp://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsdhttp://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"><!-- 1、指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名) --><dubbo:application name="user-service-provider"></dubbo:application><!-- 2、指定注册中心的位置 --><!-- <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry> --><dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry><!-- 3、指定通信规则(通信协议 通信端口) --><dubbo:protocol name="dubbo" port="20882"></dubbo:protocol><!-- 4、暴露服务   ref:指向服务的真正的实现对象 --><dubbo:service interface="com.test.dubbo.service.UserService" ref="userServiceImpl01" timeout="1000" version="1.0.0"><dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method></dubbo:service><!--统一设置服务提供方的规则  --><dubbo:provider timeout="1000"></dubbo:provider><!-- 服务的实现 --><bean id="userServiceImpl01" class="com.test.dubbo.service.impl.UserServiceImpl"></bean><!-- 连接监控中心 --><dubbo:monitor protocol="registry"></dubbo:monitor></beans>
  • 加个业务实现类:
package com.test.dubbo.service.impl;import java.util.Arrays;
import java.util.List;import com.test.dubbo.bean.UserAddress;
import com.test.dubbo.service.UserService;public class UserServiceImpl implements UserService {//@Overridepublic List<UserAddress> getUserAddressList(String userId) {UserAddress address1 = new UserAddress(1, "北京市昌平区", "1", "李老师", "010-56253825", "Y");UserAddress address2 = new UserAddress(2, "深圳市宝安区", "1", "王老师", "010-56253825", "N");return Arrays.asList(address1,address2);}}
  • 启动服务提供者,注册到Zookeeper:
    启动服务提供者有两种方法,一种是IOC启动:
package com.test.dubbo;import java.io.IOException;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainApplication {public static void main(String[] args) throws IOException {ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("provider.xml");ioc.start();System.in.read();}}

另外一种是调dubbo的Main类,启动:

dubbo的main函数:
com.alibaba.dubbo.container.Main
com.alibaba.dubbo.container.spring.SpringContainer

服务注册成功,可以去dubbo-admin看


查看服务接口的详细信息:

4.4、服务消费者工程

然后服务已经注册了,现在创建一个消费者工程order-service-comsumer

  • maven加上配置
<!-- 引入dubbo --><!-- https://mvnrepository.com/artifact/com.alibaba/dubbo --><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.6.2</version></dependency><!-- 注册中心使用的是zookeeper,引入操作zookeeper的客户端端 --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>2.12.0</version></dependency>
  • 消费者配置文件:
<?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.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsdhttp://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsdhttp://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"><context:component-scan base-package="com.test.dubbo.service.impl"></context:component-scan><dubbo:application name="order-service-consumer"></dubbo:application><dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry><!--  配置本地存根--><!--声明需要调用的远程服务的接口;生成远程服务代理  --><!-- 1)、精确优先 (方法级优先,接口级次之,全局配置再次之)2)、消费者设置优先(如果级别一样,则消费方优先,提供方次之)--><!-- timeout="0" 默认是1000ms--><!-- retries="":重试次数,不包含第一次调用,0代表不重试--><!-- 幂等(设置重试次数)【查询、删除、修改】、非幂等(不能设置重试次数)【新增】 --><dubbo:reference interface="com.test.dubbo.service.UserService" id="userService" timeout="5000" retries="3" version="*"><!-- <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method> --></dubbo:reference><!-- 配置当前消费者的统一规则:所有的服务都不检查 --><dubbo:consumer check="false" timeout="5000"></dubbo:consumer><dubbo:monitor protocol="registry"></dubbo:monitor><!-- <dubbo:monitor address="127.0.0.1:7070"></dubbo:monitor> --></beans>
  • 订单服务类:
package com.test.dubbo.service.impl;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import com.test.dubbo.bean.UserAddress;
import com.test.dubbo.service.OrderService;
import com.test.dubbo.service.UserService;/*** 让服务消费者去注册中心订阅服务提供者的服务地址*/
@Service
public class OrderServiceImpl implements OrderService {@AutowiredUserService userService;@Overridepublic List<UserAddress> initOrder(String userId) {System.out.println("用户id:"+userId);//查询用户的收货地址List<UserAddress> addressList = userService.getUserAddressList(userId);for (UserAddress userAddress : addressList) {System.out.println(userAddress.getUserAddress());}return addressList;}
}
  • IOC启动
    同样也是可以ioc启动,或者Dubbo提供的Main类启动:
package com.test.dubbo;import java.io.IOException;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.test.dubbo.service.OrderService;public class MainApplication {@SuppressWarnings("resource")public static void main(String[] args) throws IOException {ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("consumer.xml");OrderService orderService = applicationContext.getBean(OrderService.class);orderService.initOrder("1");System.out.println("调用成功....");System.in.read();}}

调用成功,console打印:


用户id:1
北京市昌平区
深圳市宝安区
调用成功....

Dubbo系列之服务注册与发现相关推荐

  1. 微服务系列:服务注册与发现的实现原理、及实现优劣势比较

    服务注册与发现的来源 首先,服务注册与发现是来自于微服务架构的产物. 在传统的服务架构中,服务的规模处于运维人员的可控范围内.当部署服务的多个节点时,一般使用静态配置的方式实现服务信息的设定.而在微服 ...

  2. springcloud微服务系列之服务注册与发现组件Eureka

    一.Eurake的简介 二.使用Eureka进行服务的注册消费 1.创建一个服务注册中心 2.创建服务的提供者 3.创建服务的消费者 总结 一.Eurake的简介 今天我们来介绍下springclou ...

  3. 【SpringCloud系列】服务注册与发现 - Eureka Server源码分析(2)

    3.6.Eureka Server 源码分析 上一篇文章简单介绍了 Eureka 的一些概念,今天咱们来看看其原理和源码,首先先看 Eureka Server 的原理. 3.6.1.Eureka Se ...

  4. SpringBoot系列:9. 分布式系统,Dubbo,Zookeeper服务注册与发现

    前言 本章主要对分布式系统,RPC的实现方式和Zookeeper实现做一个详细的概述并通过实战代码加深对他们的了解. 1. 分布式 什么是分布式系统? :"分布式系统是若干独立计算机的集合, ...

  5. 源码分析Dubbo服务注册与发现机制RegistryDirectory)

    RegistryDirectory,基于注册中心的服务发现,本文将重点探讨Dubbo是如何实现服务的自动注册与发现.从上篇文章,得知在消息消费者在创建服务调用器(Invoker)[消费者在初始时]时需 ...

  6. Dubbo学习笔记001---分布式服务调用_Dubbo简介_依赖zookeeper做为注册中心进行服务注册与发现

    JAVA技术交流QQ群:170933152 Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员 ...

  7. SpringCloud系列之Eureka服务注册及发现

    Eureka 1. Eureka简介 1.1 什么是Eureka 2. Eureka实例 2.1 编写Eureka Server 2.2 编写Eureka Client 3. Eureka源码解析 3 ...

  8. Dubbo服务注册与发现的流程

    Dubbo 服务注册与发现的流程 1.流程说明: Provider(提供者)绑定指定端口并启动服务 指供者连接注册中心,并发本机IP.端口.应用信息和提供服务信息发送至注册中心存储 Consumer( ...

  9. .Net Core 商城微服务项目系列(二):使用Ocelot + Consul构建具备服务注册和发现功能的网关...

    1.服务注册 在上一篇的鉴权和登录服务中分别通过NuGet引用Consul这个包,同时新增AppBuilderExtensions类: public static class AppBuilderEx ...

最新文章

  1. [OS复习]进程管理2
  2. 统计学习方法第九章作业:三硬币EM算法、GMM高维高斯混合模型 代码实现
  3. scala编程第16章学习笔记(1)
  4. 产品开发管理之流程和体系(总篇)
  5. linux下软件发布,Linux Kernel 5.12发布下载,附新特性及新功能介绍
  6. 2021数据分析岗疯狂内卷下,给应届校招生的建议:请避开大厂
  7. mfc实验报告心得体会_mfc实验报告.doc
  8. nlp基础—10.结巴分词的应用及底层原理剖析
  9. windows server 系统SERVER服务消失无法共享
  10. 酷应用背后,低代码正在被重估
  11. 长等线,中等线,正等线,细等线,扁宋,扁等线
  12. UE4 Datasmith 格式简述
  13. 二、SSD网络原理及代码讲解
  14. 暴力破解之NTscan
  15. yasm,nasm的关系
  16. Markdown语法中使用表情符号
  17. Xcode7-“App Transport Security has blocked a cleartext HTTP (http://) resource load since it is inse
  18. lol排位服务器维护赢了没加分,LOL最新排位制裁,“挂机退游戏会被限制加分,力度将逐次叠加”...
  19. latex插图编号_LaTex技巧[26]:Latex重新为图片编号
  20. android商品标签,TextView首行缩进效果(商品标签)

热门文章

  1. 需要拼单的平台数据获取
  2. 【MySQL】mysql | 解决navicat连接mysql报错1129
  3. iView单选框默认选中问题
  4. 多个域名对应一个IP地址
  5. 一篇HITSZ的究极情况_个人向
  6. NUC980开源项目39-Rtl8188eus WIFI联网
  7. Python数据分析18——公务员工资数据分析
  8. HDU 6641 TDL 异或性质
  9. linux下gb28181服务器搭建,GB28181 代码Linux
  10. My97DatePicker无权限问题