分布式我爱编程

windows下搭建springboot+zookeeper+d

2018-03-23  本文已影响309人  大力水手_

springboot介绍

1.开箱即用,省去了原来的那么多配置,本身提供了默认的配置

2.内置tomcat,可以使用无war包形式去部署

3.可以开发,上线,测试环境的快速切换

4.简化了maven的配置

5.与spring生态圈的其他组件集成更好

6.很好的支持了微服务,可以快速搭建大型项目,可横向扩展


dubbo介绍

1.dubbo是Alibaba的开源分布式项目,很好的是分布式开发中的各模块之间的耦合

2.他支持多种协议的调用,基于生产消费模型

3.有多种暴露服务的方式,如直连,广播,使用注册中心

而注册中心中又有多种选择

    Multicast注册中心

    Zookeeper注册中心

    Redis注册中心

    Simple注册中心

4.提供了dubbo的监控系统,可以配置负载均衡策略,以及各服务之间的调用关系

这里分享一个很好的讲解dubbo架构的文章

简单之美 | Dubbo架构设计详解

使用dubbo需要注意的事项

①  在生产者和消费者之间传递的类一定要实现序列化接口

②  生产者之间有多个版本的时候一定要定义版本号

③  设置的超时时间要恰到好处否则会失败

④  Spring容器和springmvc的容器初始化的顺序很有可能会导致注入属性失败

⑤  后序待更新……


使用环境

开发工具:Eclipse Mars.2 Release (4.5.2)

JDK: 1.7(springboot2.0以上必须使用jdk1.8)

maven:3.3.9版本

数据库管理工具:Navicat 11.0.7


构建项目

Windows环境下搭建dubbo+zookeeper+springboot的分布式架构,实现rpc(远程调用)的(微服务)

下载zookeeper并解压到指定的文件夹,复制zoo_sample.cfg文件为zoo.cfg文件,因为启动zookeeper服务端的时候会自动寻找zoo.cfg文件

Zookeeper的下载网址https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/这里选用的是3.4.11版本

下载dubbo的dubbo-admin.war文件,这里直接部署到tomcat下就可以看到图形化的监控中心,这里可以配置负载均衡的策略,以及各个服务器之间的权重,以及服务之间的调用关系

这里使用dubbo-admin-2.5.4.war版本,其他的版本或者demo可以直接去alibaba的github上获取https://github.com/alibaba/dubbo

在zookeeper的bin目录下启动zKserver.cmd文件,然后去启动我们准备好的tomcat,确保我们的war文件已经在webapps下,在地址栏访问localhost:8080/admin-dubbo-2.5.4 这里会让我们登录,我们输入账号密码均为root即可.也可以到web-inf下的dubbo.properties中的账号密码,这里zookeeper默认绑定了2181端口

这里容易出现的问题:

① 命令行startup.bat的时候,无法启动,命令行窗口显示5行“Using.........”字样,显示的是JDK和tomcat的环境变量信息,没有其他信息了。

          cmd中输入catalina.bat run,显示错误信息,提示JVM内存设置错误,这个一般是由于之前设置过tomcat参数。

          用notepad打开catalina.bat文件,大概在186行rem ----- Execute The Requested

Command ---------------------------------------下面有之前的设置,屏蔽掉

②tomcat启动到一半的时候,停止在starting zkclient event thread不动

这是由于zookeeper没有启动,启动zkServer.cmd就好了。

4.下面开始创建我们的maven项目

①创建父工程

注意父工程的文件类型是pom

剩下的子工程都是在父工程之上创建(选中父工程)

②包结构如下

         dubbo-yiside-pojo是一个jar文件

         dubbo-yiside-commons(这里可以加一些各个模块都使用的工具)是一个jar文件

         dubbo-yiside-dao是一个jar文件(他依赖pojo)

         dubbo-yiside-interface是一个jar文件(他依赖dao)

         dubbo-yiside-web是一个war文件(他依赖dubbo-yiside-interface)

         dubbo-yiside-service是一个war文件(他依赖dubbo-yiside-interface)

接下来导入pom文件(这里不考虑效率问题,将依赖加入到父工程中)

接下来编写生产者(dubbo—yiside-service)与消费者(dubbo-yiside-web)

① 生产者编写如下

需要在buddo-yiside-interface中创建接口

package cn.yiside.service;

public interface UserService {  

  /**     *返回调用信息     *@return     */  

  StringRPCInfo();

}

在service中创建服务的实现类

package cn.yiside.service.Impl ;

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

import cn.yiside.service.UserService;

@Service(group="userService",version="1.0")

public class UserServiceImpl implements UserService {

    publicStringRPCInfo(){  return "hello 这里是生产者!";    }

}

注意这里使用的是dubbo的service注解

然后编写springboot的启动类以及application.properties文件

这里是springboot的启动类

package cn.yiside.service.Impl;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplicationpublic

classApplication {  

  public static void main(String[] args) {  

       SpringApplication.run(Application.class,args);    }

}

Application.propertis文件内容如下

#PROFILES

##dev | prod |

testspring.profiles.active=dev

#EMBEDDED SERVER CON FIGURATION

(ServerProperties)server.port=8091

server.session-timeout=30

server.context-path=server.tomcat.max-threads=100

server.tomcat.uri-encoding=UTF-8#DATASOURCE

spring.datasource.platform=mysql

#spring.datasource.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.

driverClassName=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://127.0.0.1:3306/sfishuseUnicode=true&characterEncoding=utf8

spring.datasource.username=root

spring.datasource.password=123

spring.datasource.max-active=100

spring.datasource.max-idle=2

spring.datasource.min-idle=1

spring.datasource.initial-size=15

#mybatis

#mybatis.mapperLocations=classpath*:com/iking/provider/*/mapping/*.xml#mybatis.typeAliasesPackage=com.iking.provider.*.model.*

#multipartfilespring.http.multipart.maxFileSize=100Mb

spring.http.multipart.maxRequestSize=1000Mb

#dubbospring.dubbo.application.name=user-provider

spring.dubbo.registry.address=zookeeper://127.0.0.1:2181

spring.dubbo.protocol.name=dubbo

spring.dubbo.protocol.port=20880

spring.dubbo.scan=cn.yiside.service.Impl

spring.dubbo.application.registries.timeout=10000

spring.dubbo.application.registries.session=100000

注意这里的application.name后面的值不能带有特殊的字符比如 空格等等

编写后完后启动启动类即可

成功后会在dubbo的监视系统中看到服务

②  编写消费者(dubbo-yiside-web)

将上面的文件复制一份到application.properties中

改写接下来的两项

编写消费的controller

package cn.yiside.user.controller;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

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

import cn.yiside.service.UserService;

@Controller

@RequestMapping("/user")

public class UserController {   

@Reference(group="userService",version="1.0")// 

@Autowired    private UserService userService;   

@RequestMapping("/rpc")   

@ResponseBody    

public String RPCInfo(){        

StringrpcInfo = userService.RPCInfo();        

 return rpcInfo;    }

}

注意如果是多个实现类的话一定要指定version版本号

编写消费者的启动类

package cn.yiside.user.controller;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication

@ComponentScan("cn.yiside.user.controller")

public classApplication {           

public static void main(String[]args) {          

             SpringApplication.run(Application.class,args);            }

}

启动消费者,可以在dubbo的监控中心看到消费者和生产者

接下来我们在地址栏访问我们服务者的地址,可以看到从消费者传递过来的消息

上一篇下一篇

猜你喜欢

热点阅读