Dubbo系列之微服务框架整合教程

Stella981
• 阅读 442

文章目录

一、分布式基本知识

1.1) 架构演变

Dubbo系列之微服务框架整合教程

先给出dubbo官方的图,图片表示了架构的演变。然后我说一下自己的理解。

应用最开始是单体应用,即一个应用包括了所有应用模块。

随后就是垂直应用架构,也就是将系统拆分为多个应用模块。

随后就是RPC架构,之前的垂直应用架构其实可以说是在一个进程内的通讯,而RPC就是一种进步,RPC是进程之间的通讯,远程过程调用就是这么来的。

有了RPC之后,虽然可以实现进程之间的通讯,但是服务器集群后的服务器资源利用有些时候容易造成浪费,比如有个系统,一般情况都是不能很好地预估需要分配多少机器的,很容易造成一种情况就是业务访问很频繁的模块分配了不足的机器,而访问不是很频繁的模块分配了太多的机器,这种情况就不能实现资源的很好利用,所以针对这种情况就有了SOA(Service Oriented Architecture)的出现,SOA其实就是一个服务注册中心,可以实现资源调度,合理地分配资源,提高资源调度,是一个治理中心。

1.2)、分布式基本概念

所以我们了解了架构演变之后,就可以更好的理解分布式,分布式其实就是一种可以实现不同进程之间通讯的架构,然后进程之间怎么通讯的?一般都是通过RPC框架实现。比如Java方面的,Dubbo框架或者Spring Cloud。

二、RPC简介

2.1) RPC概念

RPC:全称远程过程调用,是一种进程间的通信的方式,它所做的事情就是实现进程内的通信,允许调用另外一个地址空间,可以是共享网络里的另外一台机器。

2.2) RPC核心模块

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

三、Dubbo原理简介

3.1) Dubbo简介

Dubbo是阿里巴巴开源的一款Java RPC框架,现在已经捐赠给Apache
官网:http://dubbo.apache.org/

3.2) 核心功能

a、智能容错和负载均衡

b、服务注册和发现

c、面向接口的远程方法调用

3.3) 原理简介

Dubbo系列之微服务框架整合教程

上图是Dubbo官方的图

角色

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

Container:服务运行的容器

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

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

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

调用

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

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

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

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

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

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

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

四、Dubbo安装部署

4.1) Zookeeper安装

因为没有实践过linux系统的安装,所以本博客只介绍window系统的安装,当然linux安装dubbo环境也不会难。Dubbo的注册中心实现有很多种,比如Redis、Multicast等等,不过官方推荐的还是Zookeeper,所以本博客选Zookeeper注册中心搭建进行介绍。

下载Zookeeper
https://archive.apache.org/dist/zookeeper/
ps:先下载Zookeeper,因为3.5.X的都是公测版或者内测版,所以有可能不太稳定,不建议下载。

修改配置文件
解压下载好的Zookeeper压缩文件,zookeeper-3.4.13的配置文件在conf文件夹下面,可以看到里面有个zoo_sample.cfg的文件,我们需要修改文件名称,不然会出现文件找不到,将文件名称改为zoo.cfg

这里主要改一下Zookeeper临时文件夹,默认是linux系统的tmp/zookeeper,我修改后的配置如下:

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
# Linux系统下的临时目录
# dataDir=/tmp/zookeeper
dataDir=../tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

启动Zookeeper
在bin目录下面,有个zkServer.cmd文件,这是Zookeeper服务端启动的文件,点击启动

zkCli.cmd是客户端启动文件,我们点击启动,Zookeeper是一个树形目录结构的

### get根目录
[zk: localhost:2181(CONNECTED) 1] get /
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = -1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
### 看一下根目录下面有什么,默认有Zookeeper这个目录
[zk: localhost:2181(CONNECTED) 2] ls /
[zookeeper]
### 在根目录下面创建一个taoshop的目录,并写值"mytest"
[zk: localhost:2181(CONNECTED) 3] create -e /taoshop mytest
Created /taoshop
### 查看一下,创建成功
[zk: localhost:2181(CONNECTED) 4] ls /
[taoshop, zookeeper]
### 查看一下taoshop目录下面有什么,可以看到"mytest"这个保存的值
[zk: localhost:2181(CONNECTED) 5] get /taoshop
mytest
cZxid = 0x6
ctime = Sun Nov 04 20:54:19 CST 2018
mZxid = 0x6
mtime = Sun Nov 04 20:54:19 CST 2018
pZxid = 0x6
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x1000250f2010000
dataLength = 6
numChildren = 0

4.2) Dubbo监控平台部署

下载一下Dubbo提供的监控平台,可以先去下载master分支,有看到一个develop分支,不过感觉develop分支的还没稳定下来,根据自己需要下载,我就是下载master版本的
https://github.com/apache/incubator-dubbo-ops/tree/master

可以git clone一下https://github.com/apache/incubator-dubbo-ops.git

git clone https://github.com/apache/incubator-dubbo-ops.git

然后到dubbo-admin下面打包一下
incubator-dubbo-ops-master/dubbo-admin

mvn clean package

完成后,到该目录target下面发现一个jar,cmd运行

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

当然也可以写个简单的bat脚本来执行,不用每次都敲命令,创建一个startDubboAdmin.bat文件
敲上以下脚本,然后保存,下次就不用再敲命令了,不过jar文件要和bat文件放在同级目录

@echo off
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar

访问Dubbo管理平台

http://localhost:7001/

输入账号密码root/root

Dubbo系列之微服务框架整合教程

Dubbo监控平台配置
在官方下载的incubator-dubbo-ops-master/dubbo-monitor-simple下面
使用maven命令打包一下

