Springboot整合dubbo/zookeeper安装详解

Springboot整合dubbo/zookeeper安装详解(最近项目需要用到,吐血整理)

1.前言

互联网日益发展,访问量越来越大,用户需求也越来越多样化,单一的MVC的框架系统架构,使得在开发过程中,占用的资源越来越多,而且随着流量的增加使得维护起来越来越难以维护,将应用拆成互不相干的几个应用,以提升效率。此时,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。

2.dubbo是什么

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册

3.为什么使用dubbo

当我们在多个Tomcat部署不同的系统时, 例如A系统(TomcatA)想调用B系统(TomcatB)中的服务, 这时Dubbo就有了用武之地。首先我们需要B系统在注册中心将自己的Url注册进去, 然后注册中心将Url返还给系统A, 那么系统A就可以调用了。当然了我这里说的只是Dubbo的一种用法, 在这个项目中使用的也是Dubbo的远程调用功能. (感觉真的和webservice有点像)

4.项目说明

(1)安装zookeeper,导入springboot,dubbo、zookeeper依赖
(2)在服务提供者端,编写服务接口,服务接口的实现类,编写配置文件
(3)读取配置文件
(4)在服务消费者,即客户端,调用服务接口,调用服务实现类,编写配置文件
这样系统间就可以互相通信,从而感觉像在本地使用一样。
使用dubbo不像httpclient一样json的转换,因为dubbo都自动进行了。

4.1.zookeeper安装(window环境)

dubbo和zookeeper啥关系?

简单来说打个比方:dubbo就是动物园的动物,zookeeper是动物园。如果游客想看动物的话那么就去动物园看。比如你要看老虎,那么动物园有你才能看到。换句话说我们把很多不同的dubbo(动物)放到zookeeper(动物园中)提供给我们游客进行观赏。这个过程中三个关键:场所、供给者、消费者。

zookeeper安装说明

Zookeeper的安装和配置十分简单, 既可以配置成单机模式,也可以配置成集群模式。这里是单机模式。
1.在官网http://zookeeper.apache.org/下载zookeeper.我下载的是zookeeper-3.4.13.tar.gz。
2.解压zookeeper-3.4.6至G:\soft\zookeeper-3.4.13。
3.至G:\soft\zookeeper-3.4.13\conf 复制 zoo_sample.cfg 并粘贴到当前目录下,命名zoo.cfg。
Springboot整合dubbo/zookeeper安装详解zoo.cfg文件
4.进入G:\soft\zookeeper-3.4.13\bin目录下,双击运行zkserver.cmd。

项目开始

1.新建一个maven project,如下图所示:
Springboot整合dubbo/zookeeper安装详解
Springboot整合dubbo/zookeeper安装详解
2.在项目上右键,创建maven module,创建项目springbootDubboProvider以及项目springbootDubboConsumer,如下图所示:
Springboot整合dubbo/zookeeper安装详解
3.编辑父模块SpringbootDubbo中pom.xml,如下:

<!-- springbootDubbo/pom.xml --!>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.test.springboot.dubbo</groupId>
  <artifactId>SpringbootDubbo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  <modules>
    <module>SpringbootDubboConsumer</module>
    <module>SpringbootDubboProvider</module>
  </modules>
  
  <!-- 引入springboot -->
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.4.RELEASE</version>
		<relativePath />
	</parent>
	
	<dependencies>
		<!-- 引入springboot -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
		<!-- 引入dubbot -->
        <dependency>
            <groupId>com.gitee.reger</groupId>
            <artifactId>spring-boot-starter-dubbo</artifactId>
            <version>1.0.9</version>
        </dependency>
	</dependencies>
</project>

4.编辑springbootDubboConsumer(消费者模块)中pom.xml

<!-- springbootDubboConsumer/pom.xml --!>

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  
  <parent>
    <groupId>com.test.springboot.dubbo</groupId>
    <artifactId>SpringbootDubbo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  
  <artifactId>SpringbootDubboConsumer</artifactId>
  <name>SpringbootDubboConsumer</name>
  <url>http://maven.apache.org</url>
  
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  
  <dependencies>
    <dependency>
			<groupId>com.test.springboot.dubbo</groupId>
    		<artifactId>SpringbootDubboProvider</artifactId>
    		<version>0.0.1-SNAPSHOT</version>
		</dependency>
  </dependencies>
