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。zoo.cfg文件
4.进入G:\soft\zookeeper-3.4.13\bin目录下,双击运行zkserver.cmd。
项目开始
1.新建一个maven project,如下图所示:
2.在项目上右键,创建maven module,创建项目springbootDubboProvider以及项目springbootDubboConsumer,如下图所示:
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
项目结构图
剩下的就是启动服务了。
注意先启动服务提供方, 然后再启动服务消费方。启动以后在浏览器输入http://localhost:8082/sayhello/lisi
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。这里可以看到提供者的服务!