文档章节

SpringBoot+Dubbo搭建微服务

smileNicky
 smileNicky
发布于 2018/12/02 22:29
字数 2657
阅读 80
收藏 0

@[toc]

一、分布式基本知识

1.1) 架构演变

在这里插入图片描述

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

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

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

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

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

1.2)、分布式基本概念

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

二、RCP简介

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官方的图

角色

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监控平台配置 在官方下载的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是处理分布式架构的一种很不错的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配置:

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)

© 著作权归作者所有

smileNicky
粉丝 12
博文 19
码字总数 24361
作品 2
西城
程序员
私信 提问
微服务化架构与半微服务化架构的选型

一个前后端完全分离的web项目,后端主要采用的springboot+dubbo技术。这是个创业项目,量大不大不确定。 在架构项目的过程中,我跟一个朋友都支持服务化架构,把服务拆分成多个主要的服务,商...

瓜娃
02/21
87
0
使用 Spring Cloud 搭建微服务项目架构

前言: 本文为使用 Spring Cloud 搭建微服务项目架构的整体思路讲述,欢迎讨论。文章对新手不友好,推荐新手访问此文:史上最简单的 SpringCloud 教程 终章,讲得很好。 1、微服务的定义 微服...

木云凌
2018/08/30
822
4
spring cloud中微服务之间的调用以及eureka的自我保护机制

上篇讲了spring cloud注册中心及客户端的注册,所以这篇主要讲一下服务和服务之间是怎样调用的 不会搭建的小伙伴请参考我上一篇博客:idea快速搭建spring cloud-注册中心与注册 基于上一篇的...

IT高飞
2018/07/19
0
0
微服务权限系统 - FEBS Cloud

FEBS Cloud是一款使用Spring Cloud Greenwich.SR1、Spring Cloud OAuth2和Spring Cloud Security构建的权限管理系统,前端(FEBS Cloud Web)采用vue element admin构建。FEBS意指:Fast,E...

mrbird
09/09
7.9K
9
基于 Spring Cloud Greenwich.SR1 的微服务权限系统 FEBS Cloud

FEBS Cloud是一款使用Spring Cloud Greenwich.SR1、Spring Cloud OAuth2和Spring Cloud Security构建的权限管理系统,前端(FEBS Cloud Web)采用vue element admin构建。FEBS意指:Fast,E...

mrbird
09/09
2.8K
15

没有更多内容

加载失败,请刷新页面

加载更多

《JAVA核心知识》学习笔记 (21. JAVA 算法)

21. JAVA 算法

Shingfi
1分钟前
0
0
redis 命令

redis 秒杀用到的 原子锁 :$redis->decr('jili_reward_goods_stock_' . $gifts_id) redis 秒杀用到的原子锁在秒杀过程中库存量增加 $redis->incrBy('key1', 10); redis 键查看重复:$redis-......

小小小壮
1分钟前
0
0
像智能手机一样管理云端应用:阿里云联合微软全球首发开放应用模型(OAM)

2019 年 10 月 17 日上午 9 点 15 分,阿里巴巴合伙人、阿里云智能基础产品事业部总经理蒋江伟在 QCon 上海《基于云架构的研发模式演进》主题演讲中,正式宣布: “今天,我们同微软联合发布...

阿里巴巴云原生
10分钟前
0
0
SpringBoot配置数据源

默认数据源 Springboot默认支持4种数据源类型,定义在 org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration 中,分别是: org.apache.tomcat.jdbc.pool.DataSource......

Gx_ww
13分钟前
0
0
Java应用在docker环境配置容器健康检查

在《极速体验docker容器健康》一文已体验了docker容器健康检查功能,今天就来给java应用的容器加入健康检查,使应用的状态随时都可以被监控和查看。 实战环境信息 操作系统:macOS Catalina ...

程序员欣宸
15分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部