dubbo yml配置_利用springboot+dubbo,构建分布式微服务,全程注解开发(一)

随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。
一、先来一张图
说起 Dubbo,相信大家都不会陌生!阿里巴巴公司开源的一个高性能优秀的服务框架,可以使得应用可通过高性能的 RPC 实现服务的输出和输入功能,同时可以和 Spring 框架无缝集成。

Dubbo 架构图
节点角色说明:
- Provider:暴露服务的服务提供方
- Consumer:调用远程服务的服务消费方
- Registry:服务注册与发现的注册中心
- Monitor:统计服务的调用次数和调用时间的监控中心
- Container:服务运行容器
二、实现思路
今天,我们以一个用户选择商品下订单这个流程,将其拆分成3个业务服务:用户中心、商品中心、订单中心,使用 Springboot + Dubbo 来实现一个小 Demo!
服务交互流程如下:

本文主要是介绍 Springboot 与 Dubbo 的框架整合以及开发实践,而真实的业务服务拆分是一个非常复杂的过程,比我们介绍的这个要复杂的多,上文提到的三个服务只是为了项目演示,不必过于纠结为什么要这样拆分!
好了,废话也不多说了,下面我们开撸!
- 1.在虚拟机创建 4 台 centos7,任意选择一台安装 zookeeper
- 2.构建微服务项目并编写代码
- 3.在 centos7 上部署微服务
- 4.远程服务调用测试
三、zookeeper安装
在使用 Dubbo 之前,我们需要一个注册中心,目前 Dubbo 可以选择的注册中心有 zookeeper、Nacos 等,一般建议使用 zookeeper!
首先在安装 Zookeeper 之前,需要安装并配置好 JDK,本机采用的是Oracle Java8 SE。
- 安装JDK(已经安装可以忽略)
yum -y install java-1.8.0-openjdk
- 查看java安装情况
java -version

- JDK安装完成之后,下载安装Zookeeper
#创建一个zookeeper文件夹
cd /usr
mkdir zookeeper#下载zookeeper-3.4.14版本
wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz#解压
tar -zxvf zookeeper-3.4.14.tar.gz
创建数据、日志目录
#创建数据和日志存放目录
cd /usr/zookeeper/
mkdir data
mkdir log#把conf下的zoo_sample.cfg备份一份,然后重命名为zoo.cfg
cd conf/
cp zoo_sample.cfg zoo.cfg
配置zookeeper
#编辑zoo.cfg文件
vim zoo.cfg

- 启动Zookeeper
#进入Zookeeper的bin目录
cd zookeeper/zookeeper-3.4.14/bin#启动Zookeeper
./zkServer.sh start#查询Zookeeper状态
./zkServer.sh status#关闭Zookeeper状态
./zkServer.sh stop
出现如下信息,表示启动成功!

四、项目介绍
- springboot版本:2.1.1.RELEASE
- zookeeper版本:3.4.14
- dubbo版本:2.7.3
- mybtais-plus版本:3.0.6
- 数据库:mysql-8
- 构建工具:maven
- 服务模块:用户中心、商品中心、订单中心
五、代码实践
5.1、初始化数据库
首先在 mysql 客户端,创建3个数据库,分别是:dianshang-user
、dianshang-platform
、dianshang-business
。
- 在 dianshang-user 数据库中,创建用户表 tb_user,并初始化数据


- 在 dianshang-platform 数据库中,创建商品表 tb_product,并初始化数据


- 在 dianshang-platform 数据库中,创建订单表 tb_order、订单详情表 tb_order_detail


5.2、创建工程
数据库表设计完成之后,在 IDEA 下创建一个名称为dianshang
的Springboot
工程。
最终的目录如下图:

