windows下搭建springboot+zookeeper+d
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需要注意的事项
① 在生产者和消费者之间传递的类一定要实现序列化接口
② 生产者之间有多个版本的时候一定要定义版本号
③ 设置的超时时间要恰到好处否则会失败
④ 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的监控中心看到消费者和生产者
接下来我们在地址栏访问我们服务者的地址,可以看到从消费者传递过来的消息