【JAVA秒会技术之Dubbo入门】Dubbo在电商开发中的应用

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: Dubbo在电商开发中的应用 一、Dubbo背景 所谓背景介绍,就是“我们在什么情况下,基于什么原因开发了这样一个中间件?”就博主来看,简而言之,总结如下: (1) 随着服务的不断增多,服务的URL配置管理变得非常困难。此时,我们需要找一个中介替我们管理。 (2) 服务间的依赖关系变得错踪复杂,相互调用混乱。此时,我们需要厘清谁是服务提供方,谁是服务的消费方。 (3) 服务间的调

Dubbo在电商开发中的应用

一、Dubbo背景

所谓背景介绍,就是我们在什么情况下,基于什么原因开发了这样一个中间件?”就博主来看,简而言之,总结如下:

(1) 随着服务的不断增多,服务的URL配置管理变得非常困难。此时,我们需要找一个中介替我们管理。

(2) 服务间的依赖关系变得错踪复杂,相互调用混乱。此时,我们需要厘清谁是服务提供方,谁是服务的消费方。

(3) 服务间的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?此时,我们需要有一个自动监控系统,帮助我们监控管理这一切。

基于以上三点,我们再做一个进一步提取:

我们需要一个管理众多服务URL的中介 ——注册中心

我们需要搞清服务间复杂的依赖关系 ——服务提供方服务消费方

我们需要有一个自动监控系统,监管一切 ——监控中心

如此,我们Dubbo的模型就自然而然的出来了。

二、Dubbo简介

Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合),比如表现层和业务层就需要解耦合。

从面向服务的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)服务消费方(Consumer)两个角色。

除了以上两个角色,它还有注册中心和监控中心。它可以通过注册中心对服务进行注册和订阅,实现了软负载均衡和Failover(故障切换),降低对F5硬件负载均衡器的依赖,也能减少部分成本。同事,还可以通过监控中心对服务进行监控,这样的话,就可以知道哪些服务使用率高、哪些服务使用率低。对使用率高的服务增加机器,对使用率低的服务减少机器,达到合理分配资源的目的。


调用关系说明:

[0] 服务容器负责启动,加载,运行服务提供者。

[1] 服务提供者在启动时,向注册中心注册自己提供的服务。

[2] 服务消费者在启动时,向注册中心订阅自己所需的服务。

[3] 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

[4] 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

[5] 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

三、注册中心

注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。Dubbo目前支持4种注册中心,(multicast、zookeeper、redis、simple),但是对于dubbo-2.3.3以上版本,建议使用Zookeeper注册中心。

1)Zookeeper简介

Zookeeper是Apacahe Hadoop的子项目,是一个树型的目录服务,支持变更推送,适合作为Dubbo服务的注册中心,工业强度较高,可用于生产环境,并推荐使用。


流程说明:

①服务提供者启动时:
   
向/dubbo/com.foo.BarService/providers目录下写入自己的URL地址。
②服务消费者启动时:
    订阅/dubbo/com.foo.BarService/providers目录下的提供者URL地址。
    并向/dubbo/com.foo.BarService/consumers目录下写入自己的URL地址。
③监控中心启动时:
    订阅/dubbo/com.foo.BarService目录下的所有提供者和消费者URL地址。

支持以下功能:

①当提供者出现断电等异常停机时,注册中心能自动删除提供者信息。
②当注册中心重启时,能自动恢复注册数据,以及订阅请求。
③当会话过期时,能自动恢复注册数据,以及订阅请求。
④当设置<dubbo:registry check="false" />时,记录失败注册和订阅请求,后台定时重试。
⑤可通过<dubbo:registry username="admin" password="1234" />设置zookeeper登录信息。
⑥可通过<dubbo:registry group="dubbo" />设置zookeeper的根节点,不设置将使用无根树。
⑦支持*号通配符<dubbo:reference group="*" version="*" />,可订阅服务的所有分组和所有版本的提供者

2)Zookeeper单机安装

安装环境:Linux centOSJDK环境(Zookeeper是由java开发的)

第一步:下载zookeeper的压缩包,上传到Linux系统

下载Zookeeper-3.4.5.tar.gz 地址http://www.apache.org/dist/zookeeper/

第二步:解压缩

tar -zxf zookeeper-3.4.5.tar.gz

第三步:创建zoo.cfg文件,进入zookeeper-3.4.5/conf/目录,修改zoo_sample.cfg 为zoo.cfg

cp zoo_sample.cfg zoo.cfg

第四步:配置zoo.cfg

主要配置dataDir和clientPort参数。例如:dataDir = /usr/local/zookeeper/data; clientPort = 2181。
注意:datadir目录中的data末级目录如果不存在,也会自动生成。

第五步:启动zookeeper

启动命令:./zkServer.sh start
关闭命令:./zkServer.sh stop
查看状态命令:./zkServer.sh status
第六步:关闭防火墙(可选)

暂时关闭:service iptables stop
永久关闭:chkconfig iptables off</strong>

四、Dubbo的配置

Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。

Maven的pom.xml中配置如下

<dependency>
<!-- 配置zookeeper的客户端Curator支持Fluent风格的操作API -->
	<groupId>com.netflix.curator</groupId>
	<artifactId>curator-framework</artifactId>
	<version>${com.netflix.curator.version}</version>