目录结构说明:
- dianshang-common:主要存放一些公共工具库,所有的服务都可以依赖使用
- dianshang-business:订单中心,其中
api
模块主要是提供dubbo服务暴露接口,provider
模块是一个springboot
项目,提供服务处理操作 - dianshang-user:用户中心,其中
api
模块和provider
模块,设计与之类似 - dianshang-platform:商品中心,其中
api
模块和provider
模块,设计与之类似
在父类pom
文件中加入dubbo
和zookeeper
客户端,所有依赖的项目都可以使用。
<!-- lombok -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.4</version><scope>provided</scope>
</dependency><!-- Dubbo Spring Boot Starter -->
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>2.7.3</version>
</dependency>
<!-- 因为使用的是 zookeeper 作为注册中心,所以要添加 zookeeper 依赖 -->
<dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.13</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></exclusion><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion><exclusion><groupId>log4j</groupId><artifactId>log4j</artifactId></exclusion></exclusions>
</dependency>
<!--使用curator 作为zookeeper客户端-->
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>4.2.0</version>
</dependency>
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>4.2.0</version>
</dependency>
温馨提示:小编在搭建环境的时候,发现一个坑,工程中依赖的zookeeper
版本与服务器的版本,需要尽量一致,例如,本例中zookeeper
服务器的版本是3.4.14
,那么在依赖zookeeper
文件库的时候,也尽量保持一致,如果依赖3.5.x
版本的zookeeper
,项目在启动的时候会各种妖魔鬼怪的报错!
5.3、创建用户中心项目
在 IDEA 中,创建dianshang-user
子模块,并依赖dianshang-common
模块
<dependencies><dependency><groupId>org.project.demo</groupId><artifactId>dianshang-common</artifactId><version>1.0.0</version></dependency>
</dependencies>
同时,创建dianshang-user-provider
和dianshang-user-api
模块。
- dianshang-user-api:主要对其他服务提供接口暴露
- dianshang-user-provider:类似一个web工程,主要负责基础业务的
crud
,同时依赖dianshang-user-api
模块
5.3.1、配置dubbo服务
在dianshang-user-provider
的application.yml
文件中配置dubbo
服务,如下:
#用户中心服务端口
server:port: 8080
#数据源配置
spring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: "jdbc:mysql://localhost:3306/dianshang-user"username: rootpassword: 111111
#dubbo配置
dubbo:scan:# 包名根据自己的实际情况写base-packages: org.project.dianshang.userprotocol:port: 20880name: dubboregistry:#zookeeper注册中心地址address: zookeeper://192.168.0.107:2181
5.3.2、编写服务暴露接口以及实现类
在dianshang-user-api
模块中,创建一个UserApi
接口,以及返回参数对象UserVo
!
public interface UserApi {/*** 查询用户信息* @param userId* @return*/UserVo findUserById(String userId);
}
其中UserVo
,需要实现序列化,如下:
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class UserVo implements Serializable {private static final long serialVersionUID = 1L;/*** 用户ID*/private String userId;/*** 用户中文名*/private String userName;
}
在dianshang-user-provider
模块中,编写UserApi
接口实现类,如下:
@Service(interfaceClass =UserApi.class)
@Component
public class UserProvider implements UserApi {@Autowiredprivate UserService userService;@Overridepublic UserVo findUserById(String userId) {QueryWrapper<User> queryWrapper = new QueryWrapper<User>();queryWrapper.eq("user_id",userId);User source = userService.getOne(queryWrapper);if(source != null){UserVo vo = new UserVo();BeanUtils.copyProperties(source,vo);return vo;}return null;}
}
未完待续。。。。
相关文章:

treeview 保持选中状态
发现当treeview控件失去焦点的时候,会丢失选中状态的指示(条目的蓝色背景)。如果想要保持,只要设置treeview的一个属性即可: this.treeView1.HideSelection false; 但是,发现阴影很浅,但是聊胜…

1-2-Active Directory 域服务准备概述
参照: http://technet.microsoft.com/zh-cn/library/gg398869.aspx Active Directory 域服务准备概述 上一次修改主题: 2010-12-09 要为 Microsoft Lync Server 2010 部署准备 Active Directory 域服务 (AD DS),必须按照特定顺序执行三个步骤。 下表介绍…