mvn clean package

然后在target文件夹下面会生成
dubbo-monitor-simple-2.0.0-assembly.tar.gz压缩文件夹,我们解压一下,然后
在dubbo-monitor-simple-2.0.0-assembly/dubbo-moitor-simple-2.0.0/assembly.bin文件夹下面可以看到start.bat文件,start.sh是linux系统的。win系统可以点击start.bat运行,运行之后访问127.0.0.1:8080,可以看到Dubbo官方提供的一个监控平台页面
Dubbo系列之微服务框架整合教程

五、Dubbo例子

下面简单写个例子实践一下Dubbo
Dubbo是处理分布式架构的一种很不错的RPC框架,官方文档比较齐全。
下面是Dubbo官方给的架构分包建议。ps:Dubbo现在暂不能支持分布式事务,所以服务定义的时候要设计好,尽量避免分布式事务的处理

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

服务提供者实现
maven加上jar,Zookeeper注意加上去除log4j依赖,假如你项目引入其它版本的log4j的话,容易造成jar冲突

  <exclusions>
       <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
     </exclusion>
    <exclusion>
                  <groupId>log4j</groupId>
                  <artifactId>log4j</artifactId>
       </exclusion>
   </exclusions>

dubbo配置,我放在一个common工程,taoshop-common-rpc

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <dubbo.springboot.version>1.0.0</dubbo.springboot.version>
        <zookeeper.version>3.4.6</zookeeper.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>io.dubbo.springboot</groupId>
            <artifactId>spring-boot-starter-dubbo</artifactId>
            <version>${dubbo.springboot.version}</version>
        </dependency>

         <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.12.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>${zookeeper.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>


    </dependencies>

provider工程一般是Service工程,我新建一个taoshop-provider-item订单工程

<!--API接口工程 -->
<dependency>
            <groupId>com.muses.taoshop.provider-api</groupId>
            <artifactId>taoshop-provider-api-item</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
<!-- 有dubbo相关jar的工程-->
        <dependency>
            <groupId>com.muses.taoshop.common</groupId>
            <artifactId>taoshop-common-rpc</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

dubbo配置:

spring.dubbo.application.name=taoshop-provider-item
spring.dubbo.registry.protocol=zookeeper
spring.dubbo.registry.address=127.0.0.1:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
spring.dubbo.scan=com.muses.taoshop

业务接口实现:
注意点:这里要加上dubbo提供的@Service注解,而不是spring框架提供的@Service注解

com.alibaba.dubbo.config.annotation.Service

package com.muses.taoshop.item.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.muses.taoshop.item.entity.ItemDetail;
import com.muses.taoshop.item.entity.ItemPortal;
import com.muses.taoshop.item.entity.ItemSpec;
import com.muses.taoshop.item.mapper.ItemMapper;
import org.springframework.beans.factory.annotation.Autowired;


import java.util.List;

/**
 * <pre>
 *  商品信息服务实现类
 * </pre>
 *
 * @author nicky
 * @version 1.00.00
 * <pre>
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.06.24 22:37    修改内容:
 * </pre>
 */
@Service(version = "1.0.0")
public class ItemServiceImpl implements IItemService {

    @Autowired
    ItemMapper itemMapper;

    /**
     * 在门户网站列出商品粗略信息
     *
     * @return
     */
    @Override
    public List<ItemPortal> listItemPortal() {
        return itemMapper.listItemPortal();
    }

    /**
     * 获取商品详情信息
     * @return ItemDetail
     */
    @Override
    public ItemDetail getItemDetailInfo(int spuId){
        ItemDetail itemDetail = itemMapper.getItemDetail(spuId);
        return  itemDetail;
    }


}

随意写个SpringBoot启动类:

package com.muses.taoshop.item;

/**
 * <pre>
 *  服务提供者
 * </pre>
 *
 * @author nicky
 * @version 1.00.00
 * <pre>
 * 修改记录
 *    修改后版本:     修改人:  修改日期: 2018.11.17 23:24    修改内容:
 * </pre>
 */
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ImportResource;


import java.util.concurrent.CountDownLatch;

@SpringBootApplication
//@ImportResource({"classpath:dubbo-provider.xml"})
public class ItemProviderApplication {
  //  private static final Logger logger = Logger.getLogger(ItemProviderApplication.class);

    @Bean
    public CountDownLatch closeLatch() {
        return new CountDownLatch(1);
    }

    public static void main(String[] args) throws InterruptedException {
        ApplicationContext ctx = SpringApplication.run(ItemProviderApplication.class, args);
//        logger.info("项目启动!");
//        CountDownLatch closeLatch = ctx.getBean(CountDownLatch.class);
//        closeLatch.await();
    }

}

启动一下provider,在监控平台上可以看到启动成功的服务,服务接口暴露成功
Dubbo系列之微服务框架整合教程

服务消费者
Dubbo配置:

spring.dubbo.application.name=taoshop-consume-portal
spring.dubbo.registry.protocol=zookeeper
spring.dubbo.registry.address=127.0.0.1:2181
spring.dubbo.scan=com.muses.taoshop
spring.dubbo.monitor.protocol=registry

xml配置就是这样的
自动发现

<dubbo:monitor protocol="registry"></dubbo:monitor>

引用,主要是引入import com.alibaba.dubbo.config.annotation.Reference;

@Reference
IItemService iItemService;

参考资料

SpringBoot+Dubbo

零基础搭建一套微服务框架(Spring Boot + Dubbo + Docker + Jenkins)

本文分享 CSDN - smileNicky。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
3年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这