</dependency>
<dependency>
<!-- 配置zookeeper的客户端ZkClient -->
<!-- 可以解决常见问题:重复注册watcher、session失效重连、异常处理。 -->
	<groupId>com.101tec</groupId>
	<artifactId>zkclient</artifactId>
	<version>${com.101tec.version}</version>
	<exclusions>
		<exclusion>
            <!-- 添加日志 -->
				<groupId>org.slf4j</groupId>
				<artifactId>slf4j-log4j12</artifactId>
		</exclusion>
	</exclusions>
</dependency>
<dependency>
<!-- 配置Zookeeper -->
	<groupId>org.apache.zookeeper</groupId>
	<artifactId>zookeeper</artifactId>
	<version>${org.apache.zookeeper.version}</version>
		<exclusions>
			<exclusion>
                <!-- 添加日志 -->
				<groupId>org.slf4j</groupId>
				<artifactId>slf4j-log4j12</artifactId>
			</exclusion>
		</exclusions>
</dependency>
<dependency>
<!-- 配置Dubbo -->
	<groupId>com.alibaba</groupId>
	<artifactId>dubbo</artifactId>
	<version>${com.alibaba.version}</version>
		<exclusions>
			<exclusion>
				<artifactId>spring</artifactId>
				<groupId>org.springframework</groupId>
			</exclusion>
		</exclusions>
</dependency>

applicationContext.xml中添加如下配置

<!-- 引入Dubbo相关的配置文件 -->
    <import resource="applicationContext-dubbo.xml"/>
    <import resource="service-provider.xml"/>
    <import resource="service-consumer.xml"/>

applicationContext-dubbo.xml中添加如下配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
	xmlns="http://www.springframework.org/schema/beans"
	xsi:schemaLocation="
	http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	http://code.alibabatech.com/schema/dubbo 
	http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
	<!-- 注册中心地址 -->
	<dubbo:registry protocol="zookeeper" address="${dubbo.protocol.zookeeper}"
		client="curator" file="docservice-query.properties" /> 
    <!-- 本地缓存文件(保留已注册的服务) -->
	<!--<dubbo:registry address="multicast://224.5.96.10:1234" /> -->
	<!-- 提供方应用信息:application-计算依赖关系。name-应用名,owner-负责人 -->
	<dubbo:application name="${dubbo.application.name}"
		owner="${dubbo.application.owner}" logger="slf4j" />
	<!-- 注册端口名字(接收器)-->
	<dubbo:protocol name="${dubbo.protocol.name}" port="${dubbo.protocol.port}" />
	<!-- 当前提供组名 -->
	<dubbo:provider group="${dubbo.registry.group}" />
	<!-- 需要消费的消费组名 -->
	<dubbo:consumer group="${dubbo.registry.group}" />
</beans>

服务提供方 service-provider.xml配置如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="
   http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
   http://code.alibabatech.com/schema/dubbo
   http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 需要暴露的服务地址以及服务名 ,protocol接收器标识-->
<dubbo:service interface="com.xxx.XxxService" ref="xxxService"
    protocol="dubbo"  timeout="1000"/>
</beans>

服务消费方service-consumer.xml配置如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="
   http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
   http://code.alibabatech.com/schema/dubbo
   http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 需要暴露的服务地址以及服务名 ,protocol接收器标识-->
<dubbo:reference interface="com.xxx.XxxService" id="xxxService" protocol="dubbo"
     timeout="10000" init="true" group="${dubbo.registry.group}" check="false"/>
dubbo.properties配置如下

<strong>#注册端口名字(接收器)
dubbo.application.name=service-query
dubbo.protocol.name=dubbo
dubbo.protocol.port=20020
#contarin conf
dubbo.container=logback,spring
dubbo.shutdown.hook=true
#log
dubbo.application.logger=slf4j
#spring container
dubbo.spring.config=classpath*:*spring/applicationContext.xml
dubbo.logback.level=debug
dubbo.logback.maxhistory=30</strong>

 

 

 

 

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
17天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
26天前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
19天前
|
SQL Java 数据库连接
从理论到实践:Hibernate与JPA在Java项目中的实际应用
本文介绍了Java持久层框架Hibernate和JPA的基本概念及其在具体项目中的应用。通过一个在线书店系统的实例,展示了如何使用@Entity注解定义实体类、通过Spring Data JPA定义仓库接口、在服务层调用方法进行数据库操作,以及使用JPQL编写自定义查询和管理事务。这些技术不仅简化了数据库操作,还显著提升了开发效率。
33 3
|
22天前
|
JSON 前端开发 JavaScript
java-ajax技术详解!!!
本文介绍了Ajax技术及其工作原理,包括其核心XMLHttpRequest对象的属性和方法。Ajax通过异步通信技术,实现在不重新加载整个页面的情况下更新部分网页内容。文章还详细描述了使用原生JavaScript实现Ajax的基本步骤,以及利用jQuery简化Ajax操作的方法。最后,介绍了JSON作为轻量级数据交换格式在Ajax应用中的使用,包括Java中JSON与对象的相互转换。
36 1
|
25天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
60 3
|
27天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
41 3
|
27天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
51 2
|
27天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
27 1
|
27天前
|
算法 Java 数据库连接
Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性
本文详细介绍了Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性。连接池通过复用数据库连接,显著提升了应用的性能和稳定性。文章还展示了使用HikariCP连接池的示例代码,帮助读者更好地理解和应用这一技术。
40 1
|
7月前
|
Dubbo Java 应用服务中间件
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用