iOS----------拨打电话的3种方式
iOS实现拨打电话的方式:方法一、requestWithURL,此方法拨打前弹出提示NSMutableString * string [[NSMutableString alloc] initWithFormat:"tel:%","136****0000"];UIWebView * callWebview [[UIWebView alloc] init];[callWebvi…

linux命令 iperf-网络性能测试工具
iperf命令是一个网络性能测试工具。iperf可以测试TCP和UDP带宽质量。iperf可以测量最大TCP带宽,具有多种参数和UDP特性。iperf可以报告带宽,延迟抖动和数据包丢失。利用iperf这一特性,可以用来测试一些网络设备如路由器,防火墙&am…

SearchHit转成java对象_Java开发中最常犯的10个错误,你中招了吗?
http://www.programcreek.com/2014/05/top-10-mistakes-java-developers-make/阅读目录Array转ArrayList判断一个数组是否包含某个值在循环内部删除List中的一个元素HashTable与HashMap使用集合原始类型(raw type)访问级别ArrayList和LinkedList可变与不可变父类和子类的构造方…

hdu1160FatMouse's Speed(DP)
http://acm.hdu.edu.cn/showproblem.php?pid1160 1A 破题敲了一个多小时 最长上升子序列和最长下降子序列合起来 并把路径保留下来 题中是可以打乱顺序去找的 先按W上升或S下降排下序 再按最升和最降做 View Code 1 #include <iostream>2 #include<cstdio>3 #inc…

五、springcloud之客户端负载均衡Ribbon
一、简介 在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的。Spring cloud有两种服务调用方式: 一种是ribbonrestTemplate, 另一种是feign。 ribbon是一个负载均衡客户端,可以很好…

fiddler 抓取winform wcf包
修改客户端配置<system.net> <defaultProxy> <proxy bypassonlocal"false" usesystemdefault"true" /> </defaultProxy> </system.net> 最好使用机器名替换 localhost 2 fiddler 过滤设置 3 查看抓包数据 fiddler 抓包官方说…

dhcp报文_动态地址分配DHCP,IP地址管理方式及分配原则,一分钟了解下
一、DHCP简介DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)用来为网络设备动态地分配 IP地址等网络配置参数。DHCP 采用客户端/服务器通信模式,由客户端向服务器提出请求分配网络配置参数的申请,服务器返回为客户端分配的 IP …

不同浏览器的怪癖小结【转】
1.在设置div top,left是必须一起设置,否则对象消失 ,说明层postion设为fixed document.getElementById("mydiv").style.top10"px"; document.getElementById("mydiv").style.left10"px"; 在chrome下测试没有这个问题 2.获取…

成长必经的低谷已经来了么?
90年出生的我,已经在IT里面走了2年了.小时候出生在一个村落.后来一直在城市中生活着. 一开始学习时,对自己的未来充满着希望,如今,却在找工作中,不断的徘徊. 其实一开始想学习的是编写程序.这源于我一开始对网络的认识.那时候第一次接触到了电脑,记得是一台联想的台式机器,慢慢…

Go指南练习_错误
源地址 https://tour.go-zh.org/methods/20 一、题目描述 从之前的练习中复制 Sqrt 函数,修改它使其返回 error 值。 Sqrt 接受到一个负数时,应当返回一个非 nil 的错误值。复数同样也不被支持。 创建一个新的类型 type ErrNegativeSqrt float64 并为其实…

