dubbo+zookeeper示例记录
提示:要直接看搭建例子的可以跳到 三
一.项目架构的发展
传统的mvc架构项目将整个系统功能实现全部写在一个项目中,部署在一个机器上,随着用户量的增涨,单个项目服务器无法承受暴增的用户请求时需要增加服务器数量,并通过负载均衡集群将项目部署到多个服务器上,提高项目可处理的用户请求总数。
当mvc架构项目中的某个或某几个模块的用户请求量较大,其他模块用户请求量较小,此时负载均衡集群依然是每个服务器部署一个完整的项目,实际需要进行负载均衡的仅是用户请求量较大的几个模块,此处则可采用分布式将系统功能模块服务化。
在项目过于庞大,部署单项目无法满足需求时,需要将项目的不同功能模块拆分成单独的服务项目部署到不同的服务器上(也就是分布式)。
在分布式中,各个服务项目之间要进行相互调用,需要在知道地址的情况下通过网络进行访问。此时需要一个能让所有服务都能得知其他服务地址的中间人,由此产生了服务注册中心,服务项目需要告诉服务注册中心它是干嘛的,也就是进行服务注册,
当其他项目要调用特定服务时可以到服务注册中心查找服务项目的地址,获取到服务项目地址后即可通过网络地址自行调用该服务项目,这整个过程涉及的结构也就是rpc架构的内容。
rpc架构:
包含服务提供者、服务消费者、服务注册中心;
服务注册中心:在服务提供者进行服务注册时保存服务提供者信息,在服务消费者进行服务发现时返回服务提供者地址;
服务提供者provider:在服务注册中心进行服务注册,等待服务消费者调用;
服务消费者consumer:在服务注册中心进行服务发现,在得到服务注册中心返回的服务提供者地址后进行服务调用;
rpc架构缺点:当项目拆分服务过多时无法得知服务是否正在被谁使用;
soa服务化架构:在rpc架构的基础上加了服务治理系统;
二.Zookeeper与Dubbo分别是什么?各自在项目中充当什么角色?
Zookeeper是什么:
Apache ZooKeeper是由集群(节点组)使用的一种服务,用于在自身之间协调,并通过稳健的同步技术维护共享数据。ZooKeeper本身是一个分布式应用程序,为写入分布式应用程序提供服务。
zookeeper充当的角色:
在上述rpc架构中zookeeper就是一个服务注册中心,所有的服务都在zookeeper中进行登记(服务注册),当某个服务要调用其他服务时,问zookeeper要该服务的网络地址(服务发现)。
dubbo是什么:
Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
dubbo充当的角色:
rpc架构的系统中所有服务项目都需要进行服务注册(告诉服务注册中心我是谁)与服务发现(告诉服务注册中心我要找谁),服务提供者和服务消费者(也就是服务本身)可使用dubbo来负责服务注册与服务发现。
dubbo对rpc架构缺点的处理:
Dubbo提供了dubbo-admin服务治理系统,在搭建dubbo+zookeeper后可运行dubbo-admin系统进行服务管理,也就从rpc架构变成了soa服务化架构。
三.搭建dubbo+zookeeper小例子
在正式搭建前可以先安装并启动zookeeper(略),随后安装dubbo-admin,下载dubbo-admin.war,改名ROOT.war,放到tomcat中,启动后可修改其中的dubbo.properties,将地址和账号密码修改成你安装的zookeeper的,随后重启项目
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
然后可以访问localhost:8080(修改为ROOT.war就是为了能localhost:8080直接访问项目),登录dubbo-admin后可以进去逛逛
在搭建到步骤3或步骤4时可以启动项目,然后到dubbo-admin服务管理系统中查看消费者和提供者是否有对应的数据,可以此为依据,判断服务是否注册成功。
1.创建maven项目,并在项目中创建三个子项目,service项目用于编写公共服务接口,dubboProvider去实现service中的接口,dubboConsumer用于调用公共服务接口在dubboProvider中的实现
2.在service项目中新增一个接口:
package com.lwl.service; public interface DemoService { String sayHello(String name);
}
3.dubboProvider中的操作:
3-1)在dubboProvider项目的pom.xml中加入依赖
<!--公共服务接口依赖-->
<dependency>
<groupId>com.lwl</groupId>
<artifactId>service</artifactId>
<version>1.0</version>
</dependency>
<!--dubbo依赖 https://mvnrepository.com/artifact/com.alibaba/dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.10</version>
<!-- 排除dubbo依赖自带的spring和netty依赖,防止自带的依赖与项目内依赖版本冲突,如果本身项目没有,无需排除 -->
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
<exclusion>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--zkclient依赖 https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.11</version>
</dependency>
<!--dubbo自身的spring相关依赖被排除,此处将dubbo所需要的对应依赖引入-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
3-2)创建DemoServiceImpl 类,实现公共服务接口
package com.lwl.service.impl; import com.lwl.service.DemoService; public class DemoServiceImpl implements DemoService {
@Override
public String sayHello(String name) {
return "Hello " + name;
}
}
3-3)在web.xml中配置启动spring
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5"> <!-- 启动spring容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> </web-app>
3-4)在applicationContext.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:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!--启动扫描-->
<context:component-scan base-package="com.lwl.service"/>
<!--声明公共服务接口实现类的bean-->
<bean id="demoService" class="com.lwl.service.impl.DemoServiceImpl"/>
<!--dubbo:application:提供方的应用名-->
<dubbo:application name="dubbo-provider"/>
<!--dubbo:registry:注册中心的类型和地址-->
<dubbo:registry address="zookeeper://127.0.0.1:2181" check="false" subscribe="false" register=""/>
<!--dubbo:protocol:这个服务要暴露在哪个端口上(使用方根据这个端口使用服务)-->
<dubbo:protocol name="dubbo" port="20880"/>
<!--dubbo:service:设置暴露的服务接口,ref 为该接口的 bean,timeout 为超时时间-->
<dubbo:service interface="com.lwl.service.DemoService" ref="demoService" timeout="600000"/> </beans>
4.在dubboConsumer项目中的操作:
4-1)在dubboConsumer项目的pom.xml文件添加依赖:
<!--公共服务接口依赖-->
<dependency>
<groupId>com.lwl</groupId>
<artifactId>service</artifactId>
<version>1.0</version>
</dependency>
<!--dubbo依赖 https://mvnrepository.com/artifact/com.alibaba/dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.10</version>
<!-- 排除dubbo自带的spring和netty,使用项目的包,如果本身项目没有则无需排除 -->
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
<exclusion>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--zkclient依赖 https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.11</version>
</dependency> <!-- SpringMVC: https://mvnrepository.com/artifact/org.springframework/spring-webmvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
4-2)在web.xml中启动springmvc
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5"> <!-- SpringMVC核心控制器 -->
<servlet>
<servlet-name>spring-mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring-mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> <welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
4-3)在spring-mvc.xml中
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"> <!-- 注解探测器-->
<context:component-scan base-package="com.lwl.controller"/>
<context:annotation-config/> <!--dubbo:application: 使用方的应用名-->
<dubbo:application name="dubbo-consumer"/>
<!--dubbo:registry:注册中心的类型和地址-->
<dubbo:registry address="zookeeper://127.0.0.1:2181" check="false"/>
<!--dubbo:reference:要使用的服务的接口,并将返回的注入 bean,名称为id设的值-->
<dubbo:reference interface="com.lwl.service.DemoService" id="demoService"/> <!-- 注册注解驱动 -->
<mvc:annotation-driven/> </beans>
4-4)创建controller:
package com.lwl.controller; import com.lwl.service.DemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; @RestController
public class DemoController { // @Autowired
// 默认按byType自动注入,当找不到对应类型的bean时才按byName自动注入,都找不到时抛出异常
// 默认情况下必须要求依赖对象必须存在,如果要允许null值可使用@Autowired(required=false)
// @Resource
// 默认按byName自动注入,找不到时抛出异常
@Resource//或使用@Autowired(required = false)
private DemoService demoService; @GetMapping("/{name}")
public String get(@PathVariable String name) {
return demoService.sayHello(name);
} }
5.先启动dubboProvider项目,随后启动dubboConsumer项目,启动后访问http://localhost:8080/dubboConsumer/** 返回 Hello ** 则配置成功
dubbo+zookeeper示例记录的更多相关文章
- Dubbo+Zookeeper实现简单的远程方法调用示例
1. Dubbo介绍 示例代码:Github 1.1 RPC Remote Procedure Call:远程过程调用 1.2 Dubbo架构 Subscribe 订阅:签署:赞成 Monitor 监 ...
- dubbo+zookeeper+springboot简单示例
目录 dubbo+zookeeper+springboot简单示例 zookeeper安装使用 api子模块 生产者producer 消费者consumer @(目录) dubbo+zookeeper ...
- 关于dubbo+zookeeper微服务的一些认识记录
借鉴架构示意图: 实例介绍: 公司某项目架构 服务器A:nginx 服务器BC:tomcat1.tomcat2 服务器D:Dubbo+zookeeper 服务器EF:db1+zookeeper.db2 ...
- Java代码搭建Dubbo+ZooKeeper 的示例
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- dubbo + zookeeper 环境搭建
一.zookeeper windows部署 1.下载安装 到官网下载解压版后解压至F:\server\zookeeper-3.4.8,剩下为文件配置工作: 2.本地伪集群 1) 在F:\server\ ...
- 精华【分布式、微服务、云架构、dubbo+zookeeper+springmvc+mybatis+shiro+redis】分布式大型互联网企业架构!
平台简介 Jeesz是一个分布式的框架,提供项目模块化.服务化.热插拔的思想,高度封装安全性的Java EE快速开发平台. Jeesz本身集成Dubbo服务管控.Zookeeper注册中心.Redis ...
- 分布式架构真正适用于大型互联网项目的架构! dubbo+zookeeper+springmvc+mybatis+shiro+redis
分类: 分布式技术(3) 目录(?)[+] 平台简介 Jeesz是一个分布式的框架,提供项目模块化.服务化.热插拔的思想,高度封装安全性的Java EE快速开发平台. Jeesz本身集成D ...
- 搭建SpringBoot+dubbo+zookeeper+maven框架(二)
上一篇文章是关于搭建SpringBoot+dubbo+zookeeper+maven框架的,但是里面的功能还不够完善,今天就日志管理方面做一些改善. 下了demo的网友可能会发现项目在启动时会有警告: ...
- dubbo系列二、dubbo+zookeeper+dubboadmin分布式服务框架搭建(windows平台)
一.zookeeper配置中心安装 1.下载安装包,zookeeper-3.4.6.tar.gz 2.解压安装包,修改配置文件 参考zookeeper-3.4.6/conf/zoo_sample.cf ...
随机推荐
- C#,WinForm文本框录入内容判断
|| e.KeyChar > ) && (e.KeyChar != ) && (e.KeyChar != ) && (e.KeyChar != ) ...
- EWA不能及时通过邮件接收
1. 确保EWA已经配置成功.可以通过SW_workcenter查看 2.确保EWA的邮箱设置成功 3. 检查EWAreport产生的时间 卫星系统:SDCCN 在tab"done" ...
- Python:Shapefile矢量转化为GeoJSON格式
在最近的项目中,完成了许多python处理矢量数据的算法程序,比如缓冲区分析.叠置分析.统计分析等,主要用到的是GDAL/OGR库,很多功能都参照了此链接中的示例:http://pcjericks.g ...
- 记一次B类地址子网划分
说明:一般内网地址,没有要求严格的划分之类的.需要按要求严格划分一般都是公网地址 温馨提醒:由于笔者功底不是很深厚,只能说我们保证把数算对用相对简单的方法 现有一个公网ip,B类地址130.3.0.0 ...
- 18C 新的发行版和补丁模型
18C 新的发行版和补丁模型 以后不再会有第一和第二个发行版,如12.1,12.2,以后只有18C,19C,20C 这样的发行版. 更少的One-Off 补丁 澄清1:版本家族 从生命周期支持上来说1 ...
- CentOS7安装CDH 第十章:CDH中安装Spark2
相关文章链接 CentOS7安装CDH 第一章:CentOS7系统安装 CentOS7安装CDH 第二章:CentOS7各个软件安装和启动 CentOS7安装CDH 第三章:CDH中的问题和解决方法 ...
- C语言面试题目之指针和数组
说明:所有题目均摘录于网络以及我所见过的面试题目,欢迎补充! 无特殊说明情况下,下面所有题s目都是linux下的32位C程序. 先来几个简单的热热身. 1.计算以下sizeof的值. char str ...
- You are what you say!
说话的方式表现了你的角色,所以说话的口吻在不同场合要贴合自己的身份和角色 尖锐的问题:如果要说一个比较尖锐的问题,那么可以把这个问题推理一下,从比较生活化的一点开始,或者将问题推给虚拟的第三方(但是注 ...
- [Abp vNext微服务实践] - 框架分析
一.简介 abp vNext新框架的热度一直都很高,于是最近上手将vNext的微服务Demo做了一番研究.我的体验是,vNext的微服务架构确实比较成熟,但是十分难以上手,对于没有微服务开发经验的.n ...
- MyBatis3_[tp-26-27]_映射文件_select_返回List_记录封装Map:返回单个元素的Map或者整体Map集合
笔记要点出错分析与总结工程组织 1.定义接口 public interface EmployeeMapper { //多条记录封装到一个map中: Map<Integer,Employee> ...