spring boot下整合dubbo和zookeeper

本章主要说下dubbo和zookeeper的概念,以及在基于springboot框架搭建dubbo+zookeeper分布式服务架构。

来一个比较懵的官方解释:

dubbo框架:dubbo是阿里巴巴soa服务化治理方案的核心框架,是一个分布式服务的框架,致力于提高性能和透明化rpc远程服务调用方案,以及soa服务治理方案。

确实懵,什么是soa呢,什么是rpc呢???

soa:面向服务的架构,将应用程序的不同功能单元(也叫作服务)通过服务之间的定义良好的接口和契约联系起来。

rpc:远程过程调用协议,是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

在dubbo+zookeeper中有三个重要的角色:

 1. provider(服务提供者):在我们项目中可以粗糙地理解成实现类
    
 2. Consumer(服务消费者):可以理解为调用服务(调用实现类)的类,类似于controller,当然如果集成rabbitmq也有可能是消息队列的类,也有可能是实现类调用实现类,所以实现类可以身兼数职,既可以是服务提供者也可以是服务调用者。
    
 3. registry(zookeeper):也就是我们的注册中心,zookeeper是Apache下的产品。

没有用dubbo之前我们一般是controller调用service,service调用mapper(dao),但是现在加上了dubbo以后就是controller(当然不止controller,所有服务消费者都可以)通过向zookeeper订阅服务,service向zookeeper注册服务,通过zookeeper这个中介,把服务提供方的服务注入到服务消费者中。

调用流程

       1. 服务容器负责启动,加载,运行服务提供者。
       2. 服务提供者在启动时,向注册中心注册自己提供的服务。
       3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
       4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
       5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
       6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

理解不理解没关系来张图看下:
在这里插入图片描述还不理解,没关系来个demo:

运行环境:JDK8,Maven 3.0+
技术栈:SpringBoot 2.2.6.RELEASE、Dubbo 1.0.0、ZooKeeper3.5.7、mybatis2.1.2(推荐使用MP)、mysql
编辑器:eclipse 4.15.0(已安装好STS)
提供者项目

1、提供者:
在这里插入图片描述
pom文件需引入的内容如下:

        <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.1.2</version>
		</dependency>
		<!-- 整合dubbo -->
        <dependency>
            <groupId>io.dubbo.springboot</groupId>
            <artifactId>spring-boot-starter-dubbo</artifactId>
            <version>1.0.0</version>
        </dependency>
		
		<!-- 注意:dubbo强制内置log4J 如果没有则会报错 -->
		<!-- https://mvnrepository.com/artifact/log4j/log4j -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>

提供者的项目结构如下:
在这里插入图片描述配置文件,此处使用的默认的application.properties类型的:

spring.dubbo.application.name=provider
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
#dubbo 资源扫描文件 
spring.dubbo.scan=cn.chfsun.server.service

server.port=8084

#数据库相关配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/orcl?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root123
spring.datasource.max-idle=10
spring.datasource.max-wait=10000
spring.datasource.min-idle=5
spring.datasource.initial-size=5

mapper层:
在这里插入图片描述业务逻辑实现层:
在这里插入图片描述PS:到此提供者已经写好了,然后,然后使用mvn命令打包为jar文件,再启动服务,看着控制台愉快的跑起来…

等等!是不是报错了(如果没报错更好,但是可能吗,除非…):打包报错,启动也报错…什么鬼! 别慌,你的zookeeper服务启动了没?zookeeper是啥?这个还需要服务?

Zookeeper

本文刚开始已经提到了:…zookeeper这个中介,把服务提供方的服务注入到服务消费者中。

再来点:

zookeeper是开放源码的分布式应用程序协调服务,可以作为dubbo等服务的注册中心,也可以在分布式系统中实现分布式锁。

ZooKeeper的基本运转流程:

1、选举Leader。(选举leader可以参考
https://blog.csdn.net/gaoshan12345678910/article/details/67638657)

2、同步数据。

3、选举Leader过程中算法有很多,但要达到的选举标准是一致的。

4、Leader要具有最高的执行ID,类似root权限。

5、集群中大多数的机器得到响应并接受选出的Leader。

zookeeper的四种状态:

    LOOKING:寻找Leader状态。当服务器处于该状态时,它会认为当前集群中没有Leader,因此需要进入Leader选举状态。

  FOLLOWING:跟随者状态。表明当前服务器角色是Follower。

  LEADING:领导者状态。表明当前服务器角色是Leader。

  OBSERVING:观察者状态。表明当前服务器角色是Observer。

不是很理解没关系,先让它跑起来再说:

1、下载地址:
zookeeperhttps://archive.apache.org/dist/zookeeper/
在这里插入图片描述不是版本越高越好,稳定决定一切,我下载的是3.5.7的。点击进去,跳转到如下页面,选择标识的版本-------为啥?有坑啊!稍不注意就会…

注意: 从zookeeper-3.5.5开始,在下载zk时候 请下载apache-zookeeper-3.5.5 -bin .tar.gz
而不是apache-zookeeper-3.5.5.tar.gz:

在这里插入图片描述不然启动时候会报

找不到或无法加载主类 org.apache.zookeeper.server.quorum.QuorumPeerMain

2、下载好了,解压缩到本地磁盘中,然后进入bin中,找到zkServer.cmd,双击打开就能运行,然后又…
在这里插入图片描述如果不是这个错,那么你很悲催,还得解决其它的错误,最后还是会看到这个错误!!!
从错误中我们能大致知道是缺少初始化文件了。
解决方式很简单粗暴:

1.将conf目录下的zoo-sample.cfg复制下,改名为zoo.cfg,或者粗暴的修改conf目录下的zoo-sample.cfg重命名为zoo.cfg;

2.修改配置文件,如果不存在路径data和log,请先新建。(最好使用文本编辑器来修改配置)
在这里插入图片描述

启动:
打开bin文件夹,cmd进去执行:
在这里插入图片描述保持doc窗口不要关闭,更不要鼠标点进去,否则你可以试下,看会怎么样。
回到eclipse中,启动提供者项目:
在这里插入图片描述能看到红色的部分就说明提供者起作用名副其实了,别急,既然是提供者,是需要给消费者用的,就需要打包成一个starter。停止项目,项目右键先build path更改下
在这里插入图片描述

保存退出,然后继续项目右键–>Run As—>Maven clean/Maven install 或者使用mvn命令也可。
在这里插入图片描述红色部分即为打包后的jar,如果没看到刷新下就可以了。此时已经写入了你的本地maven仓库中。
再启动项目,作为服务提供者。

继续再来个消费者:

2消费者项目
创建方式同提供者项目,名字不一样就行,但是最好还是见名知意,符合规范。结构如下:
在这里插入图片描述

前文提起过:调用者可以直接调取提供者提供的服务,自身也可以是一个服务提供者,给其他调用者提供服务,此处只是调用,因此架构上不需要什么复杂的。

pom文件:

       <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		
		<dependency>
            <groupId>cn.chfsun</groupId>
            <artifactId>dubbo-serverorcl</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
		
		<!-- 整合dubbo -->
        <dependency>
            <groupId>io.dubbo.springboot</groupId>
            <artifactId>spring-boot-starter-dubbo</artifactId>
            <version>1.0.0</version>
        </dependency>
        <!-- 注意:dubbo强制内置log4J 如果没有则会报错 -->
		<!-- https://mvnrepository.com/artifact/log4j/log4j -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>

PS:pom文件中需要引入之前打包好的服务提供者jar
如果不清楚怎么引入可查看服务提供者打包后的配置文件:
在这里插入图片描述配置文件:

#防止服务消费者和提供者端口冲突(一致)
server.port=8085
## Dubbo 消费者  
spring.dubbo.application.name=consumer
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181

spring.dubbo.scan=cn.chfsun.client.controller

#数据库相关配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/orcl?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456

控制层代码:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.dubbo.config.annotation.Reference;

import cn.chfsun.server.service.DeptServie;

@RestController
public class DeptController {
	@Reference(version = "1.0.0")
	private DeptServie deptServie;

	@GetMapping(value = "/list")
	public Object list() {
		return deptServie.queryList();
	}
}

PS:@Reference(version = “1.0.0”)这个注解用的是dubbo提供的

然后启动消费者项目
在这里插入图片描述能看到红色部分代表消费者搭建成功。

下面打开浏览器访问:http://localhost:7001/,在服务监控中切换到提供者标签,即可看到:
在这里插入图片描述切换到消费者标签即可看到:
在这里插入图片描述嗯?访问这个url看不到?你问怎么访问这个,搭建个服务监控就行了,走起!

Dubbo环境搭建-ZooKeeper注册中心

在上面搭建好ZooKeeper注册中心后,搭建管理控制台实现服务监控。
进入Dubbo官网,点击GIthub
http://dubbo.apache.org/zh-cn/
在这里插入图片描述

进入到Github页面后,一直往下找到dubbo-admin/dubbo-monitor
在这里插入图片描述
在此页面会看到dubbo-admin-server,但是没有dubbo-admin,这是因为此时的分支是develop,将分支切换为master
在这里插入图片描述
此时页面地址为:
https://github.com/apache/dubbo-admin/tree/master
在此页面可以看见其官方说明
在这里插入图片描述
下载后找到dubbo-admin-server/src/main/resources/application.properties
将要监控的Zookpeeper注册中心的地址修改,这里是本机。
在这里插入图片描述
然后回到dubbo-admin目录下,在此处打开命令行窗口,使用maven进行打包

mvn clean package

在这里插入图片描述

出现Build Success 则就打包成功

此时在目录下会生成target目录,在target目录下会有一个jar包

在运行jar包程序前将上面所讲的ZooKeeper的服务端与客户端运行
然后在target目录下打开命令行运行jar包

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

此时打开浏览器输入:
http://localhost:7001/
默认是7001端口,会提示输入账户密码,默认都是root

点击登录,不出意外就能看到上面所展示的页面

管理控制台的作用

禁止提供者
在这里插入图片描述发送请求后:
在这里插入图片描述后端控制台:
在这里插入图片描述

禁止消费者
在这里插入图片描述执行后再去访问页面返回:
在这里插入图片描述eclipse控制台:
在这里插入图片描述再允许访问后,即可正常访问。

发布了3 篇原创文章 · 获赞 8 · 访问量 8946

猜你喜欢

转载自blog.csdn.net/u011429828/article/details/105668521