java基础编程题(1)
1、 题目:打印出杨辉三角形(要求打印出10行如下图) 11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 1...... package com.jzq.test1;/*** 题目:打印出杨辉三角形(要求打印出10行如下图&#x…

poj_2762,弱连通
http://poj.org/problem?id2762 这题是求弱连通 弱连通就是无向图强连通(基图是有向图) 思路:先targan缩点,然后这些点求最长链 也就是这些点(缩点)在一棵树上,这棵树的深度应该为强连通分量个…

tp数组转为json_数据存储—JSON
JSON文件存储JSON全称JavaScript Object Notation,也就是JavaScript对象标记,它通过对象和数组的组合来表示数据。1、对象和数组对象:在JavaScript中是使用花括号{}包裹起来的内容,数据结构为{key:value,ke…

VMWARE HOST-ONLY方式共享上网
在HOST-ONLY网络模式下,虚拟系统的网卡连接到宿主计算机的VMware Network Adapter VMnet1网卡上。如果要让VMware的虚拟机可以访问外网,则主系统必须共享网络连接。 具体操作步骤如下: 1. 通过网络连接,打开拨号连接的属性&#x…

tensorflow基于csv数据集实现多元线性回归并预测
#coding:utf8 import tensorflow as tf from sklearn import linear_model from sklearn import preprocessing import numpy as npdef read_data(file_queue):the function is to get features and label (即样本特征和样本的标签)数据来源是csv的文件,…

ab测试nginx Nginx性能优化
转自:https://www.cnblogs.com/nulige/p/9369700.html 1.性能优化概述 在做性能优化前, 我们需要对如下进行考虑 1.当前系统结构瓶颈 观察指标压力测试2.了解业务模式 接口业务类型系统层次化结构3.性能与安全 性能好安全弱安全好性能低2.压力测试工具 1.安装压力测…

jedis使用_网易架构师心得:Springboot下使用redis踩过的坑
点击?蓝色“ 深入原理”,关注并“设为星标”技术干货,第一时间推送首先总结了redis服务端单线程工作模型,redis四种部署方式及使用场景,然后从源码的角度上,分析springboot在jedis和lettuce客户端下使用redis的一些坑…

【URAL】1091 Tmutarakan Exams
题意:取k个不同的数,每个数不超过s,问种数。 若kx1,kx2,...,kx3满足条件,则x1,x2,...,x3必然满足条件。 因此枚举素数容斥,2*3*5*7>50,所以枚举之多三层。 1 #include<cstdio>2 #include<cstri…

怎样将无线路由做成无线AP
什么是无线AP? 无线AP,即Access Point,也就是无线接入点。简单来说就是无线网络中的无线交换机,它是移动终端用户进入有线网络的接入点,主要用于家庭宽带、企业内部网络部署等,无线覆盖距离为几十米至上…

Java实现网页截屏功能(基于phantomJs)
公司最近有个需求:把用户第一次的测量身体信息和最近一次测量信息进行对比,并且需要把对比的数据截成图片可以发给用户(需要在不打开网页的情况下实时对网页进行截图然后保存到服务器上,返回图片地址),通过…

CPU性能指标
1,主频 主频 时钟频率,它是指CPU内部晶振的频率,常用单位为MHz,它反映了CPU的基本工作节拍; 时钟频率又称主频,它是指CPU内部晶振的频率,常用单位为MHz,它反映了CPU的基本工作节拍; 2ÿ…

canvas 文字颜色_Canvas技术概述
Canvas简介在学习一项新技术之前,先了解这项技术的历史发展及成因会帮助我们更深刻的理解这项技术。历史上,canvas最早是由Apple Inc. 提出的,在Mac OS X webkit中创建控制板组件使用,而在canvas称为HTML草案及标准之前࿰…

sql server 2008学习10 存储过程
输入输出参数: 给存储过程传参数,叫做输入参数,用户告诉存储过程需要 利用这个参数干些什么. 输出参数: 从存储过程得到那些数据. 创建一个可选参数的存储过程: create proc pa1 name varchar(50)NULL as if(name is not null)select * from a where name like name%; elsesele…

C#_关于静态类和静态方法(转)
静态类是不能实例化的,即不能new 我们直接使用它的属性与方法,静态类最大的特点就是共享。 静态类中的所有成员必须是静态的。 静态类可以有静态构造函数,静态构造函数不可继承。 静态构造函数可以用于静态类,也可用于非静态类。 …

Struts2和SpringMVC简单配置以及区别总结
Struts2: struts 2 是一个基于MVC(mode-view-con)设计模式的Web应用框架,是由Struts1和WebWork两个经典框架发展而来的。 工作流程: 1客户端浏览器发出HTTP请求 2根据web.xml配置,该请求被FilterDispatcher(过滤器调度员)接收 3根据struts.xm…

python数字类型及运算_Python基础之(基本数据类型及运算)
一、运算 1.1、算数运算1.2、比较运算:1.3、赋值运算:1.4、逻辑运算:1.5、成员运算:针对逻辑运算的进一步研究: 1、在没有()的情况下not 优先级高于 and,and优先级高于or,即优先级关系为( )>…

AJAX跨域访问解决方案
Case I. Web代理的方式 (on Server A) 即用户访问A网站时所产生的对B网站的跨域访问请求均提交到A网站的指定页面,由该页面代替用户页面完成交互,从而返回合适的结果。此方案可以解决现阶段所能够想到的多数跨域访问问题,但要求A网站提供Web…

什么是生成器?
在python中, 要产生一个列表,可以这样写: a[] for i in range(10): a.append(i*2) 但是,这样挺麻烦的,产生一个列表,需要三行语句。所以,有人就想到能不能一行代码来表示呢?其实&a…