</project>

5.编辑springbootProvider(提供者)代码
①新建User.java,代码如下:

package org.SpringbootDubboProvider.pojo;

import java.io.Serializable;

public class User implements Serializable{
	
	private static final long serialVersionUID = -3106669659541626230L;

	private int id;
	
	private String username;
	
	private String password;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
	
	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", password=" + password + "]";
	}
	
}

②新建UserService .java,代码如下:

package org.SpringbootDubboProvider.service;

import java.util.List;

import org.SpringbootDubboProvider.pojo.User;

public interface UserService {
	
	public List<User> getUser();
}

③新建UserServiceImpl.java,实现类,代码如下:

package org.SpringbootDubboProvider.service;

import java.util.ArrayList;
import java.util.List;

import org.SpringbootDubboProvider.pojo.User;
import org.springframework.stereotype.Component;

@Component("userService")
public class UserServiceImpl implements UserService{
	
	@Override
	public List<User> getUser() {
		List<User> users=new ArrayList<User>();
		for (int i = 0; i < 10; i++) {
			User user=new User();
			user.setId(i);
			user.setUsername("name_"+i);
			user.setPassword("123456");
			users.add(user);
		}
		return users;
	}
}

如果这样consumer直接调用能够行的通吗? 当然是不行的, 那么这里是怎么直接调用到了provider中的service实现类呢?

④编辑提供者dubbo.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <!--配置服务名称-->
    <dubbo:application name="dubboproviderhello" />
    <!--配置服务注册中心,dubbo不仅仅支持zookeeper-->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />
    <!--声明对外暴露的服务-->
    <dubbo:service interface="org.SpringbootDubboProvider.service.UserService" ref="userService" />
</beans>

⑤创建提供方springboot启动类

package org.SpringbootDubboProvider;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@ImportResource("classpath:/dubbo.xml")
@RestController
public class ProviderApplication {
	public  static void main(String[] args){
        SpringApplication.run(ProviderApplication.class,args);
    }
}

6.编辑springbootConsumer(消费者)代码

①创建dubbo.xml服务调用方组件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
       
       <!--配置服务名称-->
       <dubbo:application name="dubboConsumer"/>
       <!--配置服务注册中心,dubbo不仅仅支持zookeeper-->
       <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
       <!--调用服务提供方 提供的接口-->
       <dubbo:reference interface="org.SpringbootDubboProvider.service.UserService" id="userService"/>
       
</beans>

②创建springbootDubboConsumer启动类

package org.SpringbootDubboConsumer;

import java.util.List;

import org.provider.User;
import org.provider.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@ImportResource("classpath:/dubbo.xml")
@RestController
public class ConsumerApplication {
	@Autowired
	private UserService userService;
	public  static void main(String[] args){
        SpringApplication.run(ConsumerApplication.class,args);
    }
	
	@ResponseBody
	@RequestMapping("sayhello/{name}")
	public String sayHello(@PathVariable String name){
		List<User> users=userService.getUser();
		for (User user2 : users) {
			System.out.println(user2.getId()+user2.getUsername()+
			+user2.getPassword());
		}
		return "Hello World!";
	}
}

③创建服务器启动地址application.yml组件

server:8088

项目结构图

Springboot整合dubbo/zookeeper安装详解
剩下的就是启动服务了。
注意先启动服务提供方, 然后再启动服务消费方。启动以后在浏览器输入http://localhost:8082/sayhello/lisi
Springboot整合dubbo/zookeeper安装详解

dubbo-admin管理平台安装

1.到地址 https://github.com/alibaba/dubbo 下载dubbo源码 。
2.解压缩zip文件到 指定目录下。
3.把dubbo-admin文件夹丢进tomcat/webapps目录下,进入tomcat/bin目录,启动tomcat startup.bat。
4.浏览器输入地址http://localhost:8099/dubbo-admin-2.5.4-SNAPSHOT/ ,输入用户名密码均为root。
Springboot整合dubbo/zookeeper安装详解这里可以看到提供者的服务!